annotate atrac3.c @ 11560:8a4984c5cacc libavcodec

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