mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Move clipping of audio samples (for those codecs outputting float) from decoder
to the audio conversion routines. Originally committed as revision 22937 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
6858ce2ffc
commit
b1078e9fe6
@ -796,7 +796,7 @@ static int synthesis(AMRContext *p, float *lpc,
|
|||||||
float fixed_gain, const float *fixed_vector,
|
float fixed_gain, const float *fixed_vector,
|
||||||
float *samples, uint8_t overflow)
|
float *samples, uint8_t overflow)
|
||||||
{
|
{
|
||||||
int i, overflow_temp = 0;
|
int i;
|
||||||
float excitation[AMR_SUBFRAME_SIZE];
|
float excitation[AMR_SUBFRAME_SIZE];
|
||||||
|
|
||||||
// if an overflow has been detected, the pitch vector is scaled down by a
|
// if an overflow has been detected, the pitch vector is scaled down by a
|
||||||
@ -831,12 +831,10 @@ static int synthesis(AMRContext *p, float *lpc,
|
|||||||
// detect overflow
|
// detect overflow
|
||||||
for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
|
for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
|
||||||
if (fabsf(samples[i]) > AMR_SAMPLE_BOUND) {
|
if (fabsf(samples[i]) > AMR_SAMPLE_BOUND) {
|
||||||
overflow_temp = 1;
|
return 1;
|
||||||
samples[i] = av_clipf(samples[i], -AMR_SAMPLE_BOUND,
|
|
||||||
AMR_SAMPLE_BOUND);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return overflow_temp;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
@ -1048,10 +1046,6 @@ static int amrnb_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
|||||||
highpass_poles, highpass_gain,
|
highpass_poles, highpass_gain,
|
||||||
p->high_pass_mem, AMR_BLOCK_SIZE);
|
p->high_pass_mem, AMR_BLOCK_SIZE);
|
||||||
|
|
||||||
for (i = 0; i < AMR_BLOCK_SIZE; i++)
|
|
||||||
buf_out[i] = av_clipf(buf_out[i] * AMR_SAMPLE_SCALE,
|
|
||||||
-1.0, 32767.0 / 32768.0);
|
|
||||||
|
|
||||||
/* Update averaged lsf vector (used for fixed gain smoothing).
|
/* Update averaged lsf vector (used for fixed gain smoothing).
|
||||||
*
|
*
|
||||||
* Note that lsf_avg should not incorporate the current frame's LSFs
|
* Note that lsf_avg should not incorporate the current frame's LSFs
|
||||||
|
@ -305,20 +305,15 @@ static int atrac1_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
at1_subband_synthesis(q, su, q->out_samples[ch]);
|
at1_subband_synthesis(q, su, q->out_samples[ch]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* round, convert to 16bit and interleave */
|
/* interleave; FIXME, should create/use a DSP function */
|
||||||
if (q->channels == 1) {
|
if (q->channels == 1) {
|
||||||
/* mono */
|
/* mono */
|
||||||
q->dsp.vector_clipf(samples, q->out_samples[0], -32700.0 / (1 << 15),
|
memcpy(samples, q->out_samples[0], AT1_SU_SAMPLES * 4);
|
||||||
32700.0 / (1 << 15), AT1_SU_SAMPLES);
|
|
||||||
} else {
|
} else {
|
||||||
/* stereo */
|
/* stereo */
|
||||||
for (i = 0; i < AT1_SU_SAMPLES; i++) {
|
for (i = 0; i < AT1_SU_SAMPLES; i++) {
|
||||||
samples[i * 2] = av_clipf(q->out_samples[0][i],
|
samples[i * 2] = q->out_samples[0][i];
|
||||||
-32700.0 / (1 << 15),
|
samples[i * 2 + 1] = q->out_samples[1][i];
|
||||||
32700.0 / (1 << 15));
|
|
||||||
samples[i * 2 + 1] = av_clipf(q->out_samples[1][i],
|
|
||||||
-32700.0 / (1 << 15),
|
|
||||||
32700.0 / (1 << 15));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +209,7 @@ if(ctx->fmt_pair == ofmt + SAMPLE_FMT_NB*ifmt){\
|
|||||||
}
|
}
|
||||||
|
|
||||||
//FIXME put things below under ifdefs so we do not waste space for cases no codec will need
|
//FIXME put things below under ifdefs so we do not waste space for cases no codec will need
|
||||||
//FIXME rounding and clipping ?
|
//FIXME rounding ?
|
||||||
|
|
||||||
CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_U8 , *(const uint8_t*)pi)
|
CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_U8 , *(const uint8_t*)pi)
|
||||||
else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<8)
|
else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<8)
|
||||||
@ -226,14 +226,14 @@ if(ctx->fmt_pair == ofmt + SAMPLE_FMT_NB*ifmt){\
|
|||||||
else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_S32, *(const int32_t*)pi)
|
else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_S32, *(const int32_t*)pi)
|
||||||
else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1<<31)))
|
else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1<<31)))
|
||||||
else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1<<31)))
|
else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1<<31)))
|
||||||
else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_FLT, lrintf(*(const float*)pi * (1<<7)) + 0x80)
|
else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_FLT, av_clip_uint8( lrintf(*(const float*)pi * (1<<7)) + 0x80))
|
||||||
else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_FLT, lrintf(*(const float*)pi * (1<<15)))
|
else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_FLT, av_clip_int16( lrintf(*(const float*)pi * (1<<15))))
|
||||||
else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_FLT, lrintf(*(const float*)pi * (1<<31)))
|
else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float*)pi * (1U<<31))))
|
||||||
else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_FLT, *(const float*)pi)
|
else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_FLT, *(const float*)pi)
|
||||||
else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_FLT, *(const float*)pi)
|
else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_FLT, *(const float*)pi)
|
||||||
else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_DBL, lrint(*(const double*)pi * (1<<7)) + 0x80)
|
else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_DBL, av_clip_uint8( lrint(*(const double*)pi * (1<<7)) + 0x80))
|
||||||
else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_DBL, lrint(*(const double*)pi * (1<<15)))
|
else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_DBL, av_clip_int16( lrint(*(const double*)pi * (1<<15))))
|
||||||
else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_DBL, lrint(*(const double*)pi * (1<<31)))
|
else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double*)pi * (1U<<31))))
|
||||||
else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_DBL, *(const double*)pi)
|
else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_DBL, *(const double*)pi)
|
||||||
else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_DBL, *(const double*)pi)
|
else CONV(SAMPLE_FMT_DBL, double , SAMPLE_FMT_DBL, *(const double*)pi)
|
||||||
else return -1;
|
else return -1;
|
||||||
|
@ -424,16 +424,6 @@ static const qcelp_vector * const qcelp_lspvq[5] = {
|
|||||||
*/
|
*/
|
||||||
#define QCELP_SCALE 8192.
|
#define QCELP_SCALE 8192.
|
||||||
|
|
||||||
/**
|
|
||||||
* the upper boundary of the clipping, depends on QCELP_SCALE
|
|
||||||
*/
|
|
||||||
#define QCELP_CLIP_UPPER_BOUND (8191.75/8192.)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* the lower boundary of the clipping, depends on QCELP_SCALE
|
|
||||||
*/
|
|
||||||
#define QCELP_CLIP_LOWER_BOUND -1.
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* table for computing Ga (decoded linear codebook gain magnitude)
|
* table for computing Ga (decoded linear codebook gain magnitude)
|
||||||
*
|
*
|
||||||
|
@ -834,10 +834,6 @@ erasure:
|
|||||||
|
|
||||||
memcpy(q->formant_mem, q->formant_mem + 160, 10 * sizeof(float));
|
memcpy(q->formant_mem, q->formant_mem + 160, 10 * sizeof(float));
|
||||||
|
|
||||||
for(i=0; i<160; i++)
|
|
||||||
outbuffer[i] = av_clipf(outbuffer[i], QCELP_CLIP_LOWER_BOUND,
|
|
||||||
QCELP_CLIP_UPPER_BOUND);
|
|
||||||
|
|
||||||
memcpy(q->prev_lspf, quantized_lspf, sizeof(q->prev_lspf));
|
memcpy(q->prev_lspf, quantized_lspf, sizeof(q->prev_lspf));
|
||||||
q->prev_bitrate = q->bitrate;
|
q->prev_bitrate = q->bitrate;
|
||||||
|
|
||||||
|
@ -102,10 +102,6 @@ static void decode(RA288Context *ractx, float gain, int cb_coef)
|
|||||||
gain_block[9] = 10 * log10(sum) - 32;
|
gain_block[9] = 10 * log10(sum) - 32;
|
||||||
|
|
||||||
ff_celp_lp_synthesis_filterf(block, ractx->sp_lpc, buffer, 5, 36);
|
ff_celp_lp_synthesis_filterf(block, ractx->sp_lpc, buffer, 5, 36);
|
||||||
|
|
||||||
/* output */
|
|
||||||
for (i=0; i < 5; i++)
|
|
||||||
block[i] = av_clipf(block[i], -4095./4096., 4095./4096.);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -496,9 +496,6 @@ static void decode_frame(SiprContext *ctx, SiprParameters *params,
|
|||||||
0.939805806,
|
0.939805806,
|
||||||
ctx->highpass_filt_mem,
|
ctx->highpass_filt_mem,
|
||||||
frame_size);
|
frame_size);
|
||||||
|
|
||||||
ctx->dsp.vector_clipf(out_data, out_data, -1, 32767./(1<<15), frame_size);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_cold int sipr_decoder_init(AVCodecContext * avctx)
|
static av_cold int sipr_decoder_init(AVCodecContext * avctx)
|
||||||
|
@ -264,9 +264,6 @@ void ff_sipr_decode_frame_16k(SiprContext *ctx, SiprParameters *params,
|
|||||||
postfilter(out_data, synth, ctx->iir_mem, ctx->filt_mem, ctx->mem_preemph);
|
postfilter(out_data, synth, ctx->iir_mem, ctx->filt_mem, ctx->mem_preemph);
|
||||||
|
|
||||||
memcpy(ctx->iir_mem, Az[1], LP_FILTER_ORDER_16k * sizeof(float));
|
memcpy(ctx->iir_mem, Az[1], LP_FILTER_ORDER_16k * sizeof(float));
|
||||||
|
|
||||||
ctx->dsp.vector_clipf(out_data, out_data, -1, 32767./(1<<15), frame_size);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_sipr_init_16k(SiprContext *ctx)
|
void ff_sipr_init_16k(SiprContext *ctx)
|
||||||
|
@ -850,9 +850,6 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data,
|
|||||||
return buf_size;
|
return buf_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
tctx->dsp.vector_clipf(out, out, -32700./(1<<15), 32700./(1<<15),
|
|
||||||
avctx->channels * mtab->size);
|
|
||||||
|
|
||||||
*data_size = mtab->size*avctx->channels*4;
|
*data_size = mtab->size*avctx->channels*4;
|
||||||
|
|
||||||
return buf_size;
|
return buf_size;
|
||||||
|
@ -1351,8 +1351,9 @@ static int decode_frame(WMAProDecodeCtx *s)
|
|||||||
float* iptr = s->channel[i].out;
|
float* iptr = s->channel[i].out;
|
||||||
float* iend = iptr + s->samples_per_frame;
|
float* iend = iptr + s->samples_per_frame;
|
||||||
|
|
||||||
|
// FIXME should create/use a DSP function here
|
||||||
while (iptr < iend) {
|
while (iptr < iend) {
|
||||||
*ptr = av_clipf(*iptr++, -1.0, 32767.0 / 32768.0);
|
*ptr = *iptr++;
|
||||||
ptr += incr;
|
ptr += incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1117,8 +1117,7 @@ static int synth_frame(AVCodecContext *ctx, GetBitContext *gb,
|
|||||||
av_log_missing_feature(ctx, "APF", 0);
|
av_log_missing_feature(ctx, "APF", 0);
|
||||||
s->do_apf = 0;
|
s->do_apf = 0;
|
||||||
} //else
|
} //else
|
||||||
for (n = 0; n < 160; n++)
|
memcpy(samples, synth, 160 * sizeof(synth[0]));
|
||||||
samples[n] = av_clipf(synth[n], -1.0, 1.0);
|
|
||||||
|
|
||||||
/* Cache values for next frame */
|
/* Cache values for next frame */
|
||||||
s->frame_cntr++;
|
s->frame_cntr++;
|
||||||
|
@ -144,6 +144,17 @@ static inline av_const int16_t av_clip_int16(int a)
|
|||||||
else return a;
|
else return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clips a signed 64-bit integer value into the -2147483648,2147483647 range.
|
||||||
|
* @param a value to clip
|
||||||
|
* @return clipped value
|
||||||
|
*/
|
||||||
|
static inline av_const int32_t av_clipl_int32(int64_t a)
|
||||||
|
{
|
||||||
|
if ((a+2147483648) & ~2147483647) return (a>>63) ^ 2147483647;
|
||||||
|
else return a;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clips a float value into the amin-amax range.
|
* Clips a float value into the amin-amax range.
|
||||||
* @param a value to clip
|
* @param a value to clip
|
||||||
|
Loading…
Reference in New Issue
Block a user