| Index: patched-ffmpeg-mt/libavcodec/h264_cabac.c
|
| ===================================================================
|
| --- patched-ffmpeg-mt/libavcodec/h264_cabac.c (revision 41250)
|
| +++ patched-ffmpeg-mt/libavcodec/h264_cabac.c (working copy)
|
| @@ -688,30 +688,30 @@
|
| void ff_h264_init_cabac_states(H264Context *h) {
|
| MpegEncContext * const s = &h->s;
|
| int i;
|
| + const int8_t (*tab)[2];
|
|
|
| + if( h->slice_type_nos == FF_I_TYPE ) tab = cabac_context_init_I;
|
| + else tab = cabac_context_init_PB[h->cabac_init_idc];
|
| +
|
| /* calculate pre-state */
|
| for( i= 0; i < 460; i++ ) {
|
| - int pre;
|
| - if( h->slice_type_nos == FF_I_TYPE )
|
| - pre = av_clip( ((cabac_context_init_I[i][0] * s->qscale) >>4 ) + cabac_context_init_I[i][1], 1, 126 );
|
| - else
|
| - pre = av_clip( ((cabac_context_init_PB[h->cabac_init_idc][i][0] * s->qscale) >>4 ) + cabac_context_init_PB[h->cabac_init_idc][i][1], 1, 126 );
|
| + int pre = 2*(((tab[i][0] * s->qscale) >>4 ) + tab[i][1]) - 127;
|
|
|
| - if( pre <= 63 )
|
| - h->cabac_state[i] = 2 * ( 63 - pre ) + 0;
|
| - else
|
| - h->cabac_state[i] = 2 * ( pre - 64 ) + 1;
|
| + pre^= pre>>31;
|
| + if(pre > 124)
|
| + pre= 124 + (pre&1);
|
| +
|
| + h->cabac_state[i] = pre;
|
| }
|
| }
|
|
|
| static int decode_cabac_field_decoding_flag(H264Context *h) {
|
| MpegEncContext * const s = &h->s;
|
| - const long mba_xy = h->mb_xy - 1L;
|
| const long mbb_xy = h->mb_xy - 2L*s->mb_stride;
|
|
|
| unsigned long ctx = 0;
|
|
|
| - ctx += (s->current_picture.mb_type[mba_xy]>>7)&(h->slice_table[mba_xy] == h->slice_num);
|
| + ctx += h->mb_field_decoding_flag & !!s->mb_x; //for FMO:(s->current_picture.mb_type[mba_xy]>>7)&(h->slice_table[mba_xy] == h->slice_num);
|
| ctx += (s->current_picture.mb_type[mbb_xy]>>7)&(h->slice_table[mbb_xy] == h->slice_num);
|
|
|
| return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
|
| @@ -722,13 +722,10 @@
|
| int mb_type;
|
|
|
| if(intra_slice){
|
| - MpegEncContext * const s = &h->s;
|
| - const int mba_xy = h->left_mb_xy[0];
|
| - const int mbb_xy = h->top_mb_xy;
|
| int ctx=0;
|
| - if( h->slice_table[mba_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mba_xy] ) )
|
| + if( h->left_type[0] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
|
| ctx++;
|
| - if( h->slice_table[mbb_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mbb_xy] ) )
|
| + if( h->top_type & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
|
| ctx++;
|
| if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
|
| return 0; /* I4x4 */
|
| @@ -750,44 +747,6 @@
|
| return mb_type;
|
| }
|
|
|
| -static int decode_cabac_mb_type_b( H264Context *h ) {
|
| - MpegEncContext * const s = &h->s;
|
| -
|
| - const int mba_xy = h->left_mb_xy[0];
|
| - const int mbb_xy = h->top_mb_xy;
|
| - int ctx = 0;
|
| - int bits;
|
| - assert(h->slice_type_nos == FF_B_TYPE);
|
| -
|
| - if( h->slice_table[mba_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mba_xy] ) )
|
| - ctx++;
|
| - if( h->slice_table[mbb_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mbb_xy] ) )
|
| - ctx++;
|
| -
|
| - if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) )
|
| - return 0; /* B_Direct_16x16 */
|
| -
|
| - if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
|
| - return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
|
| - }
|
| -
|
| - bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
|
| - bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
|
| - bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
|
| - bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
|
| - if( bits < 8 )
|
| - return bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
|
| - else if( bits == 13 ) {
|
| - return decode_cabac_intra_mb_type(h, 32, 0) + 23;
|
| - } else if( bits == 14 )
|
| - return 11; /* B_L1_L0_8x16 */
|
| - else if( bits == 15 )
|
| - return 22; /* B_8x8 */
|
| -
|
| - bits= ( bits<<1 ) | get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
|
| - return bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
|
| -}
|
| -
|
| static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
|
| MpegEncContext * const s = &h->s;
|
| int mba_xy, mbb_xy;
|
| @@ -834,10 +793,7 @@
|
| mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
|
| mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
|
|
|
| - if( mode >= pred_mode )
|
| - return mode + 1;
|
| - else
|
| - return mode;
|
| + return mode + ( mode >= pred_mode );
|
| }
|
|
|
| static int decode_cabac_mb_chroma_pre_mode( H264Context *h) {
|
| @@ -847,10 +803,10 @@
|
| int ctx = 0;
|
|
|
| /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
|
| - if( h->slice_table[mba_xy] == h->slice_num && h->chroma_pred_mode_table[mba_xy] != 0 )
|
| + if( h->left_type[0] && h->chroma_pred_mode_table[mba_xy] != 0 )
|
| ctx++;
|
|
|
| - if( h->slice_table[mbb_xy] == h->slice_num && h->chroma_pred_mode_table[mbb_xy] != 0 )
|
| + if( h->top_type && h->chroma_pred_mode_table[mbb_xy] != 0 )
|
| ctx++;
|
|
|
| if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
|
| @@ -867,8 +823,8 @@
|
| static int decode_cabac_mb_cbp_luma( H264Context *h) {
|
| int cbp_b, cbp_a, ctx, cbp = 0;
|
|
|
| - cbp_a = h->slice_table[h->left_mb_xy[0]] == h->slice_num ? h->left_cbp : -1;
|
| - cbp_b = h->slice_table[h->top_mb_xy] == h->slice_num ? h->top_cbp : -1;
|
| + cbp_a = h->left_cbp;
|
| + cbp_b = h->top_cbp;
|
|
|
| ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
|
| cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
|
| @@ -898,22 +854,7 @@
|
| if( cbp_b == 2 ) ctx += 2;
|
| return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
|
| }
|
| -static int decode_cabac_mb_dqp( H264Context *h) {
|
| - int ctx= h->last_qscale_diff != 0;
|
| - int val = 0;
|
|
|
| - while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
|
| - ctx= 2+(ctx>>1);
|
| - val++;
|
| - if(val > 102) //prevent infinite loop
|
| - return INT_MIN;
|
| - }
|
| -
|
| - if( val&0x01 )
|
| - return (val + 1)>>1 ;
|
| - else
|
| - return -((val + 1)>>1);
|
| -}
|
| static int decode_cabac_p_mb_sub_type( H264Context *h ) {
|
| if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
|
| return 0; /* 8x8 */
|
| @@ -940,10 +881,6 @@
|
| return type;
|
| }
|
|
|
| -static inline int decode_cabac_mb_transform_size( H264Context *h ) {
|
| - return get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
|
| -}
|
| -
|
| static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
|
| int refa = h->ref_cache[list][scan8[n] - 1];
|
| int refb = h->ref_cache[list][scan8[n] - 8];
|
| @@ -951,9 +888,9 @@
|
| int ctx = 0;
|
|
|
| if( h->slice_type_nos == FF_B_TYPE) {
|
| - if( refa > 0 && !h->direct_cache[scan8[n] - 1] )
|
| + if( refa > 0 && !(h->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
|
| ctx++;
|
| - if( refb > 0 && !h->direct_cache[scan8[n] - 8] )
|
| + if( refb > 0 && !(h->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
|
| ctx += 2;
|
| } else {
|
| if( refa > 0 )
|
| @@ -972,22 +909,21 @@
|
| return ref;
|
| }
|
|
|
| -static int decode_cabac_mb_mvd( H264Context *h, int list, int n, int l ) {
|
| - int amvd = abs( h->mvd_cache[list][scan8[n] - 1][l] ) +
|
| - abs( h->mvd_cache[list][scan8[n] - 8][l] );
|
| - int ctxbase = (l == 0) ? 40 : 47;
|
| +static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda) {
|
| int mvd;
|
| - int ctx = (amvd>2) + (amvd>32);
|
|
|
| - if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+ctx]))
|
| + if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
|
| +// if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
|
| + *mvda= 0;
|
| return 0;
|
| + }
|
|
|
| mvd= 1;
|
| - ctx= 3;
|
| - while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase+ctx] ) ) {
|
| + ctxbase+= 3;
|
| + while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase] ) ) {
|
| + if( mvd < 4 )
|
| + ctxbase++;
|
| mvd++;
|
| - if( ctx < 6 )
|
| - ctx++;
|
| }
|
|
|
| if( mvd >= 9 ) {
|
| @@ -1001,13 +937,25 @@
|
| }
|
| }
|
| while( k-- ) {
|
| - if( get_cabac_bypass( &h->cabac ) )
|
| - mvd += 1 << k;
|
| + mvd += get_cabac_bypass( &h->cabac )<<k;
|
| }
|
| - }
|
| + *mvda=mvd < 70 ? mvd : 70;
|
| + }else
|
| + *mvda=mvd;
|
| return get_cabac_bypass_sign( &h->cabac, -mvd );
|
| }
|
|
|
| +#define DECODE_CABAC_MB_MVD( h, list, n )\
|
| +{\
|
| + int amvd0 = h->mvd_cache[list][scan8[n] - 1][0] +\
|
| + h->mvd_cache[list][scan8[n] - 8][0];\
|
| + int amvd1 = h->mvd_cache[list][scan8[n] - 1][1] +\
|
| + h->mvd_cache[list][scan8[n] - 8][1];\
|
| +\
|
| + mx += decode_cabac_mb_mvd( h, 40, amvd0, &mpx );\
|
| + my += decode_cabac_mb_mvd( h, 47, amvd1, &mpy );\
|
| +}
|
| +
|
| static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int is_dc ) {
|
| int nza, nzb;
|
| int ctx = 0;
|
| @@ -1242,32 +1190,6 @@
|
| #endif
|
| }
|
|
|
| -static inline void compute_mb_neighbors(H264Context *h)
|
| -{
|
| - MpegEncContext * const s = &h->s;
|
| - const int mb_xy = h->mb_xy;
|
| - h->top_mb_xy = mb_xy - s->mb_stride;
|
| - h->left_mb_xy[0] = mb_xy - 1;
|
| - if(FRAME_MBAFF){
|
| - const int pair_xy = s->mb_x + (s->mb_y & ~1)*s->mb_stride;
|
| - const int top_pair_xy = pair_xy - s->mb_stride;
|
| - const int top_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]);
|
| - const int left_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]);
|
| - const int curr_mb_field_flag = MB_FIELD;
|
| - const int bottom = (s->mb_y & 1);
|
| -
|
| - if (curr_mb_field_flag && (bottom || top_mb_field_flag)){
|
| - h->top_mb_xy -= s->mb_stride;
|
| - }
|
| - if (!left_mb_field_flag == curr_mb_field_flag) {
|
| - h->left_mb_xy[0] = pair_xy - 1;
|
| - }
|
| - } else if (FIELD_PICTURE) {
|
| - h->top_mb_xy -= s->mb_stride;
|
| - }
|
| - return;
|
| -}
|
| -
|
| /**
|
| * decodes a macroblock
|
| * @returns 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
|
| @@ -1284,8 +1206,6 @@
|
| if( h->slice_type_nos != FF_I_TYPE ) {
|
| int skip;
|
| /* a skipped mb needs the aff flag from the following mb */
|
| - if( FRAME_MBAFF && s->mb_x==0 && (s->mb_y&1)==0 )
|
| - predict_field_decoding_flag(h);
|
| if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped )
|
| skip = h->next_mb_skipped;
|
| else
|
| @@ -1317,17 +1237,43 @@
|
|
|
| h->prev_mb_skipped = 0;
|
|
|
| - compute_mb_neighbors(h);
|
| + fill_decode_neighbors(h, -(MB_FIELD));
|
|
|
| if( h->slice_type_nos == FF_B_TYPE ) {
|
| - mb_type = decode_cabac_mb_type_b( h );
|
| - if( mb_type < 23 ){
|
| - partition_count= b_mb_type_info[mb_type].partition_count;
|
| - mb_type= b_mb_type_info[mb_type].type;
|
| + int ctx = 0;
|
| + assert(h->slice_type_nos == FF_B_TYPE);
|
| +
|
| + if( !IS_DIRECT( h->left_type[0]-1 ) )
|
| + ctx++;
|
| + if( !IS_DIRECT( h->top_type-1 ) )
|
| + ctx++;
|
| +
|
| + if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ){
|
| + mb_type= 0; /* B_Direct_16x16 */
|
| + }else if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
|
| + mb_type= 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
|
| }else{
|
| - mb_type -= 23;
|
| - goto decode_intra_mb;
|
| + int bits;
|
| + bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
|
| + bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
|
| + bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
|
| + bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
|
| + if( bits < 8 ){
|
| + mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
|
| + }else if( bits == 13 ){
|
| + mb_type= decode_cabac_intra_mb_type(h, 32, 0);
|
| + goto decode_intra_mb;
|
| + }else if( bits == 14 ){
|
| + mb_type= 11; /* B_L1_L0_8x16 */
|
| + }else if( bits == 15 ){
|
| + mb_type= 22; /* B_8x8 */
|
| + }else{
|
| + bits= ( bits<<1 ) | get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
|
| + mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
|
| + }
|
| }
|
| + partition_count= b_mb_type_info[mb_type].partition_count;
|
| + mb_type= b_mb_type_info[mb_type].type;
|
| } else if( h->slice_type_nos == FF_P_TYPE ) {
|
| if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
|
| /* P-type */
|
| @@ -1402,7 +1348,7 @@
|
| if( IS_INTRA( mb_type ) ) {
|
| int i, pred_mode;
|
| if( IS_INTRA4x4( mb_type ) ) {
|
| - if( dct8x8_allowed && decode_cabac_mb_transform_size( h ) ) {
|
| + if( dct8x8_allowed && get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] ) ) {
|
| mb_type |= MB_TYPE_8x8DCT;
|
| for( i = 0; i < 16; i+=4 ) {
|
| int pred = pred_intra_mode( h, i );
|
| @@ -1447,11 +1393,8 @@
|
| h->ref_cache[1][scan8[4]] =
|
| h->ref_cache[0][scan8[12]] =
|
| h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
|
| - if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) {
|
| for( i = 0; i < 4; i++ )
|
| - if( IS_DIRECT(h->sub_mb_type[i]) )
|
| - fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, 1, 1 );
|
| - }
|
| + fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, (h->sub_mb_type[i]>>1)&0xFF, 1 );
|
| }
|
| } else {
|
| for( i = 0; i < 4; i++ ) {
|
| @@ -1488,7 +1431,7 @@
|
| for(i=0; i<4; i++){
|
| h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ];
|
| if(IS_DIRECT(h->sub_mb_type[i])){
|
| - fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 4);
|
| + fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
|
| continue;
|
| }
|
|
|
| @@ -1500,11 +1443,9 @@
|
| int mx, my;
|
| const int index= 4*i + block_width*j;
|
| int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
|
| - int16_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
|
| - pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mpx, &mpy);
|
| -
|
| - mx = mpx + decode_cabac_mb_mvd( h, list, index, 0 );
|
| - my = mpy + decode_cabac_mb_mvd( h, list, index, 1 );
|
| + uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
|
| + pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
|
| + DECODE_CABAC_MB_MVD( h, list, index)
|
| tprintf(s->avctx, "final mv:%d %d\n", mx, my);
|
|
|
| if(IS_SUB_8X8(sub_mb_type)){
|
| @@ -1514,43 +1455,41 @@
|
| mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
|
|
|
| mvd_cache[ 1 ][0]=
|
| - mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mx - mpx;
|
| + mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
|
| mvd_cache[ 1 ][1]=
|
| - mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= my - mpy;
|
| + mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
|
| }else if(IS_SUB_8X4(sub_mb_type)){
|
| mv_cache[ 1 ][0]= mx;
|
| mv_cache[ 1 ][1]= my;
|
|
|
| - mvd_cache[ 1 ][0]= mx - mpx;
|
| - mvd_cache[ 1 ][1]= my - mpy;
|
| + mvd_cache[ 1 ][0]= mpx;
|
| + mvd_cache[ 1 ][1]= mpy;
|
| }else if(IS_SUB_4X8(sub_mb_type)){
|
| mv_cache[ 8 ][0]= mx;
|
| mv_cache[ 8 ][1]= my;
|
|
|
| - mvd_cache[ 8 ][0]= mx - mpx;
|
| - mvd_cache[ 8 ][1]= my - mpy;
|
| + mvd_cache[ 8 ][0]= mpx;
|
| + mvd_cache[ 8 ][1]= mpy;
|
| }
|
| mv_cache[ 0 ][0]= mx;
|
| mv_cache[ 0 ][1]= my;
|
|
|
| - mvd_cache[ 0 ][0]= mx - mpx;
|
| - mvd_cache[ 0 ][1]= my - mpy;
|
| + mvd_cache[ 0 ][0]= mpx;
|
| + mvd_cache[ 0 ][1]= mpy;
|
| }
|
| }else{
|
| - uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
|
| - uint32_t *pd= (uint32_t *)&h->mvd_cache[list][ scan8[4*i] ][0];
|
| - p[0] = p[1] = p[8] = p[9] = 0;
|
| - pd[0]= pd[1]= pd[8]= pd[9]= 0;
|
| + fill_rectangle(h->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
|
| + fill_rectangle(h->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
|
| }
|
| }
|
| }
|
| } else if( IS_DIRECT(mb_type) ) {
|
| ff_h264_pred_direct_motion(h, &mb_type);
|
| - fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 4);
|
| - fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4);
|
| + fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
|
| + fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
|
| dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
|
| } else {
|
| - int list, mx, my, i, mpx, mpy;
|
| + int list, i;
|
| if(IS_16X16(mb_type)){
|
| for(list=0; list<h->list_count; list++){
|
| if(IS_DIR(mb_type, 0, list)){
|
| @@ -1564,21 +1503,18 @@
|
| }else
|
| ref=0;
|
| fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
|
| - }else
|
| - fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); //FIXME factorize and the other fill_rect below too
|
| + }
|
| }
|
| for(list=0; list<h->list_count; list++){
|
| if(IS_DIR(mb_type, 0, list)){
|
| - pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy);
|
| -
|
| - mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 );
|
| - my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 );
|
| + int mx,my,mpx,mpy;
|
| + pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
|
| + DECODE_CABAC_MB_MVD( h, list, 0)
|
| tprintf(s->avctx, "final mv:%d %d\n", mx, my);
|
|
|
| - fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
|
| + fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
|
| fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
|
| - }else
|
| - fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4);
|
| + }
|
| }
|
| }
|
| else if(IS_16X8(mb_type)){
|
| @@ -1602,15 +1538,15 @@
|
| for(list=0; list<h->list_count; list++){
|
| for(i=0; i<2; i++){
|
| if(IS_DIR(mb_type, i, list)){
|
| - pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mpx, &mpy);
|
| - mx = mpx + decode_cabac_mb_mvd( h, list, 8*i, 0 );
|
| - my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 );
|
| + int mx,my,mpx,mpy;
|
| + pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
|
| + DECODE_CABAC_MB_MVD( h, list, 8*i)
|
| tprintf(s->avctx, "final mv:%d %d\n", mx, my);
|
|
|
| - fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4);
|
| + fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
|
| fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
|
| }else{
|
| - fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
|
| + fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
|
| fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
|
| }
|
| }
|
| @@ -1637,15 +1573,15 @@
|
| for(list=0; list<h->list_count; list++){
|
| for(i=0; i<2; i++){
|
| if(IS_DIR(mb_type, i, list)){
|
| - pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mpx, &mpy);
|
| - mx = mpx + decode_cabac_mb_mvd( h, list, 4*i, 0 );
|
| - my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 );
|
| + int mx,my,mpx,mpy;
|
| + pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
|
| + DECODE_CABAC_MB_MVD( h, list, 4*i)
|
|
|
| tprintf(s->avctx, "final mv:%d %d\n", mx, my);
|
| - fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
|
| + fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
|
| fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
|
| }else{
|
| - fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
|
| + fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
|
| fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
|
| }
|
| }
|
| @@ -1667,15 +1603,13 @@
|
| h->cbp_table[mb_xy] = h->cbp = cbp;
|
|
|
| if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
|
| - if( decode_cabac_mb_transform_size( h ) )
|
| - mb_type |= MB_TYPE_8x8DCT;
|
| + mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
|
| }
|
| s->current_picture.mb_type[mb_xy]= mb_type;
|
|
|
| if( cbp || IS_INTRA16x16( mb_type ) ) {
|
| const uint8_t *scan, *scan8x8, *dc_scan;
|
| const uint32_t *qmul;
|
| - int dqp;
|
|
|
| if(IS_INTERLACED(mb_type)){
|
| scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
|
| @@ -1687,19 +1621,35 @@
|
| dc_scan= luma_dc_zigzag_scan;
|
| }
|
|
|
| - h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h );
|
| - if( dqp == INT_MIN ){
|
| - av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y);
|
| - return -1;
|
| - }
|
| - s->qscale += dqp;
|
| - if(((unsigned)s->qscale) > 51){
|
| - if(s->qscale<0) s->qscale+= 52;
|
| - else s->qscale-= 52;
|
| - }
|
| - h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
|
| - h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
|
| + // decode_cabac_mb_dqp
|
| + if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
|
| + int val = 1;
|
| + int ctx= 2;
|
|
|
| + while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
|
| + ctx= 3;
|
| + val++;
|
| + if(val > 102){ //prevent infinite loop
|
| + av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y);
|
| + return -1;
|
| + }
|
| + }
|
| +
|
| + if( val&0x01 )
|
| + val= (val + 1)>>1 ;
|
| + else
|
| + val= -((val + 1)>>1);
|
| + h->last_qscale_diff = val;
|
| + s->qscale += val;
|
| + if(((unsigned)s->qscale) > 51){
|
| + if(s->qscale<0) s->qscale+= 52;
|
| + else s->qscale-= 52;
|
| + }
|
| + h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
|
| + h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
|
| + }else
|
| + h->last_qscale_diff=0;
|
| +
|
| if( IS_INTRA16x16( mb_type ) ) {
|
| int i;
|
| //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" );
|
|
|