summaryrefslogtreecommitdiff
path: root/libavcodec/qtrle.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2019-08-25 23:10:41 -0300
committerJames Almer <jamrial@gmail.com>2019-08-27 15:10:03 -0300
commit8b71cc3363b5d5b01a56f334e8b6318374192076 (patch)
treeb88ffd0d1308246d2ca42663e773d82bcf0be643 /libavcodec/qtrle.c
parentdead949a1fbf019647f5c8ea797d1c7be6615639 (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.c12
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;