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" ); |