# HG changeset patch # User michael # Date 1264590869 0 # Node ID cd1f5f6a2e450a6f96e72467cff2649e7a08502b # Parent 5ab861519e798779de36c7b2b866e8089652a952 Use table to speedup access to non_zero_count in MBAFF with differing interlacing. ~4 cpu cycles speedup diff -r 5ab861519e79 -r cd1f5f6a2e45 h264_loopfilter.c --- a/h264_loopfilter.c Wed Jan 27 00:31:52 2010 +0000 +++ b/h264_loopfilter.c Wed Jan 27 11:14:29 2010 +0000 @@ -632,6 +632,16 @@ *(uint64_t*)&bS[0]= *(uint64_t*)&bS[4]= 0x0004000400040004ULL; else { + static const uint8_t offset[2][2][8]={ + { + {7+8*0, 7+8*0, 7+8*0, 7+8*0, 7+8*1, 7+8*1, 7+8*1, 7+8*1}, + {7+8*2, 7+8*2, 7+8*2, 7+8*2, 7+8*3, 7+8*3, 7+8*3, 7+8*3}, + },{ + {7+8*0, 7+8*1, 7+8*2, 7+8*3, 7+8*0, 7+8*1, 7+8*2, 7+8*3}, + {7+8*0, 7+8*1, 7+8*2, 7+8*3, 7+8*0, 7+8*1, 7+8*2, 7+8*3}, + } + }; + const uint8_t *off= offset[MB_FIELD][mb_y&1]; for( i = 0; i < 8; i++ ) { int j= MB_FIELD ? i>>2 : i&1; int mbn_xy = h->left_mb_xy[j]; @@ -644,7 +654,7 @@ ((!h->pps.cabac && IS_8x8DCT(mbn_type)) ? (h->cbp_table[mbn_xy] & ((MB_FIELD ? (i&2) : (mb_y&1)) ? 8 : 2)) : - h->non_zero_count[mbn_xy][7+(MB_FIELD ? (i&3) : (i>>2)+(mb_y&1)*2)*8])); + h->non_zero_count[mbn_xy][ off[i] ])); } } }