[FFmpeg-soc] [soc]: r374 - qcelp/qcelpdec.c

reynaldo subversion at mplayerhq.hu
Wed Jul 11 21:26:34 CEST 2007


Author: reynaldo
Date: Wed Jul 11 21:26:34 2007
New Revision: 374

Log:
Work on qcelp_ctc2GI(), implemented rate 1/8 GAIN decoding, rate 1/4 gain
interpolator and rate 1 & 1/2 predictor, the latter must be revisited.


Modified:
   qcelp/qcelpdec.c

Modified: qcelp/qcelpdec.c
==============================================================================
--- qcelp/qcelpdec.c	(original)
+++ qcelp/qcelpdec.c	Wed Jul 11 21:26:34 2007
@@ -116,7 +116,6 @@ void qcelp_lspv2lspf(const QCELPFrame *f
             {
                 lspf[i]=lspv[i]? 0.02:-0.02; /* 2.4.3.3.1-1 */
             }
-            break;
     }
 }
 
@@ -127,20 +126,21 @@ void qcelp_lspv2lspf(const QCELPFrame *f
  */
 void qcelp_ctc2GI(const QCELPFrame *frame, int *g0, float *gain, int *index)
 {
-    int i, gs[16], g1[16];
-    uint8_t *cbgain, *cbsign, *cindex;
-    float predictor, ga[16];
+    int           i, gs[16], g1[16], predictor;
+    const uint8_t *cbgain, *cbsign, *cindex;
+    float         ga[16];
 
     /* FIXME need to get rid of g0, sanity checks should be done here */
     /* WIP this is almost verbatim from spec, seeking workability first */
-    /* WIP lacks rate 1/8 decoding */
+
+    cbsign=frame->data+QCELP_CBSIGN0_POS;
+    cbgain=frame->data+QCELP_CBGAIN0_POS;
+    cindex=frame->data+QCELP_CINDEX0_POS;
+
     switch(frame->rate)
     {
         case RATE_FULL:
         case RATE_HALF:
-            cbsign=frame->data+QCELP_CBSIGN0_POS;
-            cbgain=frame->data+QCELP_CBGAIN0_POS;
-            cindex=frame->data+QCELP_CINDEX0_POS;
             for(i=0; i<16; i++)
             {
                 if(frame->rate == RATE_HALF && i>=4) break;
@@ -148,16 +148,13 @@ void qcelp_ctc2GI(const QCELPFrame *fram
                 gs[i]=QCELP_CBSIGN2GS(cbsign[i]);
                 g0[i]=QCELP_CBGAIN2G0(cbgain[i]);
 
+                /* FIXME this needs to be further examinated */
                 if(frame->rate == RATE_HALF || !((i+1)%4))
-                {
-                    predictor=0.0;
-
-                }else
-                {
-                    /* WIP Implement predictor 2.4.6.1.4-4/5 */
-                }
+                    predictor=0;
+                else
+                    predictor=av_clip(6, 38, (g1[i-1]+g1[i-2]+g1[i-3])/3);
 
-                g1[i]=g0[i]+predictor; /* FIXME, not sure */
+                g1[i]=g0[i]+predictor;
                 ga[i]=qcelp_g12ga[g1[i]];
 
                 gain[i]=ga[i]*gs[i];
@@ -166,19 +163,36 @@ void qcelp_ctc2GI(const QCELPFrame *fram
 
             break;
         case RATE_QUARTER:
-            cbgain=frame->data+QCELP_CBGAIN0_POS;
             for(i=0; i<5; i++)
             {
                 g0[i]=g1[i]=QCELP_CBGAIN2G0(cbgain[i]);
                 gs[i]=1;
-                ga[i]=gain[i]=qcelp_g12ga[g1[i]];
-                /* WIP Should implement gain interpolation each 20 samples
-                 * 2.4.6.2.2-1
-                 * */
+                ga[i]=qcelp_g12ga[g1[i]];
             }
+            /**
+             * 5->8 Interpolation to 'Provide smoothing of the energy
+             * of the unvoiced excitation' 2.4.6.2
+             */
+            gain[0]=    ga[0];
+            gain[1]=0.6*ga[0]+0.4*ga[1];
+            gain[2]=    ga[1];
+            gain[3]=0.2*ga[1]+0.8*ga[2];
+            gain[4]=0.8*ga[2]+0.2*ga[3];
+            gain[5]=    ga[3];
+            gain[7]=0.4*ga[3]+0.6*ga[4];
+            gain[7]=    ga[4];
+
             break;
         case RATE_OCTAVE:
-            break;
+            switch(cbgain[0])
+            {
+                case 0: gain[0]=-4; break;
+                case 1: gain[0]=-2; break;
+                case 2: gain[0]= 0; break;
+                case 3: gain[0]= 2; break;
+                default:; /* shouldn't happen.. must propagate some error */
+            }
+            gs[0]=1;
     }
 }
 
@@ -270,7 +284,7 @@ static int qcelp_decode_frame(AVCodecCon
      */
 
     qcelp_lspv2lspf(q->frame, qtzd_lspf);
-    qcelp_ctc2GI (q->frame, g0, gain, index);
+    qcelp_ctc2GI(q->frame, g0, gain, index);
 
     /**
      * Check for badly received packets



More information about the FFmpeg-soc mailing list