From: Fiona Glaser Date: Fri, 16 May 2008 04:44:12 +0000 (-0600) Subject: omit delta_quant in i16x16 blocks with no residual X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d5d07b1823292e65572466577689819cf3bb98ec;p=libx264 omit delta_quant in i16x16 blocks with no residual (all other block types were already covered, but i16x16 cbp is special) --- diff --git a/encoder/cabac.c b/encoder/cabac.c index d482c066..7e70a256 100644 --- a/encoder/cabac.c +++ b/encoder/cabac.c @@ -304,6 +304,15 @@ static void x264_cabac_mb_qp_delta( x264_t *h, x264_cabac_t *cb ) int i_dqp = h->mb.i_qp - h->mb.i_last_qp; int ctx; + /* Avoid writing a delta quant if we have an empty i16x16 block, e.g. in a completely flat background area */ + if( h->mb.i_type == I_16x16 && !h->mb.cbp[h->mb.i_mb_xy] ) + { +#ifndef RD_SKIP_BS + h->mb.i_qp = h->mb.i_last_qp; +#endif + i_dqp = 0; + } + /* No need to test for PCM / SKIP */ if( h->mb.i_last_dqp && ( h->mb.type[i_mbn_xy] == I_16x16 || (h->mb.cbp[i_mbn_xy]&0x3f) ) ) diff --git a/encoder/cavlc.c b/encoder/cavlc.c index 726d024f..b0d951df 100644 --- a/encoder/cavlc.c +++ b/encoder/cavlc.c @@ -220,6 +220,17 @@ static void block_residual_write_cavlc( x264_t *h, bs_t *s, int i_idx, int16_t * static void cavlc_qp_delta( x264_t *h, bs_t *s ) { int i_dqp = h->mb.i_qp - h->mb.i_last_qp; + + /* Avoid writing a delta quant if we have an empty i16x16 block, e.g. in a completely flat background area */ + if( h->mb.i_type == I_16x16 && !(h->mb.i_cbp_luma | h->mb.i_cbp_chroma) + && !array_non_zero(h->dct.luma16x16_dc) ) + { +#ifndef RD_SKIP_BS + h->mb.i_qp = h->mb.i_last_qp; +#endif + i_dqp = 0; + } + if( i_dqp ) { if( i_dqp < -26 )