[FFmpeg-soc] DCA encoder fixes

Kostya kostya.shishkov at gmail.com
Sun Mar 23 12:39:41 CET 2008


Here's proof of the concept patch to the dcaenc.c
which fixes DCA encoding.
It is not very clean and should be splitted into parts.

Spotted and fixed/workarounded bugs:
* avctx->frame_size was unset with filling temp buffer instead
* small errors in bistream writing
* no check was done on written data - outputting 0xFFFF in
  bitstream may be treated as syncword so I clear last bit of
  quantized value (so it can't be made from to consequent words
  as well).

And I'd like to do AAC encoder anyway.
-------------- next part --------------
--- ../dcaenc.c	2008-03-22 19:45:40.000000000 +0200
+++ dcaenc.c	2008-03-23 13:28:59.000000000 +0200
@@ -27,7 +27,6 @@
     int32_t pcm[DCA_SUBBANDS_32];
     int32_t subband[64][MAX_CHANNELS][DCA_SUBBANDS_32]; /* [sample][channel][subband] */
     int16_t st_samples[4096];
-    int     fill_samples;
 } DCAContext;
 
 static int32_t cos_table[128];
@@ -94,7 +93,7 @@
        (0.0, 0.0, ..., 0.0, -1.0, 1.0, 0.0, ..., 0.0)
        so that -1.0 cancels 1.0 from the previous step */
 
-    memset(accum,0,sizeof(int32_t));
+    memset(accum,0,sizeof(accum));
 
     for (k = 48, j = 0, i = c->start[channel]; i < 512; k++, j++, i++)
         accum[(k & 32) ? (31 - (k & 31)) : (k & 31)] += mul32(c->history[channel][i], UnQMF[j]);
@@ -248,7 +247,7 @@
 static uint32_t quantize(int32_t d)
 {
     d = d >> 16;
-    return d & 0xffff;
+    return d & 0xfffe;
 }
 
 
@@ -299,8 +298,7 @@
                 for (i = 0; i < 8; i++)
                     put_bits(&c->pb, 16, quantize(subband_data[ss * 8 + i][ch][sub]));
     /* DSYNC */
-    align_put_bits(&c->pb);
-    put_bits(&c->pb, 0xffff, 16);
+    put_bits(&c->pb, 16, 0xffff);
 }
 
 void put_frame(DCAContext *c, int32_t subband_data[64][2][32], uint8_t *frame)
@@ -321,46 +319,35 @@
 {
     int i,k,channel;
     DCAContext *c = avctx->priv_data;
-//    int16_t *samples = data;
+    int16_t *samples = data;
 
 //    if (buf_size < MAX_CHANNELS*2048*sizeof(int16_t))
 //        return -1;
 
-    // We always get 2048 16bit samples per call so save then until next call
-
-    if (c->fill_samples) {
-        memcpy(c->st_samples, data, 2048*sizeof(int16_t));
-        c->fill_samples = 0;
-        return 0;
-    }
-    memcpy(&c->st_samples[2048], data, 2048*sizeof(int16_t));
-    c->fill_samples = 0;
-
     for (i = 0; i < 64; i ++) /* i is the decimated sample number */
         for (channel=0; channel<2 ; channel++) {
             /* Get 32 PCM samples */
             for (k = 0; k < 32; k++) { /* k is the sample number in a 32-sample block */
-                c->pcm[k] = c->st_samples[4 * (32*i+k) + 2 * channel] << 16;
+                c->pcm[k] = samples[2 * (32*i+k) + channel] << 16;
             }
-        /* Put subband samples into the proper place */
-        qmf_decompose(c, c->pcm, &c->subband[i][channel][0], channel);
-    }
+            /* Put subband samples into the proper place */
+            qmf_decompose(c, c->pcm, &c->subband[i][channel][0], channel);
+        }
 
     put_frame(c, c->subband, frame);
 
-    return 4000;
+    return put_bits_count(&c->pb)>>3;
 }
 
 static int DCA_encode_init(AVCodecContext *avctx) {
-    DCAContext *c = avctx->priv_data;
+    //DCAContext *c = avctx->priv_data;
 
     if(avctx->channels != 2 || avctx->sample_rate != 44100) {
         av_log(avctx, AV_LOG_ERROR, "Only 44.1 kHz stereo is supported at the moment!\n");
         return -1;
     }
-
-    // Make sure that the first call to encode is a fill call
-    c->fill_samples = 1;
+    
+    avctx->frame_size = 2048;
 
     qmf_init();
     return 0;


More information about the FFmpeg-soc mailing list