summaryrefslogtreecommitdiff
authorNanxin Qin <nanxin.qin@amlogic.com>2020-05-22 12:28:19 (GMT)
committer Hui Zhang <hui.zhang@amlogic.com>2020-05-26 05:56:19 (GMT)
commit527e712a2b0e5dbc14db80e0a854b3c97bcd6823 (patch)
tree305a8a6d624cd355b8b5469b72559fe3973bfd93
parenta3339bfb9d2487506e72bb7810f82952a38a6303 (diff)
downloadmedia_modules-527e712a2b0e5dbc14db80e0a854b3c97bcd6823.zip
media_modules-527e712a2b0e5dbc14db80e0a854b3c97bcd6823.tar.gz
media_modules-527e712a2b0e5dbc14db80e0a854b3c97bcd6823.tar.bz2
vdec: fixed some issues of playback on dv mode. [1/1]
PD#SWPL-26639 PD#SWPL-26646 Problem: 1. fixed the issue of stbuf ops is null on dv mode. 2. the video is stuck in fixed position when play the DV video Solution: 1. the stbuf ops must be set into second vdec inst. 2. ignore pts adjust when work on dv mode. Verify: ab311 Change-Id: I8a275415a3eb647ce2f587b1d3f5a4055cf5d158 Signed-off-by: Nanxin Qin <nanxin.qin@amlogic.com>
Diffstat
-rw-r--r--drivers/frame_provider/decoder/h265/vh265.c5
-rw-r--r--drivers/frame_provider/decoder/utils/vdec.c37
2 files changed, 34 insertions, 8 deletions
diff --git a/drivers/frame_provider/decoder/h265/vh265.c b/drivers/frame_provider/decoder/h265/vh265.c
index d161c84..8a4eda6 100644
--- a/drivers/frame_provider/decoder/h265/vh265.c
+++ b/drivers/frame_provider/decoder/h265/vh265.c
@@ -8763,7 +8763,7 @@ static int prepare_display_buf(struct hevc_state_s *hevc, struct PIC_s *pic)
else {
#endif
#endif
- if (pic->stream_frame_size > 50 &&
+ if (!vdec_dual(vdec) && pic->stream_frame_size > 50 &&
(hevc->min_pic_size > pic->stream_frame_size ||
(hevc->min_pic_size == 0))) {
hevc->min_pic_size = pic->stream_frame_size;
@@ -8803,7 +8803,8 @@ static int prepare_display_buf(struct hevc_state_s *hevc, struct PIC_s *pic)
}
#endif
#endif
- if (vdec_stream_based(vdec) && (vf->duration > 0)) {
+ if (!vdec_dual(vdec) &&
+ vdec_stream_based(vdec) && (vf->duration > 0)) {
if ((vf->pts != 0) && (hevc->last_pts != 0)) {
int diff = vf->pts - hevc->last_pts;
if (diff > ((hevc->pts_continue_miss + 2)
diff --git a/drivers/frame_provider/decoder/utils/vdec.c b/drivers/frame_provider/decoder/utils/vdec.c
index ddb51bb..c81f1de 100644
--- a/drivers/frame_provider/decoder/utils/vdec.c
+++ b/drivers/frame_provider/decoder/utils/vdec.c
@@ -1299,11 +1299,31 @@ static void vdec_sync_input_write(struct vdec_s *vdec)
return;
if (vdec->input.target == VDEC_INPUT_TARGET_VLD) {
- WRITE_VREG(VLD_MEM_VIFIFO_WP,
- STBUF_READ(&vdec->vbuf, get_wp));
+ if (enable_stream_mode_multi_dec) {
+ if (!vdec->master) {
+ WRITE_VREG(VLD_MEM_VIFIFO_WP,
+ STBUF_READ(&vdec->vbuf, get_wp));
+ } else {
+ STBUF_WRITE(&vdec->vbuf, set_wp,
+ STBUF_READ(&vdec->master->vbuf, get_wp));
+ }
+ } else {
+ WRITE_VREG(VLD_MEM_VIFIFO_WP,
+ STBUF_READ(&vdec->vbuf, get_wp));
+ }
} else if (vdec->input.target == VDEC_INPUT_TARGET_HEVC) {
- WRITE_VREG(HEVC_STREAM_WR_PTR,
- STBUF_READ(&vdec->vbuf, get_wp));
+ if (enable_stream_mode_multi_dec) {
+ if (!vdec->master) {
+ WRITE_VREG(HEVC_STREAM_WR_PTR,
+ STBUF_READ(&vdec->vbuf, get_wp));
+ } else {
+ STBUF_WRITE(&vdec->vbuf, set_wp,
+ STBUF_READ(&vdec->master->vbuf, get_wp));
+ }
+ } else {
+ WRITE_VREG(HEVC_STREAM_WR_PTR,
+ STBUF_READ(&vdec->vbuf, get_wp));
+ }
}
}
@@ -2224,7 +2244,7 @@ s32 vdec_init(struct vdec_s *vdec, int is_4k)
vdec_frame_check_init(vdec);
#endif
/* stream buffer init. */
- if (vdec->vbuf.ops) {
+ if (vdec->vbuf.ops && !vdec->master) {
r = vdec->vbuf.ops->init(&vdec->vbuf, vdec);
if (r) {
pr_err("%s stream buffer init err (%d)\n", dev_name, r);
@@ -2235,6 +2255,11 @@ s32 vdec_init(struct vdec_s *vdec, int is_4k)
goto error;
}
+
+ if (vdec->slave) {
+ memcpy(&vdec->slave->vbuf, &vdec->vbuf,
+ sizeof(vdec->vbuf));
+ }
}
p->dev = platform_device_register_data(
@@ -2598,7 +2623,7 @@ void vdec_release(struct vdec_s *vdec)
/*Check if the vdec still in connected list, if yes, delete it*/
vdec_connect_list_force_clear(vdec_core, vdec);
- if (vdec->vbuf.ops)
+ if (vdec->vbuf.ops && !vdec->master)
vdec->vbuf.ops->release(&vdec->vbuf);
pr_debug("vdec_release instance %p, total %d\n", vdec,