Commit fb38fce5 authored by michael's avatar michael

Store sub_mb_type in direct_cache/direct_table.

This is equal complexity but could be more usefull.


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@21821 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 5a64acc3
...@@ -1060,31 +1060,31 @@ static void fill_decode_caches(H264Context *h, int mb_type){ ...@@ -1060,31 +1060,31 @@ static void fill_decode_caches(H264Context *h, int mb_type){
*(uint32_t*)h->mvd_cache [list][scan8[12]]= 0; *(uint32_t*)h->mvd_cache [list][scan8[12]]= 0;
if(h->slice_type_nos == FF_B_TYPE){ if(h->slice_type_nos == FF_B_TYPE){
fill_rectangle(&h->direct_cache[scan8[0]], 4, 4, 8, 0, 1); fill_rectangle(&h->direct_cache[scan8[0]], 4, 4, 8, MB_TYPE_16x16>>1, 1);
if(IS_DIRECT(top_type)){ if(IS_DIRECT(top_type)){
*(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0x01010101; *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0x01010101*(MB_TYPE_DIRECT2>>1);
}else if(IS_8X8(top_type)){ }else if(IS_8X8(top_type)){
int b8_xy = h->mb2b8_xy[top_xy] + h->b8_stride; int b8_xy = h->mb2b8_xy[top_xy] + h->b8_stride;
h->direct_cache[scan8[0] + 0 - 1*8]= h->direct_table[b8_xy]; h->direct_cache[scan8[0] + 0 - 1*8]= h->direct_table[b8_xy];
h->direct_cache[scan8[0] + 2 - 1*8]= h->direct_table[b8_xy + 1]; h->direct_cache[scan8[0] + 2 - 1*8]= h->direct_table[b8_xy + 1];
}else{ }else{
*(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0; *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0x01010101*(MB_TYPE_16x16>>1);
} }
if(IS_DIRECT(left_type[0])) if(IS_DIRECT(left_type[0]))
h->direct_cache[scan8[0] - 1 + 0*8]= 1; h->direct_cache[scan8[0] - 1 + 0*8]= MB_TYPE_DIRECT2>>1;
else if(IS_8X8(left_type[0])) else if(IS_8X8(left_type[0]))
h->direct_cache[scan8[0] - 1 + 0*8]= h->direct_table[h->mb2b8_xy[left_xy[0]] + 1 + h->b8_stride*(left_block[0]>>1)]; h->direct_cache[scan8[0] - 1 + 0*8]= h->direct_table[h->mb2b8_xy[left_xy[0]] + 1 + h->b8_stride*(left_block[0]>>1)];
else else
h->direct_cache[scan8[0] - 1 + 0*8]= 0; h->direct_cache[scan8[0] - 1 + 0*8]= MB_TYPE_16x16>>1;
if(IS_DIRECT(left_type[1])) if(IS_DIRECT(left_type[1]))
h->direct_cache[scan8[0] - 1 + 2*8]= 1; h->direct_cache[scan8[0] - 1 + 2*8]= MB_TYPE_DIRECT2>>1;
else if(IS_8X8(left_type[1])) else if(IS_8X8(left_type[1]))
h->direct_cache[scan8[0] - 1 + 2*8]= h->direct_table[h->mb2b8_xy[left_xy[1]] + 1 + h->b8_stride*(left_block[2]>>1)]; h->direct_cache[scan8[0] - 1 + 2*8]= h->direct_table[h->mb2b8_xy[left_xy[1]] + 1 + h->b8_stride*(left_block[2]>>1)];
else else
h->direct_cache[scan8[0] - 1 + 2*8]= 0; h->direct_cache[scan8[0] - 1 + 2*8]= MB_TYPE_16x16>>1;
} }
} }
} }
...@@ -1409,9 +1409,9 @@ static inline void write_back_motion(H264Context *h, int mb_type){ ...@@ -1409,9 +1409,9 @@ static inline void write_back_motion(H264Context *h, int mb_type){
if(h->slice_type_nos == FF_B_TYPE && CABAC){ if(h->slice_type_nos == FF_B_TYPE && CABAC){
if(IS_8X8(mb_type)){ if(IS_8X8(mb_type)){
uint8_t *direct_table = &h->direct_table[b8_xy]; uint8_t *direct_table = &h->direct_table[b8_xy];
direct_table[1+0*h->b8_stride] = IS_DIRECT(h->sub_mb_type[1]) ? 1 : 0; direct_table[1+0*h->b8_stride] = h->sub_mb_type[1]>>1;
direct_table[0+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[2]) ? 1 : 0; direct_table[0+1*h->b8_stride] = h->sub_mb_type[2]>>1;
direct_table[1+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[3]) ? 1 : 0; direct_table[1+1*h->b8_stride] = h->sub_mb_type[3]>>1;
} }
} }
} }
......
...@@ -951,9 +951,9 @@ static int decode_cabac_mb_ref( H264Context *h, int list, int n ) { ...@@ -951,9 +951,9 @@ static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
int ctx = 0; int ctx = 0;
if( h->slice_type_nos == FF_B_TYPE) { 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++; 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; ctx += 2;
} else { } else {
if( refa > 0 ) if( refa > 0 )
...@@ -1450,7 +1450,7 @@ decode_intra_mb: ...@@ -1450,7 +1450,7 @@ decode_intra_mb:
if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) { if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) {
for( i = 0; i < 4; i++ ) for( i = 0; i < 4; i++ )
if( IS_DIRECT(h->sub_mb_type[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, MB_TYPE_DIRECT2>>1, 1 );
} }
} }
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment