[FFmpeg-soc] [soc]AMR-WB decoder branch, master, updated.
Marcelo Póvoa
marspeoplester at gmail.com
Sun Aug 15 02:09:02 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 0df8ecfa7ac2ac271f0ceb67bc1f5d1ddafcf3af (commit)
via eaae7fce7962d7f77a6b40cc6e79654d8a751be2 (commit)
via 276a401628b57729108a3d1b933615f14bae12b9 (commit)
via cea139e25cd421a3de4370670ca1b6d8b9e5542f (commit)
via 74da10c018a038577644160b873b0a2720e46656 (commit)
from 98f6e7534f557e9800395ab0fa6c39bdc4a1f907 (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 0df8ecfa7ac2ac271f0ceb67bc1f5d1ddafcf3af
Author: Marcelo Povoa <marspeoplester at gmail.com>
Date: Sat Aug 14 21:05:36 2010 -0300
Modify past pitch_lag decoding to be compliant with
the reference code rather than the spec
diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c
index 30fc262..d289b70 100644
--- a/libavcodec/amrwbdec.c
+++ b/libavcodec/amrwbdec.c
@@ -402,7 +402,7 @@ static void decode_pitch_lag_high(int *lag_int, int *lag_frac, int pitch_index,
*lag_frac = 0;
}
/* minimum lag for next subframe */
- *base_lag_int = av_clip(*lag_int - 8, AMRWB_P_DELAY_MIN,
+ *base_lag_int = av_clip(*lag_int - 8 - (*lag_frac < 0 ? 1 : 0), AMRWB_P_DELAY_MIN,
AMRWB_P_DELAY_MAX - 15);
/* XXX: the spec states clearly that *base_lag_int should be
* the nearest integer to *lag_int (minus 8), but the ref code
@@ -432,7 +432,8 @@ static void decode_pitch_lag_low(int *lag_int, int *lag_frac, int pitch_index,
*lag_int = pitch_index - 24;
*lag_frac = 0;
}
- *base_lag_int = av_clip(*lag_int - 8, AMRWB_P_DELAY_MIN,
+ /* XXX: same problem as before */
+ *base_lag_int = av_clip(*lag_int - 8 - (*lag_frac < 0 ? 1 : 0), AMRWB_P_DELAY_MIN,
AMRWB_P_DELAY_MAX - 15);
} else {
*lag_int = (pitch_index + 1) >> 1;
commit eaae7fce7962d7f77a6b40cc6e79654d8a751be2
Author: Marcelo Povoa <marspeoplester at gmail.com>
Date: Sat Aug 14 21:02:48 2010 -0300
Scaling and size bugfixes for extrapolate_isf (6K60 only)
diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c
index a0e7457..30fc262 100644
--- a/libavcodec/amrwbdec.c
+++ b/libavcodec/amrwbdec.c
@@ -1129,7 +1129,7 @@ static void extrapolate_isf(float out[LP_ORDER_16k], float isf[LP_ORDER])
float est, scale;
int i, i_max_corr;
- memcpy(out, isf, LP_ORDER - 1);
+ memcpy(out, isf, (LP_ORDER - 1) * sizeof(float));
out[LP_ORDER_16k - 1] = isf[LP_ORDER - 1];
/* Calculate the difference vector */
@@ -1154,8 +1154,8 @@ static void extrapolate_isf(float out[LP_ORDER_16k], float isf[LP_ORDER])
- isf[i - 2 - i_max_corr];
/* Calculate an estimate for ISF(18) and scale ISF based on the error */
- est = 79.65 + (out[2] - out[3] - out[4]) / 6.0;
- scale = (FFMIN(est, 76.0) - out[LP_ORDER - 2]) /
+ est = 7965 + (out[2] - out[3] - out[4]) / 6.0;
+ scale = 0.5 * (FFMIN(est, 7600) - out[LP_ORDER - 2]) /
(out[LP_ORDER_16k - 2] - out[LP_ORDER - 2]);
// XXX: should divide numerator by 2.0?
@@ -1172,12 +1172,11 @@ static void extrapolate_isf(float out[LP_ORDER_16k], float isf[LP_ORDER])
}
for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++)
- out[i] = out[i - 1] + diff_hi[i];
+ out[i] = out[i - 1] + diff_hi[i] / (float) (1 << 15);
- /* XXX: Don't know why this 26214 coefficient, maybe it is not Q8 */
/* Scale the ISF vector for 16000 Hz */
for (i = 0; i < LP_ORDER_16k - 1; i++)
- out[i] *= 26214 / (float) (1 << 8);
+ out[i] *= 0.8;
}
/**
commit 276a401628b57729108a3d1b933615f14bae12b9
Author: Marcelo Povoa <marspeoplester at gmail.com>
Date: Sat Aug 14 21:00:03 2010 -0300
Create a slightly modified version of ff_lsp2polyf
to use with 16kHz ISPs at the higher band part
diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c
index 1cfa13e..a0e7457 100644
--- a/libavcodec/amrwbdec.c
+++ b/libavcodec/amrwbdec.c
@@ -313,6 +313,26 @@ static void interpolate_isp(double isp_q[4][LP_ORDER], const double *isp4_past)
}
/**
+ * 16kHz version of ff_lsp2polyf
+ */
+static void lsp2polyf_16k(const double *lsp, double *f, int lp_half_order)
+{
+ int i, j;
+
+ f[0] = 0.25;
+ f[1] = -0.5 * lsp[0];
+ lsp -= 2;
+ for(i = 2; i <= lp_half_order; i++)
+ {
+ double val = -2 * lsp[2 * i];
+ f[i] = val * f[i - 1] + 2 * f[i - 2];
+ for(j = i - 1; j > 1; j--)
+ f[j] += f[j - 1] * val + f[j - 2];
+ f[1] += 0.25 * val;
+ }
+}
+
+/**
* Convert a ISP vector to LP coefficient domain {a_k}
* Equations from TS 26.190 section 5.2.4
*
@@ -321,20 +341,23 @@ static void interpolate_isp(double isp_q[4][LP_ORDER], const double *isp4_past)
* @param[in] lp_half_order Half the number of LPs to construct
*/
static void isp2lp(const double *isp, float *lp, int lp_half_order) {
- double pa[MAX_LP_HALF_ORDER + 1], qa[MAX_LP_HALF_ORDER + 1];
+ double pa[10 + 1], qa[10 + 1];
float *lp2 = lp + (lp_half_order << 1);
double last_isp = isp[2 * lp_half_order - 1];
double qa_old = 0.0;
int i;
- ff_lsp2polyf(isp, pa, lp_half_order);
- ff_lsp2polyf(isp + 1, qa, lp_half_order - 1);
-
if (lp_half_order > 8) { // high-band specific
+ lsp2polyf_16k(isp, pa, lp_half_order);
+ lsp2polyf_16k(isp + 1, qa, lp_half_order - 1);
+
for (i = 0; i <= lp_half_order; i++)
pa[i] *= 4.0;
for (i = 0; i < lp_half_order; i++)
qa[i] *= 4.0;
+ } else {
+ ff_lsp2polyf(isp, pa, lp_half_order);
+ ff_lsp2polyf(isp + 1, qa, lp_half_order - 1);
}
for (i = 1; i < lp_half_order; i++) {
commit cea139e25cd421a3de4370670ca1b6d8b9e5542f
Author: Marcelo Povoa <marspeoplester at gmail.com>
Date: Sat Aug 14 20:57:13 2010 -0300
Modify isf2isp to work with every ISP length
diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c
index 12bf531..1cfa13e 100644
--- a/libavcodec/amrwbdec.c
+++ b/libavcodec/amrwbdec.c
@@ -175,15 +175,16 @@ static enum Mode unpack_bitstream(AMRWBContext *ctx, const uint8_t *buf,
*
* @param[in] isf isf vector
* @param[out] isp output isp vector
+ * @param[in] size isf/isp size
*/
-static void isf2isp(const float *isf, double *isp)
+static void isf2isp(const float *isf, double *isp, int size)
{
int i;
- for (i = 0; i < LP_ORDER - 1; i++)
+ for (i = 0; i < size - 1; i++)
isp[i] = cos(2.0 * M_PI * isf[i]);
- isp[LP_ORDER - 1] = cos(4.0 * M_PI * isf[LP_ORDER - 1]);
+ isp[size - 1] = cos(4.0 * M_PI * isf[size - 1]);
}
/**
@@ -1201,7 +1202,7 @@ static void hb_synthesis(AMRWBContext *ctx, int subframe, float *samples,
1.0 - isfp_inter[subframe], LP_ORDER);
extrapolate_isf(e_isf, e_isf);
- isf2isp(e_isf, e_isp);
+ isf2isp(e_isf, e_isp, LP_ORDER_16k);
isp2lp(e_isp, hb_lpc, LP_ORDER_16k / 2);
lpc_weighting(hb_lpc, hb_lpc, 0.9, LP_ORDER_16k + 1);
@@ -1309,7 +1310,7 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
stab_fac = stability_factor(ctx->isf_cur, ctx->isf_past_final);
- isf2isp(ctx->isf_cur, ctx->isp[3]);
+ isf2isp(ctx->isf_cur, ctx->isp[3], LP_ORDER);
/* Generate a ISP vector for each subframe */
if (ctx->first_frame) {
ctx->first_frame = 0;
commit 74da10c018a038577644160b873b0a2720e46656
Author: Marcelo Povoa <marspeoplester at gmail.com>
Date: Sat Aug 14 20:53:37 2010 -0300
Fix a major bug at the oversampled data memory update
which was compromising output quality
diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c
index 228617d..12bf531 100644
--- a/libavcodec/amrwbdec.c
+++ b/libavcodec/amrwbdec.c
@@ -1373,8 +1373,6 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
synthesis(ctx, ctx->lp_coef[sub], synth_exc, synth_fixed_gain,
synth_fixed_vector, &ctx->samples_az[LP_ORDER]);
- /* XXX: Tested against the ref code until here, it "succeeds" at least
- * for cases in which the "opencore bug" don't interfere */
/* Synthesis speech post-processing */
de_emphasis(&ctx->samples_up[UPS_MEM_SIZE],
@@ -1383,17 +1381,14 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
high_pass_filter(&ctx->samples_up[UPS_MEM_SIZE], hpf_31_coef,
ctx->hpf_31_mem, &ctx->samples_up[UPS_MEM_SIZE]);
- /*for (i = 0; i < AMRWB_SUBFRAME_SIZE; i++)
- ctx->samples_up[UPS_MEM_SIZE+i] = rint(ctx->samples_up[UPS_MEM_SIZE+i]);*/
-
upsample_5_4(sub_buf, &ctx->samples_up[UPS_FIR_SIZE],
AMRWB_SFR_SIZE_OUT);
- /* High frequency band generation */
- high_pass_filter(&ctx->samples_up[UPS_MEM_SIZE], hpf_400_coef,
- ctx->hpf_400_mem, &ctx->samples_up[UPS_MEM_SIZE]);
+ /* High frequency band generation part */
+ high_pass_filter(hb_samples, hpf_400_coef, ctx->hpf_400_mem,
+ &ctx->samples_up[UPS_MEM_SIZE]);
- hb_gain = find_hb_gain(ctx, &ctx->samples_up[UPS_MEM_SIZE],
+ hb_gain = find_hb_gain(ctx, hb_samples,
cur_subframe->hb_gain, cf->vad);
scaled_hb_excitation(ctx, hb_exc, synth_exc, hb_gain);
@@ -1412,7 +1407,7 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
/* Add low frequency and high frequency bands */
for (i = 0; i < AMRWB_SFR_SIZE_OUT; i++) {
// XXX: the lower band should really be upscaled by 2.0?
- sub_buf[i] = (sub_buf[i] * 2.0 + hb_samples[i]) / 32768.0;
+ sub_buf[i] = (sub_buf[i] * 1.0 + hb_samples[i]) / 32768.0;
}
/* Update buffers and history */
-----------------------------------------------------------------------
Summary of changes:
libavcodec/amrwbdec.c | 73 +++++++++++++++++++++++++++++++------------------
1 files changed, 46 insertions(+), 27 deletions(-)
hooks/post-receive
--
AMR-WB decoder
More information about the FFmpeg-soc
mailing list