On 8/22/19 9:44 PM, Jernej Skrabec wrote: > When codec supports multiple slices in one frame, VPU has to know when > first slice of each frame is being processed, presumably to correctly > clear/set data in auxiliary buffers. > > Add first_slice field to cedrus_run structure and set it according to > timestamps of capture and output buffers. If timestamps are different, > it's first slice and viceversa. > > Signed-off-by: Jernej Skrabec <jernej.skra...@siol.net> > --- > drivers/staging/media/sunxi/cedrus/cedrus.h | 1 + > drivers/staging/media/sunxi/cedrus/cedrus_dec.c | 2 ++ > 2 files changed, 3 insertions(+) > > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h > b/drivers/staging/media/sunxi/cedrus/cedrus.h > index 2f017a651848..32cb38e541c6 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus.h > +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h > @@ -70,6 +70,7 @@ struct cedrus_mpeg2_run { > struct cedrus_run { > struct vb2_v4l2_buffer *src; > struct vb2_v4l2_buffer *dst; > + bool first_slice; > > union { > struct cedrus_h264_run h264; > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > index 56ca4c9ad01c..d7b54accfe83 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > @@ -31,6 +31,8 @@ void cedrus_device_run(void *priv) > > run.src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); > run.dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); > + run.first_slice = > + run.src->vb2_buf.timestamp != run.dst->vb2_buf.timestamp;
This is almost correct. To handle the corner case where no timestamp was ever copied to run.dst->vb2_buf you need this check: run.first_slice = !run.dst->vb2_buf.copied_timestamp || run.src->vb2_buf.timestamp != run.dst->vb2_buf.timestamp; Regards, Hans > > /* Apply request(s) controls if needed. */ > src_req = run.src->vb2_buf.req_obj.req; >