annotate wmaprodec.c @ 11225:5811a86f55f1 libavcodec

Use memset to set the runs partially coded superblocks Much faster for long runs (e.g. nearly uncoded frames), slightly faster for the general case.
author conrad
date Sun, 21 Feb 2010 00:10:47 +0000
parents 34a65026fa06
children 98970e51365a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10073
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
1 /*
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
2 * Wmapro compatible decoder
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
3 * Copyright (c) 2007 Baptiste Coudurier, Benjamin Larsson, Ulion
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
4 * Copyright (c) 2008 - 2009 Sascha Sommer, Benjamin Larsson
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
5 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
6 * This file is part of FFmpeg.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
7 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
10 * License as published by the Free Software Foundation; either
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
12 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
16 * Lesser General Public License for more details.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
17 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
21 */
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
22
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
23 /**
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
24 * @file libavcodec/wmaprodec.c
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
25 * @brief wmapro decoder implementation
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
26 * Wmapro is an MDCT based codec comparable to wma standard or AAC.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
27 * The decoding therefore consists of the following steps:
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
28 * - bitstream decoding
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
29 * - reconstruction of per-channel data
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
30 * - rescaling and inverse quantization
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
31 * - IMDCT
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
32 * - windowing and overlapp-add
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
33 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
34 * The compressed wmapro bitstream is split into individual packets.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
35 * Every such packet contains one or more wma frames.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
36 * The compressed frames may have a variable length and frames may
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
37 * cross packet boundaries.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
38 * Common to all wmapro frames is the number of samples that are stored in
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
39 * a frame.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
40 * The number of samples and a few other decode flags are stored
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
41 * as extradata that has to be passed to the decoder.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
42 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
43 * The wmapro frames themselves are again split into a variable number of
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
44 * subframes. Every subframe contains the data for 2^N time domain samples
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
45 * where N varies between 7 and 12.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
46 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
47 * Example wmapro bitstream (in samples):
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
48 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
49 * || packet 0 || packet 1 || packet 2 packets
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
50 * ---------------------------------------------------
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
51 * || frame 0 || frame 1 || frame 2 || frames
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
52 * ---------------------------------------------------
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
53 * || | | || | | | || || subframes of channel 0
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
54 * ---------------------------------------------------
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
55 * || | | || | | | || || subframes of channel 1
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
56 * ---------------------------------------------------
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
57 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
58 * The frame layouts for the individual channels of a wma frame does not need
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
59 * to be the same.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
60 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
61 * However, if the offsets and lengths of several subframes of a frame are the
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
62 * same, the subframes of the channels can be grouped.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
63 * Every group may then use special coding techniques like M/S stereo coding
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
64 * to improve the compression ratio. These channel transformations do not
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
65 * need to be applied to a whole subframe. Instead, they can also work on
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
66 * individual scale factor bands (see below).
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
67 * The coefficients that carry the audio signal in the frequency domain
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
68 * are transmitted as huffman-coded vectors with 4, 2 and 1 elements.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
69 * In addition to that, the encoder can switch to a runlevel coding scheme
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
70 * by transmitting subframe_length / 128 zero coefficients.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
71 *
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
72 * Before the audio signal can be converted to the time domain, the
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
73 * coefficients have to be rescaled and inverse quantized.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
74 * A subframe is therefore split into several scale factor bands that get
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
75 * scaled individually.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
76 * Scale factors are submitted for every frame but they might be shared
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
77 * between the subframes of a channel. Scale factors are initially DPCM-coded.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
78 * Once scale factors are shared, the differences are transmitted as runlevel
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
79 * codes.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
80 * Every subframe length and offset combination in the frame layout shares a
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
81 * common quantization factor that can be adjusted for every channel by a
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
82 * modifier.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
83 * After the inverse quantization, the coefficients get processed by an IMDCT.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
84 * The resulting values are then windowed with a sine window and the first half
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
85 * of the values are added to the second half of the output from the previous
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
86 * subframe in order to reconstruct the output samples.
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
87 */
57d76996ccb8 Add some more wmapro decoder hunks
faust3
parents: 10006
diff changeset
88
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
89 #include "avcodec.h"
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
90 #include "internal.h"
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
91 #include "get_bits.h"
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
92 #include "put_bits.h"
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
93 #include "wmaprodata.h"
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
94 #include "dsputil.h"
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
95 #include "wma.h"
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
96
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
97 /** current decoder limitations */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
98 #define WMAPRO_MAX_CHANNELS 8 ///< max number of handled channels
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
99 #define MAX_SUBFRAMES 32 ///< max number of subframes per channel
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
100 #define MAX_BANDS 29 ///< max number of scale factor bands
10353
c8edd2033038 increase maximum compressed frame size
faust3
parents: 10352
diff changeset
101 #define MAX_FRAMESIZE 32768 ///< maximum compressed frame size
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
102
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
103 #define WMAPRO_BLOCK_MAX_BITS 12 ///< log2 of max block size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
104 #define WMAPRO_BLOCK_MAX_SIZE (1 << WMAPRO_BLOCK_MAX_BITS) ///< maximum block size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
105 #define WMAPRO_BLOCK_SIZES (WMAPRO_BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1) ///< possible block sizes
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
106
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
107
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
108 #define VLCBITS 9
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
109 #define SCALEVLCBITS 8
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
110 #define VEC4MAXDEPTH ((HUFF_VEC4_MAXBITS+VLCBITS-1)/VLCBITS)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
111 #define VEC2MAXDEPTH ((HUFF_VEC2_MAXBITS+VLCBITS-1)/VLCBITS)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
112 #define VEC1MAXDEPTH ((HUFF_VEC1_MAXBITS+VLCBITS-1)/VLCBITS)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
113 #define SCALEMAXDEPTH ((HUFF_SCALE_MAXBITS+SCALEVLCBITS-1)/SCALEVLCBITS)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
114 #define SCALERLMAXDEPTH ((HUFF_SCALE_RL_MAXBITS+VLCBITS-1)/VLCBITS)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
115
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
116 static VLC sf_vlc; ///< scale factor DPCM vlc
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
117 static VLC sf_rl_vlc; ///< scale factor run length vlc
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
118 static VLC vec4_vlc; ///< 4 coefficients per symbol
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
119 static VLC vec2_vlc; ///< 2 coefficients per symbol
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
120 static VLC vec1_vlc; ///< 1 coefficient per symbol
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
121 static VLC coef_vlc[2]; ///< coefficient run length vlc codes
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
122 static float sin64[33]; ///< sinus table for decorrelation
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
123
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
124 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
125 * @brief frame specific decoder context for a single channel
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
126 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
127 typedef struct {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
128 int16_t prev_block_len; ///< length of the previous block
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
129 uint8_t transmit_coefs;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
130 uint8_t num_subframes;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
131 uint16_t subframe_len[MAX_SUBFRAMES]; ///< subframe length in samples
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
132 uint16_t subframe_offset[MAX_SUBFRAMES]; ///< subframe positions in the current frame
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
133 uint8_t cur_subframe; ///< current subframe number
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
134 uint16_t decoded_samples; ///< number of already processed samples
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
135 uint8_t grouped; ///< channel is part of a group
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
136 int quant_step; ///< quantization step for the current subframe
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
137 int8_t reuse_sf; ///< share scale factors between subframes
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
138 int8_t scale_factor_step; ///< scaling step for the current subframe
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
139 int max_scale_factor; ///< maximum scale factor for the current subframe
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
140 int saved_scale_factors[2][MAX_BANDS]; ///< resampled and (previously) transmitted scale factor values
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
141 int8_t scale_factor_idx; ///< index for the transmitted scale factor values (used for resampling)
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
142 int* scale_factors; ///< pointer to the scale factor values used for decoding
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
143 uint8_t table_idx; ///< index in sf_offsets for the scale factor reference block
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
144 float* coeffs; ///< pointer to the subframe decode buffer
10961
34a65026fa06 Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents: 10827
diff changeset
145 DECLARE_ALIGNED_16(float, out)[WMAPRO_BLOCK_MAX_SIZE + WMAPRO_BLOCK_MAX_SIZE / 2]; ///< output buffer
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
146 } WMAProChannelCtx;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
147
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
148 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
149 * @brief channel group for channel transformations
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
150 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
151 typedef struct {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
152 uint8_t num_channels; ///< number of channels in the group
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
153 int8_t transform; ///< transform on / off
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
154 int8_t transform_band[MAX_BANDS]; ///< controls if the transform is enabled for a certain band
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
155 float decorrelation_matrix[WMAPRO_MAX_CHANNELS*WMAPRO_MAX_CHANNELS];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
156 float* channel_data[WMAPRO_MAX_CHANNELS]; ///< transformation coefficients
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
157 } WMAProChannelGrp;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
158
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
159 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
160 * @brief main decoder context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
161 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
162 typedef struct WMAProDecodeCtx {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
163 /* generic decoder variables */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
164 AVCodecContext* avctx; ///< codec context for av_log
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
165 DSPContext dsp; ///< accelerated DSP functions
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
166 uint8_t frame_data[MAX_FRAMESIZE +
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
167 FF_INPUT_BUFFER_PADDING_SIZE];///< compressed frame data
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
168 PutBitContext pb; ///< context for filling the frame_data buffer
10199
38ab367d4231 Merge FFTContext and MDCTContext
mru
parents: 10180
diff changeset
169 FFTContext mdct_ctx[WMAPRO_BLOCK_SIZES]; ///< MDCT context per block size
10961
34a65026fa06 Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents: 10827
diff changeset
170 DECLARE_ALIGNED_16(float, tmp)[WMAPRO_BLOCK_MAX_SIZE]; ///< IMDCT output buffer
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
171 float* windows[WMAPRO_BLOCK_SIZES]; ///< windows for the different block sizes
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
172
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
173 /* frame size dependent frame information (set during initialization) */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
174 uint32_t decode_flags; ///< used compression features
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
175 uint8_t len_prefix; ///< frame is prefixed with its length
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
176 uint8_t dynamic_range_compression; ///< frame contains DRC data
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
177 uint8_t bits_per_sample; ///< integer audio sample size for the unscaled IMDCT output (used to scale to [-1.0, 1.0])
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
178 uint16_t samples_per_frame; ///< number of samples to output
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
179 uint16_t log2_frame_size;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
180 int8_t num_channels; ///< number of channels in the stream (same as AVCodecContext.num_channels)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
181 int8_t lfe_channel; ///< lfe channel index
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
182 uint8_t max_num_subframes;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
183 uint8_t subframe_len_bits; ///< number of bits used for the subframe length
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
184 uint8_t max_subframe_len_bit; ///< flag indicating that the subframe is of maximum size when the first subframe length bit is 1
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
185 uint16_t min_samples_per_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
186 int8_t num_sfb[WMAPRO_BLOCK_SIZES]; ///< scale factor bands per block size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
187 int16_t sfb_offsets[WMAPRO_BLOCK_SIZES][MAX_BANDS]; ///< scale factor band offsets (multiples of 4)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
188 int8_t sf_offsets[WMAPRO_BLOCK_SIZES][WMAPRO_BLOCK_SIZES][MAX_BANDS]; ///< scale factor resample matrix
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
189 int16_t subwoofer_cutoffs[WMAPRO_BLOCK_SIZES]; ///< subwoofer cutoff values
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
190
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
191 /* packet decode state */
10126
6ff9347c8042 store packet GetBitContext in the decoder context
faust3
parents: 10123
diff changeset
192 GetBitContext pgb; ///< bitstream reader context for the packet
10165
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
193 uint8_t packet_offset; ///< frame offset in the packet
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
194 uint8_t packet_sequence_number; ///< current packet number
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
195 int num_saved_bits; ///< saved number of bits
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
196 int frame_offset; ///< frame offset in the bit reservoir
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
197 int subframe_offset; ///< subframe offset in the bit reservoir
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
198 uint8_t packet_loss; ///< set in case of bitstream error
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
199 uint8_t packet_done; ///< set when a packet is fully decoded
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
200
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
201 /* frame decode state */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
202 uint32_t frame_num; ///< current frame number (not used for decoding)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
203 GetBitContext gb; ///< bitstream reader context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
204 int buf_bit_size; ///< buffer size in bits
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
205 float* samples; ///< current samplebuffer pointer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
206 float* samples_end; ///< maximum samplebuffer pointer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
207 uint8_t drc_gain; ///< gain for the DRC tool
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
208 int8_t skip_frame; ///< skip output step
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
209 int8_t parsed_all_subframes; ///< all subframes decoded?
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
210
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
211 /* subframe/block decode state */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
212 int16_t subframe_len; ///< current subframe length
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
213 int8_t channels_for_cur_subframe; ///< number of channels that contain the subframe
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
214 int8_t channel_indexes_for_cur_subframe[WMAPRO_MAX_CHANNELS];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
215 int8_t num_bands; ///< number of scale factor bands
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
216 int16_t* cur_sfb_offsets; ///< sfb offsets for the current block
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
217 uint8_t table_idx; ///< index for the num_sfb, sfb_offsets, sf_offsets and subwoofer_cutoffs tables
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
218 int8_t esc_len; ///< length of escaped coefficients
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
219
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
220 uint8_t num_chgroups; ///< number of channel groups
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
221 WMAProChannelGrp chgroup[WMAPRO_MAX_CHANNELS]; ///< channel group information
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
222
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
223 WMAProChannelCtx channel[WMAPRO_MAX_CHANNELS]; ///< per channel data
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
224 } WMAProDecodeCtx;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
225
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
226
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
227 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
228 *@brief helper function to print the most important members of the context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
229 *@param s context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
230 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
231 static void av_cold dump_context(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
232 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
233 #define PRINT(a, b) av_log(s->avctx, AV_LOG_DEBUG, " %s = %d\n", a, b);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
234 #define PRINT_HEX(a, b) av_log(s->avctx, AV_LOG_DEBUG, " %s = %x\n", a, b);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
235
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
236 PRINT("ed sample bit depth", s->bits_per_sample);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
237 PRINT_HEX("ed decode flags", s->decode_flags);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
238 PRINT("samples per frame", s->samples_per_frame);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
239 PRINT("log2 frame size", s->log2_frame_size);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
240 PRINT("max num subframes", s->max_num_subframes);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
241 PRINT("len prefix", s->len_prefix);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
242 PRINT("num channels", s->num_channels);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
243 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
244
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
245 /**
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
246 *@brief Uninitialize the decoder and free all resources.
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
247 *@param avctx codec context
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
248 *@return 0 on success, < 0 otherwise
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
249 */
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
250 static av_cold int decode_end(AVCodecContext *avctx)
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
251 {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
252 WMAProDecodeCtx *s = avctx->priv_data;
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
253 int i;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
254
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
255 for (i = 0; i < WMAPRO_BLOCK_SIZES; i++)
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
256 ff_mdct_end(&s->mdct_ctx[i]);
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
257
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
258 return 0;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
259 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
260
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
261 /**
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
262 *@brief Initialize the decoder.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
263 *@param avctx codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
264 *@return 0 on success, -1 otherwise
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
265 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
266 static av_cold int decode_init(AVCodecContext *avctx)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
267 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
268 WMAProDecodeCtx *s = avctx->priv_data;
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
269 uint8_t *edata_ptr = avctx->extradata;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
270 unsigned int channel_mask;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
271 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
272 int log2_max_num_subframes;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
273 int num_possible_block_sizes;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
274
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
275 s->avctx = avctx;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
276 dsputil_init(&s->dsp, avctx);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
277 init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
278
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
279 avctx->sample_fmt = SAMPLE_FMT_FLT;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
280
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
281 if (avctx->extradata_size >= 18) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
282 s->decode_flags = AV_RL16(edata_ptr+14);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
283 channel_mask = AV_RL32(edata_ptr+2);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
284 s->bits_per_sample = AV_RL16(edata_ptr);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
285 /** dump the extradata */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
286 for (i = 0; i < avctx->extradata_size; i++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
287 dprintf(avctx, "[%x] ", avctx->extradata[i]);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
288 dprintf(avctx, "\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
289
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
290 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
291 av_log_ask_for_sample(avctx, "Unknown extradata size\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
292 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
293 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
294
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
295 /** generic init */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
296 s->log2_frame_size = av_log2(avctx->block_align) + 4;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
297
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
298 /** frame info */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
299 s->skip_frame = 1; /** skip first frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
300 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
301 s->len_prefix = (s->decode_flags & 0x40);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
302
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
303 if (!s->len_prefix) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
304 av_log_ask_for_sample(avctx, "no length prefix\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
305 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
306 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
307
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
308 /** get frame len */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
309 s->samples_per_frame = 1 << ff_wma_get_frame_len_bits(avctx->sample_rate,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
310 3, s->decode_flags);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
311
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
312 /** init previous block len */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
313 for (i = 0; i < avctx->channels; i++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
314 s->channel[i].prev_block_len = s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
315
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
316 /** subframe info */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
317 log2_max_num_subframes = ((s->decode_flags & 0x38) >> 3);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
318 s->max_num_subframes = 1 << log2_max_num_subframes;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
319 if (s->max_num_subframes == 16)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
320 s->max_subframe_len_bit = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
321 s->subframe_len_bits = av_log2(log2_max_num_subframes) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
322
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
323 num_possible_block_sizes = log2_max_num_subframes + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
324 s->min_samples_per_subframe = s->samples_per_frame / s->max_num_subframes;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
325 s->dynamic_range_compression = (s->decode_flags & 0x80);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
326
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
327 if (s->max_num_subframes > MAX_SUBFRAMES) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
328 av_log(avctx, AV_LOG_ERROR, "invalid number of subframes %i\n",
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
329 s->max_num_subframes);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
330 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
331 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
332
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
333 s->num_channels = avctx->channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
334
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
335 /** extract lfe channel position */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
336 s->lfe_channel = -1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
337
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
338 if (channel_mask & 8) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
339 unsigned int mask;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
340 for (mask = 1; mask < 16; mask <<= 1) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
341 if (channel_mask & mask)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
342 ++s->lfe_channel;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
343 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
344 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
345
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
346 if (s->num_channels < 0 || s->num_channels > WMAPRO_MAX_CHANNELS) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
347 av_log_ask_for_sample(avctx, "invalid number of channels\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
348 return AVERROR_NOTSUPP;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
349 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
350
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
351 INIT_VLC_STATIC(&sf_vlc, SCALEVLCBITS, HUFF_SCALE_SIZE,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
352 scale_huffbits, 1, 1,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
353 scale_huffcodes, 2, 2, 616);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
354
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
355 INIT_VLC_STATIC(&sf_rl_vlc, VLCBITS, HUFF_SCALE_RL_SIZE,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
356 scale_rl_huffbits, 1, 1,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
357 scale_rl_huffcodes, 4, 4, 1406);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
358
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
359 INIT_VLC_STATIC(&coef_vlc[0], VLCBITS, HUFF_COEF0_SIZE,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
360 coef0_huffbits, 1, 1,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
361 coef0_huffcodes, 4, 4, 2108);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
362
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
363 INIT_VLC_STATIC(&coef_vlc[1], VLCBITS, HUFF_COEF1_SIZE,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
364 coef1_huffbits, 1, 1,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
365 coef1_huffcodes, 4, 4, 3912);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
366
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
367 INIT_VLC_STATIC(&vec4_vlc, VLCBITS, HUFF_VEC4_SIZE,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
368 vec4_huffbits, 1, 1,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
369 vec4_huffcodes, 2, 2, 604);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
370
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
371 INIT_VLC_STATIC(&vec2_vlc, VLCBITS, HUFF_VEC2_SIZE,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
372 vec2_huffbits, 1, 1,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
373 vec2_huffcodes, 2, 2, 562);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
374
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
375 INIT_VLC_STATIC(&vec1_vlc, VLCBITS, HUFF_VEC1_SIZE,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
376 vec1_huffbits, 1, 1,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
377 vec1_huffcodes, 2, 2, 562);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
378
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
379 /** calculate number of scale factor bands and their offsets
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
380 for every possible block size */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
381 for (i = 0; i < num_possible_block_sizes; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
382 int subframe_len = s->samples_per_frame >> i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
383 int x;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
384 int band = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
385
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
386 s->sfb_offsets[i][0] = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
387
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
388 for (x = 0; x < MAX_BANDS-1 && s->sfb_offsets[i][band - 1] < subframe_len; x++) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
389 int offset = (subframe_len * 2 * critical_freq[x])
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
390 / s->avctx->sample_rate + 2;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
391 offset &= ~3;
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
392 if (offset > s->sfb_offsets[i][band - 1])
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
393 s->sfb_offsets[i][band++] = offset;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
394 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
395 s->sfb_offsets[i][band - 1] = subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
396 s->num_sfb[i] = band - 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
397 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
398
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
399
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
400 /** Scale factors can be shared between blocks of different size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
401 as every block has a different scale factor band layout.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
402 The matrix sf_offsets is needed to find the correct scale factor.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
403 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
404
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
405 for (i = 0; i < num_possible_block_sizes; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
406 int b;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
407 for (b = 0; b < s->num_sfb[i]; b++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
408 int x;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
409 int offset = ((s->sfb_offsets[i][b]
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
410 + s->sfb_offsets[i][b + 1] - 1) << i) >> 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
411 for (x = 0; x < num_possible_block_sizes; x++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
412 int v = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
413 while (s->sfb_offsets[x][v + 1] << x < offset)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
414 ++v;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
415 s->sf_offsets[i][x][b] = v;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
416 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
417 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
418 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
419
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
420 /** init MDCT, FIXME: only init needed sizes */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
421 for (i = 0; i < WMAPRO_BLOCK_SIZES; i++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
422 ff_mdct_init(&s->mdct_ctx[i], BLOCK_MIN_BITS+1+i, 1,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
423 1.0 / (1 << (BLOCK_MIN_BITS + i - 1))
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
424 / (1 << (s->bits_per_sample - 1)));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
425
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
426 /** init MDCT windows: simple sinus window */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
427 for (i = 0; i < WMAPRO_BLOCK_SIZES; i++) {
10174
89cd870ca180 Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents: 10165
diff changeset
428 const int win_idx = WMAPRO_BLOCK_MAX_BITS - i;
10827
3d011a01a6a0 Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents: 10428
diff changeset
429 ff_init_ff_sine_windows(win_idx);
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
430 s->windows[WMAPRO_BLOCK_SIZES - i - 1] = ff_sine_windows[win_idx];
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
431 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
432
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
433 /** calculate subwoofer cutoff values */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
434 for (i = 0; i < num_possible_block_sizes; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
435 int block_size = s->samples_per_frame >> i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
436 int cutoff = (440*block_size + 3 * (s->avctx->sample_rate >> 1) - 1)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
437 / s->avctx->sample_rate;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
438 s->subwoofer_cutoffs[i] = av_clip(cutoff, 4, block_size);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
439 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
440
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
441 /** calculate sine values for the decorrelation matrix */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
442 for (i = 0; i < 33; i++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
443 sin64[i] = sin(i*M_PI / 64.0);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
444
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
445 if (avctx->debug & FF_DEBUG_BITSTREAM)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
446 dump_context(s);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
447
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
448 avctx->channel_layout = channel_mask;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
449 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
450 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
451
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
452 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
453 *@brief Decode the subframe length.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
454 *@param s context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
455 *@param offset sample offset in the frame
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
456 *@return decoded subframe length on success, < 0 in case of an error
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
457 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
458 static int decode_subframe_length(WMAProDecodeCtx *s, int offset)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
459 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
460 int frame_len_shift = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
461 int subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
462
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
463 /** no need to read from the bitstream when only one length is possible */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
464 if (offset == s->samples_per_frame - s->min_samples_per_subframe)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
465 return s->min_samples_per_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
466
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
467 /** 1 bit indicates if the subframe is of maximum length */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
468 if (s->max_subframe_len_bit) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
469 if (get_bits1(&s->gb))
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
470 frame_len_shift = 1 + get_bits(&s->gb, s->subframe_len_bits-1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
471 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
472 frame_len_shift = get_bits(&s->gb, s->subframe_len_bits);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
473
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
474 subframe_len = s->samples_per_frame >> frame_len_shift;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
475
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
476 /** sanity check the length */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
477 if (subframe_len < s->min_samples_per_subframe ||
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
478 subframe_len > s->samples_per_frame) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
479 av_log(s->avctx, AV_LOG_ERROR, "broken frame: subframe_len %i\n",
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
480 subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
481 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
482 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
483 return subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
484 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
485
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
486 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
487 *@brief Decode how the data in the frame is split into subframes.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
488 * Every WMA frame contains the encoded data for a fixed number of
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
489 * samples per channel. The data for every channel might be split
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
490 * into several subframes. This function will reconstruct the list of
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
491 * subframes for every channel.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
492 *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
493 * If the subframes are not evenly split, the algorithm estimates the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
494 * channels with the lowest number of total samples.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
495 * Afterwards, for each of these channels a bit is read from the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
496 * bitstream that indicates if the channel contains a subframe with the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
497 * next subframe size that is going to be read from the bitstream or not.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
498 * If a channel contains such a subframe, the subframe size gets added to
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
499 * the channel's subframe list.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
500 * The algorithm repeats these steps until the frame is properly divided
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
501 * between the individual channels.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
502 *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
503 *@param s context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
504 *@return 0 on success, < 0 in case of an error
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
505 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
506 static int decode_tilehdr(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
507 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
508 uint16_t num_samples[WMAPRO_MAX_CHANNELS]; /** sum of samples for all currently known subframes of a channel */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
509 uint8_t contains_subframe[WMAPRO_MAX_CHANNELS]; /** flag indicating if a channel contains the current subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
510 int channels_for_cur_subframe = s->num_channels; /** number of channels that contain the current subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
511 int fixed_channel_layout = 0; /** flag indicating that all channels use the same subframe offsets and sizes */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
512 int min_channel_len = 0; /** smallest sum of samples (channels with this length will be processed first) */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
513 int c;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
514
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
515 /* Should never consume more than 3073 bits (256 iterations for the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
516 * while loop when always the minimum amount of 128 samples is substracted
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
517 * from missing samples in the 8 channel case).
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
518 * 1 + BLOCK_MAX_SIZE * MAX_CHANNELS / BLOCK_MIN_SIZE * (MAX_CHANNELS + 4)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
519 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
520
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
521 /** reset tiling information */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
522 for (c = 0; c < s->num_channels; c++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
523 s->channel[c].num_subframes = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
524
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
525 memset(num_samples, 0, sizeof(num_samples));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
526
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
527 if (s->max_num_subframes == 1 || get_bits1(&s->gb))
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
528 fixed_channel_layout = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
529
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
530 /** loop until the frame data is split between the subframes */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
531 do {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
532 int subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
533
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
534 /** check which channels contain the subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
535 for (c = 0; c < s->num_channels; c++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
536 if (num_samples[c] == min_channel_len) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
537 if (fixed_channel_layout || channels_for_cur_subframe == 1 ||
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
538 (min_channel_len == s->samples_per_frame - s->min_samples_per_subframe))
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
539 contains_subframe[c] = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
540 else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
541 contains_subframe[c] = get_bits1(&s->gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
542 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
543 contains_subframe[c] = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
544 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
545
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
546 /** get subframe length, subframe_len == 0 is not allowed */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
547 if ((subframe_len = decode_subframe_length(s, min_channel_len)) <= 0)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
548 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
549
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
550 /** add subframes to the individual channels and find new min_channel_len */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
551 min_channel_len += subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
552 for (c = 0; c < s->num_channels; c++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
553 WMAProChannelCtx* chan = &s->channel[c];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
554
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
555 if (contains_subframe[c]) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
556 if (chan->num_subframes >= MAX_SUBFRAMES) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
557 av_log(s->avctx, AV_LOG_ERROR,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
558 "broken frame: num subframes > 31\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
559 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
560 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
561 chan->subframe_len[chan->num_subframes] = subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
562 num_samples[c] += subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
563 ++chan->num_subframes;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
564 if (num_samples[c] > s->samples_per_frame) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
565 av_log(s->avctx, AV_LOG_ERROR, "broken frame: "
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
566 "channel len > samples_per_frame\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
567 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
568 }
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
569 } else if (num_samples[c] <= min_channel_len) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
570 if (num_samples[c] < min_channel_len) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
571 channels_for_cur_subframe = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
572 min_channel_len = num_samples[c];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
573 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
574 ++channels_for_cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
575 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
576 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
577 } while (min_channel_len < s->samples_per_frame);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
578
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
579 for (c = 0; c < s->num_channels; c++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
580 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
581 int offset = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
582 for (i = 0; i < s->channel[c].num_subframes; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
583 dprintf(s->avctx, "frame[%i] channel[%i] subframe[%i]"
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
584 " len %i\n", s->frame_num, c, i,
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
585 s->channel[c].subframe_len[i]);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
586 s->channel[c].subframe_offset[i] = offset;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
587 offset += s->channel[c].subframe_len[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
588 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
589 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
590
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
591 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
592 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
593
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
594 /**
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
595 *@brief Calculate a decorrelation matrix from the bitstream parameters.
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
596 *@param s codec context
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
597 *@param chgroup channel group for which the matrix needs to be calculated
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
598 */
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
599 static void decode_decorrelation_matrix(WMAProDecodeCtx *s,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
600 WMAProChannelGrp *chgroup)
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
601 {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
602 int i;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
603 int offset = 0;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
604 int8_t rotation_offset[WMAPRO_MAX_CHANNELS * WMAPRO_MAX_CHANNELS];
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
605 memset(chgroup->decorrelation_matrix, 0, s->num_channels *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
606 s->num_channels * sizeof(*chgroup->decorrelation_matrix));
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
607
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
608 for (i = 0; i < chgroup->num_channels * (chgroup->num_channels - 1) >> 1; i++)
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
609 rotation_offset[i] = get_bits(&s->gb, 6);
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
610
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
611 for (i = 0; i < chgroup->num_channels; i++)
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
612 chgroup->decorrelation_matrix[chgroup->num_channels * i + i] =
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
613 get_bits1(&s->gb) ? 1.0 : -1.0;
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
614
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
615 for (i = 1; i < chgroup->num_channels; i++) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
616 int x;
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
617 for (x = 0; x < i; x++) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
618 int y;
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
619 for (y = 0; y < i + 1; y++) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
620 float v1 = chgroup->decorrelation_matrix[x * chgroup->num_channels + y];
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
621 float v2 = chgroup->decorrelation_matrix[i * chgroup->num_channels + y];
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
622 int n = rotation_offset[offset + x];
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
623 float sinv;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
624 float cosv;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
625
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
626 if (n < 32) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
627 sinv = sin64[n];
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
628 cosv = sin64[32 - n];
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
629 } else {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
630 sinv = sin64[64 - n];
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
631 cosv = -sin64[n - 32];
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
632 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
633
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
634 chgroup->decorrelation_matrix[y + x * chgroup->num_channels] =
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
635 (v1 * sinv) - (v2 * cosv);
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
636 chgroup->decorrelation_matrix[y + i * chgroup->num_channels] =
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
637 (v1 * cosv) + (v2 * sinv);
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
638 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
639 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
640 offset += i;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
641 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
642 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
643
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
644 /**
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
645 *@brief Decode channel transformation parameters
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
646 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
647 *@return 0 in case of success, < 0 in case of bitstream errors
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
648 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
649 static int decode_channel_transform(WMAProDecodeCtx* s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
650 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
651 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
652 /* should never consume more than 1921 bits for the 8 channel case
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
653 * 1 + MAX_CHANNELS * (MAX_CHANNELS + 2 + 3 * MAX_CHANNELS * MAX_CHANNELS
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
654 * + MAX_CHANNELS + MAX_BANDS + 1)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
655 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
656
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
657 /** in the one channel case channel transforms are pointless */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
658 s->num_chgroups = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
659 if (s->num_channels > 1) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
660 int remaining_channels = s->channels_for_cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
661
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
662 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
663 av_log_ask_for_sample(s->avctx,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
664 "unsupported channel transform bit\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
665 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
666 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
667
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
668 for (s->num_chgroups = 0; remaining_channels &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
669 s->num_chgroups < s->channels_for_cur_subframe; s->num_chgroups++) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
670 WMAProChannelGrp* chgroup = &s->chgroup[s->num_chgroups];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
671 float** channel_data = chgroup->channel_data;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
672 chgroup->num_channels = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
673 chgroup->transform = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
674
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
675 /** decode channel mask */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
676 if (remaining_channels > 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
677 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
678 int channel_idx = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
679 if (!s->channel[channel_idx].grouped
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
680 && get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
681 ++chgroup->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
682 s->channel[channel_idx].grouped = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
683 *channel_data++ = s->channel[channel_idx].coeffs;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
684 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
685 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
686 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
687 chgroup->num_channels = remaining_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
688 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
689 int channel_idx = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
690 if (!s->channel[channel_idx].grouped)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
691 *channel_data++ = s->channel[channel_idx].coeffs;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
692 s->channel[channel_idx].grouped = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
693 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
694 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
695
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
696 /** decode transform type */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
697 if (chgroup->num_channels == 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
698 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
699 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
700 av_log_ask_for_sample(s->avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
701 "unsupported channel transform type\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
702 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
703 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
704 chgroup->transform = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
705 if (s->num_channels == 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
706 chgroup->decorrelation_matrix[0] = 1.0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
707 chgroup->decorrelation_matrix[1] = -1.0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
708 chgroup->decorrelation_matrix[2] = 1.0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
709 chgroup->decorrelation_matrix[3] = 1.0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
710 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
711 /** cos(pi/4) */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
712 chgroup->decorrelation_matrix[0] = 0.70703125;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
713 chgroup->decorrelation_matrix[1] = -0.70703125;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
714 chgroup->decorrelation_matrix[2] = 0.70703125;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
715 chgroup->decorrelation_matrix[3] = 0.70703125;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
716 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
717 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
718 } else if (chgroup->num_channels > 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
719 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
720 chgroup->transform = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
721 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
722 decode_decorrelation_matrix(s, chgroup);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
723 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
724 /** FIXME: more than 6 coupled channels not supported */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
725 if (chgroup->num_channels > 6) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
726 av_log_ask_for_sample(s->avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
727 "coupled channels > 6\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
728 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
729 memcpy(chgroup->decorrelation_matrix,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
730 default_decorrelation[chgroup->num_channels],
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
731 chgroup->num_channels * chgroup->num_channels *
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
732 sizeof(*chgroup->decorrelation_matrix));
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
733 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
734 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
735 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
736 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
737
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
738 /** decode transform on / off */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
739 if (chgroup->transform) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
740 if (!get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
741 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
742 /** transform can be enabled for individual bands */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
743 for (i = 0; i < s->num_bands; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
744 chgroup->transform_band[i] = get_bits1(&s->gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
745 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
746 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
747 memset(chgroup->transform_band, 1, s->num_bands);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
748 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
749 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
750 remaining_channels -= chgroup->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
751 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
752 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
753 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
754 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
755
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
756 /**
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
757 *@brief Extract the coefficients from the bitstream.
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
758 *@param s codec context
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
759 *@param c current channel number
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
760 *@return 0 on success, < 0 in case of bitstream errors
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
761 */
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
762 static int decode_coeffs(WMAProDecodeCtx *s, int c)
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
763 {
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
764 /* Integers 0..15 as single-precision floats. The table saves a
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
765 costly int to float conversion, and storing the values as
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
766 integers allows fast sign-flipping. */
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
767 static const int fval_tab[16] = {
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
768 0x00000000, 0x3f800000, 0x40000000, 0x40400000,
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
769 0x40800000, 0x40a00000, 0x40c00000, 0x40e00000,
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
770 0x41000000, 0x41100000, 0x41200000, 0x41300000,
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
771 0x41400000, 0x41500000, 0x41600000, 0x41700000,
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
772 };
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
773 int vlctable;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
774 VLC* vlc;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
775 WMAProChannelCtx* ci = &s->channel[c];
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
776 int rl_mode = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
777 int cur_coeff = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
778 int num_zeros = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
779 const uint16_t* run;
10314
ab687351bfef WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents: 10298
diff changeset
780 const float* level;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
781
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
782 dprintf(s->avctx, "decode coefficients for channel %i\n", c);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
783
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
784 vlctable = get_bits1(&s->gb);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
785 vlc = &coef_vlc[vlctable];
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
786
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
787 if (vlctable) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
788 run = coef1_run;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
789 level = coef1_level;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
790 } else {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
791 run = coef0_run;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
792 level = coef0_level;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
793 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
794
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
795 /** decode vector coefficients (consumes up to 167 bits per iteration for
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
796 4 vector coded large values) */
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
797 while (!rl_mode && cur_coeff + 3 < s->subframe_len) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
798 int vals[4];
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
799 int i;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
800 unsigned int idx;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
801
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
802 idx = get_vlc2(&s->gb, vec4_vlc.table, VLCBITS, VEC4MAXDEPTH);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
803
10101
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
804 if (idx == HUFF_VEC4_SIZE - 1) {
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
805 for (i = 0; i < 4; i += 2) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
806 idx = get_vlc2(&s->gb, vec2_vlc.table, VLCBITS, VEC2MAXDEPTH);
10101
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
807 if (idx == HUFF_VEC2_SIZE - 1) {
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
808 int v0, v1;
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
809 v0 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
810 if (v0 == HUFF_VEC1_SIZE - 1)
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
811 v0 += ff_wma_get_large_val(&s->gb);
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
812 v1 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
813 if (v1 == HUFF_VEC1_SIZE - 1)
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
814 v1 += ff_wma_get_large_val(&s->gb);
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
815 ((float*)vals)[i ] = v0;
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
816 ((float*)vals)[i+1] = v1;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
817 } else {
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
818 vals[i] = fval_tab[symbol_to_vec2[idx] >> 4 ];
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
819 vals[i+1] = fval_tab[symbol_to_vec2[idx] & 0xF];
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
820 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
821 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
822 } else {
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
823 vals[0] = fval_tab[ symbol_to_vec4[idx] >> 12 ];
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
824 vals[1] = fval_tab[(symbol_to_vec4[idx] >> 8) & 0xF];
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
825 vals[2] = fval_tab[(symbol_to_vec4[idx] >> 4) & 0xF];
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
826 vals[3] = fval_tab[ symbol_to_vec4[idx] & 0xF];
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
827 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
828
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
829 /** decode sign */
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
830 for (i = 0; i < 4; i++) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
831 if (vals[i]) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
832 int sign = get_bits1(&s->gb) - 1;
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
833 *(uint32_t*)&ci->coeffs[cur_coeff] = vals[i] ^ sign<<31;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
834 num_zeros = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
835 } else {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
836 ci->coeffs[cur_coeff] = 0;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
837 /** switch to run level mode when subframe_len / 128 zeros
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
838 were found in a row */
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
839 rl_mode |= (++num_zeros > s->subframe_len >> 8);
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
840 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
841 ++cur_coeff;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
842 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
843 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
844
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
845 /** decode run level coded coefficients */
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
846 if (rl_mode) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
847 memset(&ci->coeffs[cur_coeff], 0,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
848 sizeof(*ci->coeffs) * (s->subframe_len - cur_coeff));
10101
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
849 if (ff_wma_run_level_decode(s->avctx, &s->gb, vlc,
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
850 level, run, 1, ci->coeffs,
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
851 cur_coeff, s->subframe_len,
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
852 s->subframe_len, s->esc_len, 0))
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
853 return AVERROR_INVALIDDATA;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
854 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
855
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
856 return 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
857 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
858
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
859 /**
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
860 *@brief Extract scale factors from the bitstream.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
861 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
862 *@return 0 on success, < 0 in case of bitstream errors
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
863 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
864 static int decode_scale_factors(WMAProDecodeCtx* s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
865 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
866 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
867
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
868 /** should never consume more than 5344 bits
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
869 * MAX_CHANNELS * (1 + MAX_BANDS * 23)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
870 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
871
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
872 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
873 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
874 int* sf;
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
875 int* sf_end;
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
876 s->channel[c].scale_factors = s->channel[c].saved_scale_factors[!s->channel[c].scale_factor_idx];
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
877 sf_end = s->channel[c].scale_factors + s->num_bands;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
878
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
879 /** resample scale factors for the new block size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
880 * as the scale factors might need to be resampled several times
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
881 * before some new values are transmitted, a backup of the last
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
882 * transmitted scale factors is kept in saved_scale_factors
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
883 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
884 if (s->channel[c].reuse_sf) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
885 const int8_t* sf_offsets = s->sf_offsets[s->table_idx][s->channel[c].table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
886 int b;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
887 for (b = 0; b < s->num_bands; b++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
888 s->channel[c].scale_factors[b] =
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
889 s->channel[c].saved_scale_factors[s->channel[c].scale_factor_idx][*sf_offsets++];
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
890 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
891
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
892 if (!s->channel[c].cur_subframe || get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
893
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
894 if (!s->channel[c].reuse_sf) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
895 int val;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
896 /** decode DPCM coded scale factors */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
897 s->channel[c].scale_factor_step = get_bits(&s->gb, 2) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
898 val = 45 / s->channel[c].scale_factor_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
899 for (sf = s->channel[c].scale_factors; sf < sf_end; sf++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
900 val += get_vlc2(&s->gb, sf_vlc.table, SCALEVLCBITS, SCALEMAXDEPTH) - 60;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
901 *sf = val;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
902 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
903 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
904 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
905 /** run level decode differences to the resampled factors */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
906 for (i = 0; i < s->num_bands; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
907 int idx;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
908 int skip;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
909 int val;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
910 int sign;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
911
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
912 idx = get_vlc2(&s->gb, sf_rl_vlc.table, VLCBITS, SCALERLMAXDEPTH);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
913
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
914 if (!idx) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
915 uint32_t code = get_bits(&s->gb, 14);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
916 val = code >> 6;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
917 sign = (code & 1) - 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
918 skip = (code & 0x3f) >> 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
919 } else if (idx == 1) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
920 break;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
921 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
922 skip = scale_rl_run[idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
923 val = scale_rl_level[idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
924 sign = get_bits1(&s->gb)-1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
925 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
926
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
927 i += skip;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
928 if (i >= s->num_bands) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
929 av_log(s->avctx, AV_LOG_ERROR,
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
930 "invalid scale factor coding\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
931 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
932 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
933 s->channel[c].scale_factors[i] += (val ^ sign) - sign;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
934 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
935 }
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
936 /** swap buffers */
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
937 s->channel[c].scale_factor_idx = !s->channel[c].scale_factor_idx;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
938 s->channel[c].table_idx = s->table_idx;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
939 s->channel[c].reuse_sf = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
940 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
941
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
942 /** calculate new scale factor maximum */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
943 s->channel[c].max_scale_factor = s->channel[c].scale_factors[0];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
944 for (sf = s->channel[c].scale_factors + 1; sf < sf_end; sf++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
945 s->channel[c].max_scale_factor =
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
946 FFMAX(s->channel[c].max_scale_factor, *sf);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
947 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
948
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
949 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
950 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
951 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
952
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
953 /**
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
954 *@brief Reconstruct the individual channel data.
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
955 *@param s codec context
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
956 */
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
957 static void inverse_channel_transform(WMAProDecodeCtx *s)
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
958 {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
959 int i;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
960
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
961 for (i = 0; i < s->num_chgroups; i++) {
10096
071d6d272a77 merge 2-channel M/S stereo decoding code with the multichannel version
faust3
parents: 10084
diff changeset
962 if (s->chgroup[i].transform) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
963 float data[WMAPRO_MAX_CHANNELS];
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
964 const int num_channels = s->chgroup[i].num_channels;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
965 float** ch_data = s->chgroup[i].channel_data;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
966 float** ch_end = ch_data + num_channels;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
967 const int8_t* tb = s->chgroup[i].transform_band;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
968 int16_t* sfb;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
969
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
970 /** multichannel decorrelation */
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
971 for (sfb = s->cur_sfb_offsets;
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
972 sfb < s->cur_sfb_offsets + s->num_bands; sfb++) {
10096
071d6d272a77 merge 2-channel M/S stereo decoding code with the multichannel version
faust3
parents: 10084
diff changeset
973 int y;
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
974 if (*tb++ == 1) {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
975 /** multiply values with the decorrelation_matrix */
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
976 for (y = sfb[0]; y < FFMIN(sfb[1], s->subframe_len); y++) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
977 const float* mat = s->chgroup[i].decorrelation_matrix;
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
978 const float* data_end = data + num_channels;
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
979 float* data_ptr = data;
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
980 float** ch;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
981
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
982 for (ch = ch_data; ch < ch_end; ch++)
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
983 *data_ptr++ = (*ch)[y];
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
984
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
985 for (ch = ch_data; ch < ch_end; ch++) {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
986 float sum = 0;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
987 data_ptr = data;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
988 while (data_ptr < data_end)
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
989 sum += *data_ptr++ * *mat++;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
990
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
991 (*ch)[y] = sum;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
992 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
993 }
10096
071d6d272a77 merge 2-channel M/S stereo decoding code with the multichannel version
faust3
parents: 10084
diff changeset
994 } else if (s->num_channels == 2) {
10298
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
995 int len = FFMIN(sfb[1], s->subframe_len) - sfb[0];
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
996 s->dsp.vector_fmul_scalar(ch_data[0] + sfb[0],
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
997 ch_data[0] + sfb[0],
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
998 181.0 / 128, len);
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
999 s->dsp.vector_fmul_scalar(ch_data[1] + sfb[0],
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1000 ch_data[1] + sfb[0],
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1001 181.0 / 128, len);
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
1002 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
1003 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
1004 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
1005 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
1006 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
1007
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1008 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1009 *@brief Apply sine window and reconstruct the output buffer.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1010 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1011 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1012 static void wmapro_window(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1013 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1014 int i;
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1015 for (i = 0; i < s->channels_for_cur_subframe; i++) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1016 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1017 float* window;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1018 int winlen = s->channel[c].prev_block_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1019 float* start = s->channel[c].coeffs - (winlen >> 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1020
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1021 if (s->subframe_len < winlen) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1022 start += (winlen - s->subframe_len) >> 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1023 winlen = s->subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1024 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1025
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1026 window = s->windows[av_log2(winlen) - BLOCK_MIN_BITS];
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1027
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1028 winlen >>= 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1029
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1030 s->dsp.vector_fmul_window(start, start, start + winlen,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1031 window, 0, winlen);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1032
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1033 s->channel[c].prev_block_len = s->subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1034 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1035 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1036
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1037 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1038 *@brief Decode a single subframe (block).
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1039 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1040 *@return 0 on success, < 0 when decoding failed
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1041 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1042 static int decode_subframe(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1043 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1044 int offset = s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1045 int subframe_len = s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1046 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1047 int total_samples = s->samples_per_frame * s->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1048 int transmit_coeffs = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1049 int cur_subwoofer_cutoff;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1050
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1051 s->subframe_offset = get_bits_count(&s->gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1052
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1053 /** reset channel context and find the next block offset and size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1054 == the next block of the channel with the smallest number of
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1055 decoded samples
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1056 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1057 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1058 s->channel[i].grouped = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1059 if (offset > s->channel[i].decoded_samples) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1060 offset = s->channel[i].decoded_samples;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1061 subframe_len =
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1062 s->channel[i].subframe_len[s->channel[i].cur_subframe];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1063 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1064 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1065
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1066 dprintf(s->avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1067 "processing subframe with offset %i len %i\n", offset, subframe_len);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1068
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1069 /** get a list of all channels that contain the estimated block */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1070 s->channels_for_cur_subframe = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1071 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1072 const int cur_subframe = s->channel[i].cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1073 /** substract already processed samples */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1074 total_samples -= s->channel[i].decoded_samples;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1075
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1076 /** and count if there are multiple subframes that match our profile */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1077 if (offset == s->channel[i].decoded_samples &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1078 subframe_len == s->channel[i].subframe_len[cur_subframe]) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1079 total_samples -= s->channel[i].subframe_len[cur_subframe];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1080 s->channel[i].decoded_samples +=
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1081 s->channel[i].subframe_len[cur_subframe];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1082 s->channel_indexes_for_cur_subframe[s->channels_for_cur_subframe] = i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1083 ++s->channels_for_cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1084 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1085 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1086
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1087 /** check if the frame will be complete after processing the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1088 estimated block */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1089 if (!total_samples)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1090 s->parsed_all_subframes = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1091
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1092
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1093 dprintf(s->avctx, "subframe is part of %i channels\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1094 s->channels_for_cur_subframe);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1095
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1096 /** calculate number of scale factor bands and their offsets */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1097 s->table_idx = av_log2(s->samples_per_frame/subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1098 s->num_bands = s->num_sfb[s->table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1099 s->cur_sfb_offsets = s->sfb_offsets[s->table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1100 cur_subwoofer_cutoff = s->subwoofer_cutoffs[s->table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1101
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1102 /** configure the decoder for the current subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1103 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1104 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1105
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1106 s->channel[c].coeffs = &s->channel[c].out[(s->samples_per_frame >> 1)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1107 + offset];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1108 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1109
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1110 s->subframe_len = subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1111 s->esc_len = av_log2(s->subframe_len - 1) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1112
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1113 /** skip extended header if any */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1114 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1115 int num_fill_bits;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1116 if (!(num_fill_bits = get_bits(&s->gb, 2))) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1117 int len = get_bits(&s->gb, 4);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1118 num_fill_bits = get_bits(&s->gb, len) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1119 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1120
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1121 if (num_fill_bits >= 0) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1122 if (get_bits_count(&s->gb) + num_fill_bits > s->num_saved_bits) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1123 av_log(s->avctx, AV_LOG_ERROR, "invalid number of fill bits\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1124 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1125 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1126
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1127 skip_bits_long(&s->gb, num_fill_bits);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1128 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1129 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1130
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1131 /** no idea for what the following bit is used */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1132 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1133 av_log_ask_for_sample(s->avctx, "reserved bit set\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1134 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1135 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1136
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1137
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1138 if (decode_channel_transform(s) < 0)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1139 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1140
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1141
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1142 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1143 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1144 if ((s->channel[c].transmit_coefs = get_bits1(&s->gb)))
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1145 transmit_coeffs = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1146 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1147
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1148 if (transmit_coeffs) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1149 int step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1150 int quant_step = 90 * s->bits_per_sample >> 4;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1151 if ((get_bits1(&s->gb))) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1152 /** FIXME: might change run level mode decision */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1153 av_log_ask_for_sample(s->avctx, "unsupported quant step coding\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1154 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1155 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1156 /** decode quantization step */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1157 step = get_sbits(&s->gb, 6);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1158 quant_step += step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1159 if (step == -32 || step == 31) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1160 const int sign = (step == 31) - 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1161 int quant = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1162 while (get_bits_count(&s->gb) + 5 < s->num_saved_bits &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1163 (step = get_bits(&s->gb, 5)) == 31) {
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1164 quant += 31;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1165 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1166 quant_step += ((quant + step) ^ sign) - sign;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1167 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1168 if (quant_step < 0) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1169 av_log(s->avctx, AV_LOG_DEBUG, "negative quant step\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1170 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1171
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1172 /** decode quantization step modifiers for every channel */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1173
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1174 if (s->channels_for_cur_subframe == 1) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1175 s->channel[s->channel_indexes_for_cur_subframe[0]].quant_step = quant_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1176 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1177 int modifier_len = get_bits(&s->gb, 3);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1178 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1179 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1180 s->channel[c].quant_step = quant_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1181 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1182 if (modifier_len) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1183 s->channel[c].quant_step += get_bits(&s->gb, modifier_len) + 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1184 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1185 ++s->channel[c].quant_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1186 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1187 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1188 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1189
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1190 /** decode scale factors */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1191 if (decode_scale_factors(s) < 0)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1192 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1193 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1194
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1195 dprintf(s->avctx, "BITSTREAM: subframe header length was %i\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1196 get_bits_count(&s->gb) - s->subframe_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1197
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1198 /** parse coefficients */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1199 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1200 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1201 if (s->channel[c].transmit_coefs &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1202 get_bits_count(&s->gb) < s->num_saved_bits) {
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1203 decode_coeffs(s, c);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1204 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1205 memset(s->channel[c].coeffs, 0,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1206 sizeof(*s->channel[c].coeffs) * subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1207 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1208
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1209 dprintf(s->avctx, "BITSTREAM: subframe length was %i\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1210 get_bits_count(&s->gb) - s->subframe_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1211
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1212 if (transmit_coeffs) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1213 /** reconstruct the per channel data */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1214 inverse_channel_transform(s);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1215 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1216 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1217 const int* sf = s->channel[c].scale_factors;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1218 int b;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1219
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1220 if (c == s->lfe_channel)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1221 memset(&s->tmp[cur_subwoofer_cutoff], 0, sizeof(*s->tmp) *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1222 (subframe_len - cur_subwoofer_cutoff));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1223
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1224 /** inverse quantization and rescaling */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1225 for (b = 0; b < s->num_bands; b++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1226 const int end = FFMIN(s->cur_sfb_offsets[b+1], s->subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1227 const int exp = s->channel[c].quant_step -
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1228 (s->channel[c].max_scale_factor - *sf++) *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1229 s->channel[c].scale_factor_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1230 const float quant = pow(10.0, exp / 20.0);
10298
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1231 int start = s->cur_sfb_offsets[b];
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1232 s->dsp.vector_fmul_scalar(s->tmp + start,
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1233 s->channel[c].coeffs + start,
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1234 quant, end - start);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1235 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1236
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1237 /** apply imdct (ff_imdct_half == DCTIV with reverse) */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1238 ff_imdct_half(&s->mdct_ctx[av_log2(subframe_len) - BLOCK_MIN_BITS],
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1239 s->channel[c].coeffs, s->tmp);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1240 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1241 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1242
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1243 /** window and overlapp-add */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1244 wmapro_window(s);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1245
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1246 /** handled one subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1247 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1248 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1249 if (s->channel[c].cur_subframe >= s->channel[c].num_subframes) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1250 av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1251 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1252 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1253 ++s->channel[c].cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1254 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1255
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1256 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1257 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1258
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1259 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1260 *@brief Decode one WMA frame.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1261 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1262 *@return 0 if the trailer bit indicates that this is the last frame,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1263 * 1 if there are additional frames
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1264 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1265 static int decode_frame(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1266 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1267 GetBitContext* gb = &s->gb;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1268 int more_frames = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1269 int len = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1270 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1271
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1272 /** check for potential output buffer overflow */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1273 if (s->num_channels * s->samples_per_frame > s->samples_end - s->samples) {
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1274 /** return an error if no frame could be decoded at all */
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1275 av_log(s->avctx, AV_LOG_ERROR,
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1276 "not enough space for the output samples\n");
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1277 s->packet_loss = 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1278 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1279 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1280
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1281 /** get frame length */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1282 if (s->len_prefix)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1283 len = get_bits(gb, s->log2_frame_size);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1284
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1285 dprintf(s->avctx, "decoding frame with length %x\n", len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1286
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1287 /** decode tile information */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1288 if (decode_tilehdr(s)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1289 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1290 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1291 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1292
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1293 /** read postproc transform */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1294 if (s->num_channels > 1 && get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1295 av_log_ask_for_sample(s->avctx, "Unsupported postproc transform found\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1296 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1297 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1298 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1299
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1300 /** read drc info */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1301 if (s->dynamic_range_compression) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1302 s->drc_gain = get_bits(gb, 8);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1303 dprintf(s->avctx, "drc_gain %i\n", s->drc_gain);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1304 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1305
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1306 /** no idea what these are for, might be the number of samples
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1307 that need to be skipped at the beginning or end of a stream */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1308 if (get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1309 int skip;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1310
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1311 /** usually true for the first frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1312 if (get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1313 skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1314 dprintf(s->avctx, "start skip: %i\n", skip);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1315 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1316
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1317 /** sometimes true for the last frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1318 if (get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1319 skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1320 dprintf(s->avctx, "end skip: %i\n", skip);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1321 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1322
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1323 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1324
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1325 dprintf(s->avctx, "BITSTREAM: frame header length was %i\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1326 get_bits_count(gb) - s->frame_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1327
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1328 /** reset subframe states */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1329 s->parsed_all_subframes = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1330 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1331 s->channel[i].decoded_samples = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1332 s->channel[i].cur_subframe = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1333 s->channel[i].reuse_sf = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1334 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1335
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1336 /** decode all subframes */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1337 while (!s->parsed_all_subframes) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1338 if (decode_subframe(s) < 0) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1339 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1340 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1341 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1342 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1343
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1344 /** interleave samples and write them to the output buffer */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1345 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1346 float* ptr;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1347 int incr = s->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1348 float* iptr = s->channel[i].out;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1349 int x;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1350
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1351 ptr = s->samples + i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1352
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1353 for (x = 0; x < s->samples_per_frame; x++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1354 *ptr = av_clipf(*iptr++, -1.0, 32767.0 / 32768.0);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1355 ptr += incr;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1356 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1357
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1358 /** reuse second half of the IMDCT output for the next frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1359 memcpy(&s->channel[i].out[0],
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1360 &s->channel[i].out[s->samples_per_frame],
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1361 s->samples_per_frame * sizeof(*s->channel[i].out) >> 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1362 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1363
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1364 if (s->skip_frame) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1365 s->skip_frame = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1366 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1367 s->samples += s->num_channels * s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1368
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1369 if (len != (get_bits_count(gb) - s->frame_offset) + 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1370 /** FIXME: not sure if this is always an error */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1371 av_log(s->avctx, AV_LOG_ERROR, "frame[%i] would have to skip %i bits\n",
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1372 s->frame_num, len - (get_bits_count(gb) - s->frame_offset) - 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1373 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1374 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1375 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1376
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1377 /** skip the rest of the frame data */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1378 skip_bits_long(gb, len - (get_bits_count(gb) - s->frame_offset) - 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1379
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1380 /** decode trailer bit */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1381 more_frames = get_bits1(gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1382
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1383 ++s->frame_num;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1384 return more_frames;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1385 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1386
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1387 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1388 *@brief Calculate remaining input buffer length.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1389 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1390 *@param gb bitstream reader context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1391 *@return remaining size in bits
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1392 */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1393 static int remaining_bits(WMAProDecodeCtx *s, GetBitContext *gb)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1394 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1395 return s->buf_bit_size - get_bits_count(gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1396 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1397
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1398 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1399 *@brief Fill the bit reservoir with a (partial) frame.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1400 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1401 *@param gb bitstream reader context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1402 *@param len length of the partial frame
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1403 *@param append decides wether to reset the buffer or not
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1404 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1405 static void save_bits(WMAProDecodeCtx *s, GetBitContext* gb, int len,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1406 int append)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1407 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1408 int buflen;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1409
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1410 /** when the frame data does not need to be concatenated, the input buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1411 is resetted and additional bits from the previous frame are copyed
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1412 and skipped later so that a fast byte copy is possible */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1413
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1414 if (!append) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1415 s->frame_offset = get_bits_count(gb) & 7;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1416 s->num_saved_bits = s->frame_offset;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1417 init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1418 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1419
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1420 buflen = (s->num_saved_bits + len + 8) >> 3;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1421
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1422 if (len <= 0 || buflen > MAX_FRAMESIZE) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1423 av_log_ask_for_sample(s->avctx, "input buffer too small\n");
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1424 s->packet_loss = 1;
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1425 return;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1426 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1427
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1428 s->num_saved_bits += len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1429 if (!append) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1430 ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1431 s->num_saved_bits);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1432 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1433 int align = 8 - (get_bits_count(gb) & 7);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1434 align = FFMIN(align, len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1435 put_bits(&s->pb, align, get_bits(gb, align));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1436 len -= align;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1437 ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1438 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1439 skip_bits_long(gb, len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1440
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1441 {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1442 PutBitContext tmp = s->pb;
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1443 flush_put_bits(&tmp);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1444 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1445
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1446 init_get_bits(&s->gb, s->frame_data, s->num_saved_bits);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1447 skip_bits(&s->gb, s->frame_offset);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1448 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1449
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1450 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1451 *@brief Decode a single WMA packet.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1452 *@param avctx codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1453 *@param data the output buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1454 *@param data_size number of bytes that were written to the output buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1455 *@param avpkt input packet
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1456 *@return number of bytes that were read from the input buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1457 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1458 static int decode_packet(AVCodecContext *avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1459 void *data, int *data_size, AVPacket* avpkt)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1460 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1461 WMAProDecodeCtx *s = avctx->priv_data;
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1462 GetBitContext* gb = &s->pgb;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1463 const uint8_t* buf = avpkt->data;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1464 int buf_size = avpkt->size;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1465 int num_bits_prev_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1466 int packet_sequence_number;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1467
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1468 s->samples = data;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1469 s->samples_end = (float*)((int8_t*)data + *data_size);
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1470 *data_size = 0;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1471
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1472 if (s->packet_done || s->packet_loss) {
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1473 s->packet_done = 0;
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1474 s->buf_bit_size = buf_size << 3;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1475
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1476 /** sanity check for the buffer length */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1477 if (buf_size < avctx->block_align)
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1478 return 0;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1479
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1480 buf_size = avctx->block_align;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1481
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1482 /** parse packet header */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1483 init_get_bits(gb, buf, s->buf_bit_size);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1484 packet_sequence_number = get_bits(gb, 4);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1485 skip_bits(gb, 2);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1486
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1487 /** get number of bits that need to be added to the previous frame */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1488 num_bits_prev_frame = get_bits(gb, s->log2_frame_size);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1489 dprintf(avctx, "packet[%d]: nbpf %x\n", avctx->frame_number,
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1490 num_bits_prev_frame);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1491
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1492 /** check for packet loss */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1493 if (!s->packet_loss &&
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1494 ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) {
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1495 s->packet_loss = 1;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1496 av_log(avctx, AV_LOG_ERROR, "Packet loss detected! seq %x vs %x\n",
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1497 s->packet_sequence_number, packet_sequence_number);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1498 }
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1499 s->packet_sequence_number = packet_sequence_number;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1500
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1501 if (num_bits_prev_frame > 0) {
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1502 /** append the previous frame data to the remaining data from the
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1503 previous packet to create a full frame */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1504 save_bits(s, gb, num_bits_prev_frame, 1);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1505 dprintf(avctx, "accumulated %x bits of frame data\n",
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1506 s->num_saved_bits - s->frame_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1507
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1508 /** decode the cross packet frame if it is valid */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1509 if (!s->packet_loss)
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1510 decode_frame(s);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1511 } else if (s->num_saved_bits - s->frame_offset) {
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1512 dprintf(avctx, "ignoring %x previously saved bits\n",
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1513 s->num_saved_bits - s->frame_offset);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1514 }
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1515
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1516 s->packet_loss = 0;
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1517
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1518 } else {
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1519 int frame_size;
10165
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1520 s->buf_bit_size = avpkt->size << 3;
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1521 init_get_bits(gb, avpkt->data, s->buf_bit_size);
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1522 skip_bits(gb, s->packet_offset);
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1523 if (remaining_bits(s, gb) > s->log2_frame_size &&
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1524 (frame_size = show_bits(gb, s->log2_frame_size)) &&
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1525 frame_size <= remaining_bits(s, gb)) {
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1526 save_bits(s, gb, frame_size, 0);
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1527 s->packet_done = !decode_frame(s);
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1528 } else
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1529 s->packet_done = 1;
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1530 }
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1531
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1532 if (s->packet_done && !s->packet_loss &&
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1533 remaining_bits(s, gb) > 0) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1534 /** save the rest of the data so that it can be decoded
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1535 with the next packet */
10126
6ff9347c8042 store packet GetBitContext in the decoder context
faust3
parents: 10123
diff changeset
1536 save_bits(s, gb, remaining_bits(s, gb), 0);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1537 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1538
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1539 *data_size = (int8_t *)s->samples - (int8_t *)data;
10165
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1540 s->packet_offset = get_bits_count(gb) & 7;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1541
10352
8eb51d3eccdf return AVERROR_INVALIDDATA when the bitstream could not be decoded
faust3
parents: 10314
diff changeset
1542 return (s->packet_loss) ? AVERROR_INVALIDDATA : get_bits_count(gb) >> 3;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1543 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1544
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1545 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1546 *@brief Clear decoder buffers (for seeking).
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1547 *@param avctx codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1548 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1549 static void flush(AVCodecContext *avctx)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1550 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1551 WMAProDecodeCtx *s = avctx->priv_data;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1552 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1553 /** reset output buffer as a part of it is used during the windowing of a
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1554 new frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1555 for (i = 0; i < s->num_channels; i++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1556 memset(s->channel[i].out, 0, s->samples_per_frame *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1557 sizeof(*s->channel[i].out));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1558 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1559 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1560
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1561
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1562 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1563 *@brief wmapro decoder
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1564 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1565 AVCodec wmapro_decoder = {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1566 "wmapro",
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1567 CODEC_TYPE_AUDIO,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1568 CODEC_ID_WMAPRO,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1569 sizeof(WMAProDecodeCtx),
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1570 decode_init,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1571 NULL,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1572 decode_end,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1573 decode_packet,
10180
a514a601bf26 Add CODEC_CAP_SUBFRAMES for codecs that output multiple subframes
faust3
parents: 10174
diff changeset
1574 .capabilities = CODEC_CAP_SUBFRAMES,
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1575 .flush= flush,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1576 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 9 Professional"),
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1577 };