mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
ac3enc: clip coefficients after MDCT.
This ensures that any processing between the MDCT and exponent extraction will be using clipped coefficients.
This commit is contained in:
parent
6054cd25b4
commit
523b7eba19
@ -50,12 +50,16 @@
|
|||||||
#if CONFIG_AC3ENC_FLOAT
|
#if CONFIG_AC3ENC_FLOAT
|
||||||
#define AC3_NAME(x) ff_ac3_float_ ## x
|
#define AC3_NAME(x) ff_ac3_float_ ## x
|
||||||
#define MAC_COEF(d,a,b) ((d)+=(a)*(b))
|
#define MAC_COEF(d,a,b) ((d)+=(a)*(b))
|
||||||
|
#define COEF_MIN (-16777215.0/16777216.0)
|
||||||
|
#define COEF_MAX ( 16777215.0/16777216.0)
|
||||||
typedef float SampleType;
|
typedef float SampleType;
|
||||||
typedef float CoefType;
|
typedef float CoefType;
|
||||||
typedef float CoefSumType;
|
typedef float CoefSumType;
|
||||||
#else
|
#else
|
||||||
#define AC3_NAME(x) ff_ac3_fixed_ ## x
|
#define AC3_NAME(x) ff_ac3_fixed_ ## x
|
||||||
#define MAC_COEF(d,a,b) MAC64(d,a,b)
|
#define MAC_COEF(d,a,b) MAC64(d,a,b)
|
||||||
|
#define COEF_MIN -16777215
|
||||||
|
#define COEF_MAX 16777215
|
||||||
typedef int16_t SampleType;
|
typedef int16_t SampleType;
|
||||||
typedef int32_t CoefType;
|
typedef int32_t CoefType;
|
||||||
typedef int64_t CoefSumType;
|
typedef int64_t CoefSumType;
|
||||||
|
@ -104,6 +104,15 @@ static void scale_coefficients(AC3EncodeContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clip MDCT coefficients to allowable range.
|
||||||
|
*/
|
||||||
|
static void clip_coefficients(DSPContext *dsp, int32_t *coef, unsigned int len)
|
||||||
|
{
|
||||||
|
dsp->vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
|
static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
AC3EncodeContext *s = avctx->priv_data;
|
AC3EncodeContext *s = avctx->priv_data;
|
||||||
|
@ -111,6 +111,15 @@ static void scale_coefficients(AC3EncodeContext *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clip MDCT coefficients to allowable range.
|
||||||
|
*/
|
||||||
|
static void clip_coefficients(DSPContext *dsp, float *coef, unsigned int len)
|
||||||
|
{
|
||||||
|
dsp->vector_clipf(coef, coef, COEF_MIN, COEF_MAX, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if CONFIG_AC3_ENCODER
|
#if CONFIG_AC3_ENCODER
|
||||||
AVCodec ff_ac3_encoder = {
|
AVCodec ff_ac3_encoder = {
|
||||||
"ac3",
|
"ac3",
|
||||||
|
@ -41,6 +41,8 @@ static void apply_window(DSPContext *dsp, SampleType *output,
|
|||||||
|
|
||||||
static int normalize_samples(AC3EncodeContext *s);
|
static int normalize_samples(AC3EncodeContext *s);
|
||||||
|
|
||||||
|
static void clip_coefficients(DSPContext *dsp, CoefType *coef, unsigned int len);
|
||||||
|
|
||||||
|
|
||||||
int AC3_NAME(allocate_sample_buffers)(AC3EncodeContext *s)
|
int AC3_NAME(allocate_sample_buffers)(AC3EncodeContext *s)
|
||||||
{
|
{
|
||||||
@ -171,8 +173,8 @@ static void apply_channel_coupling(AC3EncodeContext *s)
|
|||||||
cpl_coef[i] += ch_coef[i];
|
cpl_coef[i] += ch_coef[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* coefficients must be clipped to +/- 1.0 in order to be encoded */
|
/* coefficients must be clipped in order to be encoded */
|
||||||
s->dsp.vector_clipf(cpl_coef, cpl_coef, -1.0f, 1.0f, num_cpl_coefs);
|
clip_coefficients(&s->dsp, cpl_coef, num_cpl_coefs);
|
||||||
|
|
||||||
/* scale coupling coefficients from float to 24-bit fixed-point */
|
/* scale coupling coefficients from float to 24-bit fixed-point */
|
||||||
s->ac3dsp.float_to_fixed24(&block->fixed_coef[CPL_CH][cpl_start],
|
s->ac3dsp.float_to_fixed24(&block->fixed_coef[CPL_CH][cpl_start],
|
||||||
@ -300,6 +302,7 @@ static void apply_channel_coupling(AC3EncodeContext *s)
|
|||||||
if (!block->cpl_in_use || !block->new_cpl_coords)
|
if (!block->cpl_in_use || !block->new_cpl_coords)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
clip_coefficients(&s->dsp, cpl_coords[blk][1], s->fbw_channels * 16);
|
||||||
s->ac3dsp.float_to_fixed24(fixed_cpl_coords[blk][1],
|
s->ac3dsp.float_to_fixed24(fixed_cpl_coords[blk][1],
|
||||||
cpl_coords[blk][1],
|
cpl_coords[blk][1],
|
||||||
s->fbw_channels * 16);
|
s->fbw_channels * 16);
|
||||||
@ -433,7 +436,11 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, unsigned char *frame,
|
|||||||
|
|
||||||
apply_mdct(s);
|
apply_mdct(s);
|
||||||
|
|
||||||
scale_coefficients(s);
|
if (s->fixed_point)
|
||||||
|
scale_coefficients(s);
|
||||||
|
|
||||||
|
clip_coefficients(&s->dsp, s->blocks[0].mdct_coef[1],
|
||||||
|
AC3_MAX_COEFS * AC3_MAX_BLOCKS * s->channels);
|
||||||
|
|
||||||
s->cpl_on = s->cpl_enabled;
|
s->cpl_on = s->cpl_enabled;
|
||||||
ff_ac3_compute_coupling_strategy(s);
|
ff_ac3_compute_coupling_strategy(s);
|
||||||
@ -443,6 +450,9 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, unsigned char *frame,
|
|||||||
|
|
||||||
compute_rematrixing_strategy(s);
|
compute_rematrixing_strategy(s);
|
||||||
|
|
||||||
|
if (!s->fixed_point)
|
||||||
|
scale_coefficients(s);
|
||||||
|
|
||||||
ff_ac3_apply_rematrixing(s);
|
ff_ac3_apply_rematrixing(s);
|
||||||
|
|
||||||
ff_ac3_process_exponents(s);
|
ff_ac3_process_exponents(s);
|
||||||
|
Loading…
Reference in New Issue
Block a user