From: Loren Merritt Date: Sun, 30 Jul 2006 02:39:05 +0000 (+0000) Subject: move quant_mf[] from x264_t to the heap, and merge duplicate entries X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=adc4b4f85e3682bd4868df21babcea725c919bef;p=libx264 move quant_mf[] from x264_t to the heap, and merge duplicate entries git-svn-id: svn://svn.videolan.org/x264/trunk@540 df754926-b1dd-0310-bc7b-ec298dee348c --- diff --git a/common/common.h b/common/common.h index 799d1954..322327e1 100644 --- a/common/common.h +++ b/common/common.h @@ -295,12 +295,12 @@ struct x264_t x264_pps_t *pps; int i_idr_pic_id; - int dequant4_mf[4][6][4][4]; - int dequant8_mf[2][6][8][8]; - int quant4_mf[4][6][4][4]; - int quant8_mf[2][6][8][8]; - int unquant4_mf[4][52][16]; - int unquant8_mf[2][52][64]; + int (*dequant4_mf[4])[4][4]; /* [4][6][4][4] */ + int (*dequant8_mf[2])[8][8]; /* [2][6][8][8] */ + int (*quant4_mf[4])[4][4]; /* [4][6][4][4] */ + int (*quant8_mf[2])[8][8]; /* [2][6][8][8] */ + int (*unquant4_mf[4])[16]; /* [4][52][16] */ + int (*unquant8_mf[2])[64]; /* [2][52][64] */ uint32_t nr_residual_sum[2][64]; uint32_t nr_offset[2][64]; diff --git a/common/set.c b/common/set.c index d72763ff..f6dc7c3d 100644 --- a/common/set.c +++ b/common/set.c @@ -72,7 +72,27 @@ void x264_cqm_init( x264_t *h ) int def_quant8[6][64]; int def_dequant4[6][16]; int def_dequant8[6][64]; - int q, i, i_list; + int q, i, j, i_list; + + for( i = 0; i < 6; i++ ) + { + int size = i<4 ? 16 : 64; + for( j = (i<4 ? 0 : 4); j < i; j++ ) + if( !memcmp( h->pps->scaling_list[i], h->pps->scaling_list[j], size*sizeof(uint8_t) ) ) + break; + if( j < i ) + { + h-> quant4_mf[i] = h-> quant4_mf[j]; + h->dequant4_mf[i] = h->dequant4_mf[j]; + h->unquant4_mf[i] = h->unquant4_mf[j]; + } + else + { + h-> quant4_mf[i] = x264_malloc( 6*size*sizeof(int) ); + h->dequant4_mf[i] = x264_malloc( 6*size*sizeof(int) ); + h->unquant4_mf[i] = x264_malloc(52*size*sizeof(int) ); + } + } for( q = 0; q < 6; q++ ) { @@ -116,6 +136,23 @@ void x264_cqm_init( x264_t *h ) } } +void x264_cqm_delete( x264_t *h ) +{ + int i, j; + for( i = 0; i < 6; i++ ) + { + for( j = 0; j < i; j++ ) + if( h->quant4_mf[i] == h->quant4_mf[j] ) + break; + if( j == i ) + { + x264_free( h-> quant4_mf[i] ); + x264_free( h->dequant4_mf[i] ); + x264_free( h->unquant4_mf[i] ); + } + } +} + int x264_cqm_parse_jmlist( x264_t *h, const char *buf, const char *name, uint8_t *cqm, const uint8_t *jvt, int length ) { diff --git a/common/set.h b/common/set.h index 74fa64f2..86de444a 100644 --- a/common/set.h +++ b/common/set.h @@ -219,6 +219,7 @@ static const uint8_t * const x264_cqm_jvt[6] = }; void x264_cqm_init( x264_t *h ); +void x264_cqm_delete( x264_t *h ); int x264_cqm_parse_file( x264_t *h, const char *filename ); #endif diff --git a/encoder/encoder.c b/encoder/encoder.c index 51af962a..c9b464c6 100644 --- a/encoder/encoder.c +++ b/encoder/encoder.c @@ -1818,6 +1818,7 @@ void x264_encoder_close ( x264_t *h ) if( h->param.rc.psz_rc_eq ) free( h->param.rc.psz_rc_eq ); + x264_cqm_delete( h ); x264_macroblock_cache_end( h ); x264_free( h->out.p_bitstream ); for( i = 1; i < h->param.i_threads; i++ )