diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2010-02-25 07:11:33 +0300 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2010-02-25 07:11:33 +0300 |
commit | e1c88a2138c2bb1f79f5b97b86fac8664f1c5bc7 (patch) | |
tree | af86c54ab792c4d0b5dc4d1dfaee9bf22bfc98e8 /libavcodec/h264.h | |
parent | d43c192236a3043cbcbe27f268f04437caeadb34 (diff) |
Cut the size of mvd_table by yet another factor of 2.
The code read/write code itself was 1 cycle faster, overall its
likely more due to cache effects
Originally committed as revision 22048 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/h264.h')
-rw-r--r-- | libavcodec/h264.h | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 60ccf8f5a7..6f61c8a7d4 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -1070,23 +1070,23 @@ static void fill_decode_caches(H264Context *h, int mb_type){ if( CABAC ) { /* XXX beurk, Load mvd */ if(USES_LIST(top_type, list)){ - const int b_xy= h->mb2br_xy[top_xy] + 3*h->b_stride; + const int b_xy= h->mb2br_xy[top_xy]; AV_COPY64(h->mvd_cache[list][scan8[0] + 0 - 1*8], h->mvd_table[list][b_xy + 0]); }else{ AV_ZERO64(h->mvd_cache[list][scan8[0] + 0 - 1*8]); } if(USES_LIST(left_type[0], list)){ - const int b_xy= h->mb2br_xy[left_xy[0]] + 3; - AV_COPY16(h->mvd_cache[list][scan8[0] - 1 + 0*8], h->mvd_table[list][b_xy + h->b_stride*left_block[0]]); - AV_COPY16(h->mvd_cache[list][scan8[0] - 1 + 1*8], h->mvd_table[list][b_xy + h->b_stride*left_block[1]]); + const int b_xy= h->mb2br_xy[left_xy[0]] + 6; + AV_COPY16(h->mvd_cache[list][scan8[0] - 1 + 0*8], h->mvd_table[list][b_xy - left_block[0]]); + AV_COPY16(h->mvd_cache[list][scan8[0] - 1 + 1*8], h->mvd_table[list][b_xy - left_block[1]]); }else{ AV_ZERO16(h->mvd_cache [list][scan8[0] - 1 + 0*8]); AV_ZERO16(h->mvd_cache [list][scan8[0] - 1 + 1*8]); } if(USES_LIST(left_type[1], list)){ - const int b_xy= h->mb2br_xy[left_xy[1]] + 3; - AV_COPY16(h->mvd_cache[list][scan8[0] - 1 + 2*8], h->mvd_table[list][b_xy + h->b_stride*left_block[2]]); - AV_COPY16(h->mvd_cache[list][scan8[0] - 1 + 3*8], h->mvd_table[list][b_xy + h->b_stride*left_block[3]]); + const int b_xy= h->mb2br_xy[left_xy[1]] + 6; + AV_COPY16(h->mvd_cache[list][scan8[0] - 1 + 2*8], h->mvd_table[list][b_xy - left_block[2]]); + AV_COPY16(h->mvd_cache[list][scan8[0] - 1 + 3*8], h->mvd_table[list][b_xy - left_block[3]]); }else{ AV_ZERO16(h->mvd_cache [list][scan8[0] - 1 + 2*8]); AV_ZERO16(h->mvd_cache [list][scan8[0] - 1 + 3*8]); @@ -1424,13 +1424,15 @@ static inline void write_back_motion(H264Context *h, int mb_type){ AV_COPY128(mv_dst + y*b_stride, mv_src + 8*y); } if( CABAC ) { - uint8_t (*mvd_dst)[2] = &h->mvd_table[list][FMO ? b_xy : h->mb2br_xy[h->mb_xy]]; + uint8_t (*mvd_dst)[2] = &h->mvd_table[list][FMO ? 8*h->mb_xy : h->mb2br_xy[h->mb_xy]]; uint8_t (*mvd_src)[2] = &h->mvd_cache[list][scan8[0]]; if(IS_SKIP(mb_type)) - fill_rectangle(mvd_dst, 4, 4, h->b_stride, 0, 2); - else - for(y=0; y<4; y++){ - AV_COPY64(mvd_dst + y*b_stride, mvd_src + 8*y); + AV_ZERO128(mvd_dst); + else{ + AV_COPY64(mvd_dst, mvd_src + 8*3); + for(y=0; y<3; y++){ + AV_COPY16(mvd_dst + 3 + 3 - y, mvd_src + 3 + 8*y); + } } } |