to the audio conversion routines. Originally committed as revision 22937 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
| @@ -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; | |||||
| samples[i] = av_clipf(samples[i], -AMR_SAMPLE_BOUND, | |||||
| AMR_SAMPLE_BOUND); | |||||
| return 1; | |||||
| } | } | ||||
| 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), | |||||
| 32700.0 / (1 << 15), AT1_SU_SAMPLES); | |||||
| memcpy(samples, q->out_samples[0], AT1_SU_SAMPLES * 4); | |||||
| } 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], | |||||
| -32700.0 / (1 << 15), | |||||
| 32700.0 / (1 << 15)); | |||||
| samples[i * 2 + 1] = av_clipf(q->out_samples[1][i], | |||||
| -32700.0 / (1 << 15), | |||||
| 32700.0 / (1 << 15)); | |||||
| samples[i * 2] = q->out_samples[0][i]; | |||||
| samples[i * 2 + 1] = q->out_samples[1][i]; | |||||
| } | } | ||||
| } | } | ||||
| @@ -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_S16, int16_t, SAMPLE_FMT_FLT, 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_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, av_clip_int16( lrintf(*(const float*)pi * (1<<15)))) | |||||
| 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_S16, int16_t, SAMPLE_FMT_DBL, 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_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, av_clip_int16( lrint(*(const double*)pi * (1<<15)))) | |||||
| 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++) | |||||
| samples[n] = av_clipf(synth[n], -1.0, 1.0); | |||||
| memcpy(samples, synth, 160 * sizeof(synth[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 | ||||