On Wed, Aug 14, 2019 at 6:04 PM Paul B Mahol <one...@gmail.com> wrote:
> > > On Mon, Aug 12, 2019 at 9:19 PM Michael Niedermayer <mich...@niedermayer.cc> > wrote: > >> Fixes: Ticket7880 >> >> Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc> >> --- >> 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) & 0x3FFFFFFF; >> @@ -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".