[FFmpeg-soc] [soc]: r5331 - wmapro/wmaprodec.c

faust3 subversion at mplayerhq.hu
Sat Aug 29 15:49:50 CEST 2009


Author: faust3
Date: Sat Aug 29 15:49:50 2009
New Revision: 5331

Log:
decode_tilehdr: merge the fixed_channel_layout case with the max_num_subframes == 1 case

Modified:
   wmapro/wmaprodec.c

Modified: wmapro/wmaprodec.c
==============================================================================
--- wmapro/wmaprodec.c	Sat Aug 29 15:15:09 2009	(r5330)
+++ wmapro/wmaprodec.c	Sat Aug 29 15:49:50 2009	(r5331)
@@ -497,7 +497,6 @@ static int decode_subframe_length(WMA3De
 static int decode_tilehdr(WMA3DecodeContext *s)
 {
     int c;
-    uint16_t num_samples[WMAPRO_MAX_CHANNELS];
 
     /* Should never consume more than 3073 bits (256 iterations for the
      * while loop when always the minimum amount of 128 samples is substracted
@@ -509,19 +508,24 @@ static int decode_tilehdr(WMA3DecodeCont
     for (c = 0; c < s->num_channels; c++)
         s->channel[c].num_subframes = 0;
 
-    memset(num_samples, 0, sizeof(num_samples));
-
-    /** handle the easy case with one constant-sized subframe per channel */
-    if (s->max_num_subframes == 1) {
-        for (c = 0; c < s->num_channels; c++) {
-            s->channel[c].num_subframes = 1;
-            s->channel[c].subframe_len[0] = s->samples_per_frame;
+    /** all channels have the same subframe layout */
+    if (s->max_num_subframes == 1 || get_bits1(&s->gb)) {
+        int num_samples = 0;
+        while (num_samples < s->samples_per_frame) {
+            int subframe_len = s->min_samples_per_subframe;
+            if (num_samples < s->samples_per_frame - s->min_samples_per_subframe) {
+                if (!(subframe_len = decode_subframe_length(s)))
+                    return AVERROR_INVALIDDATA;
+            }
+            for (c = 0; c < s->num_channels; c++)
+                s->channel[c].subframe_len[s->channel[c].num_subframes++] = subframe_len;
+            num_samples += subframe_len;
         }
-    } else { /** subframe length and number of subframes is not constant */
+    } else { /** different channels have different subframe layouts */
+        uint16_t num_samples[WMAPRO_MAX_CHANNELS];
         int missing_samples = s->num_channels * s->samples_per_frame;
-        int fixed_channel_layout;      /** all channels have the same subframe layout */
 
-        fixed_channel_layout = get_bits1(&s->gb);
+        memset(num_samples, 0, sizeof(num_samples));
 
         /** loop until the frame data is split between the subframes */
         while (missing_samples > 0) {
@@ -532,10 +536,6 @@ static int decode_tilehdr(WMA3DecodeCont
             /** minimum number of samples that need to be read */
             int min_samples = s->min_samples_per_subframe;
 
-            if (fixed_channel_layout) {
-                channels_for_cur_subframe = s->num_channels;
-                min_channel_len = num_samples[0];
-            } else {
                 min_channel_len = s->samples_per_frame;
                 /** find channels with the smallest overall length */
                 for (c = 0; c < s->num_channels; c++) {
@@ -547,14 +547,12 @@ static int decode_tilehdr(WMA3DecodeCont
                         ++channels_for_cur_subframe;
                     }
                 }
-            }
             min_samples *= channels_for_cur_subframe;
 
             /** For every channel with the minimum length, 1 bit
                 might be transmitted that informs us if the channel
                 contains a subframe with the next subframe_len. */
-            if (fixed_channel_layout || channels_for_cur_subframe == 1 ||
-                                             min_samples == missing_samples) {
+            if (channels_for_cur_subframe == 1 || min_samples == missing_samples) {
                 channel_mask = -1;
             } else {
                 channel_mask = get_bits(&s->gb, channels_for_cur_subframe);


More information about the FFmpeg-soc mailing list