summaryrefslogtreecommitdiff
path: root/libavcodec/h264_refs.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2015-12-17 19:38:24 +0100
committerAnton Khirnov <anton@khirnov.net>2016-01-01 16:09:14 +0100
commit9d74012761bc3ee676fe43321d5699e4877fde5b (patch)
tree0d3abb72b26c112f681b638bb943e3dd23658036 /libavcodec/h264_refs.c
parent40d949677335a564f769823f4afdb7e7a3da8d6b (diff)
h264: improve behaviour with invalid reference lists
Before 741b494fa8cd28a7d096349bac183893c236e3f9, when the reference list modification description was invalid, the code would substitute the corresponding reference from the initial ("default") reference list. After that commit, it will just return an error. Since there are apparently invalid samples in the wild that used to play fine with the old code, it is a good idea to re-add some sort of error resilience here. So, when the reference list modification results in a missing frame, substitute a previous reference frame for it. The relevant sample again decodes fine with the same output as previously.
Diffstat (limited to 'libavcodec/h264_refs.c')
-rw-r--r--libavcodec/h264_refs.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c
index 46b51e0bfd..877f6fe7ad 100644
--- a/libavcodec/h264_refs.c
+++ b/libavcodec/h264_refs.c
@@ -325,7 +325,10 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h, H264SliceContext *sl)
for (index = 0; index < sl->ref_count[list]; index++) {
if (!sl->ref_list[list][index].parent) {
av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture\n");
- return -1;
+ if (index == 0 || h->avctx->err_recognition & AV_EF_EXPLODE)
+ return AVERROR_INVALIDDATA;
+ else
+ sl->ref_list[list][index] = sl->ref_list[list][index - 1];
}
}
}