[FFmpeg-soc] [soc]: r5328 - wmapro/wmaprodec.c
faust3
subversion at mplayerhq.hu
Sat Aug 29 14:53:57 CEST 2009
Author: faust3
Date: Sat Aug 29 14:53:57 2009
New Revision: 5328
Log:
move subframe_len_bits calculation to decode_init
Modified:
wmapro/wmaprodec.c
Modified: wmapro/wmaprodec.c
==============================================================================
--- wmapro/wmaprodec.c Sat Aug 29 14:02:32 2009 (r5327)
+++ wmapro/wmaprodec.c Sat Aug 29 14:53:57 2009 (r5328)
@@ -179,6 +179,8 @@ typedef struct WMA3DecodeContext {
int8_t num_channels; ///< number of channels in the stream (same as AVCodecContext.num_channels)
int8_t lfe_channel; ///< lfe channel index
uint8_t max_num_subframes;
+ uint8_t subframe_len_bits; ///< number of bits used for the subframe length
+ uint8_t max_subframe_len_bit; ///< flag indicating that the subframe is of maximum size when the first subframe length bit is 1
int8_t num_possible_block_sizes; ///< number of distinct block sizes that can be found in the file
uint16_t min_samples_per_subframe;
int8_t num_sfb[WMAPRO_BLOCK_SIZES]; ///< scale factor bands per block size
@@ -310,6 +312,10 @@ static av_cold int decode_init(AVCodecCo
/** subframe info */
log2_max_num_subframes = ((s->decode_flags & 0x38) >> 3);
s->max_num_subframes = 1 << log2_max_num_subframes;
+ if (s->max_num_subframes == 16)
+ s->max_subframe_len_bit = 1;
+ s->subframe_len_bits = av_log2(log2_max_num_subframes) + 1;
+
s->num_possible_block_sizes = log2_max_num_subframes + 1;
s->min_samples_per_subframe = s->samples_per_frame / s->max_num_subframes;
s->dynamic_range_compression = (s->decode_flags & 0x80);
@@ -485,17 +491,10 @@ static int decode_tilehdr(WMA3DecodeCont
}
} else { /** subframe length and number of subframes is not constant */
int missing_samples = s->num_channels * s->samples_per_frame;
- int subframe_len_bits = 0; /** bits needed for the subframe length */
- int subframe_len_zero_bit = 0; /** first bit indicates if length is zero */
int fixed_channel_layout; /** all channels have the same subframe layout */
fixed_channel_layout = get_bits1(&s->gb);
- /** calculate subframe len bits */
- if (s->max_num_subframes == 16)
- subframe_len_zero_bit = 1;
- subframe_len_bits = av_log2(av_log2(s->max_num_subframes)) + 1;
-
/** loop until the frame data is split between the subframes */
while (missing_samples > 0) {
unsigned int channel_mask = 0;
@@ -543,13 +542,13 @@ static int decode_tilehdr(WMA3DecodeCont
if (min_samples != missing_samples) {
int log2_subframe_len = 0;
/* 1 bit indicates if the subframe is of maximum length */
- if (subframe_len_zero_bit) {
+ if (s->max_subframe_len_bit) {
if (get_bits1(&s->gb)) {
log2_subframe_len = 1 +
- get_bits(&s->gb, subframe_len_bits-1);
+ get_bits(&s->gb, s->subframe_len_bits-1);
}
} else
- log2_subframe_len = get_bits(&s->gb, subframe_len_bits);
+ log2_subframe_len = get_bits(&s->gb, s->subframe_len_bits);
subframe_len = s->samples_per_frame / (1 << log2_subframe_len);
More information about the FFmpeg-soc
mailing list