On Thu, 30 May 2019, Michael Niedermayer wrote:

Fixes: Ticket7880

Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc>
---
libavcodec/qtrle.c        | 42 +++++++++++++++++++++++++++++++++++----
tests/ref/fate/qtrle-8bit |  1 +
2 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c
index 2c29547e5a..4add1aded6 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,32 @@ 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;

This does not seem to work, because the magic in decode_simple_internal in decode.c will overwrite these fields. Alternative approach which seems to work is assigning the AVPacket fields instead:

            avpkt->pos      = s->flush_pkt.pos;
            avpkt->duration = s->flush_pkt.duration;
            avpkt->dts      = s->flush_pkt.dts;
            avpkt->pts      = s->flush_pkt.pts;

Looks a bit ugly, but as far as I see we are using an internal packet, and not the one provided by the user, so it might be OK.

Regards,
Marton
_______________________________________________
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".

Reply via email to