annotate wmaprodec.c @ 12197:fbf4d5b1b664 libavcodec

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