annotate atrac1.c @ 12329:6644e439130d libavcodec

Calculate an exact frame size before writing. Now the buffer size requirements can be known exactly, so larger frame sizes can be safely encoded without buffer overwrite.
author jbr
date Sat, 31 Jul 2010 20:32:12 +0000
parents 8b6f3d3b55cb
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
1 /*
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
2 * Atrac 1 compatible decoder
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
3 * Copyright (c) 2009 Maxim Poliakovski
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
4 * Copyright (c) 2009 Benjamin Larsson
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
5 *
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
6 * This file is part of FFmpeg.
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
7 *
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
12 *
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
16 * Lesser General Public License for more details.
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
17 *
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
21 */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
22
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
23 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
24 * @file
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
25 * Atrac 1 compatible decoder.
10225
d884c0b7af2f Mention SDDS so search engines will pick it up for when someone
banan
parents: 10224
diff changeset
26 * This decoder handles raw ATRAC1 data and probably SDDS data.
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
27 */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
28
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
29 /* Many thanks to Tim Craig for all the help! */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
30
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
31 #include <math.h>
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
32 #include <stddef.h>
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
33 #include <stdio.h>
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
34
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
35 #include "avcodec.h"
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
36 #include "get_bits.h"
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
37 #include "dsputil.h"
11370
4b3da727d832 Move FFT parts from dsputil.h to fft.h
mru
parents: 11369
diff changeset
38 #include "fft.h"
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
39
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
40 #include "atrac.h"
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
41 #include "atrac1data.h"
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
42
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
43 #define AT1_MAX_BFU 52 ///< max number of block floating units in a sound unit
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
44 #define AT1_SU_SIZE 212 ///< number of bytes in a sound unit
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
45 #define AT1_SU_SAMPLES 512 ///< number of samples in a sound unit
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
46 #define AT1_FRAME_SIZE AT1_SU_SIZE * 2
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
47 #define AT1_SU_MAX_BITS AT1_SU_SIZE * 8
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
48 #define AT1_MAX_CHANNELS 2
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
49
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
50 #define AT1_QMF_BANDS 3
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
51 #define IDX_LOW_BAND 0
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
52 #define IDX_MID_BAND 1
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
53 #define IDX_HIGH_BAND 2
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
54
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
55 /**
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
56 * Sound unit struct, one unit is used per channel
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
57 */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
58 typedef struct {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
59 int log2_block_count[AT1_QMF_BANDS]; ///< log2 number of blocks in a band
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
60 int num_bfus; ///< number of Block Floating Units
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
61 float* spectrum[2];
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
62 DECLARE_ALIGNED(16, float, spec1)[AT1_SU_SAMPLES]; ///< mdct buffer
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
63 DECLARE_ALIGNED(16, float, spec2)[AT1_SU_SAMPLES]; ///< mdct buffer
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
64 DECLARE_ALIGNED(16, float, fst_qmf_delay)[46]; ///< delay line for the 1st stacked QMF filter
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
65 DECLARE_ALIGNED(16, float, snd_qmf_delay)[46]; ///< delay line for the 2nd stacked QMF filter
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
66 DECLARE_ALIGNED(16, float, last_qmf_delay)[256+23]; ///< delay line for the last stacked QMF filter
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
67 } AT1SUCtx;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
68
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
69 /**
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
70 * The atrac1 context, holds all needed parameters for decoding
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
71 */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
72 typedef struct {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
73 AT1SUCtx SUs[AT1_MAX_CHANNELS]; ///< channel sound unit
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
74 DECLARE_ALIGNED(16, float, spec)[AT1_SU_SAMPLES]; ///< the mdct spectrum buffer
10185
25752b5ce17a Only use one mdct window size in atrac1.
banan
parents: 10170
diff changeset
75
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
76 DECLARE_ALIGNED(16, float, low)[256];
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
77 DECLARE_ALIGNED(16, float, mid)[256];
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
78 DECLARE_ALIGNED(16, float, high)[512];
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
79 float* bands[3];
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
80 DECLARE_ALIGNED(16, float, out_samples)[AT1_MAX_CHANNELS][AT1_SU_SAMPLES];
10199
38ab367d4231 Merge FFTContext and MDCTContext
mru
parents: 10198
diff changeset
81 FFTContext mdct_ctx[3];
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
82 int channels;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
83 DSPContext dsp;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
84 } AT1Ctx;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
85
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
86 /** size of the transform in samples in the long mode for each QMF band */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
87 static const uint16_t samples_per_band[3] = {128, 128, 256};
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
88 static const uint8_t mdct_long_nbits[3] = {7, 7, 8};
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
89
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
90
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
91 static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits,
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
92 int rev_spec)
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
93 {
10216
5906eb8b992b Cosmetics. Merge declaration and initialization.
banan
parents: 10215
diff changeset
94 FFTContext* mdct_context = &q->mdct_ctx[nbits - 5 - (nbits > 6)];
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
95 int transf_size = 1 << nbits;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
96
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
97 if (rev_spec) {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
98 int i;
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
99 for (i = 0; i < transf_size / 2; i++)
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
100 FFSWAP(float, spec[i], spec[transf_size - 1 - i]);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
101 }
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
102 ff_imdct_half(mdct_context, out, spec);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
103 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
104
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
105
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
106 static int at1_imdct_block(AT1SUCtx* su, AT1Ctx *q)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
107 {
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
108 int band_num, band_samples, log2_block_count, nbits, num_blocks, block_size;
10198
78af613fc316 Fix embarassing typo in last commit: Restore mistakenly removed ','.
diego
parents: 10197
diff changeset
109 unsigned int start_pos, ref_pos = 0, pos = 0;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
110
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
111 for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) {
10266
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
112 float *prev_buf;
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
113 int j;
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
114
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
115 band_samples = samples_per_band[band_num];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
116 log2_block_count = su->log2_block_count[band_num];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
117
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
118 /* number of mdct blocks in the current QMF band: 1 - for long mode */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
119 /* 4 for short mode(low/middle bands) and 8 for short mode(high band)*/
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
120 num_blocks = 1 << log2_block_count;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
121
10266
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
122 if (num_blocks == 1) {
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
123 /* mdct block size in samples: 128 (long mode, low & mid bands), */
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
124 /* 256 (long mode, high band) and 32 (short mode, all bands) */
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
125 block_size = band_samples >> log2_block_count;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
126
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
127 /* calc transform size in bits according to the block_size_mode */
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
128 nbits = mdct_long_nbits[band_num] - log2_block_count;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
129
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
130 if (nbits != 5 && nbits != 7 && nbits != 8)
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
131 return -1;
10266
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
132 } else {
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
133 block_size = 32;
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
134 nbits = 5;
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
135 }
10185
25752b5ce17a Only use one mdct window size in atrac1.
banan
parents: 10170
diff changeset
136
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
137 start_pos = 0;
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
138 prev_buf = &su->spectrum[1][ref_pos + band_samples - 16];
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
139 for (j=0; j < num_blocks; j++) {
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
140 at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos + start_pos], nbits, band_num);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
141
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
142 /* overlap and window */
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
143 q->dsp.vector_fmul_window(&q->bands[band_num][start_pos], prev_buf,
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
144 &su->spectrum[0][ref_pos + start_pos], ff_sine_32, 0, 16);
10185
25752b5ce17a Only use one mdct window size in atrac1.
banan
parents: 10170
diff changeset
145
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
146 prev_buf = &su->spectrum[0][ref_pos+start_pos + 16];
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
147 start_pos += block_size;
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
148 pos += block_size;
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
149 }
10266
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
150
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
151 if (num_blocks == 1)
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
152 memcpy(q->bands[band_num] + 32, &su->spectrum[0][ref_pos + 16], 240 * sizeof(float));
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
153
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
154 ref_pos += band_samples;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
155 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
156
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
157 /* Swap buffers so the mdct overlap works */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
158 FFSWAP(float*, su->spectrum[0], su->spectrum[1]);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
159
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
160 return 0;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
161 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
162
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
163 /**
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
164 * Parse the block size mode byte
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
165 */
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
166
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
167 static int at1_parse_bsm(GetBitContext* gb, int log2_block_cnt[AT1_QMF_BANDS])
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
168 {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
169 int log2_block_count_tmp, i;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
170
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
171 for (i = 0; i < 2; i++) {
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
172 /* low and mid band */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
173 log2_block_count_tmp = get_bits(gb, 2);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
174 if (log2_block_count_tmp & 1)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
175 return -1;
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
176 log2_block_cnt[i] = 2 - log2_block_count_tmp;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
177 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
178
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
179 /* high band */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
180 log2_block_count_tmp = get_bits(gb, 2);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
181 if (log2_block_count_tmp != 0 && log2_block_count_tmp != 3)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
182 return -1;
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
183 log2_block_cnt[IDX_HIGH_BAND] = 3 - log2_block_count_tmp;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
184
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
185 skip_bits(gb, 2);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
186 return 0;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
187 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
188
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
189
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
190 static int at1_unpack_dequant(GetBitContext* gb, AT1SUCtx* su,
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
191 float spec[AT1_SU_SAMPLES])
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
192 {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
193 int bits_used, band_num, bfu_num, i;
10215
a43faa684a20 Move the scale factor and word length indexes to the stack.
banan
parents: 10199
diff changeset
194 uint8_t idwls[AT1_MAX_BFU]; ///< the word length indexes for each BFU
a43faa684a20 Move the scale factor and word length indexes to the stack.
banan
parents: 10199
diff changeset
195 uint8_t idsfs[AT1_MAX_BFU]; ///< the scalefactor indexes for each BFU
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
196
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
197 /* parse the info byte (2nd byte) telling how much BFUs were coded */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
198 su->num_bfus = bfu_amount_tab1[get_bits(gb, 3)];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
199
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
200 /* calc number of consumed bits:
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
201 num_BFUs * (idwl(4bits) + idsf(6bits)) + log2_block_count(8bits) + info_byte(8bits)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
202 + info_byte_copy(8bits) + log2_block_count_copy(8bits) */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
203 bits_used = su->num_bfus * 10 + 32 +
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
204 bfu_amount_tab2[get_bits(gb, 2)] +
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
205 (bfu_amount_tab3[get_bits(gb, 3)] << 1);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
206
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
207 /* get word length index (idwl) for each BFU */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
208 for (i = 0; i < su->num_bfus; i++)
10215
a43faa684a20 Move the scale factor and word length indexes to the stack.
banan
parents: 10199
diff changeset
209 idwls[i] = get_bits(gb, 4);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
210
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
211 /* get scalefactor index (idsf) for each BFU */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
212 for (i = 0; i < su->num_bfus; i++)
10215
a43faa684a20 Move the scale factor and word length indexes to the stack.
banan
parents: 10199
diff changeset
213 idsfs[i] = get_bits(gb, 6);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
214
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
215 /* zero idwl/idsf for empty BFUs */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
216 for (i = su->num_bfus; i < AT1_MAX_BFU; i++)
10215
a43faa684a20 Move the scale factor and word length indexes to the stack.
banan
parents: 10199
diff changeset
217 idwls[i] = idsfs[i] = 0;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
218
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
219 /* read in the spectral data and reconstruct MDCT spectrum of this channel */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
220 for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) {
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
221 for (bfu_num = bfu_bands_t[band_num]; bfu_num < bfu_bands_t[band_num+1]; bfu_num++) {
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
222 int pos;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
223
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
224 int num_specs = specs_per_bfu[bfu_num];
10215
a43faa684a20 Move the scale factor and word length indexes to the stack.
banan
parents: 10199
diff changeset
225 int word_len = !!idwls[bfu_num] + idwls[bfu_num];
a43faa684a20 Move the scale factor and word length indexes to the stack.
banan
parents: 10199
diff changeset
226 float scale_factor = sf_table[idsfs[bfu_num]];
10217
35f1814a6496 Cosmetics, indentation.
banan
parents: 10216
diff changeset
227 bits_used += word_len * num_specs; /* add number of bits consumed by current BFU */
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
228
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
229 /* check for bitstream overflow */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
230 if (bits_used > AT1_SU_MAX_BITS)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
231 return -1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
232
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
233 /* get the position of the 1st spec according to the block size mode */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
234 pos = su->log2_block_count[band_num] ? bfu_start_short[bfu_num] : bfu_start_long[bfu_num];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
235
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
236 if (word_len) {
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
237 float max_quant = 1.0 / (float)((1 << (word_len - 1)) - 1);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
238
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
239 for (i = 0; i < num_specs; i++) {
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
240 /* read in a quantized spec and convert it to
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
241 * signed int and then inverse quantization
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
242 */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
243 spec[pos+i] = get_sbits(gb, word_len) * scale_factor * max_quant;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
244 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
245 } else { /* word_len = 0 -> empty BFU, zero all specs in the emty BFU */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
246 memset(&spec[pos], 0, num_specs * sizeof(float));
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
247 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
248 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
249 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
250
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
251 return 0;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
252 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
253
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
254
11374
1cd8731bbe7f Make some functions static
mru
parents: 11370
diff changeset
255 static void at1_subband_synthesis(AT1Ctx *q, AT1SUCtx* su, float *pOut)
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
256 {
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
257 float temp[256];
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
258 float iqmf_temp[512 + 46];
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
259
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
260 /* combine low and middle bands */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
261 atrac_iqmf(q->bands[0], q->bands[1], 128, temp, su->fst_qmf_delay, iqmf_temp);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
262
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
263 /* delay the signal of the high band by 23 samples */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
264 memcpy( su->last_qmf_delay, &su->last_qmf_delay[256], sizeof(float) * 23);
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
265 memcpy(&su->last_qmf_delay[23], q->bands[2], sizeof(float) * 256);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
266
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
267 /* combine (low + middle) and high bands */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
268 atrac_iqmf(temp, su->last_qmf_delay, 256, pOut, su->snd_qmf_delay, iqmf_temp);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
269 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
270
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
271
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
272 static int atrac1_decode_frame(AVCodecContext *avctx, void *data,
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
273 int *data_size, AVPacket *avpkt)
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
274 {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
275 const uint8_t *buf = avpkt->data;
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
276 int buf_size = avpkt->size;
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
277 AT1Ctx *q = avctx->priv_data;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
278 int ch, ret, i;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
279 GetBitContext gb;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
280 float* samples = data;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
281
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
282
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
283 if (buf_size < 212 * q->channels) {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
284 av_log(q,AV_LOG_ERROR,"Not enought data to decode!\n");
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
285 return -1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
286 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
287
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
288 for (ch = 0; ch < q->channels; ch++) {
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
289 AT1SUCtx* su = &q->SUs[ch];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
290
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
291 init_get_bits(&gb, &buf[212 * ch], 212 * 8);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
292
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
293 /* parse block_size_mode, 1st byte */
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
294 ret = at1_parse_bsm(&gb, su->log2_block_count);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
295 if (ret < 0)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
296 return ret;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
297
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
298 ret = at1_unpack_dequant(&gb, su, q->spec);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
299 if (ret < 0)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
300 return ret;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
301
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
302 ret = at1_imdct_block(su, q);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
303 if (ret < 0)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
304 return ret;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
305 at1_subband_synthesis(q, su, q->out_samples[ch]);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
306 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
307
11652
8b6f3d3b55cb Move clipping of audio samples (for those codecs outputting float) from decoder
rbultje
parents: 11644
diff changeset
308 /* interleave; FIXME, should create/use a DSP function */
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
309 if (q->channels == 1) {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
310 /* mono */
11652
8b6f3d3b55cb Move clipping of audio samples (for those codecs outputting float) from decoder
rbultje
parents: 11644
diff changeset
311 memcpy(samples, q->out_samples[0], AT1_SU_SAMPLES * 4);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
312 } else {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
313 /* stereo */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
314 for (i = 0; i < AT1_SU_SAMPLES; i++) {
11652
8b6f3d3b55cb Move clipping of audio samples (for those codecs outputting float) from decoder
rbultje
parents: 11644
diff changeset
315 samples[i * 2] = q->out_samples[0][i];
8b6f3d3b55cb Move clipping of audio samples (for those codecs outputting float) from decoder
rbultje
parents: 11644
diff changeset
316 samples[i * 2 + 1] = q->out_samples[1][i];
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
317 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
318 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
319
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
320 *data_size = q->channels * AT1_SU_SAMPLES * sizeof(*samples);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
321 return avctx->block_align;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
322 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
323
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
324
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
325 static av_cold int atrac1_decode_init(AVCodecContext *avctx)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
326 {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
327 AT1Ctx *q = avctx->priv_data;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
328
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
329 avctx->sample_fmt = SAMPLE_FMT_FLT;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
330
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
331 q->channels = avctx->channels;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
332
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
333 /* Init the mdct transforms */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
334 ff_mdct_init(&q->mdct_ctx[0], 6, 1, -1.0/ (1 << 15));
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
335 ff_mdct_init(&q->mdct_ctx[1], 8, 1, -1.0/ (1 << 15));
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
336 ff_mdct_init(&q->mdct_ctx[2], 9, 1, -1.0/ (1 << 15));
10185
25752b5ce17a Only use one mdct window size in atrac1.
banan
parents: 10170
diff changeset
337
10827
3d011a01a6a0 Add support for hard-coded MDCT-related ff_sine_windows tables.
reimar
parents: 10267
diff changeset
338 ff_init_ff_sine_windows(5);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
339
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
340 atrac_generate_tables();
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
341
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
342 dsputil_init(&q->dsp, avctx);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
343
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
344 q->bands[0] = q->low;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
345 q->bands[1] = q->mid;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
346 q->bands[2] = q->high;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
347
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
348 /* Prepare the mdct overlap buffers */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
349 q->SUs[0].spectrum[0] = q->SUs[0].spec1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
350 q->SUs[0].spectrum[1] = q->SUs[0].spec2;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
351 q->SUs[1].spectrum[0] = q->SUs[1].spec1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
352 q->SUs[1].spectrum[1] = q->SUs[1].spec2;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
353
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
354 return 0;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
355 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
356
10218
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
357
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
358 static av_cold int atrac1_decode_end(AVCodecContext * avctx) {
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
359 AT1Ctx *q = avctx->priv_data;
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
360
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
361 ff_mdct_end(&q->mdct_ctx[0]);
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
362 ff_mdct_end(&q->mdct_ctx[1]);
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
363 ff_mdct_end(&q->mdct_ctx[2]);
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
364 return 0;
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
365 }
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
366
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
367
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
368 AVCodec atrac1_decoder = {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
369 .name = "atrac1",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11374
diff changeset
370 .type = AVMEDIA_TYPE_AUDIO,
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
371 .id = CODEC_ID_ATRAC1,
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
372 .priv_data_size = sizeof(AT1Ctx),
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
373 .init = atrac1_decode_init,
10218
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
374 .close = atrac1_decode_end,
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
375 .decode = atrac1_decode_frame,
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
376 .long_name = NULL_IF_CONFIG_SMALL("Atrac 1 (Adaptive TRansform Acoustic Coding)"),
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
377 };