diff --git a/libavcodec/h264_cabac.c b/libavcodec/h264_cabac.c index 375cf90cef..11d0e32a8e 100644 --- a/libavcodec/h264_cabac.c +++ b/libavcodec/h264_cabac.c @@ -1915,7 +1915,6 @@ int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl) int dct8x8_allowed= h->pps.transform_8x8_mode; int decode_chroma = h->sps.chroma_format_idc == 1 || h->sps.chroma_format_idc == 2; const int pixel_shift = h->pixel_shift; - unsigned local_ref_count[2]; mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride; @@ -2057,9 +2056,6 @@ decode_intra_mb: return 0; } - local_ref_count[0] = sl->ref_count[0] << MB_MBAFF(sl); - local_ref_count[1] = sl->ref_count[1] << MB_MBAFF(sl); - fill_decode_caches(h, sl, mb_type); if( IS_INTRA( mb_type ) ) { @@ -2128,10 +2124,11 @@ decode_intra_mb: for( i = 0; i < 4; i++ ) { if(IS_DIRECT(sl->sub_mb_type[i])) continue; if(IS_DIR(sl->sub_mb_type[i], 0, list)){ - if (local_ref_count[list] > 1) { + unsigned rc = sl->ref_count[list] << MB_MBAFF(sl); + if (rc > 1) { ref[list][i] = decode_cabac_mb_ref(sl, list, 4 * i); - if (ref[list][i] >= (unsigned)local_ref_count[list]) { - av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], local_ref_count[list]); + if (ref[list][i] >= rc) { + av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], rc); return -1; } }else @@ -2214,10 +2211,11 @@ decode_intra_mb: for (list = 0; list < sl->list_count; list++) { if(IS_DIR(mb_type, 0, list)){ int ref; - if (local_ref_count[list] > 1) { + unsigned rc = sl->ref_count[list] << MB_MBAFF(sl); + if (rc > 1) { ref= decode_cabac_mb_ref(sl, list, 0); - if (ref >= (unsigned)local_ref_count[list]) { - av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]); + if (ref >= rc) { + av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc); return -1; } }else @@ -2242,10 +2240,11 @@ decode_intra_mb: for(i=0; i<2; i++){ if(IS_DIR(mb_type, i, list)){ int ref; - if (local_ref_count[list] > 1) { + unsigned rc = sl->ref_count[list] << MB_MBAFF(sl); + if (rc > 1) { ref= decode_cabac_mb_ref(sl, list, 8 * i); - if (ref >= (unsigned)local_ref_count[list]) { - av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]); + if (ref >= rc) { + av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc); return -1; } }else @@ -2277,10 +2276,11 @@ decode_intra_mb: for(i=0; i<2; i++){ if(IS_DIR(mb_type, i, list)){ //FIXME optimize int ref; - if (local_ref_count[list] > 1) { + unsigned rc = sl->ref_count[list] << MB_MBAFF(sl); + if (rc > 1) { ref = decode_cabac_mb_ref(sl, list, 4 * i); - if (ref >= (unsigned)local_ref_count[list]) { - av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]); + if (ref >= rc) { + av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc); return -1; } }else