annotate wmaprodec.c @ 10576:64c8bc5340bd libavcodec

Revert "Add required header #include to fix 'make checkheaders'." config.h must not be included in that file. The table generator runs on the host system, but config.h describes the target.
author mru
date Thu, 26 Nov 2009 10:06:41 +0000
parents 99a26e9d6e1b
children 3d011a01a6a0
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
145 DECLARE_ALIGNED_16(float, out[WMAPRO_BLOCK_MAX_SIZE + WMAPRO_BLOCK_MAX_SIZE / 2]); ///< output buffer
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
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
170 DECLARE_ALIGNED_16(float, tmp[WMAPRO_BLOCK_MAX_SIZE]); ///< IMDCT output buffer
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++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
428 const int n = 1 << (WMAPRO_BLOCK_MAX_BITS - i);
10174
89cd870ca180 Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents: 10165
diff changeset
429 const int win_idx = WMAPRO_BLOCK_MAX_BITS - i;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
430 ff_sine_window_init(ff_sine_windows[win_idx], n);
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
431 s->windows[WMAPRO_BLOCK_SIZES - i - 1] = ff_sine_windows[win_idx];
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
432 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
433
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
434 /** calculate subwoofer cutoff values */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
435 for (i = 0; i < num_possible_block_sizes; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
436 int block_size = s->samples_per_frame >> i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
437 int cutoff = (440*block_size + 3 * (s->avctx->sample_rate >> 1) - 1)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
438 / s->avctx->sample_rate;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
439 s->subwoofer_cutoffs[i] = av_clip(cutoff, 4, block_size);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
440 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
441
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
442 /** calculate sine values for the decorrelation matrix */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
443 for (i = 0; i < 33; i++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
444 sin64[i] = sin(i*M_PI / 64.0);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
445
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
446 if (avctx->debug & FF_DEBUG_BITSTREAM)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
447 dump_context(s);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
448
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
449 avctx->channel_layout = channel_mask;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
450 return 0;
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 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
454 *@brief Decode the subframe length.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
455 *@param s context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
456 *@param offset sample offset in the frame
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
457 *@return decoded subframe length on success, < 0 in case of an error
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
458 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
459 static int decode_subframe_length(WMAProDecodeCtx *s, int offset)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
460 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
461 int frame_len_shift = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
462 int subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
463
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
464 /** no need to read from the bitstream when only one length is possible */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
465 if (offset == s->samples_per_frame - s->min_samples_per_subframe)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
466 return s->min_samples_per_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
467
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
468 /** 1 bit indicates if the subframe is of maximum length */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
469 if (s->max_subframe_len_bit) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
470 if (get_bits1(&s->gb))
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
471 frame_len_shift = 1 + get_bits(&s->gb, s->subframe_len_bits-1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
472 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
473 frame_len_shift = get_bits(&s->gb, s->subframe_len_bits);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
474
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
475 subframe_len = s->samples_per_frame >> frame_len_shift;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
476
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
477 /** sanity check the length */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
478 if (subframe_len < s->min_samples_per_subframe ||
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
479 subframe_len > s->samples_per_frame) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
480 av_log(s->avctx, AV_LOG_ERROR, "broken frame: subframe_len %i\n",
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
481 subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
482 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
483 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
484 return subframe_len;
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 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
488 *@brief Decode how the data in the frame is split into subframes.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
489 * Every WMA frame contains the encoded data for a fixed number of
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
490 * samples per channel. The data for every channel might be split
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
491 * into several subframes. This function will reconstruct the list of
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
492 * subframes for every channel.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
493 *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
494 * If the subframes are not evenly split, the algorithm estimates the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
495 * channels with the lowest number of total samples.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
496 * Afterwards, for each of these channels a bit is read from the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
497 * bitstream that indicates if the channel contains a subframe with the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
498 * 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
499 * If a channel contains such a subframe, the subframe size gets added to
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
500 * the channel's subframe list.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
501 * The algorithm repeats these steps until the frame is properly divided
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
502 * between the individual channels.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
503 *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
504 *@param s context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
505 *@return 0 on success, < 0 in case of an error
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
506 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
507 static int decode_tilehdr(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
508 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
509 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
510 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
511 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
512 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
513 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
514 int c;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
515
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
516 /* Should never consume more than 3073 bits (256 iterations for the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
517 * while loop when always the minimum amount of 128 samples is substracted
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
518 * from missing samples in the 8 channel case).
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
519 * 1 + BLOCK_MAX_SIZE * MAX_CHANNELS / BLOCK_MIN_SIZE * (MAX_CHANNELS + 4)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
520 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
521
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
522 /** reset tiling information */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
523 for (c = 0; c < s->num_channels; c++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
524 s->channel[c].num_subframes = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
525
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
526 memset(num_samples, 0, sizeof(num_samples));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
527
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
528 if (s->max_num_subframes == 1 || get_bits1(&s->gb))
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
529 fixed_channel_layout = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
530
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
531 /** loop until the frame data is split between the subframes */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
532 do {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
533 int subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
534
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
535 /** check which channels contain the subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
536 for (c = 0; c < s->num_channels; c++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
537 if (num_samples[c] == min_channel_len) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
538 if (fixed_channel_layout || channels_for_cur_subframe == 1 ||
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
539 (min_channel_len == s->samples_per_frame - s->min_samples_per_subframe))
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
540 contains_subframe[c] = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
541 else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
542 contains_subframe[c] = get_bits1(&s->gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
543 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
544 contains_subframe[c] = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
545 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
546
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
547 /** get subframe length, subframe_len == 0 is not allowed */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
548 if ((subframe_len = decode_subframe_length(s, min_channel_len)) <= 0)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
549 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
550
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
551 /** add subframes to the individual channels and find new min_channel_len */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
552 min_channel_len += subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
553 for (c = 0; c < s->num_channels; c++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
554 WMAProChannelCtx* chan = &s->channel[c];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
555
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
556 if (contains_subframe[c]) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
557 if (chan->num_subframes >= MAX_SUBFRAMES) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
558 av_log(s->avctx, AV_LOG_ERROR,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
559 "broken frame: num subframes > 31\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
560 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
561 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
562 chan->subframe_len[chan->num_subframes] = subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
563 num_samples[c] += subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
564 ++chan->num_subframes;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
565 if (num_samples[c] > s->samples_per_frame) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
566 av_log(s->avctx, AV_LOG_ERROR, "broken frame: "
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
567 "channel len > samples_per_frame\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
568 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
569 }
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
570 } else if (num_samples[c] <= min_channel_len) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
571 if (num_samples[c] < min_channel_len) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
572 channels_for_cur_subframe = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
573 min_channel_len = num_samples[c];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
574 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
575 ++channels_for_cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
576 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
577 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
578 } while (min_channel_len < s->samples_per_frame);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
579
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
580 for (c = 0; c < s->num_channels; c++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
581 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
582 int offset = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
583 for (i = 0; i < s->channel[c].num_subframes; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
584 dprintf(s->avctx, "frame[%i] channel[%i] subframe[%i]"
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
585 " len %i\n", s->frame_num, c, i,
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
586 s->channel[c].subframe_len[i]);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
587 s->channel[c].subframe_offset[i] = offset;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
588 offset += s->channel[c].subframe_len[i];
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
592 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
593 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
594
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
595 /**
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
596 *@brief Calculate a decorrelation matrix from the bitstream parameters.
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
597 *@param s codec context
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
598 *@param chgroup channel group for which the matrix needs to be calculated
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
599 */
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
600 static void decode_decorrelation_matrix(WMAProDecodeCtx *s,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
601 WMAProChannelGrp *chgroup)
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
602 {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
603 int i;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
604 int offset = 0;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
605 int8_t rotation_offset[WMAPRO_MAX_CHANNELS * WMAPRO_MAX_CHANNELS];
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
606 memset(chgroup->decorrelation_matrix, 0, s->num_channels *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
607 s->num_channels * sizeof(*chgroup->decorrelation_matrix));
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
608
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
609 for (i = 0; i < chgroup->num_channels * (chgroup->num_channels - 1) >> 1; i++)
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
610 rotation_offset[i] = get_bits(&s->gb, 6);
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
611
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
612 for (i = 0; i < chgroup->num_channels; i++)
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
613 chgroup->decorrelation_matrix[chgroup->num_channels * i + i] =
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
614 get_bits1(&s->gb) ? 1.0 : -1.0;
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
615
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
616 for (i = 1; i < chgroup->num_channels; i++) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
617 int x;
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
618 for (x = 0; x < i; x++) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
619 int y;
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
620 for (y = 0; y < i + 1; y++) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
621 float v1 = chgroup->decorrelation_matrix[x * chgroup->num_channels + y];
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
622 float v2 = chgroup->decorrelation_matrix[i * chgroup->num_channels + y];
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
623 int n = rotation_offset[offset + x];
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
624 float sinv;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
625 float cosv;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
626
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
627 if (n < 32) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
628 sinv = sin64[n];
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
629 cosv = sin64[32 - n];
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
630 } else {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
631 sinv = sin64[64 - n];
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
632 cosv = -sin64[n - 32];
10005
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
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
635 chgroup->decorrelation_matrix[y + x * chgroup->num_channels] =
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
636 (v1 * sinv) - (v2 * cosv);
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
637 chgroup->decorrelation_matrix[y + i * chgroup->num_channels] =
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
638 (v1 * cosv) + (v2 * sinv);
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 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
641 offset += i;
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
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
645 /**
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
646 *@brief Decode channel transformation parameters
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
647 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
648 *@return 0 in case of success, < 0 in case of bitstream errors
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
649 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
650 static int decode_channel_transform(WMAProDecodeCtx* s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
651 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
652 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
653 /* 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
654 * 1 + MAX_CHANNELS * (MAX_CHANNELS + 2 + 3 * MAX_CHANNELS * MAX_CHANNELS
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
655 * + MAX_CHANNELS + MAX_BANDS + 1)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
656 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
657
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
658 /** in the one channel case channel transforms are pointless */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
659 s->num_chgroups = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
660 if (s->num_channels > 1) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
661 int remaining_channels = s->channels_for_cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
662
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
663 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
664 av_log_ask_for_sample(s->avctx,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
665 "unsupported channel transform bit\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
666 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
667 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
668
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
669 for (s->num_chgroups = 0; remaining_channels &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
670 s->num_chgroups < s->channels_for_cur_subframe; s->num_chgroups++) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
671 WMAProChannelGrp* chgroup = &s->chgroup[s->num_chgroups];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
672 float** channel_data = chgroup->channel_data;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
673 chgroup->num_channels = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
674 chgroup->transform = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
675
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
676 /** decode channel mask */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
677 if (remaining_channels > 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
678 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
679 int channel_idx = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
680 if (!s->channel[channel_idx].grouped
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
681 && get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
682 ++chgroup->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
683 s->channel[channel_idx].grouped = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
684 *channel_data++ = s->channel[channel_idx].coeffs;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
685 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
686 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
687 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
688 chgroup->num_channels = remaining_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
689 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
690 int channel_idx = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
691 if (!s->channel[channel_idx].grouped)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
692 *channel_data++ = s->channel[channel_idx].coeffs;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
693 s->channel[channel_idx].grouped = 1;
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
697 /** decode transform type */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
698 if (chgroup->num_channels == 2) {
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 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
701 av_log_ask_for_sample(s->avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
702 "unsupported channel transform type\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
703 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
704 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
705 chgroup->transform = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
706 if (s->num_channels == 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
707 chgroup->decorrelation_matrix[0] = 1.0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
708 chgroup->decorrelation_matrix[1] = -1.0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
709 chgroup->decorrelation_matrix[2] = 1.0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
710 chgroup->decorrelation_matrix[3] = 1.0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
711 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
712 /** cos(pi/4) */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
713 chgroup->decorrelation_matrix[0] = 0.70703125;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
714 chgroup->decorrelation_matrix[1] = -0.70703125;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
715 chgroup->decorrelation_matrix[2] = 0.70703125;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
716 chgroup->decorrelation_matrix[3] = 0.70703125;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
717 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
718 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
719 } else if (chgroup->num_channels > 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
720 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
721 chgroup->transform = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
722 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
723 decode_decorrelation_matrix(s, chgroup);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
724 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
725 /** FIXME: more than 6 coupled channels not supported */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
726 if (chgroup->num_channels > 6) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
727 av_log_ask_for_sample(s->avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
728 "coupled channels > 6\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
729 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
730 memcpy(chgroup->decorrelation_matrix,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
731 default_decorrelation[chgroup->num_channels],
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
732 chgroup->num_channels * chgroup->num_channels *
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
733 sizeof(*chgroup->decorrelation_matrix));
10122
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
739 /** decode transform on / off */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
740 if (chgroup->transform) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
741 if (!get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
742 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
743 /** transform can be enabled for individual bands */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
744 for (i = 0; i < s->num_bands; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
745 chgroup->transform_band[i] = get_bits1(&s->gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
746 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
747 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
748 memset(chgroup->transform_band, 1, s->num_bands);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
749 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
750 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
751 remaining_channels -= chgroup->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
752 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
753 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
754 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
755 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
756
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
757 /**
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
758 *@brief Extract the coefficients from the bitstream.
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
759 *@param s codec context
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
760 *@param c current channel number
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
761 *@return 0 on success, < 0 in case of bitstream errors
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
762 */
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
763 static int decode_coeffs(WMAProDecodeCtx *s, int c)
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
764 {
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
765 /* 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
766 costly int to float conversion, and storing the values as
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
767 integers allows fast sign-flipping. */
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
768 static const int fval_tab[16] = {
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
769 0x00000000, 0x3f800000, 0x40000000, 0x40400000,
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
770 0x40800000, 0x40a00000, 0x40c00000, 0x40e00000,
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
771 0x41000000, 0x41100000, 0x41200000, 0x41300000,
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
772 0x41400000, 0x41500000, 0x41600000, 0x41700000,
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
773 };
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
774 int vlctable;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
775 VLC* vlc;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
776 WMAProChannelCtx* ci = &s->channel[c];
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
777 int rl_mode = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
778 int cur_coeff = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
779 int num_zeros = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
780 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
781 const float* level;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
782
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
783 dprintf(s->avctx, "decode coefficients for channel %i\n", c);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
784
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
785 vlctable = get_bits1(&s->gb);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
786 vlc = &coef_vlc[vlctable];
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
787
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
788 if (vlctable) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
789 run = coef1_run;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
790 level = coef1_level;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
791 } else {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
792 run = coef0_run;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
793 level = coef0_level;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
794 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
795
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
796 /** decode vector coefficients (consumes up to 167 bits per iteration for
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
797 4 vector coded large values) */
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
798 while (!rl_mode && cur_coeff + 3 < s->subframe_len) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
799 int vals[4];
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
800 int i;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
801 unsigned int idx;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
802
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
803 idx = get_vlc2(&s->gb, vec4_vlc.table, VLCBITS, VEC4MAXDEPTH);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
804
10101
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
805 if (idx == HUFF_VEC4_SIZE - 1) {
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
806 for (i = 0; i < 4; i += 2) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
807 idx = get_vlc2(&s->gb, vec2_vlc.table, VLCBITS, VEC2MAXDEPTH);
10101
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
808 if (idx == HUFF_VEC2_SIZE - 1) {
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
809 int v0, v1;
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
810 v0 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
811 if (v0 == HUFF_VEC1_SIZE - 1)
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
812 v0 += ff_wma_get_large_val(&s->gb);
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
813 v1 = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
814 if (v1 == HUFF_VEC1_SIZE - 1)
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
815 v1 += ff_wma_get_large_val(&s->gb);
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
816 ((float*)vals)[i ] = v0;
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
817 ((float*)vals)[i+1] = v1;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
818 } else {
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
819 vals[i] = fval_tab[symbol_to_vec2[idx] >> 4 ];
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
820 vals[i+1] = fval_tab[symbol_to_vec2[idx] & 0xF];
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
821 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
822 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
823 } else {
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
824 vals[0] = fval_tab[ symbol_to_vec4[idx] >> 12 ];
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
825 vals[1] = fval_tab[(symbol_to_vec4[idx] >> 8) & 0xF];
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
826 vals[2] = fval_tab[(symbol_to_vec4[idx] >> 4) & 0xF];
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
827 vals[3] = fval_tab[ symbol_to_vec4[idx] & 0xF];
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
828 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
829
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
830 /** decode sign */
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
831 for (i = 0; i < 4; i++) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
832 if (vals[i]) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
833 int sign = get_bits1(&s->gb) - 1;
10428
99a26e9d6e1b WMAPRO: use some type punning in decode_coeffs()
mru
parents: 10353
diff changeset
834 *(uint32_t*)&ci->coeffs[cur_coeff] = vals[i] ^ sign<<31;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
835 num_zeros = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
836 } else {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
837 ci->coeffs[cur_coeff] = 0;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
838 /** switch to run level mode when subframe_len / 128 zeros
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
839 were found in a row */
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
840 rl_mode |= (++num_zeros > s->subframe_len >> 8);
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
841 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
842 ++cur_coeff;
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
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
846 /** decode run level coded coefficients */
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
847 if (rl_mode) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
848 memset(&ci->coeffs[cur_coeff], 0,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
849 sizeof(*ci->coeffs) * (s->subframe_len - cur_coeff));
10101
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
850 if (ff_wma_run_level_decode(s->avctx, &s->gb, vlc,
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
851 level, run, 1, ci->coeffs,
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
852 cur_coeff, s->subframe_len,
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
853 s->subframe_len, s->esc_len, 0))
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
854 return AVERROR_INVALIDDATA;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
855 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
856
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
857 return 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
858 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
859
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
860 /**
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
861 *@brief Extract scale factors from the bitstream.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
862 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
863 *@return 0 on success, < 0 in case of bitstream errors
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
864 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
865 static int decode_scale_factors(WMAProDecodeCtx* s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
866 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
867 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
868
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
869 /** should never consume more than 5344 bits
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
870 * MAX_CHANNELS * (1 + MAX_BANDS * 23)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
871 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
872
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
873 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
874 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
875 int* sf;
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
876 int* sf_end;
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
877 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
878 sf_end = s->channel[c].scale_factors + s->num_bands;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
879
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
880 /** resample scale factors for the new block size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
881 * as the scale factors might need to be resampled several times
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
882 * before some new values are transmitted, a backup of the last
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
883 * transmitted scale factors is kept in saved_scale_factors
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
884 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
885 if (s->channel[c].reuse_sf) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
886 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
887 int b;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
888 for (b = 0; b < s->num_bands; b++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
889 s->channel[c].scale_factors[b] =
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
890 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
891 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
892
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
893 if (!s->channel[c].cur_subframe || get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
894
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
895 if (!s->channel[c].reuse_sf) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
896 int val;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
897 /** decode DPCM coded scale factors */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
898 s->channel[c].scale_factor_step = get_bits(&s->gb, 2) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
899 val = 45 / s->channel[c].scale_factor_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
900 for (sf = s->channel[c].scale_factors; sf < sf_end; sf++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
901 val += get_vlc2(&s->gb, sf_vlc.table, SCALEVLCBITS, SCALEMAXDEPTH) - 60;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
902 *sf = val;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
903 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
904 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
905 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
906 /** run level decode differences to the resampled factors */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
907 for (i = 0; i < s->num_bands; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
908 int idx;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
909 int skip;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
910 int val;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
911 int sign;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
912
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
913 idx = get_vlc2(&s->gb, sf_rl_vlc.table, VLCBITS, SCALERLMAXDEPTH);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
914
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
915 if (!idx) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
916 uint32_t code = get_bits(&s->gb, 14);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
917 val = code >> 6;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
918 sign = (code & 1) - 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
919 skip = (code & 0x3f) >> 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
920 } else if (idx == 1) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
921 break;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
922 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
923 skip = scale_rl_run[idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
924 val = scale_rl_level[idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
925 sign = get_bits1(&s->gb)-1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
926 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
927
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
928 i += skip;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
929 if (i >= s->num_bands) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
930 av_log(s->avctx, AV_LOG_ERROR,
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
931 "invalid scale factor coding\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
932 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
933 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
934 s->channel[c].scale_factors[i] += (val ^ sign) - sign;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
935 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
936 }
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
937 /** swap buffers */
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
938 s->channel[c].scale_factor_idx = !s->channel[c].scale_factor_idx;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
939 s->channel[c].table_idx = s->table_idx;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
940 s->channel[c].reuse_sf = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
941 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
942
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
943 /** calculate new scale factor maximum */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
944 s->channel[c].max_scale_factor = s->channel[c].scale_factors[0];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
945 for (sf = s->channel[c].scale_factors + 1; sf < sf_end; sf++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
946 s->channel[c].max_scale_factor =
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
947 FFMAX(s->channel[c].max_scale_factor, *sf);
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 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
951 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
952 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
953
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
954 /**
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
955 *@brief Reconstruct the individual channel data.
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
956 *@param s codec context
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
957 */
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
958 static void inverse_channel_transform(WMAProDecodeCtx *s)
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
959 {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
960 int i;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
961
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
962 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
963 if (s->chgroup[i].transform) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
964 float data[WMAPRO_MAX_CHANNELS];
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
965 const int num_channels = s->chgroup[i].num_channels;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
966 float** ch_data = s->chgroup[i].channel_data;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
967 float** ch_end = ch_data + num_channels;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
968 const int8_t* tb = s->chgroup[i].transform_band;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
969 int16_t* sfb;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
970
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
971 /** multichannel decorrelation */
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
972 for (sfb = s->cur_sfb_offsets;
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
973 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
974 int y;
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
975 if (*tb++ == 1) {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
976 /** multiply values with the decorrelation_matrix */
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
977 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
978 const float* mat = s->chgroup[i].decorrelation_matrix;
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
979 const float* data_end = data + num_channels;
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
980 float* data_ptr = data;
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
981 float** ch;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
982
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
983 for (ch = ch_data; ch < ch_end; ch++)
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
984 *data_ptr++ = (*ch)[y];
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
985
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
986 for (ch = ch_data; ch < ch_end; ch++) {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
987 float sum = 0;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
988 data_ptr = data;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
989 while (data_ptr < data_end)
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
990 sum += *data_ptr++ * *mat++;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
991
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
992 (*ch)[y] = sum;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
993 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
994 }
10096
071d6d272a77 merge 2-channel M/S stereo decoding code with the multichannel version
faust3
parents: 10084
diff changeset
995 } else if (s->num_channels == 2) {
10298
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
996 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
997 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
998 ch_data[0] + sfb[0],
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
999 181.0 / 128, len);
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1000 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
1001 ch_data[1] + sfb[0],
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1002 181.0 / 128, len);
10005
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 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
1008
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1009 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1010 *@brief Apply sine window and reconstruct the output buffer.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1011 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1012 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1013 static void wmapro_window(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1014 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1015 int i;
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1016 for (i = 0; i < s->channels_for_cur_subframe; i++) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1017 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1018 float* window;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1019 int winlen = s->channel[c].prev_block_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1020 float* start = s->channel[c].coeffs - (winlen >> 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1021
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1022 if (s->subframe_len < winlen) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1023 start += (winlen - s->subframe_len) >> 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1024 winlen = s->subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1025 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1026
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1027 window = s->windows[av_log2(winlen) - BLOCK_MIN_BITS];
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1028
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1029 winlen >>= 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1030
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1031 s->dsp.vector_fmul_window(start, start, start + winlen,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1032 window, 0, winlen);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1033
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1034 s->channel[c].prev_block_len = s->subframe_len;
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 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1039 *@brief Decode a single subframe (block).
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1040 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1041 *@return 0 on success, < 0 when decoding failed
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1042 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1043 static int decode_subframe(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1044 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1045 int offset = s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1046 int subframe_len = s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1047 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1048 int total_samples = s->samples_per_frame * s->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1049 int transmit_coeffs = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1050 int cur_subwoofer_cutoff;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1051
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1052 s->subframe_offset = get_bits_count(&s->gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1053
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1054 /** reset channel context and find the next block offset and size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1055 == the next block of the channel with the smallest number of
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1056 decoded samples
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1057 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1058 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1059 s->channel[i].grouped = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1060 if (offset > s->channel[i].decoded_samples) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1061 offset = s->channel[i].decoded_samples;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1062 subframe_len =
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1063 s->channel[i].subframe_len[s->channel[i].cur_subframe];
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1067 dprintf(s->avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1068 "processing subframe with offset %i len %i\n", offset, subframe_len);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1069
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1070 /** get a list of all channels that contain the estimated block */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1071 s->channels_for_cur_subframe = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1072 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1073 const int cur_subframe = s->channel[i].cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1074 /** substract already processed samples */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1075 total_samples -= s->channel[i].decoded_samples;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1076
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1077 /** and count if there are multiple subframes that match our profile */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1078 if (offset == s->channel[i].decoded_samples &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1079 subframe_len == s->channel[i].subframe_len[cur_subframe]) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1080 total_samples -= s->channel[i].subframe_len[cur_subframe];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1081 s->channel[i].decoded_samples +=
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1082 s->channel[i].subframe_len[cur_subframe];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1083 s->channel_indexes_for_cur_subframe[s->channels_for_cur_subframe] = i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1084 ++s->channels_for_cur_subframe;
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1088 /** check if the frame will be complete after processing the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1089 estimated block */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1090 if (!total_samples)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1091 s->parsed_all_subframes = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1092
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1093
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1094 dprintf(s->avctx, "subframe is part of %i channels\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1095 s->channels_for_cur_subframe);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1096
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1097 /** calculate number of scale factor bands and their offsets */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1098 s->table_idx = av_log2(s->samples_per_frame/subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1099 s->num_bands = s->num_sfb[s->table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1100 s->cur_sfb_offsets = s->sfb_offsets[s->table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1101 cur_subwoofer_cutoff = s->subwoofer_cutoffs[s->table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1102
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1103 /** configure the decoder for the current subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1104 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1105 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1106
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1107 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
1108 + offset];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1109 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1110
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1111 s->subframe_len = subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1112 s->esc_len = av_log2(s->subframe_len - 1) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1113
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1114 /** skip extended header if any */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1115 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1116 int num_fill_bits;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1117 if (!(num_fill_bits = get_bits(&s->gb, 2))) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1118 int len = get_bits(&s->gb, 4);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1119 num_fill_bits = get_bits(&s->gb, len) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1120 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1121
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1122 if (num_fill_bits >= 0) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1123 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
1124 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
1125 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1126 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1127
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1128 skip_bits_long(&s->gb, num_fill_bits);
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1132 /** no idea for what the following bit is used */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1133 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1134 av_log_ask_for_sample(s->avctx, "reserved bit set\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1135 return AVERROR_INVALIDDATA;
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1139 if (decode_channel_transform(s) < 0)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1140 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1141
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1142
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1143 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1144 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1145 if ((s->channel[c].transmit_coefs = get_bits1(&s->gb)))
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1146 transmit_coeffs = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1147 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1148
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1149 if (transmit_coeffs) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1150 int step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1151 int quant_step = 90 * s->bits_per_sample >> 4;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1152 if ((get_bits1(&s->gb))) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1153 /** FIXME: might change run level mode decision */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1154 av_log_ask_for_sample(s->avctx, "unsupported quant step coding\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1155 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1156 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1157 /** decode quantization step */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1158 step = get_sbits(&s->gb, 6);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1159 quant_step += step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1160 if (step == -32 || step == 31) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1161 const int sign = (step == 31) - 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1162 int quant = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1163 while (get_bits_count(&s->gb) + 5 < s->num_saved_bits &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1164 (step = get_bits(&s->gb, 5)) == 31) {
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1165 quant += 31;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1166 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1167 quant_step += ((quant + step) ^ sign) - sign;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1168 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1169 if (quant_step < 0) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1170 av_log(s->avctx, AV_LOG_DEBUG, "negative quant step\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1171 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1172
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1173 /** decode quantization step modifiers for every channel */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1174
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1175 if (s->channels_for_cur_subframe == 1) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1176 s->channel[s->channel_indexes_for_cur_subframe[0]].quant_step = quant_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1177 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1178 int modifier_len = get_bits(&s->gb, 3);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1179 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1180 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1181 s->channel[c].quant_step = quant_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1182 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1183 if (modifier_len) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1184 s->channel[c].quant_step += get_bits(&s->gb, modifier_len) + 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1185 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1186 ++s->channel[c].quant_step;
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1191 /** decode scale factors */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1192 if (decode_scale_factors(s) < 0)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1193 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1194 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1195
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1196 dprintf(s->avctx, "BITSTREAM: subframe header length was %i\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1197 get_bits_count(&s->gb) - s->subframe_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1198
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1199 /** parse coefficients */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1200 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1201 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1202 if (s->channel[c].transmit_coefs &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1203 get_bits_count(&s->gb) < s->num_saved_bits) {
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1204 decode_coeffs(s, c);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1205 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1206 memset(s->channel[c].coeffs, 0,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1207 sizeof(*s->channel[c].coeffs) * subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1208 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1209
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1210 dprintf(s->avctx, "BITSTREAM: subframe length was %i\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1211 get_bits_count(&s->gb) - s->subframe_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1212
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1213 if (transmit_coeffs) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1214 /** reconstruct the per channel data */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1215 inverse_channel_transform(s);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1216 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1217 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1218 const int* sf = s->channel[c].scale_factors;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1219 int b;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1220
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1221 if (c == s->lfe_channel)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1222 memset(&s->tmp[cur_subwoofer_cutoff], 0, sizeof(*s->tmp) *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1223 (subframe_len - cur_subwoofer_cutoff));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1224
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1225 /** inverse quantization and rescaling */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1226 for (b = 0; b < s->num_bands; b++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1227 const int end = FFMIN(s->cur_sfb_offsets[b+1], s->subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1228 const int exp = s->channel[c].quant_step -
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1229 (s->channel[c].max_scale_factor - *sf++) *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1230 s->channel[c].scale_factor_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1231 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
1232 int start = s->cur_sfb_offsets[b];
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1233 s->dsp.vector_fmul_scalar(s->tmp + start,
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1234 s->channel[c].coeffs + start,
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1235 quant, end - start);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1236 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1237
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1238 /** apply imdct (ff_imdct_half == DCTIV with reverse) */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1239 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
1240 s->channel[c].coeffs, s->tmp);
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1244 /** window and overlapp-add */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1245 wmapro_window(s);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1246
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1247 /** handled one subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1248 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1249 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1250 if (s->channel[c].cur_subframe >= s->channel[c].num_subframes) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1251 av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1252 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1253 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1254 ++s->channel[c].cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1255 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1256
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1257 return 0;
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 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1261 *@brief Decode one WMA frame.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1262 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1263 *@return 0 if the trailer bit indicates that this is the last frame,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1264 * 1 if there are additional frames
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1265 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1266 static int decode_frame(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1267 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1268 GetBitContext* gb = &s->gb;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1269 int more_frames = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1270 int len = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1271 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1272
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1273 /** check for potential output buffer overflow */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1274 if (s->num_channels * s->samples_per_frame > s->samples_end - s->samples) {
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1275 /** 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
1276 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
1277 "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
1278 s->packet_loss = 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1279 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1280 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1281
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1282 /** get frame length */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1283 if (s->len_prefix)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1284 len = get_bits(gb, s->log2_frame_size);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1285
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1286 dprintf(s->avctx, "decoding frame with length %x\n", len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1287
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1288 /** decode tile information */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1289 if (decode_tilehdr(s)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1290 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1291 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1292 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1293
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1294 /** read postproc transform */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1295 if (s->num_channels > 1 && get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1296 av_log_ask_for_sample(s->avctx, "Unsupported postproc transform found\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1297 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1298 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1299 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1300
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1301 /** read drc info */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1302 if (s->dynamic_range_compression) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1303 s->drc_gain = get_bits(gb, 8);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1304 dprintf(s->avctx, "drc_gain %i\n", s->drc_gain);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1305 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1306
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1307 /** no idea what these are for, might be the number of samples
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1308 that need to be skipped at the beginning or end of a stream */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1309 if (get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1310 int skip;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1311
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1312 /** usually true for the first frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1313 if (get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1314 skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1315 dprintf(s->avctx, "start skip: %i\n", skip);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1316 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1317
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1318 /** sometimes true for the last frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1319 if (get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1320 skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1321 dprintf(s->avctx, "end skip: %i\n", skip);
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1326 dprintf(s->avctx, "BITSTREAM: frame header length was %i\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1327 get_bits_count(gb) - s->frame_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1328
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1329 /** reset subframe states */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1330 s->parsed_all_subframes = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1331 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1332 s->channel[i].decoded_samples = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1333 s->channel[i].cur_subframe = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1334 s->channel[i].reuse_sf = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1335 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1336
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1337 /** decode all subframes */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1338 while (!s->parsed_all_subframes) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1339 if (decode_subframe(s) < 0) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1340 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1341 return 0;
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1345 /** interleave samples and write them to the output buffer */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1346 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1347 float* ptr;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1348 int incr = s->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1349 float* iptr = s->channel[i].out;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1350 int x;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1351
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1352 ptr = s->samples + i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1353
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1354 for (x = 0; x < s->samples_per_frame; x++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1355 *ptr = av_clipf(*iptr++, -1.0, 32767.0 / 32768.0);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1356 ptr += incr;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1357 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1358
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1359 /** reuse second half of the IMDCT output for the next frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1360 memcpy(&s->channel[i].out[0],
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1361 &s->channel[i].out[s->samples_per_frame],
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1362 s->samples_per_frame * sizeof(*s->channel[i].out) >> 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1363 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1364
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1365 if (s->skip_frame) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1366 s->skip_frame = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1367 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1368 s->samples += s->num_channels * s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1369
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1370 if (len != (get_bits_count(gb) - s->frame_offset) + 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1371 /** FIXME: not sure if this is always an error */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1372 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
1373 s->frame_num, len - (get_bits_count(gb) - s->frame_offset) - 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1374 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1375 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1376 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1377
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1378 /** skip the rest of the frame data */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1379 skip_bits_long(gb, len - (get_bits_count(gb) - s->frame_offset) - 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1380
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1381 /** decode trailer bit */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1382 more_frames = get_bits1(gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1383
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1384 ++s->frame_num;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1385 return more_frames;
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 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1389 *@brief Calculate remaining input buffer length.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1390 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1391 *@param gb bitstream reader context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1392 *@return remaining size in bits
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1393 */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1394 static int remaining_bits(WMAProDecodeCtx *s, GetBitContext *gb)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1395 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1396 return s->buf_bit_size - get_bits_count(gb);
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 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1400 *@brief Fill the bit reservoir with a (partial) frame.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1401 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1402 *@param gb bitstream reader context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1403 *@param len length of the partial frame
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1404 *@param append decides wether to reset the buffer or not
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1405 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1406 static void save_bits(WMAProDecodeCtx *s, GetBitContext* gb, int len,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1407 int append)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1408 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1409 int buflen;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1410
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1411 /** when the frame data does not need to be concatenated, the input buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1412 is resetted and additional bits from the previous frame are copyed
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1413 and skipped later so that a fast byte copy is possible */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1414
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1415 if (!append) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1416 s->frame_offset = get_bits_count(gb) & 7;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1417 s->num_saved_bits = s->frame_offset;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1418 init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1419 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1420
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1421 buflen = (s->num_saved_bits + len + 8) >> 3;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1422
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1423 if (len <= 0 || buflen > MAX_FRAMESIZE) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1424 av_log_ask_for_sample(s->avctx, "input buffer too small\n");
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1425 s->packet_loss = 1;
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1426 return;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1427 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1428
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1429 s->num_saved_bits += len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1430 if (!append) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1431 ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1432 s->num_saved_bits);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1433 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1434 int align = 8 - (get_bits_count(gb) & 7);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1435 align = FFMIN(align, len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1436 put_bits(&s->pb, align, get_bits(gb, align));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1437 len -= align;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1438 ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1439 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1440 skip_bits_long(gb, len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1441
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1442 {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1443 PutBitContext tmp = s->pb;
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1444 flush_put_bits(&tmp);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1445 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1446
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1447 init_get_bits(&s->gb, s->frame_data, s->num_saved_bits);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1448 skip_bits(&s->gb, s->frame_offset);
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 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1452 *@brief Decode a single WMA packet.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1453 *@param avctx codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1454 *@param data the output buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1455 *@param data_size number of bytes that were written to the output buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1456 *@param avpkt input packet
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1457 *@return number of bytes that were read from the input buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1458 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1459 static int decode_packet(AVCodecContext *avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1460 void *data, int *data_size, AVPacket* avpkt)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1461 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1462 WMAProDecodeCtx *s = avctx->priv_data;
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1463 GetBitContext* gb = &s->pgb;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1464 const uint8_t* buf = avpkt->data;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1465 int buf_size = avpkt->size;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1466 int num_bits_prev_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1467 int packet_sequence_number;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1468
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1469 s->samples = data;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1470 s->samples_end = (float*)((int8_t*)data + *data_size);
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1471 *data_size = 0;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1472
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1473 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
1474 s->packet_done = 0;
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1475 s->buf_bit_size = buf_size << 3;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1476
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1477 /** sanity check for the buffer length */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1478 if (buf_size < avctx->block_align)
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1479 return 0;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1480
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1481 buf_size = avctx->block_align;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1482
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1483 /** parse packet header */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1484 init_get_bits(gb, buf, s->buf_bit_size);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1485 packet_sequence_number = get_bits(gb, 4);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1486 skip_bits(gb, 2);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1487
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1488 /** get number of bits that need to be added to the previous frame */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1489 num_bits_prev_frame = get_bits(gb, s->log2_frame_size);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1490 dprintf(avctx, "packet[%d]: nbpf %x\n", avctx->frame_number,
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1491 num_bits_prev_frame);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1492
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1493 /** check for packet loss */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1494 if (!s->packet_loss &&
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1495 ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) {
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1496 s->packet_loss = 1;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1497 av_log(avctx, AV_LOG_ERROR, "Packet loss detected! seq %x vs %x\n",
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1498 s->packet_sequence_number, packet_sequence_number);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1499 }
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1500 s->packet_sequence_number = packet_sequence_number;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1501
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1502 if (num_bits_prev_frame > 0) {
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1503 /** append the previous frame data to the remaining data from the
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1504 previous packet to create a full frame */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1505 save_bits(s, gb, num_bits_prev_frame, 1);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1506 dprintf(avctx, "accumulated %x bits of frame data\n",
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1507 s->num_saved_bits - s->frame_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1508
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1509 /** decode the cross packet frame if it is valid */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1510 if (!s->packet_loss)
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1511 decode_frame(s);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1512 } else if (s->num_saved_bits - s->frame_offset) {
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1513 dprintf(avctx, "ignoring %x previously saved bits\n",
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1514 s->num_saved_bits - s->frame_offset);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1515 }
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1516
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1517 s->packet_loss = 0;
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1518
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1519 } else {
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1520 int frame_size;
10165
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1521 s->buf_bit_size = avpkt->size << 3;
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1522 init_get_bits(gb, avpkt->data, s->buf_bit_size);
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1523 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
1524 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
1525 (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
1526 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
1527 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
1528 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
1529 } else
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1530 s->packet_done = 1;
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1531 }
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1532
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1533 if (s->packet_done && !s->packet_loss &&
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1534 remaining_bits(s, gb) > 0) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1535 /** save the rest of the data so that it can be decoded
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1536 with the next packet */
10126
6ff9347c8042 store packet GetBitContext in the decoder context
faust3
parents: 10123
diff changeset
1537 save_bits(s, gb, remaining_bits(s, gb), 0);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1538 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1539
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1540 *data_size = (int8_t *)s->samples - (int8_t *)data;
10165
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1541 s->packet_offset = get_bits_count(gb) & 7;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1542
10352
8eb51d3eccdf return AVERROR_INVALIDDATA when the bitstream could not be decoded
faust3
parents: 10314
diff changeset
1543 return (s->packet_loss) ? AVERROR_INVALIDDATA : get_bits_count(gb) >> 3;
10122
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 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1547 *@brief Clear decoder buffers (for seeking).
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1548 *@param avctx codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1549 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1550 static void flush(AVCodecContext *avctx)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1551 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1552 WMAProDecodeCtx *s = avctx->priv_data;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1553 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1554 /** 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
1555 new frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1556 for (i = 0; i < s->num_channels; i++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1557 memset(s->channel[i].out, 0, s->samples_per_frame *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1558 sizeof(*s->channel[i].out));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1559 s->packet_loss = 1;
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 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1564 *@brief wmapro decoder
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1565 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1566 AVCodec wmapro_decoder = {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1567 "wmapro",
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1568 CODEC_TYPE_AUDIO,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1569 CODEC_ID_WMAPRO,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1570 sizeof(WMAProDecodeCtx),
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1571 decode_init,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1572 NULL,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1573 decode_end,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1574 decode_packet,
10180
a514a601bf26 Add CODEC_CAP_SUBFRAMES for codecs that output multiple subframes
faust3
parents: 10174
diff changeset
1575 .capabilities = CODEC_CAP_SUBFRAMES,
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1576 .flush= flush,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1577 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 9 Professional"),
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1578 };