# HG changeset patch # User michael # Date 1267065745 0 # Node ID cf41a3e8e14eacebd887067097dc9afa11264ad0 # Parent 11fb96e945738b617c07d62f3f4b1c10755568b0 Keep mvd_table values of only 2 mb rows. diff -r 11fb96e94573 -r cf41a3e8e14e h264.c --- a/h264.c Wed Feb 24 23:56:52 2010 +0000 +++ b/h264.c Thu Feb 25 02:42:25 2010 +0000 @@ -663,6 +663,7 @@ av_freep(&h->list_counts); av_freep(&h->mb2b_xy); + av_freep(&h->mb2br_xy); av_freep(&h->mb2b8_xy); for(i = 0; i < MAX_THREADS; i++) { @@ -765,6 +766,7 @@ h->slice_table= h->slice_table_base + s->mb_stride*2 + 1; FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2b_xy , big_mb_num * sizeof(uint32_t), fail); + FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2br_xy , big_mb_num * sizeof(uint32_t), fail); FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2b8_xy , big_mb_num * sizeof(uint32_t), fail); for(y=0; ymb_height; y++){ for(x=0; xmb_width; x++){ @@ -773,6 +775,7 @@ const int b8_xy= 2*x + 2*y*h->b8_stride; h->mb2b_xy [mb_xy]= b_xy; + h->mb2br_xy[mb_xy]= FMO ? b_xy : (b_xy % (8*h->b_stride)); h->mb2b8_xy[mb_xy]= b8_xy; } } @@ -797,6 +800,7 @@ dst->slice_table = src->slice_table; dst->cbp_table = src->cbp_table; dst->mb2b_xy = src->mb2b_xy; + dst->mb2br_xy = src->mb2br_xy; dst->mb2b8_xy = src->mb2b8_xy; dst->chroma_pred_mode_table = src->chroma_pred_mode_table; dst->mvd_table[0] = src->mvd_table[0]; diff -r 11fb96e94573 -r cf41a3e8e14e h264.h --- a/h264.h Wed Feb 24 23:56:52 2010 +0000 +++ b/h264.h Thu Feb 25 02:42:25 2010 +0000 @@ -61,6 +61,8 @@ #define ALLOW_NOCHROMA +#define FMO 0 + /** * The maximum number of slices supported by the decoder. * must be a power of 2 @@ -344,6 +346,7 @@ int block_offset[2*(16+8)]; uint32_t *mb2b_xy; //FIXME are these 4 a good idea? + uint32_t *mb2br_xy; uint32_t *mb2b8_xy; int b_stride; //FIXME use s->b4_stride int b8_stride; @@ -1067,13 +1070,13 @@ if( CABAC ) { /* XXX beurk, Load mvd */ if(USES_LIST(top_type, list)){ - const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride; + const int b_xy= h->mb2br_xy[top_xy] + 3*h->b_stride; 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->mb2b_xy[left_xy[0]] + 3; + 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]]); }else{ @@ -1081,7 +1084,7 @@ AV_ZERO16(h->mvd_cache [list][scan8[0] - 1 + 1*8]); } if(USES_LIST(left_type[1], list)){ - const int b_xy= h->mb2b_xy[left_xy[1]] + 3; + 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]]); }else{ @@ -1421,7 +1424,7 @@ AV_COPY128(mv_dst + y*b_stride, mv_src + 8*y); } if( CABAC ) { - uint8_t (*mvd_dst)[2] = &h->mvd_table[list][b_xy]; + uint8_t (*mvd_dst)[2] = &h->mvd_table[list][FMO ? b_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);