[FFmpeg-soc] [soc]AMR-WB decoder branch, master, updated.
Marcelo Póvoa
marspeoplester at gmail.com
Thu Jun 24 18:29:49 CEST 2010
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "AMR-WB decoder".
The branch, master has been updated
via 18bd5b400745788b6f7bc40dafc0c2c1d9ebdc28 (commit)
from 16c2032735c2e55fb9fa7e05cb07ca9d6e0328a1 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 18bd5b400745788b6f7bc40dafc0c2c1d9ebdc28
Author: Marcelo Povoa <marspeoplester at gmail.com>
Date: Thu Jun 24 13:28:23 2010 -0300
Decode pitch lag for all modes
diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c
index d2a264f..68a5d91 100644
--- a/libavcodec/amrwbdec.c
+++ b/libavcodec/amrwbdec.c
@@ -37,8 +37,9 @@ typedef struct {
double isp[4][LP_ORDER]; ///< ISP vectors from current frame
double isp_sub4_past[LP_ORDER]; ///< ISP vector for the 4th subframe of the previous frame
- float lp_coef[4][LP_ORDER]; ///< Linear Prediction Coefficients from ISP vector
+ float lp_coef[4][LP_ORDER]; ///< Linear Prediction Coefficients from ISP vector
+ uint8_t base_pitch_lag; ///< integer part of pitch lag for next relative subframe
} AMRWBContext;
static int amrwb_decode_init(AVCodecContext *avctx)
@@ -285,6 +286,106 @@ static void isp2lp(double isp[LP_ORDER], float *lp, int lp_half_order) {
lp2[lp_half_order] = last_isp;
}
+/**
+ * Decode a adaptive codebook index into pitch lag (except 6k60, 8k85 modes)
+ * Calculate (nearest) integer lag and fractional lag using 1/4 resolution
+ * In 1st and 3rd subframes index is relative to last subframe integer lag
+ *
+ * @param lag_int [out] Decoded integer pitch lag
+ * @param lag_frac [out] Decoded fractional pitch lag
+ * @param pitch_index [in] Adaptive codebook pitch index
+ * @param base_lag_int [in/out] Base integer lag used in relative subframes
+ * @param subframe [in] Current subframe index (0 to 3)
+ */
+static void decode_pitch_lag_high(int *lag_int, int *lag_frac, int pitch_index,
+ uint8_t *base_lag_int, const int subframe)
+{
+ if (subframe == 0 || subframe == 2) {
+ if (pitch_index < 376) {
+ *lag_int = (pitch_index + 137) >> 2;
+ *lag_frac = pitch_index - (*lag_int << 2) + 136;
+ } else if (pitch_index < 440) {
+ *lag_int = (pitch_index + 257 - 376) >> 1;
+ *lag_frac = (pitch_index - (*lag_int << 1) + 256 - 376) << 1;
+ /* the actual resolution is 1/2 but expressed as 1/4 */
+ } else {
+ *lag_int = pitch_index - 280;
+ *lag_frac = 0;
+ }
+ *base_lag_int = *lag_int; // store previous lag
+ } else {
+ *lag_int = (pitch_index + 1) >> 2;
+ *lag_frac = pitch_index - (*lag_int << 2);
+ *lag_int += *base_lag_int - 8;
+ /* Doesn't seem to need bounding according to TS 26.190 */
+ }
+}
+
+/**
+ * Decode a adaptive codebook index into pitch lag for 8k85 mode
+ * Description is analogous to decode_pitch_lag_high
+ */
+static void decode_pitch_lag_8K85(int *lag_int, int *lag_frac, int pitch_index,
+ uint8_t *base_lag_int, const int subframe)
+{
+ if (subframe == 0 || subframe == 2) {
+ if (pitch_index < 116) {
+ *lag_int = (pitch_index + 69) >> 1;
+ *lag_frac = (pitch_index - (*lag_int << 1) + 68) << 1;
+ } else {
+ *lag_int = pitch_index - 24;
+ *lag_frac = 0;
+ }
+ *base_lag_int = *lag_int;
+ } else {
+ *lag_int = (pitch_index + 1) >> 1;
+ *lag_frac = pitch_index - (*lag_int << 1);
+ *lag_int += *base_lag_int - 8;
+ }
+}
+
+/**
+ * Decode a adaptive codebook index into pitch lag for 6k60 mode
+ * Description is analogous to decode_pitch_lag_high, but relative
+ * index is used for all subframes except the first
+ */
+static void decode_pitch_lag_6K60(int *lag_int, int *lag_frac, int pitch_index,
+ uint8_t *base_lag_int, const int subframe)
+{
+ if (subframe == 0) {
+ if (pitch_index < 116) {
+ *lag_int = (pitch_index + 69) >> 1;
+ *lag_frac = (pitch_index - (*lag_int << 1) + 68) << 1;
+ } else {
+ *lag_int = pitch_index - 24;
+ *lag_frac = 0;
+ }
+ *base_lag_int = *lag_int;
+ } else {
+ *lag_int = (pitch_index + 1) >> 1;
+ *lag_frac = pitch_index - (*lag_int << 1);
+ *lag_int += *base_lag_int - 8;
+ }
+}
+
+static void decode_pitch_vector(AMRWBContext *ctx,
+ const AMRWBSubFrame *amr_subframe,
+ const int subframe)
+{
+ int pitch_lag_int, pitch_lag_frac;
+ enum Mode mode = ctx->fr_cur_mode;
+
+ if (mode == MODE_6k60) {
+ decode_pitch_lag_6K60(&pitch_lag_int, &pitch_lag_frac, amr_subframe->adap,
+ &ctx->base_pitch_lag, subframe);
+ } else if (mode == MODE_8k85) {
+ decode_pitch_lag_8K85(&pitch_lag_int, &pitch_lag_frac, amr_subframe->adap,
+ &ctx->base_pitch_lag, subframe);
+ } else
+ decode_pitch_lag_high(&pitch_lag_int, &pitch_lag_frac, amr_subframe->adap,
+ &ctx->base_pitch_lag, subframe);
+}
+
static int amrwb_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
AVPacket *avpkt)
{
@@ -292,7 +393,7 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
AMRWBFrame *cf = &ctx->frame;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
- int i;
+ int sub;
ctx->fr_cur_mode = unpack_bitstream(ctx, buf, buf_size);
@@ -319,8 +420,14 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
/* Generate a ISP vector for each subframe */
interpolate_isp(ctx->isp, ctx->isp_sub4_past);
- for (i=0; i<4; i++)
- isp2lp(ctx->isp[i], ctx->lp_coef[i], LP_ORDER/2);
+ for (sub = 0; sub < 4; sub++)
+ isp2lp(ctx->isp[sub], ctx->lp_coef[sub], LP_ORDER/2);
+
+ for (sub = 0; sub < 4; sub++) {
+ const AMRWBSubFrame *cur_subframe = &cf->subframe[sub];
+
+ decode_pitch_vector(ctx, cur_subframe, sub);
+ }
//update state for next frame
memcpy(ctx->isp_sub4_past, ctx->isp[3], LP_ORDER * sizeof(ctx->isp[3][0]));
-----------------------------------------------------------------------
Summary of changes:
libavcodec/amrwbdec.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 111 insertions(+), 4 deletions(-)
hooks/post-receive
--
AMR-WB decoder
More information about the FFmpeg-soc
mailing list