On 01/09/19 15:19, Paul Kocialkowski wrote: > It was reported that some cases of interleaved video decoding require > using the current destination buffer as a reference. However, this is > no longer possible after the move to vb2_find_timestamp because only > dequeued and done buffers are considered. > > Add a helper in our driver that also considers the current destination > buffer before resorting to vb2_find_timestamp and use it in MPEG-2. This patch looks good, but can you also add checks to handle the case when no buffer with the given timestamp was found? Probably should be done in a third patch. I suspect the driver will crash if an unknown timestamp is passed on to the driver. I would really like to see that corner case fixed. Regards, Hans > > Signed-off-by: Paul Kocialkowski <paul.kocialkowski@xxxxxxxxxxx> > --- > drivers/staging/media/sunxi/cedrus/cedrus_dec.c | 13 +++++++++++++ > drivers/staging/media/sunxi/cedrus/cedrus_dec.h | 2 ++ > drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c | 10 ++++++---- > 3 files changed, 21 insertions(+), 4 deletions(-) > > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > index 443fb037e1cf..2c295286766c 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c > @@ -22,6 +22,19 @@ > #include "cedrus_dec.h" > #include "cedrus_hw.h" > > +int cedrus_reference_index_find(struct vb2_queue *queue, > + struct vb2_buffer *vb2_buf, u64 timestamp) > +{ > + /* > + * Allow using the current capture buffer as reference, which can occur > + * for field-coded pictures. > + */ > + if (vb2_buf->timestamp == timestamp) > + return vb2_buf->index; > + else > + return vb2_find_timestamp(queue, timestamp, 0); > +} > + > void cedrus_device_run(void *priv) > { > struct cedrus_ctx *ctx = priv; > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.h b/drivers/staging/media/sunxi/cedrus/cedrus_dec.h > index d1ae7903677b..8d0fc248220f 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.h > +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.h > @@ -16,6 +16,8 @@ > #ifndef _CEDRUS_DEC_H_ > #define _CEDRUS_DEC_H_ > > +int cedrus_reference_index_find(struct vb2_queue *queue, > + struct vb2_buffer *vb2_buf, u64 timestamp); > void cedrus_device_run(void *priv); > > #endif > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c > index cb45fda9aaeb..81c66a8aa1ac 100644 > --- a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c > +++ b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c > @@ -10,6 +10,7 @@ > #include <media/videobuf2-dma-contig.h> > > #include "cedrus.h" > +#include "cedrus_dec.h" > #include "cedrus_hw.h" > #include "cedrus_regs.h" > > @@ -159,8 +160,8 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) > cedrus_write(dev, VE_DEC_MPEG_PICBOUNDSIZE, reg); > > /* Forward and backward prediction reference buffers. */ > - forward_idx = vb2_find_timestamp(cap_q, > - slice_params->forward_ref_ts, 0); > + forward_idx = cedrus_reference_index_find(cap_q, &run->dst->vb2_buf, > + slice_params->forward_ref_ts); > > fwd_luma_addr = cedrus_dst_buf_addr(ctx, forward_idx, 0); > fwd_chroma_addr = cedrus_dst_buf_addr(ctx, forward_idx, 1); > @@ -168,8 +169,9 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) > cedrus_write(dev, VE_DEC_MPEG_FWD_REF_LUMA_ADDR, fwd_luma_addr); > cedrus_write(dev, VE_DEC_MPEG_FWD_REF_CHROMA_ADDR, fwd_chroma_addr); > > - backward_idx = vb2_find_timestamp(cap_q, > - slice_params->backward_ref_ts, 0); > + backward_idx = cedrus_reference_index_find(cap_q, &run->dst->vb2_buf, > + slice_params->backward_ref_ts); > + > bwd_luma_addr = cedrus_dst_buf_addr(ctx, backward_idx, 0); > bwd_chroma_addr = cedrus_dst_buf_addr(ctx, backward_idx, 1); > > _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel