[FFmpeg-devel] [PATCH] avcodec/qtrle: return last frame even if unchanged
Michael Niedermayer
michael at niedermayer.cc
Thu May 16 00:48:36 EEST 2019
On Wed, May 15, 2019 at 10:53:25PM +0200, Hendrik Leppkes wrote:
> On Wed, May 15, 2019 at 8:41 PM Michael Niedermayer
> <michael at niedermayer.cc> wrote:
> >
> > Fixes: Ticket7880
> >
> > Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> > ---
> > libavcodec/qtrle.c | 27 +++++++++++++++++++++++++--
> > tests/ref/fate/qtrle-8bit | 1 +
> > 2 files changed, 26 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c
> > index 2c29547e5a..11226cb842 100644
> > --- a/libavcodec/qtrle.c
> > +++ b/libavcodec/qtrle.c
> > @@ -45,6 +45,7 @@ typedef struct QtrleContext {
> >
> > GetByteContext g;
> > uint32_t pal[256];
> > + int need_flush;
> > } QtrleContext;
> >
> > #define CHECK_PIXEL_PTR(n) \
> > @@ -444,6 +445,12 @@ static av_cold int qtrle_decode_init(AVCodecContext *avctx)
> > return 0;
> > }
> >
> > +static void qtrle_flush(AVCodecContext *avctx){
> > + QtrleContext *s = avctx->priv_data;
> > +
> > + s->need_flush = 0;
> > +}
> > +
> > static int qtrle_decode_frame(AVCodecContext *avctx,
> > void *data, int *got_frame,
> > AVPacket *avpkt)
> > @@ -454,11 +461,26 @@ static int qtrle_decode_frame(AVCodecContext *avctx,
> > int has_palette = 0;
> > int ret, size;
> >
> > + if (!avpkt->data) {
> > + if (s->need_flush) {
> > + s->need_flush = 0;
> > + if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
> > + return ret;
> > + if ((ret = av_frame_ref(data, s->frame)) < 0)
> > + return ret;
> > + *got_frame = 1;
> > + }
> > + return 0;
> > + }
> > +
> > bytestream2_init(&s->g, avpkt->data, avpkt->size);
> >
> > /* check if this frame is even supposed to change */
> > - if (avpkt->size < 8)
> > + if (avpkt->size < 8) {
> > + s->need_flush = 1;
> > return avpkt->size;
> > + }
> > + s->need_flush = 0;
> >
> > /* start after the chunk size */
> > size = bytestream2_get_be32(&s->g) & 0x3FFFFFFF;
> > @@ -572,5 +594,6 @@ AVCodec ff_qtrle_decoder = {
> > .init = qtrle_decode_init,
> > .close = qtrle_decode_end,
> > .decode = qtrle_decode_frame,
> > - .capabilities = AV_CODEC_CAP_DR1,
> > + .flush = qtrle_flush,
> > + .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
> > };
> > diff --git a/tests/ref/fate/qtrle-8bit b/tests/ref/fate/qtrle-8bit
> > index 27bb8aad71..39a03b7b6c 100644
> > --- a/tests/ref/fate/qtrle-8bit
> > +++ b/tests/ref/fate/qtrle-8bit
> > @@ -61,3 +61,4 @@
> > 0, 160, 160, 1, 921600, 0xcfd6ad2b
> > 0, 163, 163, 1, 921600, 0x3b372379
> > 0, 165, 165, 1, 921600, 0x36f245f5
> > +0, 166, 166, 1, 921600, 0x36f245f5
>
> Does this actually work if there is a gap between the last frame and
> the previously changed frame?
> I'm not sure where it would save the proper timestamp.
i had tested it with this:
make -j12 && ./ffmpeg -i test.mov test%d.jpg
and it turned a case with a single frame and 10 skiped ones into 11 frames
so i assume it works. Do you have a case where it does not work ?
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
The greatest way to live with honor in this world is to be what we pretend
to be. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190515/f5ee6e83/attachment.sig>
More information about the ffmpeg-devel
mailing list