[FFmpeg-devel] [PATCH 5/6] avcodec/qtrle: return last frame even if unchanged
Paul B Mahol
onemda at gmail.com
Sun Aug 25 09:38:25 EEST 2019
Very ugly non-solution. NAK.
On Sat, Aug 24, 2019 at 8:27 PM Michael Niedermayer <michael at niedermayer.cc>
wrote:
> Fixes: Ticket7880
>
> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> ---
> libavcodec/qtrle.c | 30 ++++++++++++++++++++++++++----
> tests/ref/fate/qtrle-8bit | 1 +
> 2 files changed, 27 insertions(+), 4 deletions(-)
>
> diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c
> index 2c29547e5a..c22a1a582d 100644
> --- a/libavcodec/qtrle.c
> +++ b/libavcodec/qtrle.c
> @@ -45,6 +45,7 @@ typedef struct QtrleContext {
>
> GetByteContext g;
> uint32_t pal[256];
> + AVPacket flush_pkt;
> } QtrleContext;
>
> #define CHECK_PIXEL_PTR(n)
> \
> @@ -454,11 +455,27 @@ static int qtrle_decode_frame(AVCodecContext *avctx,
> int has_palette = 0;
> int ret, size;
>
> + if (!avpkt->data) {
> + if (avctx->internal->need_flush) {
> + avctx->internal->need_flush = 0;
> + ret = ff_setup_buffered_frame_for_return(avctx, data,
> s->frame, &s->flush_pkt);
> + if (ret < 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) {
> + avctx->internal->need_flush = 1;
> return avpkt->size;
> + }
> + avctx->internal->need_flush = 0;
>
> /* start after the chunk size */
> size = bytestream2_get_be32(&s->g) & 0x3FFFFFFF;
> @@ -471,14 +488,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) {
> + avctx->internal->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) {
> + avctx->internal->need_flush = 1;
> return avpkt->size;
> + }
> } else {
> start_line = 0;
> height = s->avctx->height;
> @@ -572,5 +593,6 @@ AVCodec ff_qtrle_decoder = {
> .init = qtrle_decode_init,
> .close = qtrle_decode_end,
> .decode = qtrle_decode_frame,
> - .capabilities = AV_CODEC_CAP_DR1,
> + .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS |
> FF_CODEC_CAP_SETS_PKT_POS,
> + .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.23.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