X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavcodec%2Fh264_refs.c;h=efd65f2fcec8029f0f6d9a21b3909ec241ebd183;hb=e9a2ffa117f560c0899c7a3bb373e908ae03d285;hp=0f91020a2d6de8b67316ac6f3178b86f472901e4;hpb=96c93b8ceb6c95335ed8fc743956e46dd1ccfae5;p=ffmpeg diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c index 0f91020a2d6..efd65f2fcec 100644 --- a/libavcodec/h264_refs.c +++ b/libavcodec/h264_refs.c @@ -301,7 +301,7 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h){ void ff_h264_fill_mbaff_ref_list(H264Context *h){ int list, i, j; - for(list=0; list<2; list++){ //FIXME try list_count + for(list=0; listlist_count; list++){ for(i=0; iref_count[list]; i++){ Picture *frame = &h->ref_list[list][i]; Picture *field = &h->ref_list[list][16+2*i]; @@ -479,10 +479,9 @@ static void print_long_term(H264Context *h) { void ff_generate_sliding_window_mmcos(H264Context *h) { MpegEncContext * const s = &h->s; - av_assert0(h->long_ref_count + h->short_ref_count <= h->sps.ref_frame_count); h->mmco_index= 0; - if(h->short_ref_count && h->long_ref_count + h->short_ref_count == h->sps.ref_frame_count && + if(h->short_ref_count && h->long_ref_count + h->short_ref_count >= h->sps.ref_frame_count && !(FIELD_PICTURE && !s->first_field && s->current_picture_ptr->f.reference)) { h->mmco[0].opcode= MMCO_SHORT2UNUSED; h->mmco[0].short_pic_num= h->short_ref[ h->short_ref_count - 1 ]->frame_num; @@ -655,7 +654,13 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ print_short_term(h); print_long_term(h); - return h->s.avctx->error_recognition >= FF_ER_EXPLODE ? err : 0; + + if(err >= 0 && h->long_ref_count==0 && h->short_ref_count<=2 && h->pps.ref_count[0]<=1 && s->current_picture_ptr->f.pict_type == AV_PICTURE_TYPE_I){ + h->sync |= 1; + s->current_picture_ptr->sync |= h->sync; + } + + return (h->s.avctx->err_recognition & AV_EF_EXPLODE) ? err : 0; } int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb){