changeset 4692:3318e3f6470f libavcodec

Small simplifications to subband coefficient handling and use av_random(). Patch by Ian Braithwaite ian .. braithwaite ... dk
author banan
date Tue, 20 Mar 2007 18:08:51 +0000
parents 0f596a49ba3d
children 86a2dfcc5eef
files cook.c
diffstat 1 files changed, 20 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/cook.c	Tue Mar 20 16:51:30 2007 +0000
+++ b/cook.c	Tue Mar 20 18:08:51 2007 +0000
@@ -52,6 +52,7 @@
 #include "dsputil.h"
 #include "common.h"
 #include "bytestream.h"
+#include "random.h"
 
 #include "cookdata.h"
 
@@ -87,7 +88,7 @@
     int                 bits_per_subpacket;
     int                 cookversion;
     /* states */
-    int                 random_state;
+    AVRandomState       random_state;
 
     /* transform data */
     MDCTContext         mdct_ctx;
@@ -374,22 +375,6 @@
 }
 
 /**
- * Create the quant value table.
- *
- * @param q                 pointer to the COOKContext
- * @param quant_value_table pointer to the array
- */
-
-static void inline dequant_envelope(COOKContext *q, int* quant_index_table,
-                                    float* quant_value_table){
-
-    int i;
-    for(i=0 ; i < q->total_subbands ; i++){
-        quant_value_table[i] = q->rootpow2tab[quant_index_table[i]+63];
-    }
-}
-
-/**
  * Calculate the category and category_index vector.
  *
  * @param q                     pointer to the COOKContext
@@ -536,33 +521,28 @@
  *
  * @param q                     pointer to the COOKContext
  * @param index                 index
- * @param band                  current subband
- * @param quant_value_table     pointer to the array
+ * @param quant_index           quantisation index
  * @param subband_coef_index    array of indexes to quant_centroid_tab
  * @param subband_coef_sign     signs of coefficients
- * @param mlt_buffer            pointer to the mlt buffer
+ * @param mlt_p                 pointer into the mlt buffer
  */
 
-
-static void scalar_dequant(COOKContext *q, int index, int band,
-                           float* quant_value_table, int* subband_coef_index,
-                           int* subband_coef_sign, float* mlt_buffer){
+static void scalar_dequant(COOKContext *q, int index, int quant_index,
+                           int* subband_coef_index, int* subband_coef_sign,
+                           float* mlt_p){
     int i;
     float f1;
 
     for(i=0 ; i<SUBBAND_SIZE ; i++) {
         if (subband_coef_index[i]) {
-            if (subband_coef_sign[i]) {
-                f1 = -quant_centroid_tab[index][subband_coef_index[i]];
-            } else {
-                f1 = quant_centroid_tab[index][subband_coef_index[i]];
-            }
+            f1 = quant_centroid_tab[index][subband_coef_index[i]];
+            if (subband_coef_sign[i]) f1 = -f1;
         } else {
             /* noise coding if subband_coef_index[i] == 0 */
-            q->random_state = q->random_state * 214013 + 2531011;    //typical RNG numbers
-            f1 = randsign[(q->random_state/0x1000000)&1] * dither_tab[index]; //>>31
+            f1 = dither_tab[index];
+            if (av_random(&q->random_state) < 0x80000000) f1 = -f1;
         }
-        mlt_buffer[band*20+ i] = f1 * quant_value_table[band];
+        mlt_p[i] = f1 * q->rootpow2tab[quant_index+63];
     }
 }
 /**
@@ -618,13 +598,13 @@
  *
  * @param q                 pointer to the COOKContext
  * @param category          pointer to the category array
- * @param quant_value_table pointer to the array
+ * @param quant_index_table pointer to the array
  * @param mlt_buffer        pointer to mlt coefficients
  */
 
 
 static void decode_vectors(COOKContext* q, int* category,
-                           float* quant_value_table, float* mlt_buffer){
+                           int *quant_index_table, float* mlt_buffer){
     /* A zero in this table means that the subband coefficient is
        random noise coded. */
     int subband_coef_index[SUBBAND_SIZE];
@@ -646,8 +626,9 @@
             memset(subband_coef_index, 0, sizeof(subband_coef_index));
             memset(subband_coef_sign, 0, sizeof(subband_coef_sign));
         }
-        scalar_dequant(q, index, band, quant_value_table, subband_coef_index,
-                       subband_coef_sign, mlt_buffer);
+        scalar_dequant(q, index, quant_index_table[band],
+                       subband_coef_index, subband_coef_sign,
+                       &mlt_buffer[band * 20]);
     }
 
     if(q->total_subbands*SUBBAND_SIZE >= q->samples_per_channel){
@@ -667,20 +648,17 @@
 static void mono_decode(COOKContext *q, float* mlt_buffer) {
 
     int category_index[128];
-    float quant_value_table[102];
     int quant_index_table[102];
     int category[128];
 
     memset(&category, 0, 128*sizeof(int));
-    memset(&quant_value_table, 0, 102*sizeof(int));
     memset(&category_index, 0, 128*sizeof(int));
 
     decode_envelope(q, quant_index_table);
     q->num_vectors = get_bits(&q->gb,q->log2_numvector_size);
-    dequant_envelope(q, quant_index_table, quant_value_table);
     categorize(q, quant_index_table, category, category_index);
     expand_category(q, category, category_index);
-    decode_vectors(q, category, quant_value_table, mlt_buffer);
+    decode_vectors(q, category, quant_index_table, mlt_buffer);
 }
 
 
@@ -1035,8 +1013,8 @@
     q->nb_channels = avctx->channels;
     q->bit_rate = avctx->bit_rate;
 
-    /* Initialize state. */
-    q->random_state = 1;
+    /* Initialize RNG. */
+    av_init_random(1, &q->random_state);
 
     /* Initialize extradata related variables. */
     q->samples_per_channel = q->samples_per_frame / q->nb_channels;