author | Nanxin 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) |
commit | 527e712a2b0e5dbc14db80e0a854b3c97bcd6823 (patch) | |
tree | 305a8a6d624cd355b8b5469b72559fe3973bfd93 | |
parent | a3339bfb9d2487506e72bb7810f82952a38a6303 (diff) | |
download | media_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>
-rw-r--r-- | drivers/frame_provider/decoder/h265/vh265.c | 5 | ||||
-rw-r--r-- | drivers/frame_provider/decoder/utils/vdec.c | 37 |
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, |