00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00028 #define CABAC 0
00029 #define UNCHECKED_BITSTREAM_READER 1
00030
00031 #include "internal.h"
00032 #include "avcodec.h"
00033 #include "mpegvideo.h"
00034 #include "h264.h"
00035 #include "h264data.h"
00036 #include "h264_mvpred.h"
00037 #include "golomb.h"
00038
00039
00040 #include <assert.h>
00041
00042 static const uint8_t golomb_to_inter_cbp_gray[16]={
00043 0, 1, 2, 4, 8, 3, 5,10,12,15, 7,11,13,14, 6, 9,
00044 };
00045
00046 static const uint8_t golomb_to_intra4x4_cbp_gray[16]={
00047 15, 0, 7,11,13,14, 3, 5,10,12, 1, 2, 4, 8, 6, 9,
00048 };
00049
00050 static const uint8_t chroma_dc_coeff_token_len[4*5]={
00051 2, 0, 0, 0,
00052 6, 1, 0, 0,
00053 6, 6, 3, 0,
00054 6, 7, 7, 6,
00055 6, 8, 8, 7,
00056 };
00057
00058 static const uint8_t chroma_dc_coeff_token_bits[4*5]={
00059 1, 0, 0, 0,
00060 7, 1, 0, 0,
00061 4, 6, 1, 0,
00062 3, 3, 2, 5,
00063 2, 3, 2, 0,
00064 };
00065
00066 static const uint8_t chroma422_dc_coeff_token_len[4*9]={
00067 1, 0, 0, 0,
00068 7, 2, 0, 0,
00069 7, 7, 3, 0,
00070 9, 7, 7, 5,
00071 9, 9, 7, 6,
00072 10, 10, 9, 7,
00073 11, 11, 10, 7,
00074 12, 12, 11, 10,
00075 13, 12, 12, 11,
00076 };
00077
00078 static const uint8_t chroma422_dc_coeff_token_bits[4*9]={
00079 1, 0, 0, 0,
00080 15, 1, 0, 0,
00081 14, 13, 1, 0,
00082 7, 12, 11, 1,
00083 6, 5, 10, 1,
00084 7, 6, 4, 9,
00085 7, 6, 5, 8,
00086 7, 6, 5, 4,
00087 7, 5, 4, 4,
00088 };
00089
00090 static const uint8_t coeff_token_len[4][4*17]={
00091 {
00092 1, 0, 0, 0,
00093 6, 2, 0, 0, 8, 6, 3, 0, 9, 8, 7, 5, 10, 9, 8, 6,
00094 11,10, 9, 7, 13,11,10, 8, 13,13,11, 9, 13,13,13,10,
00095 14,14,13,11, 14,14,14,13, 15,15,14,14, 15,15,15,14,
00096 16,15,15,15, 16,16,16,15, 16,16,16,16, 16,16,16,16,
00097 },
00098 {
00099 2, 0, 0, 0,
00100 6, 2, 0, 0, 6, 5, 3, 0, 7, 6, 6, 4, 8, 6, 6, 4,
00101 8, 7, 7, 5, 9, 8, 8, 6, 11, 9, 9, 6, 11,11,11, 7,
00102 12,11,11, 9, 12,12,12,11, 12,12,12,11, 13,13,13,12,
00103 13,13,13,13, 13,14,13,13, 14,14,14,13, 14,14,14,14,
00104 },
00105 {
00106 4, 0, 0, 0,
00107 6, 4, 0, 0, 6, 5, 4, 0, 6, 5, 5, 4, 7, 5, 5, 4,
00108 7, 5, 5, 4, 7, 6, 6, 4, 7, 6, 6, 4, 8, 7, 7, 5,
00109 8, 8, 7, 6, 9, 8, 8, 7, 9, 9, 8, 8, 9, 9, 9, 8,
00110 10, 9, 9, 9, 10,10,10,10, 10,10,10,10, 10,10,10,10,
00111 },
00112 {
00113 6, 0, 0, 0,
00114 6, 6, 0, 0, 6, 6, 6, 0, 6, 6, 6, 6, 6, 6, 6, 6,
00115 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
00116 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
00117 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
00118 }
00119 };
00120
00121 static const uint8_t coeff_token_bits[4][4*17]={
00122 {
00123 1, 0, 0, 0,
00124 5, 1, 0, 0, 7, 4, 1, 0, 7, 6, 5, 3, 7, 6, 5, 3,
00125 7, 6, 5, 4, 15, 6, 5, 4, 11,14, 5, 4, 8,10,13, 4,
00126 15,14, 9, 4, 11,10,13,12, 15,14, 9,12, 11,10,13, 8,
00127 15, 1, 9,12, 11,14,13, 8, 7,10, 9,12, 4, 6, 5, 8,
00128 },
00129 {
00130 3, 0, 0, 0,
00131 11, 2, 0, 0, 7, 7, 3, 0, 7,10, 9, 5, 7, 6, 5, 4,
00132 4, 6, 5, 6, 7, 6, 5, 8, 15, 6, 5, 4, 11,14,13, 4,
00133 15,10, 9, 4, 11,14,13,12, 8,10, 9, 8, 15,14,13,12,
00134 11,10, 9,12, 7,11, 6, 8, 9, 8,10, 1, 7, 6, 5, 4,
00135 },
00136 {
00137 15, 0, 0, 0,
00138 15,14, 0, 0, 11,15,13, 0, 8,12,14,12, 15,10,11,11,
00139 11, 8, 9,10, 9,14,13, 9, 8,10, 9, 8, 15,14,13,13,
00140 11,14,10,12, 15,10,13,12, 11,14, 9,12, 8,10,13, 8,
00141 13, 7, 9,12, 9,12,11,10, 5, 8, 7, 6, 1, 4, 3, 2,
00142 },
00143 {
00144 3, 0, 0, 0,
00145 0, 1, 0, 0, 4, 5, 6, 0, 8, 9,10,11, 12,13,14,15,
00146 16,17,18,19, 20,21,22,23, 24,25,26,27, 28,29,30,31,
00147 32,33,34,35, 36,37,38,39, 40,41,42,43, 44,45,46,47,
00148 48,49,50,51, 52,53,54,55, 56,57,58,59, 60,61,62,63,
00149 }
00150 };
00151
00152 static const uint8_t total_zeros_len[16][16]= {
00153 {1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
00154 {3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
00155 {4,3,3,3,4,4,3,3,4,5,5,6,5,6},
00156 {5,3,4,4,3,3,3,4,3,4,5,5,5},
00157 {4,4,4,3,3,3,3,3,4,5,4,5},
00158 {6,5,3,3,3,3,3,3,4,3,6},
00159 {6,5,3,3,3,2,3,4,3,6},
00160 {6,4,5,3,2,2,3,3,6},
00161 {6,6,4,2,2,3,2,5},
00162 {5,5,3,2,2,2,4},
00163 {4,4,3,3,1,3},
00164 {4,4,2,1,3},
00165 {3,3,1,2},
00166 {2,2,1},
00167 {1,1},
00168 };
00169
00170 static const uint8_t total_zeros_bits[16][16]= {
00171 {1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},
00172 {7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},
00173 {5,7,6,5,4,3,4,3,2,3,2,1,1,0},
00174 {3,7,5,4,6,5,4,3,3,2,2,1,0},
00175 {5,4,3,7,6,5,4,3,2,1,1,0},
00176 {1,1,7,6,5,4,3,2,1,1,0},
00177 {1,1,5,4,3,3,2,1,1,0},
00178 {1,1,1,3,3,2,2,1,0},
00179 {1,0,1,3,2,1,1,1},
00180 {1,0,1,3,2,1,1},
00181 {0,1,1,2,1,3},
00182 {0,1,1,1,1},
00183 {0,1,1,1},
00184 {0,1,1},
00185 {0,1},
00186 };
00187
00188 static const uint8_t chroma_dc_total_zeros_len[3][4]= {
00189 { 1, 2, 3, 3,},
00190 { 1, 2, 2, 0,},
00191 { 1, 1, 0, 0,},
00192 };
00193
00194 static const uint8_t chroma_dc_total_zeros_bits[3][4]= {
00195 { 1, 1, 1, 0,},
00196 { 1, 1, 0, 0,},
00197 { 1, 0, 0, 0,},
00198 };
00199
00200 static const uint8_t chroma422_dc_total_zeros_len[7][8]= {
00201 { 1, 3, 3, 4, 4, 4, 5, 5 },
00202 { 3, 2, 3, 3, 3, 3, 3 },
00203 { 3, 3, 2, 2, 3, 3 },
00204 { 3, 2, 2, 2, 3 },
00205 { 2, 2, 2, 2 },
00206 { 2, 2, 1 },
00207 { 1, 1 },
00208 };
00209
00210 static const uint8_t chroma422_dc_total_zeros_bits[7][8]= {
00211 { 1, 2, 3, 2, 3, 1, 1, 0 },
00212 { 0, 1, 1, 4, 5, 6, 7 },
00213 { 0, 1, 1, 2, 6, 7 },
00214 { 6, 0, 1, 2, 7 },
00215 { 0, 1, 2, 3 },
00216 { 0, 1, 1 },
00217 { 0, 1 },
00218 };
00219
00220 static const uint8_t run_len[7][16]={
00221 {1,1},
00222 {1,2,2},
00223 {2,2,2,2},
00224 {2,2,2,3,3},
00225 {2,2,3,3,3,3},
00226 {2,3,3,3,3,3,3},
00227 {3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},
00228 };
00229
00230 static const uint8_t run_bits[7][16]={
00231 {1,0},
00232 {1,1,0},
00233 {3,2,1,0},
00234 {3,2,1,1,0},
00235 {3,2,3,2,1,0},
00236 {3,0,1,3,2,5,4},
00237 {7,6,5,4,3,2,1,1,1,1,1,1,1,1,1},
00238 };
00239
00240 static VLC coeff_token_vlc[4];
00241 static VLC_TYPE coeff_token_vlc_tables[520+332+280+256][2];
00242 static const int coeff_token_vlc_tables_size[4]={520,332,280,256};
00243
00244 static VLC chroma_dc_coeff_token_vlc;
00245 static VLC_TYPE chroma_dc_coeff_token_vlc_table[256][2];
00246 static const int chroma_dc_coeff_token_vlc_table_size = 256;
00247
00248 static VLC chroma422_dc_coeff_token_vlc;
00249 static VLC_TYPE chroma422_dc_coeff_token_vlc_table[8192][2];
00250 static const int chroma422_dc_coeff_token_vlc_table_size = 8192;
00251
00252 static VLC total_zeros_vlc[15];
00253 static VLC_TYPE total_zeros_vlc_tables[15][512][2];
00254 static const int total_zeros_vlc_tables_size = 512;
00255
00256 static VLC chroma_dc_total_zeros_vlc[3];
00257 static VLC_TYPE chroma_dc_total_zeros_vlc_tables[3][8][2];
00258 static const int chroma_dc_total_zeros_vlc_tables_size = 8;
00259
00260 static VLC chroma422_dc_total_zeros_vlc[7];
00261 static VLC_TYPE chroma422_dc_total_zeros_vlc_tables[7][32][2];
00262 static const int chroma422_dc_total_zeros_vlc_tables_size = 32;
00263
00264 static VLC run_vlc[6];
00265 static VLC_TYPE run_vlc_tables[6][8][2];
00266 static const int run_vlc_tables_size = 8;
00267
00268 static VLC run7_vlc;
00269 static VLC_TYPE run7_vlc_table[96][2];
00270 static const int run7_vlc_table_size = 96;
00271
00272 #define LEVEL_TAB_BITS 8
00273 static int8_t cavlc_level_tab[7][1<<LEVEL_TAB_BITS][2];
00274
00275 #define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
00276 #define CHROMA422_DC_COEFF_TOKEN_VLC_BITS 13
00277 #define COEFF_TOKEN_VLC_BITS 8
00278 #define TOTAL_ZEROS_VLC_BITS 9
00279 #define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
00280 #define CHROMA422_DC_TOTAL_ZEROS_VLC_BITS 5
00281 #define RUN_VLC_BITS 3
00282 #define RUN7_VLC_BITS 6
00283
00288 static inline int pred_non_zero_count(H264Context *h, int n){
00289 const int index8= scan8[n];
00290 const int left= h->non_zero_count_cache[index8 - 1];
00291 const int top = h->non_zero_count_cache[index8 - 8];
00292 int i= left + top;
00293
00294 if(i<64) i= (i+1)>>1;
00295
00296 tprintf(h->s.avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31);
00297
00298 return i&31;
00299 }
00300
00301 static av_cold void init_cavlc_level_tab(void){
00302 int suffix_length;
00303 unsigned int i;
00304
00305 for(suffix_length=0; suffix_length<7; suffix_length++){
00306 for(i=0; i<(1<<LEVEL_TAB_BITS); i++){
00307 int prefix= LEVEL_TAB_BITS - av_log2(2*i);
00308
00309 if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){
00310 int level_code = (prefix << suffix_length) +
00311 (i >> (av_log2(i) - suffix_length)) - (1 << suffix_length);
00312 int mask = -(level_code&1);
00313 level_code = (((2 + level_code) >> 1) ^ mask) - mask;
00314 cavlc_level_tab[suffix_length][i][0]= level_code;
00315 cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length;
00316 }else if(prefix + 1 <= LEVEL_TAB_BITS){
00317 cavlc_level_tab[suffix_length][i][0]= prefix+100;
00318 cavlc_level_tab[suffix_length][i][1]= prefix + 1;
00319 }else{
00320 cavlc_level_tab[suffix_length][i][0]= LEVEL_TAB_BITS+100;
00321 cavlc_level_tab[suffix_length][i][1]= LEVEL_TAB_BITS;
00322 }
00323 }
00324 }
00325 }
00326
00327 av_cold void ff_h264_decode_init_vlc(void){
00328 static int done = 0;
00329
00330 if (!done) {
00331 int i;
00332 int offset;
00333 done = 1;
00334
00335 chroma_dc_coeff_token_vlc.table = chroma_dc_coeff_token_vlc_table;
00336 chroma_dc_coeff_token_vlc.table_allocated = chroma_dc_coeff_token_vlc_table_size;
00337 init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5,
00338 &chroma_dc_coeff_token_len [0], 1, 1,
00339 &chroma_dc_coeff_token_bits[0], 1, 1,
00340 INIT_VLC_USE_NEW_STATIC);
00341
00342 chroma422_dc_coeff_token_vlc.table = chroma422_dc_coeff_token_vlc_table;
00343 chroma422_dc_coeff_token_vlc.table_allocated = chroma422_dc_coeff_token_vlc_table_size;
00344 init_vlc(&chroma422_dc_coeff_token_vlc, CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 4*9,
00345 &chroma422_dc_coeff_token_len [0], 1, 1,
00346 &chroma422_dc_coeff_token_bits[0], 1, 1,
00347 INIT_VLC_USE_NEW_STATIC);
00348
00349 offset = 0;
00350 for(i=0; i<4; i++){
00351 coeff_token_vlc[i].table = coeff_token_vlc_tables+offset;
00352 coeff_token_vlc[i].table_allocated = coeff_token_vlc_tables_size[i];
00353 init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17,
00354 &coeff_token_len [i][0], 1, 1,
00355 &coeff_token_bits[i][0], 1, 1,
00356 INIT_VLC_USE_NEW_STATIC);
00357 offset += coeff_token_vlc_tables_size[i];
00358 }
00359
00360
00361
00362
00363
00364 assert(offset == FF_ARRAY_ELEMS(coeff_token_vlc_tables));
00365
00366 for(i=0; i<3; i++){
00367 chroma_dc_total_zeros_vlc[i].table = chroma_dc_total_zeros_vlc_tables[i];
00368 chroma_dc_total_zeros_vlc[i].table_allocated = chroma_dc_total_zeros_vlc_tables_size;
00369 init_vlc(&chroma_dc_total_zeros_vlc[i],
00370 CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
00371 &chroma_dc_total_zeros_len [i][0], 1, 1,
00372 &chroma_dc_total_zeros_bits[i][0], 1, 1,
00373 INIT_VLC_USE_NEW_STATIC);
00374 }
00375
00376 for(i=0; i<7; i++){
00377 chroma422_dc_total_zeros_vlc[i].table = chroma422_dc_total_zeros_vlc_tables[i];
00378 chroma422_dc_total_zeros_vlc[i].table_allocated = chroma422_dc_total_zeros_vlc_tables_size;
00379 init_vlc(&chroma422_dc_total_zeros_vlc[i],
00380 CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 8,
00381 &chroma422_dc_total_zeros_len [i][0], 1, 1,
00382 &chroma422_dc_total_zeros_bits[i][0], 1, 1,
00383 INIT_VLC_USE_NEW_STATIC);
00384 }
00385
00386 for(i=0; i<15; i++){
00387 total_zeros_vlc[i].table = total_zeros_vlc_tables[i];
00388 total_zeros_vlc[i].table_allocated = total_zeros_vlc_tables_size;
00389 init_vlc(&total_zeros_vlc[i],
00390 TOTAL_ZEROS_VLC_BITS, 16,
00391 &total_zeros_len [i][0], 1, 1,
00392 &total_zeros_bits[i][0], 1, 1,
00393 INIT_VLC_USE_NEW_STATIC);
00394 }
00395
00396 for(i=0; i<6; i++){
00397 run_vlc[i].table = run_vlc_tables[i];
00398 run_vlc[i].table_allocated = run_vlc_tables_size;
00399 init_vlc(&run_vlc[i],
00400 RUN_VLC_BITS, 7,
00401 &run_len [i][0], 1, 1,
00402 &run_bits[i][0], 1, 1,
00403 INIT_VLC_USE_NEW_STATIC);
00404 }
00405 run7_vlc.table = run7_vlc_table,
00406 run7_vlc.table_allocated = run7_vlc_table_size;
00407 init_vlc(&run7_vlc, RUN7_VLC_BITS, 16,
00408 &run_len [6][0], 1, 1,
00409 &run_bits[6][0], 1, 1,
00410 INIT_VLC_USE_NEW_STATIC);
00411
00412 init_cavlc_level_tab();
00413 }
00414 }
00415
00419 static inline int get_level_prefix(GetBitContext *gb){
00420 unsigned int buf;
00421 int log;
00422
00423 OPEN_READER(re, gb);
00424 UPDATE_CACHE(re, gb);
00425 buf=GET_CACHE(re, gb);
00426
00427 log= 32 - av_log2(buf);
00428 #ifdef TRACE
00429 print_bin(buf>>(32-log), log);
00430 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d lpr @%5d in %s get_level_prefix\n", buf>>(32-log), log, log-1, get_bits_count(gb), __FILE__);
00431 #endif
00432
00433 LAST_SKIP_BITS(re, gb, log);
00434 CLOSE_READER(re, gb);
00435
00436 return log-1;
00437 }
00438
00446 static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff){
00447 MpegEncContext * const s = &h->s;
00448 static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3};
00449 int level[16];
00450 int zeros_left, coeff_token, total_coeff, i, trailing_ones, run_before;
00451
00452
00453
00454 if(max_coeff <= 8){
00455 if (max_coeff == 4)
00456 coeff_token = get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1);
00457 else
00458 coeff_token = get_vlc2(gb, chroma422_dc_coeff_token_vlc.table, CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 1);
00459 total_coeff= coeff_token>>2;
00460 }else{
00461 if(n >= LUMA_DC_BLOCK_INDEX){
00462 total_coeff= pred_non_zero_count(h, (n - LUMA_DC_BLOCK_INDEX)*16);
00463 coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
00464 total_coeff= coeff_token>>2;
00465 }else{
00466 total_coeff= pred_non_zero_count(h, n);
00467 coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
00468 total_coeff= coeff_token>>2;
00469 }
00470 }
00471 h->non_zero_count_cache[ scan8[n] ]= total_coeff;
00472
00473
00474
00475 if(total_coeff==0)
00476 return 0;
00477 if(total_coeff > (unsigned)max_coeff) {
00478 av_log(h->s.avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", s->mb_x, s->mb_y, total_coeff);
00479 return -1;
00480 }
00481
00482 trailing_ones= coeff_token&3;
00483 tprintf(h->s.avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff);
00484 assert(total_coeff<=16);
00485
00486 i = show_bits(gb, 3);
00487 skip_bits(gb, trailing_ones);
00488 level[0] = 1-((i&4)>>1);
00489 level[1] = 1-((i&2) );
00490 level[2] = 1-((i&1)<<1);
00491
00492 if(trailing_ones<total_coeff) {
00493 int mask, prefix;
00494 int suffix_length = total_coeff > 10 & trailing_ones < 3;
00495 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
00496 int level_code= cavlc_level_tab[suffix_length][bitsi][0];
00497
00498 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
00499 if(level_code >= 100){
00500 prefix= level_code - 100;
00501 if(prefix == LEVEL_TAB_BITS)
00502 prefix += get_level_prefix(gb);
00503
00504
00505 if(prefix<14){
00506 if(suffix_length)
00507 level_code= (prefix<<1) + get_bits1(gb);
00508 else
00509 level_code= prefix;
00510 }else if(prefix==14){
00511 if(suffix_length)
00512 level_code= (prefix<<1) + get_bits1(gb);
00513 else
00514 level_code= prefix + get_bits(gb, 4);
00515 }else{
00516 level_code= 30;
00517 if(prefix>=16){
00518 if(prefix > 25+3){
00519 av_log(h->s.avctx, AV_LOG_ERROR, "Invalid level prefix\n");
00520 return -1;
00521 }
00522 level_code += (1<<(prefix-3))-4096;
00523 }
00524 level_code += get_bits(gb, prefix-3);
00525 }
00526
00527 if(trailing_ones < 3) level_code += 2;
00528
00529 suffix_length = 2;
00530 mask= -(level_code&1);
00531 level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask;
00532 }else{
00533 level_code += ((level_code>>31)|1) & -(trailing_ones < 3);
00534
00535 suffix_length = 1 + (level_code + 3U > 6U);
00536 level[trailing_ones]= level_code;
00537 }
00538
00539
00540 for(i=trailing_ones+1;i<total_coeff;i++) {
00541 static const unsigned int suffix_limit[7] = {0,3,6,12,24,48,INT_MAX };
00542 int bitsi= show_bits(gb, LEVEL_TAB_BITS);
00543 level_code= cavlc_level_tab[suffix_length][bitsi][0];
00544
00545 skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
00546 if(level_code >= 100){
00547 prefix= level_code - 100;
00548 if(prefix == LEVEL_TAB_BITS){
00549 prefix += get_level_prefix(gb);
00550 }
00551 if(prefix<15){
00552 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
00553 }else{
00554 level_code = (15<<suffix_length) + get_bits(gb, prefix-3);
00555 if(prefix>=16)
00556 level_code += (1<<(prefix-3))-4096;
00557 }
00558 mask= -(level_code&1);
00559 level_code= (((2+level_code)>>1) ^ mask) - mask;
00560 }
00561 level[i]= level_code;
00562 suffix_length+= suffix_limit[suffix_length] + level_code > 2U*suffix_limit[suffix_length];
00563 }
00564 }
00565
00566 if(total_coeff == max_coeff)
00567 zeros_left=0;
00568 else{
00569 if (max_coeff <= 8) {
00570 if (max_coeff == 4)
00571 zeros_left = get_vlc2(gb, (chroma_dc_total_zeros_vlc-1)[total_coeff].table,
00572 CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1);
00573 else
00574 zeros_left = get_vlc2(gb, (chroma422_dc_total_zeros_vlc-1)[total_coeff].table,
00575 CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 1);
00576 } else {
00577 zeros_left= get_vlc2(gb, (total_zeros_vlc-1)[ total_coeff ].table, TOTAL_ZEROS_VLC_BITS, 1);
00578 }
00579 }
00580
00581 #define STORE_BLOCK(type) \
00582 scantable += zeros_left + total_coeff - 1; \
00583 if(n >= LUMA_DC_BLOCK_INDEX){ \
00584 ((type*)block)[*scantable] = level[0]; \
00585 for(i=1;i<total_coeff && zeros_left > 0;i++) { \
00586 if(zeros_left < 7) \
00587 run_before= get_vlc2(gb, (run_vlc-1)[zeros_left].table, RUN_VLC_BITS, 1); \
00588 else \
00589 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); \
00590 zeros_left -= run_before; \
00591 scantable -= 1 + run_before; \
00592 ((type*)block)[*scantable]= level[i]; \
00593 } \
00594 for(;i<total_coeff;i++) { \
00595 scantable--; \
00596 ((type*)block)[*scantable]= level[i]; \
00597 } \
00598 }else{ \
00599 ((type*)block)[*scantable] = ((int)(level[0] * qmul[*scantable] + 32))>>6; \
00600 for(i=1;i<total_coeff && zeros_left > 0;i++) { \
00601 if(zeros_left < 7) \
00602 run_before= get_vlc2(gb, (run_vlc-1)[zeros_left].table, RUN_VLC_BITS, 1); \
00603 else \
00604 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); \
00605 zeros_left -= run_before; \
00606 scantable -= 1 + run_before; \
00607 ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \
00608 } \
00609 for(;i<total_coeff;i++) { \
00610 scantable--; \
00611 ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \
00612 } \
00613 }
00614
00615 if (h->pixel_shift) {
00616 STORE_BLOCK(int32_t)
00617 } else {
00618 STORE_BLOCK(int16_t)
00619 }
00620
00621 if(zeros_left<0){
00622 av_log(h->s.avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", s->mb_x, s->mb_y);
00623 return -1;
00624 }
00625
00626 return 0;
00627 }
00628
00629 static av_always_inline int decode_luma_residual(H264Context *h, GetBitContext *gb, const uint8_t *scan, const uint8_t *scan8x8, int pixel_shift, int mb_type, int cbp, int p){
00630 int i4x4, i8x8;
00631 MpegEncContext * const s = &h->s;
00632 int qscale = p == 0 ? s->qscale : h->chroma_qp[p-1];
00633 if(IS_INTRA16x16(mb_type)){
00634 AV_ZERO128(h->mb_luma_dc[p]+0);
00635 AV_ZERO128(h->mb_luma_dc[p]+8);
00636 AV_ZERO128(h->mb_luma_dc[p]+16);
00637 AV_ZERO128(h->mb_luma_dc[p]+24);
00638 if( decode_residual(h, h->intra_gb_ptr, h->mb_luma_dc[p], LUMA_DC_BLOCK_INDEX+p, scan, NULL, 16) < 0){
00639 return -1;
00640 }
00641
00642 assert((cbp&15) == 0 || (cbp&15) == 15);
00643
00644 if(cbp&15){
00645 for(i8x8=0; i8x8<4; i8x8++){
00646 for(i4x4=0; i4x4<4; i4x4++){
00647 const int index= i4x4 + 4*i8x8 + p*16;
00648 if( decode_residual(h, h->intra_gb_ptr, h->mb + (16*index << pixel_shift),
00649 index, scan + 1, h->dequant4_coeff[p][qscale], 15) < 0 ){
00650 return -1;
00651 }
00652 }
00653 }
00654 return 0xf;
00655 }else{
00656 fill_rectangle(&h->non_zero_count_cache[scan8[p*16]], 4, 4, 8, 0, 1);
00657 return 0;
00658 }
00659 }else{
00660 int cqm = (IS_INTRA( mb_type ) ? 0:3)+p;
00661
00662 int new_cbp = 0;
00663 for(i8x8=0; i8x8<4; i8x8++){
00664 if(cbp & (1<<i8x8)){
00665 if(IS_8x8DCT(mb_type)){
00666 DCTELEM *buf = &h->mb[64*i8x8+256*p << pixel_shift];
00667 uint8_t *nnz;
00668 for(i4x4=0; i4x4<4; i4x4++){
00669 const int index= i4x4 + 4*i8x8 + p*16;
00670 if( decode_residual(h, gb, buf, index, scan8x8+16*i4x4,
00671 h->dequant8_coeff[cqm][qscale], 16) < 0 )
00672 return -1;
00673 }
00674 nnz= &h->non_zero_count_cache[ scan8[4*i8x8+p*16] ];
00675 nnz[0] += nnz[1] + nnz[8] + nnz[9];
00676 new_cbp |= !!nnz[0] << i8x8;
00677 }else{
00678 for(i4x4=0; i4x4<4; i4x4++){
00679 const int index= i4x4 + 4*i8x8 + p*16;
00680 if( decode_residual(h, gb, h->mb + (16*index << pixel_shift), index,
00681 scan, h->dequant4_coeff[cqm][qscale], 16) < 0 ){
00682 return -1;
00683 }
00684 new_cbp |= h->non_zero_count_cache[ scan8[index] ] << i8x8;
00685 }
00686 }
00687 }else{
00688 uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8+p*16] ];
00689 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
00690 }
00691 }
00692 return new_cbp;
00693 }
00694 }
00695
00696 int ff_h264_decode_mb_cavlc(H264Context *h){
00697 MpegEncContext * const s = &h->s;
00698 int mb_xy;
00699 int partition_count;
00700 unsigned int mb_type, cbp;
00701 int dct8x8_allowed= h->pps.transform_8x8_mode;
00702 int decode_chroma = h->sps.chroma_format_idc == 1 || h->sps.chroma_format_idc == 2;
00703 const int pixel_shift = h->pixel_shift;
00704
00705 mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
00706
00707 tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
00708 cbp = 0;
00709
00710 if(h->slice_type_nos != AV_PICTURE_TYPE_I){
00711 if(s->mb_skip_run==-1)
00712 s->mb_skip_run= get_ue_golomb(&s->gb);
00713
00714 if (s->mb_skip_run--) {
00715 if(FRAME_MBAFF && (s->mb_y&1) == 0){
00716 if(s->mb_skip_run==0)
00717 h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb);
00718 }
00719 decode_mb_skip(h);
00720 return 0;
00721 }
00722 }
00723 if(FRAME_MBAFF){
00724 if( (s->mb_y&1) == 0 )
00725 h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb);
00726 }
00727
00728 h->prev_mb_skipped= 0;
00729
00730 mb_type= get_ue_golomb(&s->gb);
00731 if(h->slice_type_nos == AV_PICTURE_TYPE_B){
00732 if(mb_type < 23){
00733 partition_count= b_mb_type_info[mb_type].partition_count;
00734 mb_type= b_mb_type_info[mb_type].type;
00735 }else{
00736 mb_type -= 23;
00737 goto decode_intra_mb;
00738 }
00739 }else if(h->slice_type_nos == AV_PICTURE_TYPE_P){
00740 if(mb_type < 5){
00741 partition_count= p_mb_type_info[mb_type].partition_count;
00742 mb_type= p_mb_type_info[mb_type].type;
00743 }else{
00744 mb_type -= 5;
00745 goto decode_intra_mb;
00746 }
00747 }else{
00748 assert(h->slice_type_nos == AV_PICTURE_TYPE_I);
00749 if(h->slice_type == AV_PICTURE_TYPE_SI && mb_type)
00750 mb_type--;
00751 decode_intra_mb:
00752 if(mb_type > 25){
00753 av_log(h->s.avctx, AV_LOG_ERROR, "mb_type %d in %c slice too large at %d %d\n", mb_type, av_get_picture_type_char(h->slice_type), s->mb_x, s->mb_y);
00754 return -1;
00755 }
00756 partition_count=0;
00757 cbp= i_mb_type_info[mb_type].cbp;
00758 h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
00759 mb_type= i_mb_type_info[mb_type].type;
00760 }
00761
00762 if(MB_FIELD)
00763 mb_type |= MB_TYPE_INTERLACED;
00764
00765 h->slice_table[ mb_xy ]= h->slice_num;
00766
00767 if(IS_INTRA_PCM(mb_type)){
00768 unsigned int x;
00769 const int mb_size = ff_h264_mb_sizes[h->sps.chroma_format_idc] *
00770 h->sps.bit_depth_luma >> 3;
00771
00772
00773 align_get_bits(&s->gb);
00774
00775
00776 for(x=0; x < mb_size; x++){
00777 ((uint8_t*)h->mb)[x]= get_bits(&s->gb, 8);
00778 }
00779
00780
00781 s->current_picture.f.qscale_table[mb_xy] = 0;
00782
00783 memset(h->non_zero_count[mb_xy], 16, 48);
00784
00785 s->current_picture.f.mb_type[mb_xy] = mb_type;
00786 return 0;
00787 }
00788
00789 if(MB_MBAFF){
00790 h->ref_count[0] <<= 1;
00791 h->ref_count[1] <<= 1;
00792 }
00793
00794 fill_decode_neighbors(h, mb_type);
00795 fill_decode_caches(h, mb_type);
00796
00797
00798 if(IS_INTRA(mb_type)){
00799 int pred_mode;
00800
00801 if(IS_INTRA4x4(mb_type)){
00802 int i;
00803 int di = 1;
00804 if(dct8x8_allowed && get_bits1(&s->gb)){
00805 mb_type |= MB_TYPE_8x8DCT;
00806 di = 4;
00807 }
00808
00809
00810 for(i=0; i<16; i+=di){
00811 int mode= pred_intra_mode(h, i);
00812
00813 if(!get_bits1(&s->gb)){
00814 const int rem_mode= get_bits(&s->gb, 3);
00815 mode = rem_mode + (rem_mode >= mode);
00816 }
00817
00818 if(di==4)
00819 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
00820 else
00821 h->intra4x4_pred_mode_cache[ scan8[i] ] = mode;
00822 }
00823 write_back_intra_pred_mode(h);
00824 if( ff_h264_check_intra4x4_pred_mode(h) < 0)
00825 return -1;
00826 }else{
00827 h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode(h, h->intra16x16_pred_mode, 0);
00828 if(h->intra16x16_pred_mode < 0)
00829 return -1;
00830 }
00831 if(decode_chroma){
00832 pred_mode= ff_h264_check_intra_pred_mode(h, get_ue_golomb_31(&s->gb), 1);
00833 if(pred_mode < 0)
00834 return -1;
00835 h->chroma_pred_mode= pred_mode;
00836 } else {
00837 h->chroma_pred_mode = DC_128_PRED8x8;
00838 }
00839 }else if(partition_count==4){
00840 int i, j, sub_partition_count[4], list, ref[2][4];
00841
00842 if(h->slice_type_nos == AV_PICTURE_TYPE_B){
00843 for(i=0; i<4; i++){
00844 h->sub_mb_type[i]= get_ue_golomb_31(&s->gb);
00845 if(h->sub_mb_type[i] >=13){
00846 av_log(h->s.avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y);
00847 return -1;
00848 }
00849 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
00850 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
00851 }
00852 if( IS_DIRECT(h->sub_mb_type[0]|h->sub_mb_type[1]|h->sub_mb_type[2]|h->sub_mb_type[3])) {
00853 ff_h264_pred_direct_motion(h, &mb_type);
00854 h->ref_cache[0][scan8[4]] =
00855 h->ref_cache[1][scan8[4]] =
00856 h->ref_cache[0][scan8[12]] =
00857 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
00858 }
00859 }else{
00860 assert(h->slice_type_nos == AV_PICTURE_TYPE_P);
00861 for(i=0; i<4; i++){
00862 h->sub_mb_type[i]= get_ue_golomb_31(&s->gb);
00863 if(h->sub_mb_type[i] >=4){
00864 av_log(h->s.avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y);
00865 return -1;
00866 }
00867 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
00868 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
00869 }
00870 }
00871
00872 for(list=0; list<h->list_count; list++){
00873 int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list];
00874 for(i=0; i<4; i++){
00875 if(IS_DIRECT(h->sub_mb_type[i])) continue;
00876 if(IS_DIR(h->sub_mb_type[i], 0, list)){
00877 unsigned int tmp;
00878 if(ref_count == 1){
00879 tmp= 0;
00880 }else if(ref_count == 2){
00881 tmp= get_bits1(&s->gb)^1;
00882 }else{
00883 tmp= get_ue_golomb_31(&s->gb);
00884 if(tmp>=ref_count){
00885 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp);
00886 return -1;
00887 }
00888 }
00889 ref[list][i]= tmp;
00890 }else{
00891
00892 ref[list][i] = -1;
00893 }
00894 }
00895 }
00896
00897 if(dct8x8_allowed)
00898 dct8x8_allowed = get_dct8x8_allowed(h);
00899
00900 for(list=0; list<h->list_count; list++){
00901 for(i=0; i<4; i++){
00902 if(IS_DIRECT(h->sub_mb_type[i])) {
00903 h->ref_cache[list][ scan8[4*i] ] = h->ref_cache[list][ scan8[4*i]+1 ];
00904 continue;
00905 }
00906 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ]=
00907 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
00908
00909 if(IS_DIR(h->sub_mb_type[i], 0, list)){
00910 const int sub_mb_type= h->sub_mb_type[i];
00911 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
00912 for(j=0; j<sub_partition_count[i]; j++){
00913 int mx, my;
00914 const int index= 4*i + block_width*j;
00915 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
00916 pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
00917 mx += get_se_golomb(&s->gb);
00918 my += get_se_golomb(&s->gb);
00919 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
00920
00921 if(IS_SUB_8X8(sub_mb_type)){
00922 mv_cache[ 1 ][0]=
00923 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
00924 mv_cache[ 1 ][1]=
00925 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
00926 }else if(IS_SUB_8X4(sub_mb_type)){
00927 mv_cache[ 1 ][0]= mx;
00928 mv_cache[ 1 ][1]= my;
00929 }else if(IS_SUB_4X8(sub_mb_type)){
00930 mv_cache[ 8 ][0]= mx;
00931 mv_cache[ 8 ][1]= my;
00932 }
00933 mv_cache[ 0 ][0]= mx;
00934 mv_cache[ 0 ][1]= my;
00935 }
00936 }else{
00937 uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
00938 p[0] = p[1]=
00939 p[8] = p[9]= 0;
00940 }
00941 }
00942 }
00943 }else if(IS_DIRECT(mb_type)){
00944 ff_h264_pred_direct_motion(h, &mb_type);
00945 dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
00946 }else{
00947 int list, mx, my, i;
00948
00949 if(IS_16X16(mb_type)){
00950 for(list=0; list<h->list_count; list++){
00951 unsigned int val;
00952 if(IS_DIR(mb_type, 0, list)){
00953 if(h->ref_count[list]==1){
00954 val= 0;
00955 }else if(h->ref_count[list]==2){
00956 val= get_bits1(&s->gb)^1;
00957 }else{
00958 val= get_ue_golomb_31(&s->gb);
00959 if(val >= h->ref_count[list]){
00960 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
00961 return -1;
00962 }
00963 }
00964 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1);
00965 }
00966 }
00967 for(list=0; list<h->list_count; list++){
00968 if(IS_DIR(mb_type, 0, list)){
00969 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
00970 mx += get_se_golomb(&s->gb);
00971 my += get_se_golomb(&s->gb);
00972 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
00973
00974 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
00975 }
00976 }
00977 }
00978 else if(IS_16X8(mb_type)){
00979 for(list=0; list<h->list_count; list++){
00980 for(i=0; i<2; i++){
00981 unsigned int val;
00982 if(IS_DIR(mb_type, i, list)){
00983 if(h->ref_count[list] == 1){
00984 val= 0;
00985 }else if(h->ref_count[list] == 2){
00986 val= get_bits1(&s->gb)^1;
00987 }else{
00988 val= get_ue_golomb_31(&s->gb);
00989 if(val >= h->ref_count[list]){
00990 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
00991 return -1;
00992 }
00993 }
00994 }else
00995 val= LIST_NOT_USED&0xFF;
00996 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1);
00997 }
00998 }
00999 for(list=0; list<h->list_count; list++){
01000 for(i=0; i<2; i++){
01001 unsigned int val;
01002 if(IS_DIR(mb_type, i, list)){
01003 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
01004 mx += get_se_golomb(&s->gb);
01005 my += get_se_golomb(&s->gb);
01006 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
01007
01008 val= pack16to32(mx,my);
01009 }else
01010 val=0;
01011 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 4);
01012 }
01013 }
01014 }else{
01015 assert(IS_8X16(mb_type));
01016 for(list=0; list<h->list_count; list++){
01017 for(i=0; i<2; i++){
01018 unsigned int val;
01019 if(IS_DIR(mb_type, i, list)){
01020 if(h->ref_count[list]==1){
01021 val= 0;
01022 }else if(h->ref_count[list]==2){
01023 val= get_bits1(&s->gb)^1;
01024 }else{
01025 val= get_ue_golomb_31(&s->gb);
01026 if(val >= h->ref_count[list]){
01027 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
01028 return -1;
01029 }
01030 }
01031 }else
01032 val= LIST_NOT_USED&0xFF;
01033 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1);
01034 }
01035 }
01036 for(list=0; list<h->list_count; list++){
01037 for(i=0; i<2; i++){
01038 unsigned int val;
01039 if(IS_DIR(mb_type, i, list)){
01040 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
01041 mx += get_se_golomb(&s->gb);
01042 my += get_se_golomb(&s->gb);
01043 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
01044
01045 val= pack16to32(mx,my);
01046 }else
01047 val=0;
01048 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 4);
01049 }
01050 }
01051 }
01052 }
01053
01054 if(IS_INTER(mb_type))
01055 write_back_motion(h, mb_type);
01056
01057 if(!IS_INTRA16x16(mb_type)){
01058 cbp= get_ue_golomb(&s->gb);
01059
01060 if(decode_chroma){
01061 if(cbp > 47){
01062 av_log(h->s.avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, s->mb_x, s->mb_y);
01063 return -1;
01064 }
01065 if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp[cbp];
01066 else cbp= golomb_to_inter_cbp [cbp];
01067 }else{
01068 if(cbp > 15){
01069 av_log(h->s.avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, s->mb_x, s->mb_y);
01070 return -1;
01071 }
01072 if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp_gray[cbp];
01073 else cbp= golomb_to_inter_cbp_gray[cbp];
01074 }
01075 }
01076
01077 if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){
01078 mb_type |= MB_TYPE_8x8DCT*get_bits1(&s->gb);
01079 }
01080 h->cbp=
01081 h->cbp_table[mb_xy]= cbp;
01082 s->current_picture.f.mb_type[mb_xy] = mb_type;
01083
01084 if(cbp || IS_INTRA16x16(mb_type)){
01085 int i4x4, i8x8, chroma_idx;
01086 int dquant;
01087 int ret;
01088 GetBitContext *gb= IS_INTRA(mb_type) ? h->intra_gb_ptr : h->inter_gb_ptr;
01089 const uint8_t *scan, *scan8x8;
01090 const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8);
01091
01092 if(IS_INTERLACED(mb_type)){
01093 scan8x8= s->qscale ? h->field_scan8x8_cavlc : h->field_scan8x8_cavlc_q0;
01094 scan= s->qscale ? h->field_scan : h->field_scan_q0;
01095 }else{
01096 scan8x8= s->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0;
01097 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
01098 }
01099
01100 dquant= get_se_golomb(&s->gb);
01101
01102 s->qscale += dquant;
01103
01104 if(((unsigned)s->qscale) > max_qp){
01105 if(s->qscale<0) s->qscale+= max_qp+1;
01106 else s->qscale-= max_qp+1;
01107 if(((unsigned)s->qscale) > max_qp){
01108 av_log(h->s.avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, s->mb_x, s->mb_y);
01109 return -1;
01110 }
01111 }
01112
01113 h->chroma_qp[0]= get_chroma_qp(h, 0, s->qscale);
01114 h->chroma_qp[1]= get_chroma_qp(h, 1, s->qscale);
01115
01116 if( (ret = decode_luma_residual(h, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 0)) < 0 ){
01117 return -1;
01118 }
01119 h->cbp_table[mb_xy] |= ret << 12;
01120 if(CHROMA444){
01121 if( decode_luma_residual(h, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 1) < 0 ){
01122 return -1;
01123 }
01124 if( decode_luma_residual(h, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 2) < 0 ){
01125 return -1;
01126 }
01127 } else {
01128 const int num_c8x8 = h->sps.chroma_format_idc;
01129
01130 if(cbp&0x30){
01131 for(chroma_idx=0; chroma_idx<2; chroma_idx++)
01132 if (decode_residual(h, gb, h->mb + ((256 + 16*16*chroma_idx) << pixel_shift),
01133 CHROMA_DC_BLOCK_INDEX+chroma_idx,
01134 CHROMA422 ? chroma422_dc_scan : chroma_dc_scan,
01135 NULL, 4*num_c8x8) < 0) {
01136 return -1;
01137 }
01138 }
01139
01140 if(cbp&0x20){
01141 for(chroma_idx=0; chroma_idx<2; chroma_idx++){
01142 const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[chroma_idx]];
01143 DCTELEM *mb = h->mb + (16*(16 + 16*chroma_idx) << pixel_shift);
01144 for (i8x8=0; i8x8<num_c8x8; i8x8++) {
01145 for (i4x4=0; i4x4<4; i4x4++) {
01146 const int index= 16 + 16*chroma_idx + 8*i8x8 + i4x4;
01147 if (decode_residual(h, gb, mb, index, scan + 1, qmul, 15) < 0)
01148 return -1;
01149 mb += 16<<pixel_shift;
01150 }
01151 }
01152 }
01153 }else{
01154 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
01155 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
01156 }
01157 }
01158 }else{
01159 fill_rectangle(&h->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
01160 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
01161 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
01162 }
01163 s->current_picture.f.qscale_table[mb_xy] = s->qscale;
01164 write_back_non_zero_count(h);
01165
01166 if(MB_MBAFF){
01167 h->ref_count[0] >>= 1;
01168 h->ref_count[1] >>= 1;
01169 }
01170
01171 return 0;
01172 }