diff options
Diffstat (limited to 'libavcodec/h264_cavlc.c')
-rw-r--r-- | libavcodec/h264_cavlc.c | 93 |
1 files changed, 38 insertions, 55 deletions
diff --git a/libavcodec/h264_cavlc.c b/libavcodec/h264_cavlc.c index 8996057c31..6dfe2474cc 100644 --- a/libavcodec/h264_cavlc.c +++ b/libavcodec/h264_cavlc.c @@ -2,20 +2,20 @@ * H.26L/H.264/AVC/JVT/14496-10/... cavlc bitstream decoding * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -26,6 +26,7 @@ */ #define CABAC 0 +#define UNCHECKED_BITSTREAM_READER 1 #include "internal.h" #include "avcodec.h" @@ -34,9 +35,8 @@ #include "h264data.h" // FIXME FIXME FIXME #include "h264_mvpred.h" #include "golomb.h" +#include "libavutil/avassert.h" -//#undef NDEBUG -#include <assert.h> static const uint8_t golomb_to_inter_cbp_gray[16]={ 0, 1, 2, 4, 8, 3, 5,10,12,15, 7,11,13,14, 6, 9, @@ -360,7 +360,7 @@ av_cold void ff_h264_decode_init_vlc(void){ * the packed static coeff_token_vlc table sizes * were initialized correctly. */ - assert(offset == FF_ARRAY_ELEMS(coeff_token_vlc_tables)); + av_assert0(offset == FF_ARRAY_ELEMS(coeff_token_vlc_tables)); for(i=0; i<3; i++){ chroma_dc_total_zeros_vlc[i].table = chroma_dc_total_zeros_vlc_tables[i]; @@ -480,7 +480,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, in trailing_ones= coeff_token&3; tprintf(h->s.avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff); - assert(total_coeff<=16); + av_assert2(total_coeff<=16); i = show_bits(gb, 3); skip_bits(gb, trailing_ones); @@ -512,7 +512,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, in else level_code= prefix + get_bits(gb, 4); //part }else{ - level_code= 30 + get_bits(gb, prefix-3); //part + level_code= 30; if(prefix>=16){ if(prefix > 25+3){ av_log(h->s.avctx, AV_LOG_ERROR, "Invalid level prefix\n"); @@ -520,6 +520,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, in } level_code += (1<<(prefix-3))-4096; } + level_code += get_bits(gb, prefix-3); //part } if(trailing_ones < 3) level_code += 2; @@ -637,7 +638,7 @@ static av_always_inline int decode_luma_residual(H264Context *h, GetBitContext * return -1; //FIXME continue if partitioned and other return -1 too } - assert((cbp&15) == 0 || (cbp&15) == 15); + av_assert2((cbp&15) == 0 || (cbp&15) == 15); if(cbp&15){ for(i8x8=0; i8x8<4; i8x8++){ @@ -699,6 +700,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h){ 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 = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride; @@ -743,7 +745,7 @@ int ff_h264_decode_mb_cavlc(H264Context *h){ goto decode_intra_mb; } }else{ - assert(h->slice_type_nos == AV_PICTURE_TYPE_I); + av_assert2(h->slice_type_nos == AV_PICTURE_TYPE_I); if(h->slice_type == AV_PICTURE_TYPE_SI && mb_type) mb_type--; decode_intra_mb: @@ -784,6 +786,9 @@ decode_intra_mb: return 0; } + local_ref_count[0] = h->ref_count[0] << MB_MBAFF; + local_ref_count[1] = h->ref_count[1] << MB_MBAFF; + fill_decode_neighbors(h, mb_type); fill_decode_caches(h, mb_type); @@ -850,7 +855,7 @@ decode_intra_mb: h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; } }else{ - assert(h->slice_type_nos == AV_PICTURE_TYPE_P); //FIXME SP correct ? + av_assert2(h->slice_type_nos == AV_PICTURE_TYPE_P); //FIXME SP correct ? for(i=0; i<4; i++){ h->sub_mb_type[i]= get_ue_golomb_31(&s->gb); if(h->sub_mb_type[i] >=4){ @@ -863,7 +868,7 @@ decode_intra_mb: } for(list=0; list<h->list_count; list++){ - int ref_count = IS_REF0(mb_type) ? 1 : h->ref_count[list] << MB_MBAFF; + int ref_count= IS_REF0(mb_type) ? 1 : local_ref_count[list]; for(i=0; i<4; i++){ if(IS_DIRECT(h->sub_mb_type[i])) continue; if(IS_DIR(h->sub_mb_type[i], 0, list)){ @@ -943,14 +948,13 @@ decode_intra_mb: for(list=0; list<h->list_count; list++){ unsigned int val; if(IS_DIR(mb_type, 0, list)){ - int rc = h->ref_count[list] << MB_MBAFF; - if (rc == 1) { + if(local_ref_count[list]==1){ val= 0; - } else if (rc == 2) { + }else if(local_ref_count[list]==2){ val= get_bits1(&s->gb)^1; }else{ val= get_ue_golomb_31(&s->gb); - if (val >= rc) { + if(val >= local_ref_count[list]){ av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); return -1; } @@ -974,14 +978,13 @@ decode_intra_mb: for(i=0; i<2; i++){ unsigned int val; if(IS_DIR(mb_type, i, list)){ - int rc = h->ref_count[list] << MB_MBAFF; - if (rc == 1) { + if(local_ref_count[list] == 1){ val= 0; - } else if (rc == 2) { + }else if(local_ref_count[list] == 2){ val= get_bits1(&s->gb)^1; }else{ val= get_ue_golomb_31(&s->gb); - if (val >= rc) { + if(val >= local_ref_count[list]){ av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); return -1; } @@ -1007,19 +1010,18 @@ decode_intra_mb: } } }else{ - assert(IS_8X16(mb_type)); + av_assert2(IS_8X16(mb_type)); for(list=0; list<h->list_count; list++){ for(i=0; i<2; i++){ unsigned int val; if(IS_DIR(mb_type, i, list)){ //FIXME optimize - int rc = h->ref_count[list] << MB_MBAFF; - if (rc == 1) { + if(local_ref_count[list]==1){ val= 0; - } else if (rc == 2) { + }else if(local_ref_count[list]==2){ val= get_bits1(&s->gb)^1; }else{ val= get_ue_golomb_31(&s->gb); - if (val >= rc) { + if(val >= local_ref_count[list]){ av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); return -1; } @@ -1120,12 +1122,15 @@ decode_intra_mb: if( decode_luma_residual(h, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 2) < 0 ){ return -1; } - } else if (CHROMA422) { + } else { + const int num_c8x8 = h->sps.chroma_format_idc; + if(cbp&0x30){ for(chroma_idx=0; chroma_idx<2; chroma_idx++) if (decode_residual(h, gb, h->mb + ((256 + 16*16*chroma_idx) << pixel_shift), - CHROMA_DC_BLOCK_INDEX+chroma_idx, chroma422_dc_scan, - NULL, 8) < 0) { + CHROMA_DC_BLOCK_INDEX+chroma_idx, + CHROMA422 ? chroma422_dc_scan : chroma_dc_scan, + NULL, 4*num_c8x8) < 0) { return -1; } } @@ -1134,34 +1139,12 @@ decode_intra_mb: for(chroma_idx=0; chroma_idx<2; chroma_idx++){ const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[chroma_idx]]; DCTELEM *mb = h->mb + (16*(16 + 16*chroma_idx) << pixel_shift); - for (i8x8 = 0; i8x8 < 2; i8x8++) { - for (i4x4 = 0; i4x4 < 4; i4x4++) { - const int index = 16 + 16*chroma_idx + 8*i8x8 + i4x4; + for (i8x8=0; i8x8<num_c8x8; i8x8++) { + for (i4x4=0; i4x4<4; i4x4++) { + const int index= 16 + 16*chroma_idx + 8*i8x8 + i4x4; if (decode_residual(h, gb, mb, index, scan + 1, qmul, 15) < 0) return -1; - mb += 16 << pixel_shift; - } - } - } - }else{ - fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1); - fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1); - } - } else /* yuv420 */ { - if(cbp&0x30){ - for(chroma_idx=0; chroma_idx<2; chroma_idx++) - if( decode_residual(h, gb, h->mb + ((256 + 16*16*chroma_idx) << pixel_shift), CHROMA_DC_BLOCK_INDEX+chroma_idx, chroma_dc_scan, NULL, 4) < 0){ - return -1; - } - } - - if(cbp&0x20){ - for(chroma_idx=0; chroma_idx<2; chroma_idx++){ - const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[chroma_idx]]; - for(i4x4=0; i4x4<4; i4x4++){ - const int index= 16 + 16*chroma_idx + i4x4; - if( decode_residual(h, gb, h->mb + (16*index << pixel_shift), index, scan + 1, qmul, 15) < 0){ - return -1; + mb += 16<<pixel_shift; } } } |