diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2016-01-03 18:48:45 +0100 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-01-04 02:30:48 +0100 |
commit | 4da2ac5c7a491b20be62ad19d77526e62aa57c69 (patch) | |
tree | 5a5cfa7f23f8333523ac47018e99f5980697d107 | |
parent | b4b13848dec5420fa5dd9e1a7d4dfae5de1932d5 (diff) | |
download | ffmpeg-4da2ac5c7a491b20be62ad19d77526e62aa57c69.tar.gz |
avcodec/h264: Fix regression caused by removial of default_ref_list
This fixes a regression of the sample from Ticket 2371
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavcodec/h264.h | 1 | ||||
-rw-r--r-- | libavcodec/h264_refs.c | 11 |
2 files changed, 10 insertions, 2 deletions
diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 5d9aecdba1..a5fc3a053f 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -669,6 +669,7 @@ typedef struct H264Context { */ int max_pic_num; + H264Ref default_ref[2]; H264Picture *short_ref[32]; H264Picture *long_ref[32]; H264Picture *delayed_pic[MAX_DELAYED_PIC_COUNT + 2]; // FIXME size? diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c index 52fedc1ad1..f42d6a2198 100644 --- a/libavcodec/h264_refs.c +++ b/libavcodec/h264_refs.c @@ -208,6 +208,8 @@ static void h264_initialise_ref_list(H264Context *h, H264SliceContext *sl) } } } + for (i = 0; i < sl->list_count; i++) + h->default_ref[i] = sl->ref_list[i][0]; } static void print_short_term(H264Context *h); @@ -351,10 +353,14 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h, H264SliceContext *sl) if ( !sl->ref_list[list][index].parent || (!FIELD_PICTURE(h) && (sl->ref_list[list][index].reference&3) != 3)) { int i; - av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture\n"); + av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture, default is %d\n", h->default_ref[list].poc); for (i = 0; i < FF_ARRAY_ELEMS(h->last_pocs); i++) h->last_pocs[i] = INT_MIN; - return -1; + if (h->default_ref[list].parent + && !(!FIELD_PICTURE(h) && (h->default_ref[list].reference&3) != 3)) + sl->ref_list[list][index] = h->default_ref[list]; + else + return -1; } av_assert0(av_buffer_get_ref_count(sl->ref_list[list][index].parent->f->buf[0]) > 0); } @@ -524,6 +530,7 @@ void ff_h264_remove_all_refs(H264Context *h) } h->short_ref_count = 0; + memset(h->default_ref, 0, sizeof(h->default_ref)); for (i = 0; i < h->nb_slice_ctx; i++) { H264SliceContext *sl = &h->slice_ctx[i]; sl->list_count = sl->ref_count[0] = sl->ref_count[1] = 0; |