[FFmpeg-soc] [soc]: r4185 - dcaenc/dcaenc.c

bwolowiec subversion at mplayerhq.hu
Tue Mar 24 18:29:49 CET 2009


Author: bwolowiec
Date: Tue Mar 24 18:29:49 2009
New Revision: 4185

Log:
Add QUANTIZER_BITS and use of factor_scale

Modified:
   dcaenc/dcaenc.c

Modified: dcaenc/dcaenc.c
==============================================================================
--- dcaenc/dcaenc.c	Tue Mar 24 18:23:40 2009	(r4184)
+++ dcaenc/dcaenc.c	Tue Mar 24 18:29:49 2009	(r4185)
@@ -25,12 +25,16 @@
 #include "dcaenc.h"
 #include "dcadata.h"
 
+#undef NDEBUG
+#include <assert.h>
+
 #define MAX_CHANNELS (6)
 #define DCA_SUBBANDS_32 (32)
 #define DCA_MAX_FRAME_SIZE (16383)
 #define DCA_HEADER_SIZE 13
 
 #define DCA_SUBBANDS 32 ///< Subband activity count
+#define QUANTIZER_BITS 16
 #define SUBFRAMES 2
 #define SUBSUBFRAMES 2
 #define PCM_SAMPLES (SUBFRAMES*SUBSUBFRAMES*8)
@@ -42,6 +46,7 @@ typedef struct {
     int frame_size;
     int prim_channels;
     int sample_rate_code;
+    int scale_factor[MAX_CHANNELS][DCA_SUBBANDS_32];
 
     int32_t pcm[DCA_SUBBANDS_32];
     int32_t subband[PCM_SAMPLES][MAX_CHANNELS][DCA_SUBBANDS_32]; /* [sample][channel][subband] */
@@ -266,17 +271,26 @@ static void put_primary_audio_header(DCA
     /* Scale factor adjustment index: not transmitted */
 }
 
-/* TODO: don't hardcode 16-bit quantization */
-static uint32_t quantize(int32_t d)
+/**
+ * 8-23 bits quantization
+ * @param sample
+ * @param bits
+ */
+static inline uint32_t quantize(int32_t sample, int bits)
 {
-    d = d >> 16;
-    return d & 0xfffe; //XXX: this is done to avoid false syncwords
+    assert(sample < 1<<(bits-1));
+    assert(sample >= -(1<<(bits-1)));
+    sample &= sample & ((1<<bits)-1);
+    //sample &= sample & ((1<<bits)-2);  //XXX: this is done to avoid false syncwords
+    return sample;
 }
 
 
 static void put_subframe(DCAContext *c, int32_t subband_data[8*SUBSUBFRAMES][MAX_CHANNELS][32])
 {
-    int i, sub, ss, ch;
+    int i, j, sub, ss, ch;
+    const uint32_t *scale_table = scale_factor_quant7;
+
     /* Subsubframes count */
     put_bits(&c->pb, 2, SUBSUBFRAMES -1);
 
@@ -289,10 +303,10 @@ static void put_subframe(DCAContext *c, 
             put_bits(&c->pb, 1, 0);
 
     /* Prediction VQ addres: not transmitted */
-    /* Bit allocation index: 19 = "16 bits", for each channel and subband */
+    /* Bit allocation index */
     for (ch = 0; ch < c->prim_channels; ch++)
         for (sub = 0; sub < DCA_SUBBANDS; sub++)
-            put_bits(&c->pb, 5, 19);
+            put_bits(&c->pb, 5, QUANTIZER_BITS+3);
 
     if(SUBSUBFRAMES>1){
         /* Transition mode: none for each channel and subband */
@@ -301,11 +315,28 @@ static void put_subframe(DCAContext *c, 
                 put_bits(&c->pb, 1, 0); /* according to Huffman codebook A4 */
     }
 
+    /* Determine scale_factor */
+    for(ch=0; ch<c->prim_channels; ch++)
+        for(sub=0; sub<DCA_SUBBANDS; sub++){
+            int m=0;
+            for(i=0; i<8*SUBSUBFRAMES; i++)
+                m = FFMAX(m, FFABS(subband_data[i][ch][sub]));
+            m /= (lossy_quant[QUANTIZER_BITS]<<(QUANTIZER_BITS-1)) >> 16; //XXX
+            i=0; j=128;
+            while(i<j){
+                int q=(i+j)>>1;
+                if(m < scale_table[q]) j=q;
+                else i=q+1;
+            }
+            assert(i<128);
+            c->scale_factor[ch][sub] = i;
+        }
+
     /* Scale factors: the same for each channel and subband,
        encoded according to Table D.1.2 */
     for (ch = 0; ch < c->prim_channels; ch++)
         for (sub = 0; sub < DCA_SUBBANDS; sub++)
-            put_bits(&c->pb, 7, 110);
+            put_bits(&c->pb, 7, c->scale_factor[ch][sub]);
 
     /* Joint subband scale factor codebook select: not transmitted */
     /* Scale factors for joint subband coding: not transmitted */
@@ -319,8 +350,14 @@ static void put_subframe(DCAContext *c, 
     for (ss = 0; ss < SUBSUBFRAMES ; ss++)
         for (ch = 0; ch < c->prim_channels; ch++)
             for (sub = 0; sub < DCA_SUBBANDS; sub++)
-                for (i = 0; i < 8; i++)
-                    put_bits(&c->pb, 16, quantize(subband_data[ss * 8 + i][ch][sub]));
+                for (i = 0; i < 8; i++){
+                    ///XXX float is unnecessary
+                    float sample = subband_data[ss * 8 + i][ch][sub];
+                    sample /= scale_table[c->scale_factor[ch][sub]];
+                    sample *= 1<<16;
+                    sample /= lossy_quant[QUANTIZER_BITS];
+                    put_bits(&c->pb, QUANTIZER_BITS, quantize(sample, QUANTIZER_BITS));
+                }
     /* DSYNC */
     put_bits(&c->pb, 16, 0xffff);
 }


More information about the FFmpeg-soc mailing list