diff options
author | James Almer <jamrial@gmail.com> | 2019-08-26 05:10:41 +0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2019-08-27 21:10:03 +0300 |
commit | 8b71cc3363b5d5b01a56f334e8b6318374192076 (patch) | |
tree | b88ffd0d1308246d2ca42663e773d82bcf0be643 /libavcodec/qtrle.c | |
parent | dead949a1fbf019647f5c8ea797d1c7be6615639 (diff) |
Revert "avcodec/qtrle: Do not output duplicated frames on insufficient input"
This reverts commit a9dacdeea6168787a142209bd19fdd74aefc9dd6.
This patch effectively made the decoder output vfr content out of samples
where cfr is expected.
Addresses ticket #7880.
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/qtrle.c')
-rw-r--r-- | libavcodec/qtrle.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c index b3421d0b73..443dd88f71 100644 --- a/libavcodec/qtrle.c +++ b/libavcodec/qtrle.c @@ -455,10 +455,12 @@ static int qtrle_decode_frame(AVCodecContext *avctx, int ret, size; bytestream2_init(&s->g, avpkt->data, avpkt->size); + if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) + return ret; /* check if this frame is even supposed to change */ if (avpkt->size < 8) - return avpkt->size; + goto done; /* start after the chunk size */ size = bytestream2_get_be32(&s->g) & 0x3FFFFFFF; @@ -472,20 +474,17 @@ static int qtrle_decode_frame(AVCodecContext *avctx, /* if a header is present, fetch additional decoding parameters */ if (header & 0x0008) { if (avpkt->size < 14) - return avpkt->size; + goto done; 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) - return avpkt->size; + goto done; } else { start_line = 0; height = s->avctx->height; } - if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) - return ret; - row_ptr = s->frame->linesize[0] * start_line; switch (avctx->bits_per_coded_sample) { @@ -546,6 +545,7 @@ static int qtrle_decode_frame(AVCodecContext *avctx, memcpy(s->frame->data[1], s->pal, AVPALETTE_SIZE); } +done: if ((ret = av_frame_ref(data, s->frame)) < 0) return ret; *got_frame = 1; |