lkml.org 
[lkml]   [2020]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/3] media: cedrus: h264: Fix frame list construction
    Date
    Current frame list construction algorithm assumes that decoded image
    will be output into its own buffer. That is true for progressive content
    but not for interlaced where each field is decoded separately into same
    buffer.

    Fix that by checking if capture buffer is listed in DPB. If it is, reuse
    it.

    Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
    ---
    drivers/staging/media/sunxi/cedrus/cedrus_h264.c | 15 +++++++++------
    1 file changed, 9 insertions(+), 6 deletions(-)

    diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
    index c87717d17ec5..4f79386315ae 100644
    --- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
    +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
    @@ -102,7 +102,7 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx,
    struct cedrus_dev *dev = ctx->dev;
    unsigned long used_dpbs = 0;
    unsigned int position;
    - unsigned int output = 0;
    + int output = -1;
    unsigned int i;

    cap_q = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
    @@ -125,6 +125,11 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx,
    position = cedrus_buf->codec.h264.position;
    used_dpbs |= BIT(position);

    + if (run->dst->vb2_buf.timestamp == dpb->reference_ts) {
    + output = position;
    + continue;
    + }
    +
    if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE))
    continue;

    @@ -132,13 +137,11 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx,
    dpb->top_field_order_cnt,
    dpb->bottom_field_order_cnt,
    &pic_list[position]);
    -
    - output = max(position, output);
    }

    - position = find_next_zero_bit(&used_dpbs, CEDRUS_H264_FRAME_NUM,
    - output);
    - if (position >= CEDRUS_H264_FRAME_NUM)
    + if (output >= 0)
    + position = output;
    + else
    position = find_first_zero_bit(&used_dpbs, CEDRUS_H264_FRAME_NUM);

    output_buf = vb2_to_cedrus_buffer(&run->dst->vb2_buf);
    --
    2.27.0
    \
     
     \ /
      Last update: 2020-06-04 20:57    [W:2.665 / U:0.872 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site