avcodec/vp56rac: delay signaling an error on truncated input
authorMichael Niedermayer <michael@niedermayer.cc>
Tue, 20 Aug 2019 07:16:40 +0000 (09:16 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Wed, 11 Sep 2019 20:36:33 +0000 (22:36 +0200)
A threshold of 1 is sufficient for simple_dump_cut.webm, 10 is used
just to be sure the next truncated file doesnt cause the same issue

Obvious alternative fixes are to simply accept that the file is broken or to
write some advanced error concealment or to
simply accept that the decoder wont stop at the end of input.

Fixes: Ticket 8069 (artifacts not the differing md5 which was there before 1afd246960202917e244c844c534e9c1e3c323f5)
Fixes: simple_dump_cut.webm
Fixes: regression of 1afd246960202917e244c844c534e9c1e3c323f5

fate-vp5 changes because the last frame is truncated and now handled
differently.

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libavcodec/vp56.h
libavcodec/vp56rac.c
tests/ref/fate/vp5

index 84b2f6c94bbfab3d32534996b8c92edc2f86d1c6..65cf46870a1b32008de58711690a1eec30b720b5 100644 (file)
@@ -89,6 +89,7 @@ typedef struct VP56RangeCoder {
     const uint8_t *buffer;
     const uint8_t *end;
     unsigned int code_word;
+    int end_reached;
 } VP56RangeCoder;
 
 typedef struct VP56RefDc {
@@ -235,7 +236,9 @@ int ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_si
  */
 static av_always_inline int vpX_rac_is_end(VP56RangeCoder *c)
 {
-    return c->end <= c->buffer && c->bits >= 0;
+    if (c->end <= c->buffer && c->bits >= 0)
+        c->end_reached ++;
+    return c->end_reached > 10;
 }
 
 static av_always_inline unsigned int vp56_rac_renorm(VP56RangeCoder *c)
index e70302bf856da9771830ff5fcc64f2891613461c..64fb6a99b4fb0930e461e99b0bf5b01d065d81a2 100644 (file)
@@ -43,6 +43,7 @@ int ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_si
     c->bits = -16;
     c->buffer = buf;
     c->end = buf + buf_size;
+    c->end_reached = 0;
     if (buf_size < 1)
         return AVERROR_INVALIDDATA;
     c->code_word = bytestream_get_be24(&c->buffer);
index 2469a3ec21afb209e45029d037eaf25660768d9b..09ebe62b25e2f122f1004389c6c5b0abf7dc13f1 100644 (file)
 0,        243,        243,        1,   233472, 0x6f530ac6
 0,        244,        244,        1,   233472, 0x94f7466c
 0,        245,        245,        1,   233472, 0xa8c1d365
-0,        246,        246,        1,   233472, 0xbf73f1b7
+0,        246,        246,        1,   233472, 0x4f3ef38c