Commit 4da2ac5c authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/h264: Fix regression caused by removial of default_ref_list

This fixes a regression of the sample from Ticket 2371
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent b4b13848
...@@ -669,6 +669,7 @@ typedef struct H264Context { ...@@ -669,6 +669,7 @@ typedef struct H264Context {
*/ */
int max_pic_num; int max_pic_num;
H264Ref default_ref[2];
H264Picture *short_ref[32]; H264Picture *short_ref[32];
H264Picture *long_ref[32]; H264Picture *long_ref[32];
H264Picture *delayed_pic[MAX_DELAYED_PIC_COUNT + 2]; // FIXME size? H264Picture *delayed_pic[MAX_DELAYED_PIC_COUNT + 2]; // FIXME size?
......
...@@ -208,6 +208,8 @@ static void h264_initialise_ref_list(H264Context *h, H264SliceContext *sl) ...@@ -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); static void print_short_term(H264Context *h);
...@@ -351,9 +353,13 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h, H264SliceContext *sl) ...@@ -351,9 +353,13 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h, H264SliceContext *sl)
if ( !sl->ref_list[list][index].parent if ( !sl->ref_list[list][index].parent
|| (!FIELD_PICTURE(h) && (sl->ref_list[list][index].reference&3) != 3)) { || (!FIELD_PICTURE(h) && (sl->ref_list[list][index].reference&3) != 3)) {
int i; 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++) for (i = 0; i < FF_ARRAY_ELEMS(h->last_pocs); i++)
h->last_pocs[i] = INT_MIN; h->last_pocs[i] = INT_MIN;
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; return -1;
} }
av_assert0(av_buffer_get_ref_count(sl->ref_list[list][index].parent->f->buf[0]) > 0); 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) ...@@ -524,6 +530,7 @@ void ff_h264_remove_all_refs(H264Context *h)
} }
h->short_ref_count = 0; h->short_ref_count = 0;
memset(h->default_ref, 0, sizeof(h->default_ref));
for (i = 0; i < h->nb_slice_ctx; i++) { for (i = 0; i < h->nb_slice_ctx; i++) {
H264SliceContext *sl = &h->slice_ctx[i]; H264SliceContext *sl = &h->slice_ctx[i];
sl->list_count = sl->ref_count[0] = sl->ref_count[1] = 0; sl->list_count = sl->ref_count[0] = sl->ref_count[1] = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment