[FFmpeg-soc] [soc]: r4345 - in wmapro: wma3.h wma3dec.c

faust3 subversion at mplayerhq.hu
Sat May 30 21:22:28 CEST 2009


Author: faust3
Date: Sat May 30 21:22:28 2009
New Revision: 4345

Log:
decode decorrelation matrix in wma_decode_decorrelation_matrix and reduced the channel group context size

Modified:
   wmapro/wma3.h
   wmapro/wma3dec.c

Modified: wmapro/wma3.h
==============================================================================
--- wmapro/wma3.h	Sat May 30 19:58:50 2009	(r4344)
+++ wmapro/wma3.h	Sat May 30 21:22:28 2009	(r4345)
@@ -74,12 +74,11 @@ typedef struct {
  * @brief channel group for channel transformations
  */
 typedef struct {
-    int   num_channels;
-    int   transform;                                       ///< controls the type of the transform
-    char  transform_band[MAX_BANDS];                       ///< controls if the transform is enabled for a certain band
-    char  rotation_offset[MAX_CHANNELS * MAX_CHANNELS];
-    float decorrelation_matrix[MAX_CHANNELS*MAX_CHANNELS];
-    char  use_channel[MAX_CHANNELS];
+    char num_channels;                                     ///< number of channels in the group
+    char transform;                                        ///< controls the type of the transform
+    char transform_band[MAX_BANDS];                        ///< controls if the transform is enabled for a certain band
+    float decorrelation_matrix[MAX_CHANNELS*MAX_CHANNELS]; ///< decorrelation matrix
+    char use_channel[MAX_CHANNELS];                        ///< channels that are part of the group
 } WMA3ChannelGroup;
 
 /**

Modified: wmapro/wma3dec.c
==============================================================================
--- wmapro/wma3dec.c	Sat May 30 19:58:50 2009	(r4344)
+++ wmapro/wma3dec.c	Sat May 30 21:22:28 2009	(r4345)
@@ -613,12 +613,24 @@ static int wma_decode_tilehdr(WMA3Decode
 
 /**
  *@brief Calculate a decorrelation matrix from the bitstream parameters.
+ *@param s codec context
  *@param chgroup channel group for which the matrix needs to be calculated
  */
-static void wma_calc_decorrelation_matrix(WMA3ChannelGroup* chgroup)
+static void wma_decode_decorrelation_matrix(WMA3DecodeContext* s, WMA3ChannelGroup* chgroup)
 {
     int i;
     int offset = 0;
+    char rotation_offset[MAX_CHANNELS * MAX_CHANNELS];
+
+    for(i=0;i<chgroup->num_channels  * (chgroup->num_channels - 1) >> 1;i++)
+        rotation_offset[i] = get_bits(&s->gb,6);
+
+    for(i=0;i<chgroup->num_channels;i++){
+        if(get_bits1(&s->gb))
+            chgroup->decorrelation_matrix[chgroup->num_channels * i + i]=  1.0;
+        else
+            chgroup->decorrelation_matrix[chgroup->num_channels * i + i]= -1.0;
+    }
 
     for(i=1;i<chgroup->num_channels;i++){
         int x;
@@ -631,7 +643,7 @@ static void wma_calc_decorrelation_matri
             for(y=0;y < i + 1 ; y++){
                 float v1 = tmp1[y];
                 float v2 = tmp2[y];
-                int n = chgroup->rotation_offset[offset + x];
+                int n = rotation_offset[offset + x];
                 float cosv = sin(n*M_PI / 64.0);                // FIXME: use one table for this
                 float sinv = -cos(n*M_PI / 64.0);
 
@@ -714,22 +726,13 @@ static int wma_decode_channel_transform(
                 }
             }else if(chgroup->num_channels > 2){
                 if(get_bits1(&s->gb)){
-                    if(get_bits1(&s->gb)){
-                        int n_offset = chgroup->num_channels  * (chgroup->num_channels - 1) >> 1;
-                        int i;
-                        chgroup->transform = 2;
-                        for(i=0;i<n_offset;i++){
-                            chgroup->rotation_offset[i] = get_bits(&s->gb,6);
-                        }
-                        for(i=0;i<chgroup->num_channels;i++)
-                            chgroup->decorrelation_matrix[chgroup->num_channels * i + i] = get_bits1(&s->gb)?1.0:-1.0;
-                        wma_calc_decorrelation_matrix(chgroup);
-                    }else{
-                        chgroup->transform = 2;
+                    chgroup->transform = 2;
+                    if(get_bits1(&s->gb))
+                        wma_decode_decorrelation_matrix(s, chgroup);
+                    else
                         memcpy(chgroup->decorrelation_matrix,
                                s->def_decorrelation_mat[chgroup->num_channels],
                                chgroup->num_channels * chgroup->num_channels * sizeof(float));
-                    }
                 }
             }
 


More information about the FFmpeg-soc mailing list