[FFmpeg-cvslog] Convert gain pitch and gain code to arrays

Vladimir Voroshilov git at videolan.org
Sat Sep 24 21:17:02 CEST 2011


ffmpeg | branch: master | Vladimir Voroshilov <voroshil at gmail.com> | Fri Jun 12 23:55:06 2009 +0700| [f7980a7bedd6d0f0404bc3a98120af931c65a5c5] | committer: Michael Niedermayer

Convert gain pitch and gain code to arrays

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f7980a7bedd6d0f0404bc3a98120af931c65a5c5
---

 libavcodec/g729dec.c |   27 +++++++++++++++------------
 1 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/libavcodec/g729dec.c b/libavcodec/g729dec.c
index 8ce5eb5..04b6f54 100644
--- a/libavcodec/g729dec.c
+++ b/libavcodec/g729dec.c
@@ -111,11 +111,11 @@ typedef struct {
 
     int16_t quant_energy[4];    ///< (5.10) past quantized energy
 
-    /// (1.14) pitch gain of previous subframe
-    int16_t gain_pitch;
+    /// (1.14) pitch gain of current and five previous subframes
+    int16_t past_gain_pitch[6];
 
-    /// (14.1) gain code from previous subframe
-    int16_t gain_code;
+    /// (14.1) gain code from current and previous subframe
+    int16_t past_gain_code[2];
 
     int16_t was_periodic;       ///< whether previous frame was declared as periodic or not (4.4)
     uint16_t rand_value;        ///< random number generator value (4.4.4)
@@ -406,23 +406,26 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
         ff_acelp_weighted_vector_sum(fc + pitch_delay_int,
                                      fc + pitch_delay_int,
                                      fc, 1 << 14,
-                                     av_clip(ctx->gain_pitch, SHARP_MIN, SHARP_MAX),
+                                     av_clip(ctx->past_gain_pitch[0], SHARP_MIN, SHARP_MAX),
                                      0, 14,
                                      SUBFRAME_SIZE - pitch_delay_int);
 
+        memmove(ctx->past_gain_pitch+1, ctx->past_gain_pitch, 5 * sizeof(int16_t));
+        ctx->past_gain_code[1] = ctx->past_gain_code[0];
+
         if (frame_erasure) {
-            ctx->gain_pitch = (29491 * ctx->gain_pitch) >> 15; // 0.90 (0.15)
-            ctx->gain_code  = ( 2007 * ctx->gain_code ) >> 11; // 0.98 (0.11)
+            ctx->past_gain_pitch[0] = (29491 * ctx->past_gain_pitch[0]) >> 15; // 0.90 (0.15)
+            ctx->past_gain_code[0]  = ( 2007 * ctx->past_gain_code[0] ) >> 11; // 0.98 (0.11)
 
             gain_corr_factor = 0;
         } else {
-            ctx->gain_pitch  = cb_gain_1st_8k[gc_1st_index][0] +
-                               cb_gain_2nd_8k[gc_2nd_index][0];
+            ctx->past_gain_pitch[0]  = cb_gain_1st_8k[gc_1st_index][0] +
+                                       cb_gain_2nd_8k[gc_2nd_index][0];
             gain_corr_factor = cb_gain_1st_8k[gc_1st_index][1] +
                                cb_gain_2nd_8k[gc_2nd_index][1];
 
             /* Decode the fixed-codebook gain. */
-            ctx->gain_code = ff_acelp_decode_gain_code(&ctx->dsp, gain_corr_factor,
+            ctx->past_gain_code[0] = ff_acelp_decode_gain_code(&ctx->dsp, gain_corr_factor,
                                                        fc, MR_ENERGY,
                                                        ctx->quant_energy,
                                                        ma_prediction_coeff,
@@ -439,8 +442,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
 
         ff_acelp_weighted_vector_sum(ctx->exc + i * SUBFRAME_SIZE,
                                      ctx->exc + i * SUBFRAME_SIZE, fc,
-                                     (!ctx->was_periodic && frame_erasure) ? 0 : ctx->gain_pitch,
-                                     ( ctx->was_periodic && frame_erasure) ? 0 : ctx->gain_code,
+                                     (!ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_pitch[0],
+                                     ( ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_code[0],
                                      1 << 13, 14, SUBFRAME_SIZE);
 
         if (frame_erasure)



More information about the ffmpeg-cvslog mailing list