Skip to content
Snippets Groups Projects
Commit 306c637a authored by Jernej Skrabec's avatar Jernej Skrabec Committed by Ezequiel Garcia
Browse files

media: cedrus: h264: Fix frame list construction


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: default avatarJernej Skrabec <jernej.skrabec@siol.net>
parent ffb8e5ce
No related branches found
No related tags found
No related merge requests found
......@@ -101,7 +101,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);
......@@ -124,6 +124,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;
......@@ -131,13 +136,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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment