[x264-devel] commit: remove some redundant nnz counts (Jason Garrett-Glaser )
git version control
git at videolan.org
Sun Apr 27 11:16:38 CEST 2008
x264 | branch: master | Jason Garrett-Glaser <darkshikari at gmail.com> | Fri Apr 25 21:41:40 2008 -0600| [5dae513218070a3aafc7c56b097bc7ff7ae58526]
remove some redundant nnz counts
move some nnz counts from macroblock_encode to cavlc if cabac doesn't need them
> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=5dae513218070a3aafc7c56b097bc7ff7ae58526
---
encoder/macroblock.c | 86 +++++++++++++++++++++-----------------------------
1 files changed, 36 insertions(+), 50 deletions(-)
diff --git a/encoder/macroblock.c b/encoder/macroblock.c
index 20bc52a..de94536 100644
--- a/encoder/macroblock.c
+++ b/encoder/macroblock.c
@@ -154,6 +154,7 @@ static void x264_mb_encode_i16x16( x264_t *h, int i_qscale )
{
/* copy dc coeff */
dct4x4[0][block_idx_y[i]][block_idx_x[i]] = dct4x4[1+i][0][0];
+ dct4x4[1+i][0][0] = 0;
/* quant/scan/dequant */
if( h->mb.b_trellis )
@@ -215,6 +216,7 @@ void x264_mb_encode_8x8_chroma( x264_t *h, int b_inter, int i_qscale )
{
/* copy dc coeff */
dct2x2[block_idx_y[i]][block_idx_x[i]] = dct4x4[i][0][0];
+ dct4x4[i][0][0] = 0;
/* no trellis; it doesn't seem to help chroma noticeably */
h->quantf.quant_4x4( dct4x4[i], h->quant4_mf[CQM_4IC+b_inter][i_qscale], h->quant4_bias[CQM_4IC+b_inter][i_qscale] );
@@ -257,7 +259,7 @@ void x264_mb_encode_8x8_chroma( x264_t *h, int b_inter, int i_qscale )
h->mb.i_cbp_chroma = 0;
for( i = 0; i < 8; i++ )
{
- int nz = array_non_zero_count( h->dct.luma4x4[16+i]+1, 15 );
+ int nz = array_non_zero( h->dct.luma4x4[16+i] );
h->mb.cache.non_zero_count[x264_scan8[16+i]] = nz;
h->mb.i_cbp_chroma |= nz;
}
@@ -321,7 +323,8 @@ void x264_macroblock_encode( x264_t *h )
int i_qp = h->mb.i_qp;
int b_decimate = h->sh.i_type == SLICE_TYPE_B || h->param.analyse.b_dct_decimate;
int b_force_no_skip = 0;
- int i;
+ int i,j,idx;
+ uint8_t nnz8x8[4] = {1,1,1,1};
if( h->sh.b_mbaff
&& h->mb.i_mb_xy == h->sh.i_first_mb + h->mb.i_mb_stride
@@ -386,6 +389,8 @@ void x264_macroblock_encode( x264_t *h )
h->predict_8x8[i_mode]( p_dst, edge );
x264_mb_encode_i8x8( h, i, i_qp );
}
+ for( i = 0; i < 4; i++ )
+ nnz8x8[i] = array_non_zero( h->dct.luma8x8[i] );
}
else if( h->mb.i_type == I_4x4 )
{
@@ -413,7 +418,7 @@ void x264_macroblock_encode( x264_t *h )
}
else /* Inter MB */
{
- int i8x8, i4x4, idx;
+ int i8x8, i4x4;
int i_decimate_mb = 0;
/* Motion compensation */
@@ -433,7 +438,6 @@ void x264_macroblock_encode( x264_t *h )
else if( h->mb.b_transform_8x8 )
{
DECLARE_ALIGNED_16( int16_t dct8x8[4][8][8] );
- int nnz8x8[4] = {1,1,1,1};
b_decimate &= !h->mb.b_trellis; // 8x8 trellis is inherently optimal decimation
h->dctf.sub16x16_dct8( dct8x8, h->mb.pic.p_fenc[0], h->mb.pic.p_fdec[0] );
@@ -453,18 +457,14 @@ void x264_macroblock_encode( x264_t *h )
int i_decimate_8x8 = x264_mb_decimate_score( h->dct.luma8x8[idx], 64 );
i_decimate_mb += i_decimate_8x8;
if( i_decimate_8x8 < 4 )
- {
- memset( h->dct.luma8x8[idx], 0, sizeof( h->dct.luma8x8[idx] ) );
- memset( dct8x8[idx], 0, sizeof( dct8x8[idx] ) );
nnz8x8[idx] = 0;
- }
}
else
nnz8x8[idx] = array_non_zero( dct8x8[idx] );
}
if( i_decimate_mb < 6 && b_decimate )
- memset( h->dct.luma8x8, 0, sizeof( h->dct.luma8x8 ) );
+ *(uint32_t*)nnz8x8 = 0;
else
{
for( idx = 0; idx < 4; idx++ )
@@ -478,7 +478,6 @@ void x264_macroblock_encode( x264_t *h )
else
{
DECLARE_ALIGNED_16( int16_t dct4x4[16][4][4] );
- int nnz8x8[4] = {1,1,1,1};
h->dctf.sub16x16_dct( dct4x4, h->mb.pic.p_fenc[0], h->mb.pic.p_fdec[0] );
for( i8x8 = 0; i8x8 < 4; i8x8++ )
@@ -507,15 +506,11 @@ void x264_macroblock_encode( x264_t *h )
/* decimate this 8x8 block */
i_decimate_mb += i_decimate_8x8;
if( i_decimate_8x8 < 4 && b_decimate )
- {
- memset( &dct4x4[i8x8*4], 0, 4 * sizeof( *dct4x4 ) );
- memset( &h->dct.luma4x4[i8x8*4], 0, 4 * sizeof( *h->dct.luma4x4 ) );
nnz8x8[i8x8] = 0;
- }
}
if( i_decimate_mb < 6 && b_decimate )
- memset( h->dct.luma4x4, 0, 16 * sizeof( *h->dct.luma4x4 ) );
+ *(uint32_t*)nnz8x8 = 0;
else
{
for( i8x8 = 0; i8x8 < 4; i8x8++ )
@@ -546,34 +541,35 @@ void x264_macroblock_encode( x264_t *h )
{
for( i = 0; i < 16; i++ )
{
- const int nz = array_non_zero_count( h->dct.luma4x4[i]+1, 15 );
+ int nz = array_non_zero( h->dct.luma4x4[i] );
h->mb.cache.non_zero_count[x264_scan8[i]] = nz;
- if( nz > 0 )
- h->mb.i_cbp_luma = 0x0f;
- }
- }
- else if( h->mb.b_transform_8x8 )
- {
- /* coded_block_flag is enough for CABAC.
- * the full non_zero_count is done only in CAVLC. */
- for( i = 0; i < 4; i++ )
- {
- const int nz = array_non_zero( h->dct.luma8x8[i] );
- int j;
- for( j = 0; j < 4; j++ )
- h->mb.cache.non_zero_count[x264_scan8[4*i+j]] = nz;
- if( nz > 0 )
- h->mb.i_cbp_luma |= 1 << i;
+ h->mb.i_cbp_luma |= nz;
}
+ h->mb.i_cbp_luma *= 0xf;
}
else
{
- for( i = 0; i < 16; i++ )
+ for( i = 0; i < 4; i++)
{
- const int nz = array_non_zero_count( h->dct.luma4x4[i], 16 );
- h->mb.cache.non_zero_count[x264_scan8[i]] = nz;
- if( nz > 0 )
- h->mb.i_cbp_luma |= 1 << (i/4);
+ if(!nnz8x8[i])
+ for( j = 0; j < 4; j++ )
+ h->mb.cache.non_zero_count[x264_scan8[j+i*4]] = 0;
+ else if( h->mb.b_transform_8x8 )
+ {
+ int nz = nnz8x8[i];
+ for( j = 0; j < 4; j++ )
+ h->mb.cache.non_zero_count[x264_scan8[j+4*i]] = nz;
+ h->mb.i_cbp_luma |= nz << i;
+ }
+ else
+ {
+ for( j = 0; j < 4; j++ )
+ {
+ int nz = array_non_zero( h->dct.luma4x4[j+i*4] );
+ h->mb.cache.non_zero_count[x264_scan8[j+i*4]] = nz;
+ h->mb.i_cbp_luma |= nz << i;
+ }
+ }
}
}
@@ -657,10 +653,7 @@ int x264_macroblock_probe_skip( x264_t *h, const int b_bidir )
i_decimate_mb += x264_mb_decimate_score( dctscan, 16 );
if( i_decimate_mb >= 6 )
- {
- /* not as P_SKIP */
return 0;
- }
}
}
@@ -688,11 +681,8 @@ int x264_macroblock_probe_skip( x264_t *h, const int b_bidir )
dct2x2[1][1] = dct4x4[3][0][0];
h->dctf.dct2x2dc( dct2x2 );
h->quantf.quant_2x2_dc( dct2x2, h->quant4_mf[CQM_4PC][i_qp][0]>>1, h->quant4_bias[CQM_4PC][i_qp][0]<<1 );
- if( dct2x2[0][0] || dct2x2[0][1] || dct2x2[1][0] || dct2x2[1][1] )
- {
- /* can't be */
+ if( *(uint64_t*)dct2x2 )
return 0;
- }
/* calculate dct coeffs */
for( i4x4 = 0, i_decimate_mb = 0; i4x4 < 4; i4x4++ )
@@ -702,9 +692,7 @@ int x264_macroblock_probe_skip( x264_t *h, const int b_bidir )
i_decimate_mb += x264_mb_decimate_score( dctscan+1, 15 );
if( i_decimate_mb >= 7 )
- {
return 0;
- }
}
}
@@ -852,9 +840,7 @@ void x264_macroblock_encode_p8x8( x264_t *h, int i8 )
}
}
- if( nnz8x8 )
- h->mb.i_cbp_luma |= (1 << i8);
- else
- h->mb.i_cbp_luma &= ~(1 << i8);
+ h->mb.i_cbp_luma &= ~(1 << i8);
+ h->mb.i_cbp_luma |= nnz8x8 << i8;
h->mb.i_cbp_chroma = 0x02;
}
More information about the x264-devel
mailing list