Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
patchset. Idea is to share this common code between the AMR and QCELP decoders. Originally committed as revision 17916 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
88c4339bda
commit
95e8325771
@ -165,7 +165,7 @@ OBJS-$(CONFIG_PNG_DECODER) += png.o pngdec.o
|
|||||||
OBJS-$(CONFIG_PNG_ENCODER) += png.o pngenc.o
|
OBJS-$(CONFIG_PNG_ENCODER) += png.o pngenc.o
|
||||||
OBJS-$(CONFIG_PPM_ENCODER) += pnmenc.o pnm.o
|
OBJS-$(CONFIG_PPM_ENCODER) += pnmenc.o pnm.o
|
||||||
OBJS-$(CONFIG_PTX_DECODER) += ptx.o
|
OBJS-$(CONFIG_PTX_DECODER) += ptx.o
|
||||||
OBJS-$(CONFIG_QCELP_DECODER) += qcelpdec.o qcelp_lsp.o celp_math.o celp_filters.o
|
OBJS-$(CONFIG_QCELP_DECODER) += qcelpdec.o qcelp_lsp.o celp_math.o celp_filters.o acelp_vectors.o
|
||||||
OBJS-$(CONFIG_QDM2_DECODER) += qdm2.o mpegaudiodec.o mpegaudiodecheader.o mpegaudio.o mpegaudiodata.o
|
OBJS-$(CONFIG_QDM2_DECODER) += qdm2.o mpegaudiodec.o mpegaudiodecheader.o mpegaudio.o mpegaudiodata.o
|
||||||
OBJS-$(CONFIG_QDRAW_DECODER) += qdrw.o
|
OBJS-$(CONFIG_QDRAW_DECODER) += qdrw.o
|
||||||
OBJS-$(CONFIG_QPEG_DECODER) += qpeg.o
|
OBJS-$(CONFIG_QPEG_DECODER) += qpeg.o
|
||||||
|
@ -145,3 +145,13 @@ void ff_acelp_weighted_vector_sum(
|
|||||||
in_b[i] * weight_coeff_b +
|
in_b[i] * weight_coeff_b +
|
||||||
rounder) >> shift);
|
rounder) >> shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ff_weighted_vector_sumf(float *out, const float *in_a, const float *in_b,
|
||||||
|
float weight_coeff_a, float weight_coeff_b, int length)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<length; i++)
|
||||||
|
out[i] = weight_coeff_a * in_a[i]
|
||||||
|
+ weight_coeff_b * in_b[i];
|
||||||
|
}
|
||||||
|
@ -150,4 +150,18 @@ void ff_acelp_weighted_vector_sum(
|
|||||||
int shift,
|
int shift,
|
||||||
int length);
|
int length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* float implementation of weighted sum of two vectors.
|
||||||
|
* @param out [out] result of addition
|
||||||
|
* @param in_a first vector
|
||||||
|
* @param in_b second vector
|
||||||
|
* @param weight_coeff_a first vector weight coefficient
|
||||||
|
* @param weight_coeff_a second vector weight coefficient
|
||||||
|
* @param length vectors length
|
||||||
|
*
|
||||||
|
* @note It is safe to pass the same buffer for out and in_a or in_b.
|
||||||
|
*/
|
||||||
|
void ff_weighted_vector_sumf(float *out, const float *in_a, const float *in_b,
|
||||||
|
float weight_coeff_a, float weight_coeff_b, int length);
|
||||||
|
|
||||||
#endif /* AVCODEC_ACELP_VECTORS_H */
|
#endif /* AVCODEC_ACELP_VECTORS_H */
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
#include "celp_math.h"
|
#include "celp_math.h"
|
||||||
#include "celp_filters.h"
|
#include "celp_filters.h"
|
||||||
|
#include "acelp_vectors.h"
|
||||||
|
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -81,17 +82,6 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
void ff_celp_lspf2lpc(const double *lspf, float *lpc);
|
void ff_celp_lspf2lpc(const double *lspf, float *lpc);
|
||||||
|
|
||||||
static void weighted_vector_sumf(float *out, const float *in_a,
|
|
||||||
const float *in_b, float weight_coeff_a,
|
|
||||||
float weight_coeff_b, int length)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=0; i<length; i++)
|
|
||||||
out[i] = weight_coeff_a * in_a[i]
|
|
||||||
+ weight_coeff_b * in_b[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the speech codec according to the specification.
|
* Initialize the speech codec according to the specification.
|
||||||
*
|
*
|
||||||
@ -174,7 +164,7 @@ static int decode_lspf(QCELPContext *q, float *lspf)
|
|||||||
lspf[i-1] = FFMIN(lspf[i-1], (lspf[i] - QCELP_LSP_SPREAD_FACTOR));
|
lspf[i-1] = FFMIN(lspf[i-1], (lspf[i] - QCELP_LSP_SPREAD_FACTOR));
|
||||||
|
|
||||||
// Low-pass filter the LSP frequencies.
|
// Low-pass filter the LSP frequencies.
|
||||||
weighted_vector_sumf(lspf, lspf, q->prev_lspf, smooth, 1.0-smooth, 10);
|
ff_weighted_vector_sumf(lspf, lspf, q->prev_lspf, smooth, 1.0-smooth, 10);
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
q->octave_count = 0;
|
q->octave_count = 0;
|
||||||
@ -640,7 +630,7 @@ void interpolate_lpc(QCELPContext *q, const float *curr_lspf, float *lpc,
|
|||||||
|
|
||||||
if(weight != 1.0)
|
if(weight != 1.0)
|
||||||
{
|
{
|
||||||
weighted_vector_sumf(interpolated_lspf, curr_lspf, q->prev_lspf,
|
ff_weighted_vector_sumf(interpolated_lspf, curr_lspf, q->prev_lspf,
|
||||||
weight, 1.0 - weight, 10);
|
weight, 1.0 - weight, 10);
|
||||||
lspf2lpc(interpolated_lspf, lpc);
|
lspf2lpc(interpolated_lspf, lpc);
|
||||||
}else if(q->bitrate >= RATE_QUARTER ||
|
}else if(q->bitrate >= RATE_QUARTER ||
|
||||||
|
Loading…
x
Reference in New Issue
Block a user