Re: [FFmpeg-devel] [PATCH 7/8] avcodec/qtrle: return last frame even if unchanged
On Mon, Aug 12, 2019 at 9:19 PM Michael Niedermayer wrote: > Fixes: Ticket7880 > > Signed-off-by: Michael Niedermayer > --- > libavcodec/qtrle.c| 44 +++ > tests/ref/fate/qtrle-8bit | 1 + > 2 files changed, 41 insertions(+), 4 deletions(-) > > diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c > index 2c29547e5a..ab620cdb55 100644 > --- a/libavcodec/qtrle.c > +++ b/libavcodec/qtrle.c > @@ -45,6 +45,8 @@ typedef struct QtrleContext { > > GetByteContext g; > uint32_t pal[256]; > +int need_flush; > +AVPacket flush_pkt; > } QtrleContext; > > #define CHECK_PIXEL_PTR(n) > \ > @@ -444,6 +446,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 +462,33 @@ 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; > +s->frame->pkt_pos = s->flush_pkt.pos; > +s->frame->pkt_duration = s->flush_pkt.duration; > +s->frame->pkt_dts = s->flush_pkt.dts; > +s->frame->pkt_pts = > +s->frame->pts = s->flush_pkt.pts; > +if ((ret = av_frame_ref(data, s->frame)) < 0) > +return ret; > +*got_frame = 1; > +} > +return 0; > +} > +s->flush_pkt = *avpkt; > +s->frame->pkt_dts = s->flush_pkt.dts; > + > 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) & 0x3FFF; > @@ -471,14 +501,18 @@ static int qtrle_decode_frame(AVCodecContext *avctx, > > /* if a header is present, fetch additional decoding parameters */ > if (header & 0x0008) { > -if (avpkt->size < 14) > +if (avpkt->size < 14) { > +s->need_flush = 1; > return avpkt->size; > +} > start_line = bytestream2_get_be16(&s->g); > bytestream2_skip(&s->g, 2); > height = bytestream2_get_be16(&s->g); > bytestream2_skip(&s->g, 2); > -if (height > s->avctx->height - start_line) > +if (height > s->avctx->height - start_line) { > +s->need_flush = 1; > return avpkt->size; > +} > } else { > start_line = 0; > height = s->avctx->height; > @@ -572,5 +606,7 @@ AVCodec ff_qtrle_decoder = { > .init = qtrle_decode_init, > .close = qtrle_decode_end, > .decode = qtrle_decode_frame, > -.capabilities = AV_CODEC_CAP_DR1, > +.flush = qtrle_flush, > +.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, > +.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 > -- > I dislike this hack and I'm for removing hack that removes dupe frames all together. 2.22.0 > > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH 7/8] avcodec/qtrle: return last frame even if unchanged
On Wed, Aug 14, 2019 at 6:04 PM Paul B Mahol wrote: > > > On Mon, Aug 12, 2019 at 9:19 PM Michael Niedermayer > wrote: > >> Fixes: Ticket7880 >> >> Signed-off-by: Michael Niedermayer >> --- >> libavcodec/qtrle.c| 44 +++ >> tests/ref/fate/qtrle-8bit | 1 + >> 2 files changed, 41 insertions(+), 4 deletions(-) >> >> diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c >> index 2c29547e5a..ab620cdb55 100644 >> --- a/libavcodec/qtrle.c >> +++ b/libavcodec/qtrle.c >> @@ -45,6 +45,8 @@ typedef struct QtrleContext { >> >> GetByteContext g; >> uint32_t pal[256]; >> +int need_flush; >> +AVPacket flush_pkt; >> } QtrleContext; >> >> #define CHECK_PIXEL_PTR(n) >> \ >> @@ -444,6 +446,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 +462,33 @@ 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; >> +s->frame->pkt_pos = s->flush_pkt.pos; >> +s->frame->pkt_duration = s->flush_pkt.duration; >> +s->frame->pkt_dts = s->flush_pkt.dts; >> +s->frame->pkt_pts = >> +s->frame->pts = s->flush_pkt.pts; >> +if ((ret = av_frame_ref(data, s->frame)) < 0) >> +return ret; >> +*got_frame = 1; >> +} >> +return 0; >> +} >> +s->flush_pkt = *avpkt; >> +s->frame->pkt_dts = s->flush_pkt.dts; >> + >> 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) & 0x3FFF; >> @@ -471,14 +501,18 @@ static int qtrle_decode_frame(AVCodecContext *avctx, >> >> /* if a header is present, fetch additional decoding parameters */ >> if (header & 0x0008) { >> -if (avpkt->size < 14) >> +if (avpkt->size < 14) { >> +s->need_flush = 1; >> return avpkt->size; >> +} >> start_line = bytestream2_get_be16(&s->g); >> bytestream2_skip(&s->g, 2); >> height = bytestream2_get_be16(&s->g); >> bytestream2_skip(&s->g, 2); >> -if (height > s->avctx->height - start_line) >> +if (height > s->avctx->height - start_line) { >> +s->need_flush = 1; >> return avpkt->size; >> +} >> } else { >> start_line = 0; >> height = s->avctx->height; >> @@ -572,5 +606,7 @@ AVCodec ff_qtrle_decoder = { >> .init = qtrle_decode_init, >> .close = qtrle_decode_end, >> .decode = qtrle_decode_frame, >> -.capabilities = AV_CODEC_CAP_DR1, >> +.flush = qtrle_flush, >> +.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, >> +.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 >> -- >> > > > I dislike this hack and I'm for removing hack that removes dupe frames all > together. > To all codecs that exhibit it. Not just qtrle > 2.22.0 >> >> ___ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> >> To unsubscribe, visit link above, or email >> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH 7/8] avcodec/qtrle: return last frame even if unchanged
Fixes: Ticket7880 Signed-off-by: Michael Niedermayer --- libavcodec/qtrle.c| 44 +++ tests/ref/fate/qtrle-8bit | 1 + 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c index 2c29547e5a..ab620cdb55 100644 --- a/libavcodec/qtrle.c +++ b/libavcodec/qtrle.c @@ -45,6 +45,8 @@ typedef struct QtrleContext { GetByteContext g; uint32_t pal[256]; +int need_flush; +AVPacket flush_pkt; } QtrleContext; #define CHECK_PIXEL_PTR(n) \ @@ -444,6 +446,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 +462,33 @@ 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; +s->frame->pkt_pos = s->flush_pkt.pos; +s->frame->pkt_duration = s->flush_pkt.duration; +s->frame->pkt_dts = s->flush_pkt.dts; +s->frame->pkt_pts = +s->frame->pts = s->flush_pkt.pts; +if ((ret = av_frame_ref(data, s->frame)) < 0) +return ret; +*got_frame = 1; +} +return 0; +} +s->flush_pkt = *avpkt; +s->frame->pkt_dts = s->flush_pkt.dts; + 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) & 0x3FFF; @@ -471,14 +501,18 @@ static int qtrle_decode_frame(AVCodecContext *avctx, /* if a header is present, fetch additional decoding parameters */ if (header & 0x0008) { -if (avpkt->size < 14) +if (avpkt->size < 14) { +s->need_flush = 1; return avpkt->size; +} start_line = bytestream2_get_be16(&s->g); bytestream2_skip(&s->g, 2); height = bytestream2_get_be16(&s->g); bytestream2_skip(&s->g, 2); -if (height > s->avctx->height - start_line) +if (height > s->avctx->height - start_line) { +s->need_flush = 1; return avpkt->size; +} } else { start_line = 0; height = s->avctx->height; @@ -572,5 +606,7 @@ AVCodec ff_qtrle_decoder = { .init = qtrle_decode_init, .close = qtrle_decode_end, .decode = qtrle_decode_frame, -.capabilities = AV_CODEC_CAP_DR1, +.flush = qtrle_flush, +.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, +.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 -- 2.22.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".