aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2019-08-20 09:16:40 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2020-07-01 12:49:26 +0200
commit86b84302f3657675ddee22a1f5bbeb68a55c5c98 (patch)
tree0fca9b71eff153d12b1c58883d6c494bdd8c0a3e
parentebe45f58587d8754220f28a4e0f1ced3d74124f1 (diff)
downloadffmpeg-86b84302f3657675ddee22a1f5bbeb68a55c5c98.tar.gz
avcodec/vp56rac: delay signaling an error on truncated input
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> (cherry picked from commit b6b9ac5698c8f911841b469af77199153278c55c) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> (cherry picked from commit 70fb3fa990d604211d5b24fc43cdfe31560de250) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavcodec/vp56.h5
-rw-r--r--libavcodec/vp56rac.c1
-rw-r--r--tests/ref/fate/vp52
3 files changed, 6 insertions, 2 deletions
diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h
index 456a998769..2bae30f21f 100644
--- a/libavcodec/vp56.h
+++ b/libavcodec/vp56.h
@@ -88,6 +88,7 @@ typedef struct VP56RangeCoder {
const uint8_t *buffer;
const uint8_t *end;
unsigned int code_word;
+ int end_reached;
} VP56RangeCoder;
typedef struct VP56RefDc {
@@ -231,7 +232,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)
diff --git a/libavcodec/vp56rac.c b/libavcodec/vp56rac.c
index e70302bf85..64fb6a99b4 100644
--- a/libavcodec/vp56rac.c
+++ b/libavcodec/vp56rac.c
@@ -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);
diff --git a/tests/ref/fate/vp5 b/tests/ref/fate/vp5
index 2469a3ec21..09ebe62b25 100644
--- a/tests/ref/fate/vp5
+++ b/tests/ref/fate/vp5
@@ -249,4 +249,4 @@
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