aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorVladimir Voroshilov <voroshil@gmail.com>2009-06-20 13:36:21 +0000
committerVladimir Voroshilov <voroshil@gmail.com>2009-06-20 13:36:21 +0000
commit630c97ff4b81e5c631c33f1d803d69531f781fb3 (patch)
treee25de5fd71536821975386053eaaefcea1b0405a /libavcodec
parent6ee0eb38c015d7bf139b0058e4d28244830d9d01 (diff)
downloadffmpeg-630c97ff4b81e5c631c33f1d803d69531f781fb3.tar.gz
Convertion of LSF values to coefficients of linear prediction filter
Originally committed as revision 19240 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/g729data.h8
-rw-r--r--libavcodec/g729dec.c17
2 files changed, 25 insertions, 0 deletions
diff --git a/libavcodec/g729data.h b/libavcodec/g729data.h
index 796d24ec64..ef95570cdc 100644
--- a/libavcodec/g729data.h
+++ b/libavcodec/g729data.h
@@ -262,4 +262,12 @@ static const int16_t cb_ma_predictor[2][MA_NP][10] = { /* (0.15) */
{ 3024, 1592, 940, 1631, 1723, 1579, 2034, 2084, 1913, 2601}
}
};
+
+/**
+ * initial LSP coefficients belongs to virtual frame preceding the
+ * first frame of the stream
+ */
+static const int16_t lsp_init[10]= { /* (0.15) */
+ 30000, 26000, 21000, 15000, 8000, 0, -8000,-15000,-21000,-26000
+};
#endif /* AVCODEC_G729DATA_H */
diff --git a/libavcodec/g729dec.c b/libavcodec/g729dec.c
index 08a3a09c63..c21e89715c 100644
--- a/libavcodec/g729dec.c
+++ b/libavcodec/g729dec.c
@@ -80,6 +80,11 @@ typedef struct {
uint8_t fc_indexes_bits; ///< size (in bits) of fixed-codebook index entry
} G729FormatDescription;
+typedef struct {
+ int16_t lsp_buf[2][10]; ///< (0.15) LSP coefficients (previous and current frames) (3.2.5)
+ int16_t *lsp[2]; ///< pointers to lsp_buf
+} G729Context;
+
static const G729FormatDescription format_g729_8k = {
.ac_index_bits = {8,5},
.parity_bit = 1,
@@ -124,6 +129,10 @@ static av_cold int decoder_init(AVCodecContext * avctx)
/* Both 8kbit/s and 6.4kbit/s modes uses two subframes per frame. */
avctx->frame_size = SUBFRAME_SIZE << 1;
+ ctx->lsp[0] = ctx->lsp_buf[0];
+ ctx->lsp[1] = ctx->lsp_buf[1];
+ memcpy(ctx->lsp[0], lsp_init, 10 * sizeof(int16_t));
+
return 0;
}
@@ -138,6 +147,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
int frame_erasure = 0; ///< frame erasure detected during decoding
int bad_pitch = 0; ///< parity check failed
int i;
+ G729Context *ctx = avctx->priv_data;
+ int16_t lp[2][11]; // (3.12)
uint8_t ma_predictor; ///< switched MA predictor of LSP quantizer
uint8_t quantizer_1st; ///< first stage vector of quantizer
uint8_t quantizer_2nd_lo; ///< second stage lower vector of quantizer (size in bits)
@@ -170,6 +181,12 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
quantizer_2nd_lo = get_bits(&gb, VQ_2ND_BITS);
quantizer_2nd_hi = get_bits(&gb, VQ_2ND_BITS);
+ ff_acelp_lsf2lsp(ctx->lsp[1], ctx->lsfq, 10);
+
+ ff_acelp_lp_decode(&lp[0][0], &lp[1][0], ctx->lsp[1], ctx->lsp[0], 10);
+
+ FFSWAP(int16_t*, ctx->lsp[1], ctx->lsp[0]);
+
for (i = 0; i < 2; i++) {
uint8_t ac_index; ///< adaptive codebook index
uint8_t pulses_signs; ///< fixed-codebook vector pulse signs