annotate wmaprodec.c @ 10300:4d1b9ca628fc libavcodec

Drop unused args from vector_fmul_add_add, simpify code, and rename The src3 and step arguments to vector_fmul_add_add() are always zero and one, respectively. This removes these arguments from the function, simplifies the code accordingly, and renames the function to better match the new operation.
author mru
date Sun, 27 Sep 2009 16:51:54 +0000
parents 9699e4499f2d
children ab687351bfef
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
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
101 #define MAX_FRAMESIZE 16384 ///< maximum compressed frame size
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 {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
765 int vlctable;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
766 VLC* vlc;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
767 WMAProChannelCtx* ci = &s->channel[c];
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
768 int rl_mode = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
769 int cur_coeff = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
770 int num_zeros = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
771 const uint16_t* run;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
772 const uint16_t* level;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
773
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
774 dprintf(s->avctx, "decode coefficients for channel %i\n", c);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
775
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
776 vlctable = get_bits1(&s->gb);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
777 vlc = &coef_vlc[vlctable];
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
778
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
779 if (vlctable) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
780 run = coef1_run;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
781 level = coef1_level;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
782 } else {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
783 run = coef0_run;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
784 level = coef0_level;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
785 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
786
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
787 /** decode vector coefficients (consumes up to 167 bits per iteration for
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
788 4 vector coded large values) */
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
789 while (!rl_mode && cur_coeff + 3 < s->subframe_len) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
790 int vals[4];
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
791 int i;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
792 unsigned int idx;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
793
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
794 idx = get_vlc2(&s->gb, vec4_vlc.table, VLCBITS, VEC4MAXDEPTH);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
795
10101
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
796 if (idx == HUFF_VEC4_SIZE - 1) {
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
797 for (i = 0; i < 4; i += 2) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
798 idx = get_vlc2(&s->gb, vec2_vlc.table, VLCBITS, VEC2MAXDEPTH);
10101
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
799 if (idx == HUFF_VEC2_SIZE - 1) {
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
800 vals[i] = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
801 if (vals[i] == HUFF_VEC1_SIZE - 1)
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
802 vals[i] += ff_wma_get_large_val(&s->gb);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
803 vals[i+1] = get_vlc2(&s->gb, vec1_vlc.table, VLCBITS, VEC1MAXDEPTH);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
804 if (vals[i+1] == HUFF_VEC1_SIZE - 1)
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
805 vals[i+1] += ff_wma_get_large_val(&s->gb);
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
806 } else {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
807 vals[i] = symbol_to_vec2[idx] >> 4;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
808 vals[i+1] = symbol_to_vec2[idx] & 0xF;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
809 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
810 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
811 } else {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
812 vals[0] = symbol_to_vec4[idx] >> 12;
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
813 vals[1] = (symbol_to_vec4[idx] >> 8) & 0xF;
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
814 vals[2] = (symbol_to_vec4[idx] >> 4) & 0xF;
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
815 vals[3] = symbol_to_vec4[idx] & 0xF;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
816 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
817
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
818 /** decode sign */
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
819 for (i = 0; i < 4; i++) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
820 if (vals[i]) {
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
821 int sign = get_bits1(&s->gb) - 1;
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
822 ci->coeffs[cur_coeff] = (vals[i] ^ sign) - sign;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
823 num_zeros = 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
824 } else {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
825 ci->coeffs[cur_coeff] = 0;
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
826 /** switch to run level mode when subframe_len / 128 zeros
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
827 were found in a row */
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
828 rl_mode |= (++num_zeros > s->subframe_len >> 8);
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
829 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
830 ++cur_coeff;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
831 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
832 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
833
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
834 /** decode run level coded coefficients */
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
835 if (rl_mode) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
836 memset(&ci->coeffs[cur_coeff], 0,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
837 sizeof(*ci->coeffs) * (s->subframe_len - cur_coeff));
10101
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
838 if (ff_wma_run_level_decode(s->avctx, &s->gb, vlc,
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
839 level, run, 1, ci->coeffs,
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
840 cur_coeff, s->subframe_len,
254f8c7d5e4d whitespace cosmetics
diego
parents: 10097
diff changeset
841 s->subframe_len, s->esc_len, 0))
10097
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
842 return AVERROR_INVALIDDATA;
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 return 0;
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
846 }
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
847
9b608d9428ae add decode_coeffs()
faust3
parents: 10096
diff changeset
848 /**
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
849 *@brief Extract scale factors from the bitstream.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
850 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
851 *@return 0 on success, < 0 in case of bitstream errors
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
852 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
853 static int decode_scale_factors(WMAProDecodeCtx* s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
854 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
855 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
856
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
857 /** should never consume more than 5344 bits
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
858 * MAX_CHANNELS * (1 + MAX_BANDS * 23)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
859 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
860
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
861 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
862 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
863 int* sf;
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
864 int* sf_end;
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
865 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
866 sf_end = s->channel[c].scale_factors + s->num_bands;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
867
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
868 /** resample scale factors for the new block size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
869 * as the scale factors might need to be resampled several times
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
870 * before some new values are transmitted, a backup of the last
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
871 * transmitted scale factors is kept in saved_scale_factors
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
872 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
873 if (s->channel[c].reuse_sf) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
874 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
875 int b;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
876 for (b = 0; b < s->num_bands; b++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
877 s->channel[c].scale_factors[b] =
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
878 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
879 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
880
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
881 if (!s->channel[c].cur_subframe || get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
882
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
883 if (!s->channel[c].reuse_sf) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
884 int val;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
885 /** decode DPCM coded scale factors */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
886 s->channel[c].scale_factor_step = get_bits(&s->gb, 2) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
887 val = 45 / s->channel[c].scale_factor_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
888 for (sf = s->channel[c].scale_factors; sf < sf_end; sf++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
889 val += get_vlc2(&s->gb, sf_vlc.table, SCALEVLCBITS, SCALEMAXDEPTH) - 60;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
890 *sf = val;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
891 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
892 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
893 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
894 /** run level decode differences to the resampled factors */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
895 for (i = 0; i < s->num_bands; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
896 int idx;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
897 int skip;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
898 int val;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
899 int sign;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
900
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
901 idx = get_vlc2(&s->gb, sf_rl_vlc.table, VLCBITS, SCALERLMAXDEPTH);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
902
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
903 if (!idx) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
904 uint32_t code = get_bits(&s->gb, 14);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
905 val = code >> 6;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
906 sign = (code & 1) - 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
907 skip = (code & 0x3f) >> 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
908 } else if (idx == 1) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
909 break;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
910 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
911 skip = scale_rl_run[idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
912 val = scale_rl_level[idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
913 sign = get_bits1(&s->gb)-1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
914 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
915
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
916 i += skip;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
917 if (i >= s->num_bands) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
918 av_log(s->avctx, AV_LOG_ERROR,
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
919 "invalid scale factor coding\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
920 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
921 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
922 s->channel[c].scale_factors[i] += (val ^ sign) - sign;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
923 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
924 }
10138
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
925 /** swap buffers */
a3e378408d5c avoid extra memcpy during scale factor decoding
faust3
parents: 10130
diff changeset
926 s->channel[c].scale_factor_idx = !s->channel[c].scale_factor_idx;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
927 s->channel[c].table_idx = s->table_idx;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
928 s->channel[c].reuse_sf = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
929 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
930
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
931 /** calculate new scale factor maximum */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
932 s->channel[c].max_scale_factor = s->channel[c].scale_factors[0];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
933 for (sf = s->channel[c].scale_factors + 1; sf < sf_end; sf++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
934 s->channel[c].max_scale_factor =
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
935 FFMAX(s->channel[c].max_scale_factor, *sf);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
936 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
937
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
938 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
939 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
940 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
941
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
942 /**
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
943 *@brief Reconstruct the individual channel data.
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
944 *@param s codec context
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
945 */
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
946 static void inverse_channel_transform(WMAProDecodeCtx *s)
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
947 {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
948 int i;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
949
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
950 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
951 if (s->chgroup[i].transform) {
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
952 float data[WMAPRO_MAX_CHANNELS];
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
953 const int num_channels = s->chgroup[i].num_channels;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
954 float** ch_data = s->chgroup[i].channel_data;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
955 float** ch_end = ch_data + num_channels;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
956 const int8_t* tb = s->chgroup[i].transform_band;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
957 int16_t* sfb;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
958
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
959 /** multichannel decorrelation */
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
960 for (sfb = s->cur_sfb_offsets;
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
961 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
962 int y;
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
963 if (*tb++ == 1) {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
964 /** multiply values with the decorrelation_matrix */
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
965 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
966 const float* mat = s->chgroup[i].decorrelation_matrix;
10006
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
967 const float* data_end = data + num_channels;
4b91b74ff669 cosmetics: K&R coding style, prettyprinting
diego
parents: 10005
diff changeset
968 float* data_ptr = data;
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
969 float** ch;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
970
10084
bf63f070fbf7 whitespace cosmetics
diego
parents: 10073
diff changeset
971 for (ch = ch_data; ch < ch_end; ch++)
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
972 *data_ptr++ = (*ch)[y];
10005
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
973
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
974 for (ch = ch_data; ch < ch_end; ch++) {
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
975 float sum = 0;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
976 data_ptr = data;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
977 while (data_ptr < data_end)
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
978 sum += *data_ptr++ * *mat++;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
979
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
980 (*ch)[y] = sum;
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
981 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
982 }
10096
071d6d272a77 merge 2-channel M/S stereo decoding code with the multichannel version
faust3
parents: 10084
diff changeset
983 } else if (s->num_channels == 2) {
10298
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
984 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
985 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
986 ch_data[0] + sfb[0],
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
987 181.0 / 128, len);
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
988 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
989 ch_data[1] + sfb[0],
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
990 181.0 / 128, len);
10005
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 }
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 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
995 }
ca678269fa64 add approved hunks of the wmapro decoder
faust3
parents:
diff changeset
996
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
997 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
998 *@brief Apply sine window and reconstruct the output buffer.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
999 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1000 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1001 static void wmapro_window(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1002 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1003 int i;
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1004 for (i = 0; i < s->channels_for_cur_subframe; i++) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1005 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1006 float* window;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1007 int winlen = s->channel[c].prev_block_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1008 float* start = s->channel[c].coeffs - (winlen >> 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1009
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1010 if (s->subframe_len < winlen) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1011 start += (winlen - s->subframe_len) >> 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1012 winlen = s->subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1013 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1014
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1015 window = s->windows[av_log2(winlen) - BLOCK_MIN_BITS];
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1016
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1017 winlen >>= 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1018
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1019 s->dsp.vector_fmul_window(start, start, start + winlen,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1020 window, 0, winlen);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1021
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1022 s->channel[c].prev_block_len = s->subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1023 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1024 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1025
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1026 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1027 *@brief Decode a single subframe (block).
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1028 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1029 *@return 0 on success, < 0 when decoding failed
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1030 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1031 static int decode_subframe(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1032 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1033 int offset = s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1034 int subframe_len = s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1035 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1036 int total_samples = s->samples_per_frame * s->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1037 int transmit_coeffs = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1038 int cur_subwoofer_cutoff;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1039
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1040 s->subframe_offset = get_bits_count(&s->gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1041
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1042 /** reset channel context and find the next block offset and size
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1043 == the next block of the channel with the smallest number of
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1044 decoded samples
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1045 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1046 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1047 s->channel[i].grouped = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1048 if (offset > s->channel[i].decoded_samples) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1049 offset = s->channel[i].decoded_samples;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1050 subframe_len =
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1051 s->channel[i].subframe_len[s->channel[i].cur_subframe];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1052 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1053 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1054
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1055 dprintf(s->avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1056 "processing subframe with offset %i len %i\n", offset, subframe_len);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1057
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1058 /** get a list of all channels that contain the estimated block */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1059 s->channels_for_cur_subframe = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1060 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1061 const int cur_subframe = s->channel[i].cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1062 /** substract already processed samples */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1063 total_samples -= s->channel[i].decoded_samples;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1064
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1065 /** and count if there are multiple subframes that match our profile */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1066 if (offset == s->channel[i].decoded_samples &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1067 subframe_len == s->channel[i].subframe_len[cur_subframe]) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1068 total_samples -= s->channel[i].subframe_len[cur_subframe];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1069 s->channel[i].decoded_samples +=
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1070 s->channel[i].subframe_len[cur_subframe];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1071 s->channel_indexes_for_cur_subframe[s->channels_for_cur_subframe] = i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1072 ++s->channels_for_cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1073 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1074 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1075
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1076 /** check if the frame will be complete after processing the
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1077 estimated block */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1078 if (!total_samples)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1079 s->parsed_all_subframes = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1080
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1081
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1082 dprintf(s->avctx, "subframe is part of %i channels\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1083 s->channels_for_cur_subframe);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1084
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1085 /** calculate number of scale factor bands and their offsets */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1086 s->table_idx = av_log2(s->samples_per_frame/subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1087 s->num_bands = s->num_sfb[s->table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1088 s->cur_sfb_offsets = s->sfb_offsets[s->table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1089 cur_subwoofer_cutoff = s->subwoofer_cutoffs[s->table_idx];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1090
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1091 /** configure the decoder for the current subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1092 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1093 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1094
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1095 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
1096 + offset];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1097 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1098
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1099 s->subframe_len = subframe_len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1100 s->esc_len = av_log2(s->subframe_len - 1) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1101
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1102 /** skip extended header if any */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1103 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1104 int num_fill_bits;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1105 if (!(num_fill_bits = get_bits(&s->gb, 2))) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1106 int len = get_bits(&s->gb, 4);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1107 num_fill_bits = get_bits(&s->gb, len) + 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1108 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1109
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1110 if (num_fill_bits >= 0) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1111 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
1112 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
1113 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1114 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1115
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1116 skip_bits_long(&s->gb, num_fill_bits);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1117 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1118 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1119
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1120 /** no idea for what the following bit is used */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1121 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1122 av_log_ask_for_sample(s->avctx, "reserved bit set\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1123 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1124 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1125
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1126
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1127 if (decode_channel_transform(s) < 0)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1128 return AVERROR_INVALIDDATA;
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 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1132 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1133 if ((s->channel[c].transmit_coefs = get_bits1(&s->gb)))
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1134 transmit_coeffs = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1135 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1136
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1137 if (transmit_coeffs) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1138 int step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1139 int quant_step = 90 * s->bits_per_sample >> 4;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1140 if ((get_bits1(&s->gb))) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1141 /** FIXME: might change run level mode decision */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1142 av_log_ask_for_sample(s->avctx, "unsupported quant step coding\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1143 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1144 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1145 /** decode quantization step */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1146 step = get_sbits(&s->gb, 6);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1147 quant_step += step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1148 if (step == -32 || step == 31) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1149 const int sign = (step == 31) - 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1150 int quant = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1151 while (get_bits_count(&s->gb) + 5 < s->num_saved_bits &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1152 (step = get_bits(&s->gb, 5)) == 31) {
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1153 quant += 31;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1154 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1155 quant_step += ((quant + step) ^ sign) - sign;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1156 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1157 if (quant_step < 0) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1158 av_log(s->avctx, AV_LOG_DEBUG, "negative quant step\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1159 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1160
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1161 /** decode quantization step modifiers for every channel */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1162
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1163 if (s->channels_for_cur_subframe == 1) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1164 s->channel[s->channel_indexes_for_cur_subframe[0]].quant_step = quant_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1165 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1166 int modifier_len = get_bits(&s->gb, 3);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1167 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1168 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1169 s->channel[c].quant_step = quant_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1170 if (get_bits1(&s->gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1171 if (modifier_len) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1172 s->channel[c].quant_step += get_bits(&s->gb, modifier_len) + 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1173 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1174 ++s->channel[c].quant_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1175 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1176 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1177 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1178
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1179 /** decode scale factors */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1180 if (decode_scale_factors(s) < 0)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1181 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1182 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1183
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1184 dprintf(s->avctx, "BITSTREAM: subframe header length was %i\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1185 get_bits_count(&s->gb) - s->subframe_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1186
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1187 /** parse coefficients */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1188 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1189 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1190 if (s->channel[c].transmit_coefs &&
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1191 get_bits_count(&s->gb) < s->num_saved_bits) {
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1192 decode_coeffs(s, c);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1193 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1194 memset(s->channel[c].coeffs, 0,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1195 sizeof(*s->channel[c].coeffs) * subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1196 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1197
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1198 dprintf(s->avctx, "BITSTREAM: subframe length was %i\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1199 get_bits_count(&s->gb) - s->subframe_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1200
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1201 if (transmit_coeffs) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1202 /** reconstruct the per channel data */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1203 inverse_channel_transform(s);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1204 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1205 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1206 const int* sf = s->channel[c].scale_factors;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1207 int b;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1208
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1209 if (c == s->lfe_channel)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1210 memset(&s->tmp[cur_subwoofer_cutoff], 0, sizeof(*s->tmp) *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1211 (subframe_len - cur_subwoofer_cutoff));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1212
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1213 /** inverse quantization and rescaling */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1214 for (b = 0; b < s->num_bands; b++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1215 const int end = FFMIN(s->cur_sfb_offsets[b+1], s->subframe_len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1216 const int exp = s->channel[c].quant_step -
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1217 (s->channel[c].max_scale_factor - *sf++) *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1218 s->channel[c].scale_factor_step;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1219 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
1220 int start = s->cur_sfb_offsets[b];
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1221 s->dsp.vector_fmul_scalar(s->tmp + start,
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1222 s->channel[c].coeffs + start,
9699e4499f2d WMAPRO: use vector_fmul_scalar from dsputil where possible
mru
parents: 10199
diff changeset
1223 quant, end - start);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1224 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1225
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1226 /** apply imdct (ff_imdct_half == DCTIV with reverse) */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1227 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
1228 s->channel[c].coeffs, s->tmp);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1229 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1230 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1231
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1232 /** window and overlapp-add */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1233 wmapro_window(s);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1234
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1235 /** handled one subframe */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1236 for (i = 0; i < s->channels_for_cur_subframe; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1237 int c = s->channel_indexes_for_cur_subframe[i];
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1238 if (s->channel[c].cur_subframe >= s->channel[c].num_subframes) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1239 av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n");
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1240 return AVERROR_INVALIDDATA;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1241 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1242 ++s->channel[c].cur_subframe;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1243 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1244
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1245 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1246 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1247
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1248 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1249 *@brief Decode one WMA frame.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1250 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1251 *@return 0 if the trailer bit indicates that this is the last frame,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1252 * 1 if there are additional frames
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1253 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1254 static int decode_frame(WMAProDecodeCtx *s)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1255 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1256 GetBitContext* gb = &s->gb;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1257 int more_frames = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1258 int len = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1259 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1260
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1261 /** check for potential output buffer overflow */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1262 if (s->num_channels * s->samples_per_frame > s->samples_end - s->samples) {
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1263 /** 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
1264 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
1265 "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
1266 s->packet_loss = 1;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1267 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1268 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1269
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1270 /** get frame length */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1271 if (s->len_prefix)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1272 len = get_bits(gb, s->log2_frame_size);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1273
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1274 dprintf(s->avctx, "decoding frame with length %x\n", len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1275
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1276 /** decode tile information */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1277 if (decode_tilehdr(s)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1278 s->packet_loss = 1;
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 /** read postproc transform */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1283 if (s->num_channels > 1 && get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1284 av_log_ask_for_sample(s->avctx, "Unsupported postproc transform found\n");
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1285 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1286 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1287 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1288
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1289 /** read drc info */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1290 if (s->dynamic_range_compression) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1291 s->drc_gain = get_bits(gb, 8);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1292 dprintf(s->avctx, "drc_gain %i\n", s->drc_gain);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1293 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1294
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1295 /** no idea what these are for, might be the number of samples
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1296 that need to be skipped at the beginning or end of a stream */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1297 if (get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1298 int skip;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1299
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1300 /** usually true for the first frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1301 if (get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1302 skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1303 dprintf(s->avctx, "start skip: %i\n", skip);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1304 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1305
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1306 /** sometimes true for the last frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1307 if (get_bits1(gb)) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1308 skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1309 dprintf(s->avctx, "end skip: %i\n", skip);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1310 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1311
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1312 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1313
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1314 dprintf(s->avctx, "BITSTREAM: frame header length was %i\n",
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1315 get_bits_count(gb) - s->frame_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1316
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1317 /** reset subframe states */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1318 s->parsed_all_subframes = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1319 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1320 s->channel[i].decoded_samples = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1321 s->channel[i].cur_subframe = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1322 s->channel[i].reuse_sf = 0;
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 /** decode all subframes */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1326 while (!s->parsed_all_subframes) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1327 if (decode_subframe(s) < 0) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1328 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1329 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1330 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1331 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1332
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1333 /** interleave samples and write them to the output buffer */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1334 for (i = 0; i < s->num_channels; i++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1335 float* ptr;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1336 int incr = s->num_channels;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1337 float* iptr = s->channel[i].out;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1338 int x;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1339
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1340 ptr = s->samples + i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1341
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1342 for (x = 0; x < s->samples_per_frame; x++) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1343 *ptr = av_clipf(*iptr++, -1.0, 32767.0 / 32768.0);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1344 ptr += incr;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1345 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1346
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1347 /** reuse second half of the IMDCT output for the next frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1348 memcpy(&s->channel[i].out[0],
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1349 &s->channel[i].out[s->samples_per_frame],
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1350 s->samples_per_frame * sizeof(*s->channel[i].out) >> 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1351 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1352
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1353 if (s->skip_frame) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1354 s->skip_frame = 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1355 } else
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1356 s->samples += s->num_channels * s->samples_per_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1357
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1358 if (len != (get_bits_count(gb) - s->frame_offset) + 2) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1359 /** FIXME: not sure if this is always an error */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1360 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
1361 s->frame_num, len - (get_bits_count(gb) - s->frame_offset) - 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1362 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1363 return 0;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1364 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1365
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1366 /** skip the rest of the frame data */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1367 skip_bits_long(gb, len - (get_bits_count(gb) - s->frame_offset) - 1);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1368
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1369 /** decode trailer bit */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1370 more_frames = get_bits1(gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1371
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1372 ++s->frame_num;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1373 return more_frames;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1374 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1375
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1376 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1377 *@brief Calculate remaining input buffer length.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1378 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1379 *@param gb bitstream reader context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1380 *@return remaining size in bits
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1381 */
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1382 static int remaining_bits(WMAProDecodeCtx *s, GetBitContext *gb)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1383 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1384 return s->buf_bit_size - get_bits_count(gb);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1385 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1386
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1387 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1388 *@brief Fill the bit reservoir with a (partial) frame.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1389 *@param s codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1390 *@param gb bitstream reader context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1391 *@param len length of the partial frame
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1392 *@param append decides wether to reset the buffer or not
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1393 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1394 static void save_bits(WMAProDecodeCtx *s, GetBitContext* gb, int len,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1395 int append)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1396 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1397 int buflen;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1398
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1399 /** when the frame data does not need to be concatenated, the input buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1400 is resetted and additional bits from the previous frame are copyed
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1401 and skipped later so that a fast byte copy is possible */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1402
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1403 if (!append) {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1404 s->frame_offset = get_bits_count(gb) & 7;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1405 s->num_saved_bits = s->frame_offset;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1406 init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1407 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1408
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1409 buflen = (s->num_saved_bits + len + 8) >> 3;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1410
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1411 if (len <= 0 || buflen > MAX_FRAMESIZE) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1412 av_log_ask_for_sample(s->avctx, "input buffer too small\n");
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1413 s->packet_loss = 1;
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1414 return;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1415 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1416
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1417 s->num_saved_bits += len;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1418 if (!append) {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1419 ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1420 s->num_saved_bits);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1421 } else {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1422 int align = 8 - (get_bits_count(gb) & 7);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1423 align = FFMIN(align, len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1424 put_bits(&s->pb, align, get_bits(gb, align));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1425 len -= align;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1426 ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1427 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1428 skip_bits_long(gb, len);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1429
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1430 {
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1431 PutBitContext tmp = s->pb;
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1432 flush_put_bits(&tmp);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1433 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1434
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1435 init_get_bits(&s->gb, s->frame_data, s->num_saved_bits);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1436 skip_bits(&s->gb, s->frame_offset);
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1437 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1438
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1439 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1440 *@brief Decode a single WMA packet.
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1441 *@param avctx codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1442 *@param data the output buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1443 *@param data_size number of bytes that were written to the output buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1444 *@param avpkt input packet
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1445 *@return number of bytes that were read from the input buffer
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1446 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1447 static int decode_packet(AVCodecContext *avctx,
10123
e1bd75a1eab2 cosmetics: indentation and other prettyprinting fixes
diego
parents: 10122
diff changeset
1448 void *data, int *data_size, AVPacket* avpkt)
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1449 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1450 WMAProDecodeCtx *s = avctx->priv_data;
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1451 GetBitContext* gb = &s->pgb;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1452 const uint8_t* buf = avpkt->data;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1453 int buf_size = avpkt->size;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1454 int num_bits_prev_frame;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1455 int packet_sequence_number;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1456
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1457 s->samples = data;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1458 s->samples_end = (float*)((int8_t*)data + *data_size);
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1459 *data_size = 0;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1460
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1461 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
1462 s->packet_done = 0;
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1463 s->buf_bit_size = buf_size << 3;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1464
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1465 /** sanity check for the buffer length */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1466 if (buf_size < avctx->block_align)
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1467 return 0;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1468
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1469 buf_size = avctx->block_align;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1470
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1471 /** parse packet header */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1472 init_get_bits(gb, buf, s->buf_bit_size);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1473 packet_sequence_number = get_bits(gb, 4);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1474 skip_bits(gb, 2);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1475
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1476 /** get number of bits that need to be added to the previous frame */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1477 num_bits_prev_frame = get_bits(gb, s->log2_frame_size);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1478 dprintf(avctx, "packet[%d]: nbpf %x\n", avctx->frame_number,
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1479 num_bits_prev_frame);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1480
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1481 /** check for packet loss */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1482 if (!s->packet_loss &&
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1483 ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) {
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1484 s->packet_loss = 1;
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1485 av_log(avctx, AV_LOG_ERROR, "Packet loss detected! seq %x vs %x\n",
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1486 s->packet_sequence_number, packet_sequence_number);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1487 }
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1488 s->packet_sequence_number = packet_sequence_number;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1489
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1490 if (num_bits_prev_frame > 0) {
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1491 /** append the previous frame data to the remaining data from the
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1492 previous packet to create a full frame */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1493 save_bits(s, gb, num_bits_prev_frame, 1);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1494 dprintf(avctx, "accumulated %x bits of frame data\n",
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1495 s->num_saved_bits - s->frame_offset);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1496
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1497 /** decode the cross packet frame if it is valid */
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1498 if (!s->packet_loss)
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1499 decode_frame(s);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1500 } else if (s->num_saved_bits - s->frame_offset) {
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1501 dprintf(avctx, "ignoring %x previously saved bits\n",
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1502 s->num_saved_bits - s->frame_offset);
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1503 }
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1504
10129
0ffe220e1c80 reindent
faust3
parents: 10128
diff changeset
1505 s->packet_loss = 0;
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1506
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1507 } else {
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1508 int frame_size;
10165
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1509 s->buf_bit_size = avpkt->size << 3;
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1510 init_get_bits(gb, avpkt->data, s->buf_bit_size);
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1511 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
1512 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
1513 (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
1514 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
1515 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
1516 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
1517 } else
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1518 s->packet_done = 1;
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1519 }
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1520
10139
de9335d4b6b1 do not decode more than one audio frame in a decode packet call
faust3
parents: 10138
diff changeset
1521 if (s->packet_done && !s->packet_loss &&
10127
b17566dcfcc9 reduce output buffer needs
faust3
parents: 10126
diff changeset
1522 remaining_bits(s, gb) > 0) {
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1523 /** save the rest of the data so that it can be decoded
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1524 with the next packet */
10126
6ff9347c8042 store packet GetBitContext in the decoder context
faust3
parents: 10123
diff changeset
1525 save_bits(s, gb, remaining_bits(s, gb), 0);
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1526 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1527
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1528 *data_size = (int8_t *)s->samples - (int8_t *)data;
10165
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1529 s->packet_offset = get_bits_count(gb) & 7;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1530
10165
b30c708ce76a reinit get_bits for every decode_packet call
faust3
parents: 10139
diff changeset
1531 return get_bits_count(gb) >> 3;
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1532 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1533
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1534 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1535 *@brief Clear decoder buffers (for seeking).
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1536 *@param avctx codec context
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1537 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1538 static void flush(AVCodecContext *avctx)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1539 {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1540 WMAProDecodeCtx *s = avctx->priv_data;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1541 int i;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1542 /** 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
1543 new frame */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1544 for (i = 0; i < s->num_channels; i++)
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1545 memset(s->channel[i].out, 0, s->samples_per_frame *
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1546 sizeof(*s->channel[i].out));
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1547 s->packet_loss = 1;
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1548 }
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1549
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1550
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1551 /**
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1552 *@brief wmapro decoder
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1553 */
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1554 AVCodec wmapro_decoder = {
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1555 "wmapro",
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1556 CODEC_TYPE_AUDIO,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1557 CODEC_ID_WMAPRO,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1558 sizeof(WMAProDecodeCtx),
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1559 decode_init,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1560 NULL,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1561 decode_end,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1562 decode_packet,
10180
a514a601bf26 Add CODEC_CAP_SUBFRAMES for codecs that output multiple subframes
faust3
parents: 10174
diff changeset
1563 .capabilities = CODEC_CAP_SUBFRAMES,
10122
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1564 .flush= flush,
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1565 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 9 Professional"),
fe081db7c09c add missing wmapro decoder parts
faust3
parents: 10101
diff changeset
1566 };