Commit f507a9fe authored by Mans Rullgard's avatar Mans Rullgard

ac3enc: move inner loop of compute_rematrixing_strategy to ac3dsp

parent fce1e434
......@@ -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);
......
......@@ -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);
......
......@@ -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.
......
......@@ -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.
......
......@@ -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]))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment