[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