Commit e22e8be1 authored by reynaldo's avatar reynaldo

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.



git-svn-id: file:///var/local/repositories/ffmpeg/trunk@17916 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 38c1b352
...@@ -165,7 +165,7 @@ OBJS-$(CONFIG_PNG_DECODER) += png.o pngdec.o ...@@ -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( ...@@ -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( ...@@ -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 @@ ...@@ -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 ...@@ -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) ...@@ -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, ...@@ -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 ||
......
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