simplify snr offset and bit allocation
authorJustin Ruggles <justin.ruggles@gmail.com>
Tue, 24 Jul 2007 02:08:27 +0000 (02:08 +0000)
committerJustin Ruggles <justin.ruggles@gmail.com>
Tue, 24 Jul 2007 02:08:27 +0000 (02:08 +0000)
Originally committed as revision 9784 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/ac3dec.c

index abc70d1..f9842cf 100644 (file)
@@ -107,13 +107,12 @@ typedef struct {
     int cplexpstr;
     int lfeexpstr;
     int chexpstr[5];
-    int csnroffst;
-    int cplfsnroffst;
-    int cplfgaincod;
-    int fsnroffst[5];
-    int fgaincod[5];
-    int lfefsnroffst;
-    int lfefgaincod;
+    int cplsnroffst;
+    int cplfgain;
+    int snroffst[5];
+    int fgain[5];
+    int lfesnroffst;
+    int lfefgain;
     int cpldeltbae;
     int deltbae[5];
     int cpldeltnseg;
@@ -424,41 +423,6 @@ static void decode_exponents(GetBitContext *gb, int expstr, int ngrps,
     }
 }
 
-/* Performs bit allocation.
- * This function performs bit allocation for the requested chanenl.
- */
-static void do_bit_allocation(AC3DecodeContext *ctx, int chnl)
-{
-    int fgain, snroffset;
-
-    if (chnl == 5) {
-        fgain = ff_fgaintab[ctx->cplfgaincod];
-        snroffset = (((ctx->csnroffst - 15) << 4) + ctx->cplfsnroffst) << 2;
-        ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->cplbap,
-                                      ctx->dcplexps, ctx->cplstrtmant,
-                                      ctx->cplendmant, snroffset, fgain, 0,
-                                      ctx->cpldeltbae, ctx->cpldeltnseg,
-                                      ctx->cpldeltoffst, ctx->cpldeltlen,
-                                      ctx->cpldeltba);
-    }
-    else if (chnl == 6) {
-        fgain = ff_fgaintab[ctx->lfefgaincod];
-        snroffset = (((ctx->csnroffst - 15) << 4) + ctx->lfefsnroffst) << 2;
-        ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->lfebap,
-                                      ctx->dlfeexps, 0, 7, snroffset, fgain, 1,
-                                      DBA_NONE, 0, NULL, NULL, NULL);
-    }
-    else {
-        fgain = ff_fgaintab[ctx->fgaincod[chnl]];
-        snroffset = (((ctx->csnroffst - 15) << 4) + ctx->fsnroffst[chnl]) << 2;
-        ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->bap[chnl],
-                                      ctx->dexps[chnl], 0, ctx->endmant[chnl],
-                                      snroffset, fgain, 0, ctx->deltbae[chnl],
-                                      ctx->deltnseg[chnl], ctx->deltoffst[chnl],
-                                      ctx->deltlen[chnl], ctx->deltba[chnl]);
-    }
-}
-
 typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */
     int16_t l3_quantizers[3];
     int16_t l5_quantizers[3];
@@ -1463,19 +1427,20 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk)
     }
 
     if (get_bits1(gb)) { /* snroffset */
+        int csnr;
         bit_alloc_flags = 127;
-        ctx->csnroffst = get_bits(gb, 6);
+        csnr = (get_bits(gb, 6) - 15) << 4;
         if (ctx->cplinu) { /* coupling fine snr offset and fast gain code */
-            ctx->cplfsnroffst = get_bits(gb, 4);
-            ctx->cplfgaincod = get_bits(gb, 3);
+            ctx->cplsnroffst = (csnr + get_bits(gb, 4)) << 2;
+            ctx->cplfgain = ff_fgaintab[get_bits(gb, 3)];
         }
         for (i = 0; i < nfchans; i++) { /* channel fine snr offset and fast gain code */
-            ctx->fsnroffst[i] = get_bits(gb, 4);
-            ctx->fgaincod[i] = get_bits(gb, 3);
+            ctx->snroffst[i] = (csnr + get_bits(gb, 4)) << 2;
+            ctx->fgain[i] = ff_fgaintab[get_bits(gb, 3)];
         }
         if (ctx->lfeon) { /* lfe fine snr offset and fast gain code */
-            ctx->lfefsnroffst = get_bits(gb, 4);
-            ctx->lfefgaincod = get_bits(gb, 3);
+            ctx->lfesnroffst = (csnr + get_bits(gb, 4)) << 2;
+            ctx->lfefgain = ff_fgaintab[get_bits(gb, 3)];
         }
     }
 
@@ -1533,12 +1498,26 @@ static int ac3_parse_audio_block(AC3DecodeContext *ctx, int blk)
 
     if (bit_alloc_flags) {
         if (ctx->cplinu && (bit_alloc_flags & 64))
-            do_bit_allocation(ctx, 5);
+            ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->cplbap,
+                                          ctx->dcplexps, ctx->cplstrtmant,
+                                          ctx->cplendmant, ctx->cplsnroffst,
+                                          ctx->cplfgain, 0,
+                                          ctx->cpldeltbae, ctx->cpldeltnseg,
+                                          ctx->cpldeltoffst, ctx->cpldeltlen,
+                                          ctx->cpldeltba);
         for (i = 0; i < nfchans; i++)
             if ((bit_alloc_flags >> i) & 1)
-                do_bit_allocation(ctx, i);
+                ac3_parametric_bit_allocation(&ctx->bit_alloc_params,
+                                              ctx->bap[i], ctx->dexps[i], 0,
+                                              ctx->endmant[i], ctx->snroffst[i],
+                                              ctx->fgain[i], 0, ctx->deltbae[i],
+                                              ctx->deltnseg[i], ctx->deltoffst[i],
+                                              ctx->deltlen[i], ctx->deltba[i]);
         if (ctx->lfeon && (bit_alloc_flags & 32))
-            do_bit_allocation(ctx, 6);
+            ac3_parametric_bit_allocation(&ctx->bit_alloc_params, ctx->lfebap,
+                                          ctx->dlfeexps, 0, 7, ctx->lfesnroffst,
+                                          ctx->lfefgain, 1,
+                                          DBA_NONE, 0, NULL, NULL, NULL);
     }
 
     if (get_bits1(gb)) { /* unused dummy data */