[FFmpeg-devel] [PATCH 7/8] avcodec/qtrle: return last frame even if unchanged
Paul B Mahol
onemda at gmail.com
Wed Aug 14 19:05:00 EEST 2019
On Wed, Aug 14, 2019 at 6:04 PM Paul B Mahol <onemda at gmail.com> wrote:
>
>
> On Mon, Aug 12, 2019 at 9:19 PM Michael Niedermayer <michael at niedermayer.cc>
> wrote:
>
>> Fixes: Ticket7880
>>
>> Signed-off-by: Michael Niedermayer <michael at 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 at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>
>
More information about the ffmpeg-devel
mailing list