diff options
author | Mans Rullgard <mans@mansr.com> | 2011-04-03 19:38:41 +0100 |
---|---|---|
committer | Mans Rullgard <mans@mansr.com> | 2011-07-06 00:29:59 +0100 |
commit | f507a9fe002c6a444cbd38a1326ee4f9df8c10a1 (patch) | |
tree | f6b8cfd0161b7af699efb3a9ebb76f8d9d500efe /libavcodec | |
parent | fce1e43410bdc032c4cf2b1c66166a9ed99cc8f1 (diff) | |
download | ffmpeg-f507a9fe002c6a444cbd38a1326ee4f9df8c10a1.tar.gz |
ac3enc: move inner loop of compute_rematrixing_strategy to ac3dsp
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/ac3dsp.c | 45 | ||||
-rw-r--r-- | libavcodec/ac3dsp.h | 6 | ||||
-rw-r--r-- | libavcodec/ac3enc_fixed.c | 6 | ||||
-rw-r--r-- | libavcodec/ac3enc_float.c | 6 | ||||
-rw-r--r-- | libavcodec/ac3enc_template.c | 19 |
5 files changed, 70 insertions, 12 deletions
diff --git a/libavcodec/ac3dsp.c b/libavcodec/ac3dsp.c index 98c73573cb..69beab64ca 100644 --- a/libavcodec/ac3dsp.c +++ b/libavcodec/ac3dsp.c @@ -23,6 +23,7 @@ #include "avcodec.h" #include "ac3.h" #include "ac3dsp.h" +#include "mathops.h" static void ac3_exponent_min_c(uint8_t *exp, int num_reuse_blocks, int nb_coefs) { @@ -169,6 +170,48 @@ static void ac3_extract_exponents_c(uint8_t *exp, int32_t *coef, int nb_coefs) } } +static void ac3_sum_square_butterfly_int32_c(int64_t sum[4], + const int32_t *coef0, + const int32_t *coef1, + int len) +{ + int i; + + sum[0] = sum[1] = sum[2] = sum[3] = 0; + + for (i = 0; i < len; i++) { + int lt = coef0[i]; + int rt = coef1[i]; + int md = lt + rt; + int sd = lt - rt; + MAC64(sum[0], lt, lt); + MAC64(sum[1], rt, rt); + MAC64(sum[2], md, md); + MAC64(sum[3], sd, sd); + } +} + +static void ac3_sum_square_butterfly_float_c(float sum[4], + const float *coef0, + const float *coef1, + int len) +{ + int i; + + sum[0] = sum[1] = sum[2] = sum[3] = 0; + + for (i = 0; i < len; i++) { + float lt = coef0[i]; + float rt = coef1[i]; + float md = lt + rt; + float sd = lt - rt; + sum[0] += lt * lt; + sum[1] += rt * rt; + sum[2] += md * md; + sum[3] += sd * sd; + } +} + av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact) { c->ac3_exponent_min = ac3_exponent_min_c; @@ -180,6 +223,8 @@ av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact) c->update_bap_counts = ac3_update_bap_counts_c; c->compute_mantissa_size = ac3_compute_mantissa_size_c; c->extract_exponents = ac3_extract_exponents_c; + c->sum_square_butterfly_int32 = ac3_sum_square_butterfly_int32_c; + c->sum_square_butterfly_float = ac3_sum_square_butterfly_float_c; if (ARCH_ARM) ff_ac3dsp_init_arm(c, bit_exact); diff --git a/libavcodec/ac3dsp.h b/libavcodec/ac3dsp.h index 8eeafd68ac..621841e384 100644 --- a/libavcodec/ac3dsp.h +++ b/libavcodec/ac3dsp.h @@ -125,6 +125,12 @@ typedef struct AC3DSPContext { int (*compute_mantissa_size)(uint16_t mant_cnt[6][16]); void (*extract_exponents)(uint8_t *exp, int32_t *coef, int nb_coefs); + + void (*sum_square_butterfly_int32)(int64_t sum[4], const int32_t *coef0, + const int32_t *coef1, int len); + + void (*sum_square_butterfly_float)(float sum[4], const float *coef0, + const float *coef1, int len); } AC3DSPContext; void ff_ac3dsp_init (AC3DSPContext *c, int bit_exact); diff --git a/libavcodec/ac3enc_fixed.c b/libavcodec/ac3enc_fixed.c index ea3a46cdfa..b63f3d8df1 100644 --- a/libavcodec/ac3enc_fixed.c +++ b/libavcodec/ac3enc_fixed.c @@ -103,6 +103,12 @@ static void scale_coefficients(AC3EncodeContext *s) } } +static void sum_square_butterfly(AC3EncodeContext *s, int64_t sum[4], + const int32_t *coef0, const int32_t *coef1, + int len) +{ + s->ac3dsp.sum_square_butterfly_int32(sum, coef0, coef1, len); +} /** * Clip MDCT coefficients to allowable range. diff --git a/libavcodec/ac3enc_float.c b/libavcodec/ac3enc_float.c index 718cc1f2b2..99a0775be2 100644 --- a/libavcodec/ac3enc_float.c +++ b/libavcodec/ac3enc_float.c @@ -110,6 +110,12 @@ static void scale_coefficients(AC3EncodeContext *s) chan_size * s->channels); } +static void sum_square_butterfly(AC3EncodeContext *s, float sum[4], + const float *coef0, const float *coef1, + int len) +{ + s->ac3dsp.sum_square_butterfly_float(sum, coef0, coef1, len); +} /** * Clip MDCT coefficients to allowable range. diff --git a/libavcodec/ac3enc_template.c b/libavcodec/ac3enc_template.c index c7243c7644..1ee1b617db 100644 --- a/libavcodec/ac3enc_template.c +++ b/libavcodec/ac3enc_template.c @@ -43,6 +43,9 @@ static int normalize_samples(AC3EncodeContext *s); static void clip_coefficients(DSPContext *dsp, CoefType *coef, unsigned int len); +static void sum_square_butterfly(AC3EncodeContext *s, CoefSumType sum[4], + const CoefType *coef0, const CoefType *coef1, + int len); int AC3_NAME(allocate_sample_buffers)(AC3EncodeContext *s) { @@ -356,7 +359,7 @@ static void apply_channel_coupling(AC3EncodeContext *s) static void compute_rematrixing_strategy(AC3EncodeContext *s) { int nb_coefs; - int blk, bnd, i; + int blk, bnd; AC3Block *block, *av_uninit(block0); if (s->channel_mode != AC3_CHMODE_STEREO) @@ -384,17 +387,9 @@ static void compute_rematrixing_strategy(AC3EncodeContext *s) /* calculate calculate sum of squared coeffs for one band in one block */ int start = ff_ac3_rematrix_band_tab[bnd]; int end = FFMIN(nb_coefs, ff_ac3_rematrix_band_tab[bnd+1]); - CoefSumType sum[4] = {0,}; - for (i = start; i < end; i++) { - CoefType lt = block->mdct_coef[1][i]; - CoefType rt = block->mdct_coef[2][i]; - CoefType md = lt + rt; - CoefType sd = lt - rt; - MAC_COEF(sum[0], lt, lt); - MAC_COEF(sum[1], rt, rt); - MAC_COEF(sum[2], md, md); - MAC_COEF(sum[3], sd, sd); - } + CoefSumType sum[4]; + sum_square_butterfly(s, sum, block->mdct_coef[1] + start, + block->mdct_coef[2] + start, end - start); /* compare sums to determine if rematrixing will be used for this band */ if (FFMIN(sum[2], sum[3]) < FFMIN(sum[0], sum[1])) |