[FFmpeg-devel] [PATCH] avcodec/qtrle: return last frame even if unchanged

Michael Niedermayer michael at niedermayer.cc
Thu May 30 17:06:44 EEST 2019


On Thu, May 16, 2019 at 09:29:26PM +0200, Marton Balint wrote:
> 
> On Wed, 15 May 2019, Michael Niedermayer wrote:
> 
> >Fixes: Ticket7880
> >
> >Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> >---
> >libavcodec/qtrle.c        | 27 +++++++++++++++++++++++++--
> >tests/ref/fate/qtrle-8bit |  1 +
> >2 files changed, 26 insertions(+), 2 deletions(-)
> >
> >diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c
> >index 2c29547e5a..11226cb842 100644
> >--- a/libavcodec/qtrle.c
> >+++ b/libavcodec/qtrle.c
> >@@ -45,6 +45,7 @@ typedef struct QtrleContext {
> >
> >    GetByteContext g;
> >    uint32_t pal[256];
> >+    int need_flush;
> >} QtrleContext;
> >
> >#define CHECK_PIXEL_PTR(n)                                                            \
> >@@ -444,6 +445,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 +461,26 @@ 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;
> >+            if ((ret = av_frame_ref(data, s->frame)) < 0)
> >+                return ret;
> >+            *got_frame = 1;
> >+        }
> >+        return 0;
> >+    }
> >+
> >    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;
> 
> You probably have to set need_flush for the other two cases where you return
> avpkt->size for undersized packets.
> 
> >        return avpkt->size;
> >+    }
> >+    s->need_flush = 0;
> >
> >    /* start after the chunk size */
> >    size = bytestream2_get_be32(&s->g) & 0x3FFFFFFF;
> >@@ -572,5 +594,6 @@ AVCodec ff_qtrle_decoder = {
> >    .init           = qtrle_decode_init,
> >    .close          = qtrle_decode_end,
> >    .decode         = qtrle_decode_frame,
> >-    .capabilities   = AV_CODEC_CAP_DR1,
> >+    .flush          = qtrle_flush,
> >+    .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 tested your patch and it looks like pkt_dts and pkt_pos is lost for the
> last frame. Having no pkt_dts can be an issue later, because pkt_pts is
> already deprecated.

new patch posted

thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Modern terrorism, a quick summary: Need oil, start war with country that
has oil, kill hundread thousand in war. Let country fall into chaos,
be surprised about raise of fundamantalists. Drop more bombs, kill more
people, be surprised about them taking revenge and drop even more bombs
and strip your own citizens of their rights and freedoms. to be continued
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190530/8f386442/attachment.sig>


More information about the ffmpeg-devel mailing list