annotate atrac3.c @ 5757:ace63c809071 libavcodec

Remove uses of SIGILL for CPU extension detection, that method is not acceptable in a library. Should not change anything for PPC, the autodetection is currently pointless due to other code being compiled with -maltivec as well (and detection for OSX and AmigaOS remains in place). SPARC binaries built with VIS support can now only run on systems with VIS.
author reimar
date Tue, 02 Oct 2007 18:18:35 +0000
parents c2ab2ac31edb
children d155d4915e1c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1 /*
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
2 * Atrac 3 compatible decoder
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
3 * Copyright (c) 2006-2007 Maxim Poliakovski
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
4 * Copyright (c) 2006-2007 Benjamin Larsson
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
5 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
6 * This file is part of FFmpeg.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
7 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
12 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
16 * Lesser General Public License for more details.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
17 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
21 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
22
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
23 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
24 * @file atrac3.c
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
25 * Atrac 3 compatible decoder.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
26 * This decoder handles RealNetworks, RealAudio atrc data.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
27 * Atrac 3 is identified by the codec name atrc in RealMedia files.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
28 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
29 * To use this decoder, a calling application must supply the extradata
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
30 * bytes provided from the RealMedia container: 10 bytes or 14 bytes
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
31 * from the WAV container.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
32 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
33
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
34 #include <math.h>
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
35 #include <stddef.h>
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
36 #include <stdio.h>
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
37
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
38 #include "avcodec.h"
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
39 #include "bitstream.h"
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
40 #include "dsputil.h"
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
41 #include "bytestream.h"
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
42
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
43 #include "atrac3data.h"
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
44
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
45 #define JOINT_STEREO 0x12
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
46 #define STEREO 0x2
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
47
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
48
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
49 /* These structures are needed to store the parsed gain control data. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
50 typedef struct {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
51 int num_gain_data;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
52 int levcode[8];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
53 int loccode[8];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
54 } gain_info;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
55
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
56 typedef struct {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
57 gain_info gBlock[4];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
58 } gain_block;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
59
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
60 typedef struct {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
61 int pos;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
62 int numCoefs;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
63 float coef[8];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
64 } tonal_component;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
65
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
66 typedef struct {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
67 int bandsCoded;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
68 int numComponents;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
69 tonal_component components[64];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
70 float prevFrame[1024];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
71 int gcBlkSwitch;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
72 gain_block gainBlock[2];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
73
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
74 DECLARE_ALIGNED_16(float, spectrum[1024]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
75 DECLARE_ALIGNED_16(float, IMDCT_buf[1024]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
76
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
77 float delayBuf1[46]; ///<qmf delay buffers
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
78 float delayBuf2[46];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
79 float delayBuf3[46];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
80 } channel_unit;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
81
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
82 typedef struct {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
83 GetBitContext gb;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
84 //@{
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
85 /** stream data */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
86 int channels;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
87 int codingMode;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
88 int bit_rate;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
89 int sample_rate;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
90 int samples_per_channel;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
91 int samples_per_frame;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
92
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
93 int bits_per_frame;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
94 int bytes_per_frame;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
95 int pBs;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
96 channel_unit* pUnits;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
97 //@}
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
98 //@{
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
99 /** joint-stereo related variables */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
100 int matrix_coeff_index_prev[4];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
101 int matrix_coeff_index_now[4];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
102 int matrix_coeff_index_next[4];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
103 int weighting_delay[6];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
104 //@}
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
105 //@{
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
106 /** data buffers */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
107 float outSamples[2048];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
108 uint8_t* decoded_bytes_buffer;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
109 float tempBuf[1070];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
110 DECLARE_ALIGNED_16(float,mdct_tmp[512]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
111 //@}
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
112 //@{
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
113 /** extradata */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
114 int atrac3version;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
115 int delay;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
116 int scrambled_stream;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
117 int frame_factor;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
118 //@}
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
119 } ATRAC3Context;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
120
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
121 static DECLARE_ALIGNED_16(float,mdct_window[512]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
122 static float qmf_window[48];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
123 static VLC spectral_coeff_tab[7];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
124 static float SFTable[64];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
125 static float gain_tab1[16];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
126 static float gain_tab2[31];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
127 static MDCTContext mdct_ctx;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
128 static DSPContext dsp;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
129
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
130
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
131 /* quadrature mirror synthesis filter */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
132
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
133 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
134 * Quadrature mirror synthesis filter.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
135 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
136 * @param inlo lower part of spectrum
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
137 * @param inhi higher part of spectrum
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
138 * @param nIn size of spectrum buffer
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
139 * @param pOut out buffer
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
140 * @param delayBuf delayBuf buffer
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
141 * @param temp temp buffer
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
142 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
143
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
144
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
145 static void iqmf (float *inlo, float *inhi, unsigned int nIn, float *pOut, float *delayBuf, float *temp)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
146 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
147 int i, j;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
148 float *p1, *p3;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
149
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
150 memcpy(temp, delayBuf, 46*sizeof(float));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
151
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
152 p3 = temp + 46;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
153
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
154 /* loop1 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
155 for(i=0; i<nIn; i+=2){
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
156 p3[2*i+0] = inlo[i ] + inhi[i ];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
157 p3[2*i+1] = inlo[i ] - inhi[i ];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
158 p3[2*i+2] = inlo[i+1] + inhi[i+1];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
159 p3[2*i+3] = inlo[i+1] - inhi[i+1];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
160 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
161
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
162 /* loop2 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
163 p1 = temp;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
164 for (j = nIn; j != 0; j--) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
165 float s1 = 0.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
166 float s2 = 0.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
167
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
168 for (i = 0; i < 48; i += 2) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
169 s1 += p1[i] * qmf_window[i];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
170 s2 += p1[i+1] * qmf_window[i+1];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
171 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
172
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
173 pOut[0] = s2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
174 pOut[1] = s1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
175
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
176 p1 += 2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
177 pOut += 2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
178 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
179
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
180 /* Update the delay buffer. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
181 memcpy(delayBuf, temp + nIn*2, 46*sizeof(float));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
182 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
183
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
184 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
185 * Regular 512 points IMDCT without overlapping, with the exception of the swapping of odd bands
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
186 * caused by the reverse spectra of the QMF.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
187 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
188 * @param pInput float input
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
189 * @param pOutput float output
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
190 * @param odd_band 1 if the band is an odd band
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
191 * @param mdct_tmp aligned temporary buffer for the mdct
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
192 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
193
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
194 static void IMLT(float *pInput, float *pOutput, int odd_band, float* mdct_tmp)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
195 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
196 int i;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
197
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
198 if (odd_band) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
199 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
200 * Reverse the odd bands before IMDCT, this is an effect of the QMF transform
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
201 * or it gives better compression to do it this way.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
202 * FIXME: It should be possible to handle this in ff_imdct_calc
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
203 * for that to happen a modification of the prerotation step of
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
204 * all SIMD code and C code is needed.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
205 * Or fix the functions before so they generate a pre reversed spectrum.
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
206 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
207
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
208 for (i=0; i<128; i++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
209 FFSWAP(float, pInput[i], pInput[255-i]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
210 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
211
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
212 mdct_ctx.fft.imdct_calc(&mdct_ctx,pOutput,pInput,mdct_tmp);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
213
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
214 /* Perform windowing on the output. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
215 dsp.vector_fmul(pOutput,mdct_window,512);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
216
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
217 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
218
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
219
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
220 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
221 * Atrac 3 indata descrambling, only used for data coming from the rm container
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
222 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
223 * @param in pointer to 8 bit array of indata
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
224 * @param bits amount of bits
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
225 * @param out pointer to 8 bit array of outdata
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
226 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
227
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
228 static int decode_bytes(uint8_t* inbuffer, uint8_t* out, int bytes){
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
229 int i, off;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
230 uint32_t c;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
231 uint32_t* buf;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
232 uint32_t* obuf = (uint32_t*) out;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
233
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
234 off = (int)((long)inbuffer & 3);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
235 buf = (uint32_t*) (inbuffer - off);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
236 c = be2me_32((0x537F6103 >> (off*8)) | (0x537F6103 << (32-(off*8))));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
237 bytes += 3 + off;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
238 for (i = 0; i < bytes/4; i++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
239 obuf[i] = c ^ buf[i];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
240
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
241 if (off)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
242 av_log(NULL,AV_LOG_DEBUG,"Offset of %d not handled, post sample on ffmpeg-dev.\n",off);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
243
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
244 return off;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
245 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
246
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
247
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
248 static void init_atrac3_transforms(ATRAC3Context *q) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
249 float enc_window[256];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
250 float s;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
251 int i;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
252
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
253 /* Generate the mdct window, for details see
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
254 * http://wiki.multimedia.cx/index.php?title=RealAudio_atrc#Windows */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
255 for (i=0 ; i<256; i++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
256 enc_window[i] = (sin(((i + 0.5) / 256.0 - 0.5) * M_PI) + 1.0) * 0.5;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
257
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
258 if (!mdct_window[0])
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
259 for (i=0 ; i<256; i++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
260 mdct_window[i] = enc_window[i]/(enc_window[i]*enc_window[i] + enc_window[255-i]*enc_window[255-i]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
261 mdct_window[511-i] = mdct_window[i];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
262 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
263
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
264 /* Generate the QMF window. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
265 for (i=0 ; i<24; i++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
266 s = qmf_48tap_half[i] * 2.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
267 qmf_window[i] = s;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
268 qmf_window[47 - i] = s;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
269 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
270
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
271 /* Initialize the MDCT transform. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
272 ff_mdct_init(&mdct_ctx, 9, 1);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
273 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
274
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
275 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
276 * Atrac3 uninit, free all allocated memory
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
277 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
278
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
279 static int atrac3_decode_close(AVCodecContext *avctx)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
280 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
281 ATRAC3Context *q = avctx->priv_data;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
282
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
283 av_free(q->pUnits);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
284 av_free(q->decoded_bytes_buffer);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
285
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
286 return 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
287 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
288
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
289 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
290 / * Mantissa decoding
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
291 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
292 * @param gb the GetBit context
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
293 * @param selector what table is the output values coded with
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
294 * @param codingFlag constant length coding or variable length coding
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
295 * @param mantissas mantissa output table
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
296 * @param numCodes amount of values to get
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
297 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
298
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
299 static void readQuantSpectralCoeffs (GetBitContext *gb, int selector, int codingFlag, int* mantissas, int numCodes)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
300 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
301 int numBits, cnt, code, huffSymb;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
302
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
303 if (selector == 1)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
304 numCodes /= 2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
305
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
306 if (codingFlag != 0) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
307 /* constant length coding (CLC) */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
308 //FIXME we don't have any samples coded in CLC mode
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
309 numBits = CLCLengthTab[selector];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
310
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
311 if (selector > 1) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
312 for (cnt = 0; cnt < numCodes; cnt++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
313 if (numBits)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
314 code = get_sbits(gb, numBits);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
315 else
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
316 code = 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
317 mantissas[cnt] = code;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
318 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
319 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
320 for (cnt = 0; cnt < numCodes; cnt++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
321 if (numBits)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
322 code = get_bits(gb, numBits); //numBits is always 4 in this case
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
323 else
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
324 code = 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
325 mantissas[cnt*2] = seTab_0[code >> 2];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
326 mantissas[cnt*2+1] = seTab_0[code & 3];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
327 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
328 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
329 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
330 /* variable length coding (VLC) */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
331 if (selector != 1) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
332 for (cnt = 0; cnt < numCodes; cnt++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
333 huffSymb = get_vlc2(gb, spectral_coeff_tab[selector-1].table, spectral_coeff_tab[selector-1].bits, 3);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
334 huffSymb += 1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
335 code = huffSymb >> 1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
336 if (huffSymb & 1)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
337 code = -code;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
338 mantissas[cnt] = code;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
339 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
340 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
341 for (cnt = 0; cnt < numCodes; cnt++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
342 huffSymb = get_vlc2(gb, spectral_coeff_tab[selector-1].table, spectral_coeff_tab[selector-1].bits, 3);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
343 mantissas[cnt*2] = decTable1[huffSymb*2];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
344 mantissas[cnt*2+1] = decTable1[huffSymb*2+1];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
345 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
346 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
347 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
348 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
349
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
350 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
351 * Restore the quantized band spectrum coefficients
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
352 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
353 * @param gb the GetBit context
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
354 * @param pOut decoded band spectrum
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
355 * @return outSubbands subband counter, fix for broken specification/files
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
356 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
357
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
358 static int decodeSpectrum (GetBitContext *gb, float *pOut)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
359 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
360 int numSubbands, codingMode, cnt, first, last, subbWidth, *pIn;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
361 int subband_vlc_index[32], SF_idxs[32];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
362 int mantissas[128];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
363 float SF;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
364
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
365 numSubbands = get_bits(gb, 5); // number of coded subbands
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5423
diff changeset
366 codingMode = get_bits1(gb); // coding Mode: 0 - VLC/ 1-CLC
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
367
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
368 /* Get the VLC selector table for the subbands, 0 means not coded. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
369 for (cnt = 0; cnt <= numSubbands; cnt++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
370 subband_vlc_index[cnt] = get_bits(gb, 3);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
371
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
372 /* Read the scale factor indexes from the stream. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
373 for (cnt = 0; cnt <= numSubbands; cnt++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
374 if (subband_vlc_index[cnt] != 0)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
375 SF_idxs[cnt] = get_bits(gb, 6);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
376 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
377
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
378 for (cnt = 0; cnt <= numSubbands; cnt++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
379 first = subbandTab[cnt];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
380 last = subbandTab[cnt+1];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
381
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
382 subbWidth = last - first;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
383
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
384 if (subband_vlc_index[cnt] != 0) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
385 /* Decode spectral coefficients for this subband. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
386 /* TODO: This can be done faster is several blocks share the
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
387 * same VLC selector (subband_vlc_index) */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
388 readQuantSpectralCoeffs (gb, subband_vlc_index[cnt], codingMode, mantissas, subbWidth);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
389
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
390 /* Decode the scale factor for this subband. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
391 SF = SFTable[SF_idxs[cnt]] * iMaxQuant[subband_vlc_index[cnt]];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
392
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
393 /* Inverse quantize the coefficients. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
394 for (pIn=mantissas ; first<last; first++, pIn++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
395 pOut[first] = *pIn * SF;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
396 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
397 /* This subband was not coded, so zero the entire subband. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
398 memset(pOut+first, 0, subbWidth*sizeof(float));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
399 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
400 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
401
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
402 /* Clear the subbands that were not coded. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
403 first = subbandTab[cnt];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
404 memset(pOut+first, 0, (1024 - first) * sizeof(float));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
405 return numSubbands;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
406 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
407
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
408 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
409 * Restore the quantized tonal components
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
410 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
411 * @param gb the GetBit context
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
412 * @param pComponent tone component
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
413 * @param numBands amount of coded bands
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
414 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
415
4865
086291824752 Deobfuscade decodeTonalComponents calling logic.
banan
parents: 4856
diff changeset
416 static int decodeTonalComponents (GetBitContext *gb, tonal_component *pComponent, int numBands)
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
417 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
418 int i,j,k,cnt;
4865
086291824752 Deobfuscade decodeTonalComponents calling logic.
banan
parents: 4856
diff changeset
419 int components, coding_mode_selector, coding_mode, coded_values_per_component;
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
420 int sfIndx, coded_values, max_coded_values, quant_step_index, coded_components;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
421 int band_flags[4], mantissa[8];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
422 float *pCoef;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
423 float scalefactor;
4865
086291824752 Deobfuscade decodeTonalComponents calling logic.
banan
parents: 4856
diff changeset
424 int component_count = 0;
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
425
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
426 components = get_bits(gb,5);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
427
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
428 /* no tonal components */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
429 if (components == 0)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
430 return 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
431
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
432 coding_mode_selector = get_bits(gb,2);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
433 if (coding_mode_selector == 2)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
434 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
435
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
436 coding_mode = coding_mode_selector & 1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
437
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
438 for (i = 0; i < components; i++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
439 for (cnt = 0; cnt <= numBands; cnt++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
440 band_flags[cnt] = get_bits1(gb);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
441
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
442 coded_values_per_component = get_bits(gb,3);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
443
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
444 quant_step_index = get_bits(gb,3);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
445 if (quant_step_index <= 1)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
446 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
447
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
448 if (coding_mode_selector == 3)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
449 coding_mode = get_bits1(gb);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
450
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
451 for (j = 0; j < (numBands + 1) * 4; j++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
452 if (band_flags[j >> 2] == 0)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
453 continue;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
454
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
455 coded_components = get_bits(gb,3);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
456
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
457 for (k=0; k<coded_components; k++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
458 sfIndx = get_bits(gb,6);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
459 pComponent[component_count].pos = j * 64 + (get_bits(gb,6));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
460 max_coded_values = 1024 - pComponent[component_count].pos;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
461 coded_values = coded_values_per_component + 1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
462 coded_values = FFMIN(max_coded_values,coded_values);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
463
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
464 scalefactor = SFTable[sfIndx] * iMaxQuant[quant_step_index];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
465
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
466 readQuantSpectralCoeffs(gb, quant_step_index, coding_mode, mantissa, coded_values);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
467
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
468 pComponent[component_count].numCoefs = coded_values;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
469
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
470 /* inverse quant */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
471 pCoef = pComponent[k].coef;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
472 for (cnt = 0; cnt < coded_values; cnt++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
473 pCoef[cnt] = mantissa[cnt] * scalefactor;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
474
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
475 component_count++;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
476 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
477 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
478 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
479
4865
086291824752 Deobfuscade decodeTonalComponents calling logic.
banan
parents: 4856
diff changeset
480 return component_count;
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
481 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
482
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
483 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
484 * Decode gain parameters for the coded bands
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
485 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
486 * @param gb the GetBit context
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
487 * @param pGb the gainblock for the current band
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
488 * @param numBands amount of coded bands
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
489 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
490
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
491 static int decodeGainControl (GetBitContext *gb, gain_block *pGb, int numBands)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
492 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
493 int i, cf, numData;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
494 int *pLevel, *pLoc;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
495
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
496 gain_info *pGain = pGb->gBlock;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
497
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
498 for (i=0 ; i<=numBands; i++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
499 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
500 numData = get_bits(gb,3);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
501 pGain[i].num_gain_data = numData;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
502 pLevel = pGain[i].levcode;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
503 pLoc = pGain[i].loccode;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
504
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
505 for (cf = 0; cf < numData; cf++){
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
506 pLevel[cf]= get_bits(gb,4);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
507 pLoc [cf]= get_bits(gb,5);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
508 if(cf && pLoc[cf] <= pLoc[cf-1])
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
509 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
510 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
511 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
512
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
513 /* Clear the unused blocks. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
514 for (; i<4 ; i++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
515 pGain[i].num_gain_data = 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
516
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
517 return 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
518 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
519
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
520 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
521 * Apply gain parameters and perform the MDCT overlapping part
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
522 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
523 * @param pIn input float buffer
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
524 * @param pPrev previous float buffer to perform overlap against
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
525 * @param pOut output float buffer
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
526 * @param pGain1 current band gain info
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
527 * @param pGain2 next band gain info
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
528 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
529
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
530 static void gainCompensateAndOverlap (float *pIn, float *pPrev, float *pOut, gain_info *pGain1, gain_info *pGain2)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
531 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
532 /* gain compensation function */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
533 float gain1, gain2, gain_inc;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
534 int cnt, numdata, nsample, startLoc, endLoc;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
535
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
536
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
537 if (pGain2->num_gain_data == 0)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
538 gain1 = 1.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
539 else
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
540 gain1 = gain_tab1[pGain2->levcode[0]];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
541
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
542 if (pGain1->num_gain_data == 0) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
543 for (cnt = 0; cnt < 256; cnt++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
544 pOut[cnt] = pIn[cnt] * gain1 + pPrev[cnt];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
545 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
546 numdata = pGain1->num_gain_data;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
547 pGain1->loccode[numdata] = 32;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
548 pGain1->levcode[numdata] = 4;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
549
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
550 nsample = 0; // current sample = 0
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
551
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
552 for (cnt = 0; cnt < numdata; cnt++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
553 startLoc = pGain1->loccode[cnt] * 8;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
554 endLoc = startLoc + 8;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
555
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
556 gain2 = gain_tab1[pGain1->levcode[cnt]];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
557 gain_inc = gain_tab2[(pGain1->levcode[cnt+1] - pGain1->levcode[cnt])+15];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
558
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
559 /* interpolate */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
560 for (; nsample < startLoc; nsample++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
561 pOut[nsample] = (pIn[nsample] * gain1 + pPrev[nsample]) * gain2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
562
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
563 /* interpolation is done over eight samples */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
564 for (; nsample < endLoc; nsample++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
565 pOut[nsample] = (pIn[nsample] * gain1 + pPrev[nsample]) * gain2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
566 gain2 *= gain_inc;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
567 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
568 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
569
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
570 for (; nsample < 256; nsample++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
571 pOut[nsample] = (pIn[nsample] * gain1) + pPrev[nsample];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
572 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
573
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
574 /* Delay for the overlapping part. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
575 memcpy(pPrev, &pIn[256], 256*sizeof(float));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
576 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
577
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
578 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
579 * Combine the tonal band spectrum and regular band spectrum
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
580 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
581 * @param pSpectrum output spectrum buffer
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
582 * @param numComponents amount of tonal components
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
583 * @param pComponent tonal components for this band
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
584 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
585
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
586 static void addTonalComponents (float *pSpectrum, int numComponents, tonal_component *pComponent)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
587 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
588 int cnt, i;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
589 float *pIn, *pOut;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
590
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
591 for (cnt = 0; cnt < numComponents; cnt++){
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
592 pIn = pComponent[cnt].coef;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
593 pOut = &(pSpectrum[pComponent[cnt].pos]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
594
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
595 for (i=0 ; i<pComponent[cnt].numCoefs ; i++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
596 pOut[i] += pIn[i];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
597 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
598 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
599
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
600
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
601 #define INTERPOLATE(old,new,nsample) ((old) + (nsample)*0.125*((new)-(old)))
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
602
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
603 static void reverseMatrixing(float *su1, float *su2, int *pPrevCode, int *pCurrCode)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
604 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
605 int i, band, nsample, s1, s2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
606 float c1, c2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
607 float mc1_l, mc1_r, mc2_l, mc2_r;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
608
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
609 for (i=0,band = 0; band < 4*256; band+=256,i++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
610 s1 = pPrevCode[i];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
611 s2 = pCurrCode[i];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
612 nsample = 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
613
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
614 if (s1 != s2) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
615 /* Selector value changed, interpolation needed. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
616 mc1_l = matrixCoeffs[s1*2];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
617 mc1_r = matrixCoeffs[s1*2+1];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
618 mc2_l = matrixCoeffs[s2*2];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
619 mc2_r = matrixCoeffs[s2*2+1];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
620
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
621 /* Interpolation is done over the first eight samples. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
622 for(; nsample < 8; nsample++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
623 c1 = su1[band+nsample];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
624 c2 = su2[band+nsample];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
625 c2 = c1 * INTERPOLATE(mc1_l,mc2_l,nsample) + c2 * INTERPOLATE(mc1_r,mc2_r,nsample);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
626 su1[band+nsample] = c2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
627 su2[band+nsample] = c1 * 2.0 - c2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
628 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
629 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
630
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
631 /* Apply the matrix without interpolation. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
632 switch (s2) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
633 case 0: /* M/S decoding */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
634 for (; nsample < 256; nsample++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
635 c1 = su1[band+nsample];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
636 c2 = su2[band+nsample];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
637 su1[band+nsample] = c2 * 2.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
638 su2[band+nsample] = (c1 - c2) * 2.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
639 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
640 break;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
641
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
642 case 1:
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
643 for (; nsample < 256; nsample++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
644 c1 = su1[band+nsample];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
645 c2 = su2[band+nsample];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
646 su1[band+nsample] = (c1 + c2) * 2.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
647 su2[band+nsample] = c2 * -2.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
648 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
649 break;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
650 case 2:
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
651 case 3:
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
652 for (; nsample < 256; nsample++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
653 c1 = su1[band+nsample];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
654 c2 = su2[band+nsample];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
655 su1[band+nsample] = c1 + c2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
656 su2[band+nsample] = c1 - c2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
657 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
658 break;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
659 default:
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
660 assert(0);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
661 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
662 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
663 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
664
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
665 static void getChannelWeights (int indx, int flag, float ch[2]){
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
666
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
667 if (indx == 7) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
668 ch[0] = 1.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
669 ch[1] = 1.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
670 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
671 ch[0] = (float)(indx & 7) / 7.0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
672 ch[1] = sqrt(2 - ch[0]*ch[0]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
673 if(flag)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
674 FFSWAP(float, ch[0], ch[1]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
675 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
676 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
677
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
678 static void channelWeighting (float *su1, float *su2, int *p3)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
679 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
680 int band, nsample;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
681 /* w[x][y] y=0 is left y=1 is right */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
682 float w[2][2];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
683
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
684 if (p3[1] != 7 || p3[3] != 7){
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
685 getChannelWeights(p3[1], p3[0], w[0]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
686 getChannelWeights(p3[3], p3[2], w[1]);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
687
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
688 for(band = 1; band < 4; band++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
689 /* scale the channels by the weights */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
690 for(nsample = 0; nsample < 8; nsample++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
691 su1[band*256+nsample] *= INTERPOLATE(w[0][0], w[0][1], nsample);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
692 su2[band*256+nsample] *= INTERPOLATE(w[1][0], w[1][1], nsample);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
693 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
694
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
695 for(; nsample < 256; nsample++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
696 su1[band*256+nsample] *= w[1][0];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
697 su2[band*256+nsample] *= w[1][1];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
698 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
699 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
700 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
701 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
702
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
703
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
704 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
705 * Decode a Sound Unit
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
706 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
707 * @param gb the GetBit context
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
708 * @param pSnd the channel unit to be used
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
709 * @param pOut the decoded samples before IQMF in float representation
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
710 * @param channelNum channel number
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
711 * @param codingMode the coding mode (JOINT_STEREO or regular stereo/mono)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
712 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
713
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
714
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
715 static int decodeChannelSoundUnit (ATRAC3Context *q, GetBitContext *gb, channel_unit *pSnd, float *pOut, int channelNum, int codingMode)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
716 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
717 int band, result=0, numSubbands, numBands;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
718
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
719 if (codingMode == JOINT_STEREO && channelNum == 1) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
720 if (get_bits(gb,2) != 3) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
721 av_log(NULL,AV_LOG_ERROR,"JS mono Sound Unit id != 3.\n");
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
722 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
723 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
724 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
725 if (get_bits(gb,6) != 0x28) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
726 av_log(NULL,AV_LOG_ERROR,"Sound Unit id != 0x28.\n");
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
727 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
728 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
729 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
730
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
731 /* number of coded QMF bands */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
732 pSnd->bandsCoded = get_bits(gb,2);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
733
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
734 result = decodeGainControl (gb, &(pSnd->gainBlock[pSnd->gcBlkSwitch]), pSnd->bandsCoded);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
735 if (result) return result;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
736
4865
086291824752 Deobfuscade decodeTonalComponents calling logic.
banan
parents: 4856
diff changeset
737 pSnd->numComponents = decodeTonalComponents (gb, pSnd->components, pSnd->bandsCoded);
086291824752 Deobfuscade decodeTonalComponents calling logic.
banan
parents: 4856
diff changeset
738 if (pSnd->numComponents == -1) return -1;
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
739
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
740 numSubbands = decodeSpectrum (gb, pSnd->spectrum);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
741
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
742 /* Merge the decoded spectrum and tonal components. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
743 addTonalComponents (pSnd->spectrum, pSnd->numComponents, pSnd->components);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
744
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
745
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
746 /* Convert number of subbands into number of MLT/QMF bands */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
747 numBands = (subbandTab[numSubbands] - 1) >> 8;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
748
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
749
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
750 /* Reconstruct time domain samples. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
751 for (band=0; band<4; band++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
752 /* Perform the IMDCT step without overlapping. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
753 if (band <= numBands) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
754 IMLT(&(pSnd->spectrum[band*256]), pSnd->IMDCT_buf, band&1,q->mdct_tmp);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
755 } else
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
756 memset(pSnd->IMDCT_buf, 0, 512 * sizeof(float));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
757
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
758 /* gain compensation and overlapping */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
759 gainCompensateAndOverlap (pSnd->IMDCT_buf, &(pSnd->prevFrame[band*256]), &(pOut[band*256]),
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
760 &((pSnd->gainBlock[1 - (pSnd->gcBlkSwitch)]).gBlock[band]),
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
761 &((pSnd->gainBlock[pSnd->gcBlkSwitch]).gBlock[band]));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
762 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
763
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
764 /* Swap the gain control buffers for the next frame. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
765 pSnd->gcBlkSwitch ^= 1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
766
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
767 return 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
768 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
769
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
770 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
771 * Frame handling
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
772 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
773 * @param q Atrac3 private context
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
774 * @param databuf the input data
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
775 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
776
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
777 static int decodeFrame(ATRAC3Context *q, uint8_t* databuf)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
778 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
779 int result, i;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
780 float *p1, *p2, *p3, *p4;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
781 uint8_t *ptr1, *ptr2;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
782
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
783 if (q->codingMode == JOINT_STEREO) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
784
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
785 /* channel coupling mode */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
786 /* decode Sound Unit 1 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
787 init_get_bits(&q->gb,databuf,q->bits_per_frame);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
788
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
789 result = decodeChannelSoundUnit(q,&q->gb, q->pUnits, q->outSamples, 0, JOINT_STEREO);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
790 if (result != 0)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
791 return (result);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
792
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
793 /* Framedata of the su2 in the joint-stereo mode is encoded in
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
794 * reverse byte order so we need to swap it first. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
795 ptr1 = databuf;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
796 ptr2 = databuf+q->bytes_per_frame-1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
797 for (i = 0; i < (q->bytes_per_frame/2); i++, ptr1++, ptr2--) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
798 FFSWAP(uint8_t,*ptr1,*ptr2);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
799 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
800
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
801 /* Skip the sync codes (0xF8). */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
802 ptr1 = databuf;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
803 for (i = 4; *ptr1 == 0xF8; i++, ptr1++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
804 if (i >= q->bytes_per_frame)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
805 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
806 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
807
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
808
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
809 /* set the bitstream reader at the start of the second Sound Unit*/
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
810 init_get_bits(&q->gb,ptr1,q->bits_per_frame);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
811
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
812 /* Fill the Weighting coeffs delay buffer */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
813 memmove(q->weighting_delay,&(q->weighting_delay[2]),4*sizeof(int));
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5423
diff changeset
814 q->weighting_delay[4] = get_bits1(&q->gb);
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
815 q->weighting_delay[5] = get_bits(&q->gb,3);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
816
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
817 for (i = 0; i < 4; i++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
818 q->matrix_coeff_index_prev[i] = q->matrix_coeff_index_now[i];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
819 q->matrix_coeff_index_now[i] = q->matrix_coeff_index_next[i];
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
820 q->matrix_coeff_index_next[i] = get_bits(&q->gb,2);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
821 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
822
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
823 /* Decode Sound Unit 2. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
824 result = decodeChannelSoundUnit(q,&q->gb, &q->pUnits[1], &q->outSamples[1024], 1, JOINT_STEREO);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
825 if (result != 0)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
826 return (result);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
827
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
828 /* Reconstruct the channel coefficients. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
829 reverseMatrixing(q->outSamples, &q->outSamples[1024], q->matrix_coeff_index_prev, q->matrix_coeff_index_now);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
830
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
831 channelWeighting(q->outSamples, &q->outSamples[1024], q->weighting_delay);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
832
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
833 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
834 /* normal stereo mode or mono */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
835 /* Decode the channel sound units. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
836 for (i=0 ; i<q->channels ; i++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
837
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
838 /* Set the bitstream reader at the start of a channel sound unit. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
839 init_get_bits(&q->gb, databuf+((i*q->bytes_per_frame)/q->channels), (q->bits_per_frame)/q->channels);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
840
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
841 result = decodeChannelSoundUnit(q,&q->gb, &q->pUnits[i], &q->outSamples[i*1024], i, q->codingMode);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
842 if (result != 0)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
843 return (result);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
844 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
845 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
846
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
847 /* Apply the iQMF synthesis filter. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
848 p1= q->outSamples;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
849 for (i=0 ; i<q->channels ; i++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
850 p2= p1+256;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
851 p3= p2+256;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
852 p4= p3+256;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
853 iqmf (p1, p2, 256, p1, q->pUnits[i].delayBuf1, q->tempBuf);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
854 iqmf (p4, p3, 256, p3, q->pUnits[i].delayBuf2, q->tempBuf);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
855 iqmf (p1, p3, 512, p1, q->pUnits[i].delayBuf3, q->tempBuf);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
856 p1 +=1024;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
857 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
858
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
859 return 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
860 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
861
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
862
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
863 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
864 * Atrac frame decoding
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
865 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
866 * @param avctx pointer to the AVCodecContext
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
867 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
868
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
869 static int atrac3_decode_frame(AVCodecContext *avctx,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
870 void *data, int *data_size,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
871 uint8_t *buf, int buf_size) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
872 ATRAC3Context *q = avctx->priv_data;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
873 int result = 0, i;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
874 uint8_t* databuf;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
875 int16_t* samples = data;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
876
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
877 if (buf_size < avctx->block_align)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
878 return buf_size;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
879
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
880 /* Check if we need to descramble and what buffer to pass on. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
881 if (q->scrambled_stream) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
882 decode_bytes(buf, q->decoded_bytes_buffer, avctx->block_align);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
883 databuf = q->decoded_bytes_buffer;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
884 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
885 databuf = buf;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
886 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
887
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
888 result = decodeFrame(q, databuf);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
889
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
890 if (result != 0) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
891 av_log(NULL,AV_LOG_ERROR,"Frame decoding error!\n");
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
892 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
893 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
894
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
895 if (q->channels == 1) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
896 /* mono */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
897 for (i = 0; i<1024; i++)
5523
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 5513
diff changeset
898 samples[i] = av_clip_int16(round(q->outSamples[i]));
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
899 *data_size = 1024 * sizeof(int16_t);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
900 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
901 /* stereo */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
902 for (i = 0; i < 1024; i++) {
5523
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 5513
diff changeset
903 samples[i*2] = av_clip_int16(round(q->outSamples[i]));
c2ab2ac31edb use av_clip_int16() where it makes sense
aurel
parents: 5513
diff changeset
904 samples[i*2+1] = av_clip_int16(round(q->outSamples[1024+i]));
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
905 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
906 *data_size = 2048 * sizeof(int16_t);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
907 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
908
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
909 return avctx->block_align;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
910 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
911
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
912
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
913 /**
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
914 * Atrac3 initialization
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
915 *
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
916 * @param avctx pointer to the AVCodecContext
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
917 */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
918
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
919 static int atrac3_decode_init(AVCodecContext *avctx)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
920 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
921 int i;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
922 uint8_t *edata_ptr = avctx->extradata;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
923 ATRAC3Context *q = avctx->priv_data;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
924
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
925 /* Take data from the AVCodecContext (RM container). */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
926 q->sample_rate = avctx->sample_rate;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
927 q->channels = avctx->channels;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
928 q->bit_rate = avctx->bit_rate;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
929 q->bits_per_frame = avctx->block_align * 8;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
930 q->bytes_per_frame = avctx->block_align;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
931
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
932 /* Take care of the codec-specific extradata. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
933 if (avctx->extradata_size == 14) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
934 /* Parse the extradata, WAV format */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
935 av_log(avctx,AV_LOG_DEBUG,"[0-1] %d\n",bytestream_get_le16(&edata_ptr)); //Unknown value always 1
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
936 q->samples_per_channel = bytestream_get_le32(&edata_ptr);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
937 q->codingMode = bytestream_get_le16(&edata_ptr);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
938 av_log(avctx,AV_LOG_DEBUG,"[8-9] %d\n",bytestream_get_le16(&edata_ptr)); //Dupe of coding mode
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
939 q->frame_factor = bytestream_get_le16(&edata_ptr); //Unknown always 1
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
940 av_log(avctx,AV_LOG_DEBUG,"[12-13] %d\n",bytestream_get_le16(&edata_ptr)); //Unknown always 0
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
941
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
942 /* setup */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
943 q->samples_per_frame = 1024 * q->channels;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
944 q->atrac3version = 4;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
945 q->delay = 0x88E;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
946 if (q->codingMode)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
947 q->codingMode = JOINT_STEREO;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
948 else
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
949 q->codingMode = STEREO;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
950
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
951 q->scrambled_stream = 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
952
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
953 if ((q->bytes_per_frame == 96*q->channels*q->frame_factor) || (q->bytes_per_frame == 152*q->channels*q->frame_factor) || (q->bytes_per_frame == 192*q->channels*q->frame_factor)) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
954 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
955 av_log(avctx,AV_LOG_ERROR,"Unknown frame/channel/frame_factor configuration %d/%d/%d\n", q->bytes_per_frame, q->channels, q->frame_factor);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
956 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
957 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
958
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
959 } else if (avctx->extradata_size == 10) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
960 /* Parse the extradata, RM format. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
961 q->atrac3version = bytestream_get_be32(&edata_ptr);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
962 q->samples_per_frame = bytestream_get_be16(&edata_ptr);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
963 q->delay = bytestream_get_be16(&edata_ptr);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
964 q->codingMode = bytestream_get_be16(&edata_ptr);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
965
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
966 q->samples_per_channel = q->samples_per_frame / q->channels;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
967 q->scrambled_stream = 1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
968
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
969 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
970 av_log(NULL,AV_LOG_ERROR,"Unknown extradata size %d.\n",avctx->extradata_size);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
971 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
972 /* Check the extradata. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
973
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
974 if (q->atrac3version != 4) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
975 av_log(avctx,AV_LOG_ERROR,"Version %d != 4.\n",q->atrac3version);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
976 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
977 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
978
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
979 if (q->samples_per_frame != 1024 && q->samples_per_frame != 2048) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
980 av_log(avctx,AV_LOG_ERROR,"Unknown amount of samples per frame %d.\n",q->samples_per_frame);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
981 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
982 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
983
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
984 if (q->delay != 0x88E) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
985 av_log(avctx,AV_LOG_ERROR,"Unknown amount of delay %x != 0x88E.\n",q->delay);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
986 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
987 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
988
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
989 if (q->codingMode == STEREO) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
990 av_log(avctx,AV_LOG_DEBUG,"Normal stereo detected.\n");
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
991 } else if (q->codingMode == JOINT_STEREO) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
992 av_log(avctx,AV_LOG_DEBUG,"Joint stereo detected.\n");
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
993 } else {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
994 av_log(avctx,AV_LOG_ERROR,"Unknown channel coding mode %x!\n",q->codingMode);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
995 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
996 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
997
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
998 if (avctx->channels <= 0 || avctx->channels > 2 /*|| ((avctx->channels * 1024) != q->samples_per_frame)*/) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
999 av_log(avctx,AV_LOG_ERROR,"Channel configuration error!\n");
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1000 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1001 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1002
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1003
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1004 if(avctx->block_align >= UINT_MAX/2)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1005 return -1;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1006
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1007 /* Pad the data buffer with FF_INPUT_BUFFER_PADDING_SIZE,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1008 * this is for the bitstream reader. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1009 if ((q->decoded_bytes_buffer = av_mallocz((avctx->block_align+(4-avctx->block_align%4) + FF_INPUT_BUFFER_PADDING_SIZE))) == NULL)
5407
91906ea3337f Replace a return of -1 with ENOMEM.
takis
parents: 4865
diff changeset
1010 return AVERROR(ENOMEM);
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1011
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1012
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1013 /* Initialize the VLC tables. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1014 for (i=0 ; i<7 ; i++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1015 init_vlc (&spectral_coeff_tab[i], 9, huff_tab_sizes[i],
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1016 huff_bits[i], 1, 1,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1017 huff_codes[i], 1, 1, INIT_VLC_USE_STATIC);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1018 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1019
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1020 init_atrac3_transforms(q);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1021
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1022 /* Generate the scale factors. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1023 for (i=0 ; i<64 ; i++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1024 SFTable[i] = pow(2.0, (i - 15) / 3.0);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1025
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1026 /* Generate gain tables. */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1027 for (i=0 ; i<16 ; i++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1028 gain_tab1[i] = powf (2.0, (4 - i));
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1029
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1030 for (i=-15 ; i<16 ; i++)
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1031 gain_tab2[i+15] = powf (2.0, i * -0.125);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1032
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1033 /* init the joint-stereo decoding data */
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1034 q->weighting_delay[0] = 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1035 q->weighting_delay[1] = 7;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1036 q->weighting_delay[2] = 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1037 q->weighting_delay[3] = 7;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1038 q->weighting_delay[4] = 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1039 q->weighting_delay[5] = 7;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1040
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1041 for (i=0; i<4; i++) {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1042 q->matrix_coeff_index_prev[i] = 3;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1043 q->matrix_coeff_index_now[i] = 3;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1044 q->matrix_coeff_index_next[i] = 3;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1045 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1046
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1047 dsputil_init(&dsp, avctx);
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1048
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1049 q->pUnits = av_mallocz(sizeof(channel_unit)*q->channels);
5423
2c98d63a8956 Handle malloc failure
takis
parents: 5407
diff changeset
1050 if (!q->pUnits) {
2c98d63a8956 Handle malloc failure
takis
parents: 5407
diff changeset
1051 av_free(q->decoded_bytes_buffer);
2c98d63a8956 Handle malloc failure
takis
parents: 5407
diff changeset
1052 return AVERROR(ENOMEM);
2c98d63a8956 Handle malloc failure
takis
parents: 5407
diff changeset
1053 }
4856
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1054
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1055 return 0;
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1056 }
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1057
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1058
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1059 AVCodec atrac3_decoder =
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1060 {
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1061 .name = "atrac 3",
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1062 .type = CODEC_TYPE_AUDIO,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1063 .id = CODEC_ID_ATRAC3,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1064 .priv_data_size = sizeof(ATRAC3Context),
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1065 .init = atrac3_decode_init,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1066 .close = atrac3_decode_close,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1067 .decode = atrac3_decode_frame,
5af8895c2805 Atrac3 decoder.
banan
parents:
diff changeset
1068 };