annotate atrac1.c @ 10225:d884c0b7af2f libavcodec

Mention SDDS so search engines will pick it up for when someone needs to decode the SDDS tracks found on 35 mm movies.
author banan
date Tue, 22 Sep 2009 17:05:19 +0000
parents 47f2b03e0c62
children 8695a5f212fc
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 /**
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
24 * @file libavcodec/atrac1.c
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"
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
38
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
39 #include "atrac.h"
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
40 #include "atrac1data.h"
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
41
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
42 #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
43 #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
44 #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
45 #define AT1_FRAME_SIZE AT1_SU_SIZE * 2
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
46 #define AT1_SU_MAX_BITS AT1_SU_SIZE * 8
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
47 #define AT1_MAX_CHANNELS 2
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
48
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
49 #define AT1_QMF_BANDS 3
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
50 #define IDX_LOW_BAND 0
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
51 #define IDX_MID_BAND 1
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
52 #define IDX_HIGH_BAND 2
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
53
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 * Sound unit struct, one unit is used per channel
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
56 */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
57 typedef struct {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
58 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
59 int num_bfus; ///< number of Block Floating Units
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
60 float* spectrum[2];
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
61 DECLARE_ALIGNED_16(float, spec1[AT1_SU_SAMPLES]); ///< mdct buffer
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
62 DECLARE_ALIGNED_16(float, spec2[AT1_SU_SAMPLES]); ///< mdct buffer
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
63 DECLARE_ALIGNED_16(float, fst_qmf_delay[46]); ///< delay line for the 1st stacked QMF filter
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
64 DECLARE_ALIGNED_16(float, snd_qmf_delay[46]); ///< delay line for the 2nd stacked QMF filter
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
65 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
66 } AT1SUCtx;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
67
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 * The atrac1 context, holds all needed parameters for decoding
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
70 */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
71 typedef struct {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
72 AT1SUCtx SUs[AT1_MAX_CHANNELS]; ///< channel sound unit
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
73 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
74
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
75 DECLARE_ALIGNED_16(float, low[256]);
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
76 DECLARE_ALIGNED_16(float, mid[256]);
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
77 DECLARE_ALIGNED_16(float, high[512]);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
78 float* bands[3];
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
79 DECLARE_ALIGNED_16(float, out_samples[AT1_MAX_CHANNELS][AT1_SU_SAMPLES]);
10199
38ab367d4231 Merge FFTContext and MDCTContext
mru
parents: 10198
diff changeset
80 FFTContext mdct_ctx[3];
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
81 int channels;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
82 DSPContext dsp;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
83 } AT1Ctx;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
84
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
85 /** 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
86 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
87 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
88
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
89
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
90 static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits,
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
91 int rev_spec)
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
92 {
10216
5906eb8b992b Cosmetics. Merge declaration and initialization.
banan
parents: 10215
diff changeset
93 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
94 int transf_size = 1 << nbits;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
95
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
96 if (rev_spec) {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
97 int i;
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
98 for (i = 0; i < transf_size / 2; i++)
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
99 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
100 }
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
101 ff_imdct_half(mdct_context, out, spec);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
102 }
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 static int at1_imdct_block(AT1SUCtx* su, AT1Ctx *q)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
106 {
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
107 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
108 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
109
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
110 for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) {
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
111 band_samples = samples_per_band[band_num];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
112 log2_block_count = su->log2_block_count[band_num];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
113
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
114 /* 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
115 /* 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
116 num_blocks = 1 << log2_block_count;
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 /* mdct block size in samples: 128 (long mode, low & mid bands), */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
119 /* 256 (long mode, high band) and 32 (short mode, all bands) */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
120 block_size = band_samples >> log2_block_count;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
121
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
122 /* calc transform size in bits according to the block_size_mode */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
123 nbits = mdct_long_nbits[band_num] - log2_block_count;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
124
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
125 if (nbits != 5 && nbits != 7 && nbits != 8)
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
126 return -1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
127
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
128 if (num_blocks == 1) {
10189
de34f74fb758 Fix the short block transform for atrac1.
banan
parents: 10185
diff changeset
129 /* long blocks */
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
130 at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos], nbits, band_num);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
131 pos += block_size; // move to the next mdct block in the spectrum
10185
25752b5ce17a Only use one mdct window size in atrac1.
banan
parents: 10170
diff changeset
132
25752b5ce17a Only use one mdct window size in atrac1.
banan
parents: 10170
diff changeset
133 /* overlap and window long blocks */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
134 q->dsp.vector_fmul_window(q->bands[band_num], &su->spectrum[1][ref_pos + band_samples - 16],
10224
47f2b03e0c62 Use ff_sine_32 in atrac1.
banan
parents: 10218
diff changeset
135 &su->spectrum[0][ref_pos], ff_sine_32, 0, 16);
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
136 memcpy(q->bands[band_num] + 32, &su->spectrum[0][ref_pos + 16], 240 * sizeof(float));
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
137 } else {
10189
de34f74fb758 Fix the short block transform for atrac1.
banan
parents: 10185
diff changeset
138 /* short blocks */
10185
25752b5ce17a Only use one mdct window size in atrac1.
banan
parents: 10170
diff changeset
139 float *prev_buf;
10189
de34f74fb758 Fix the short block transform for atrac1.
banan
parents: 10185
diff changeset
140 start_pos = 0;
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
141 prev_buf = &su->spectrum[1][ref_pos + band_samples - 16];
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
142 for (; num_blocks != 0; num_blocks--) {
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
143 at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos + start_pos], 5, band_num);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
144
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
145 /* overlap and window between short blocks */
10189
de34f74fb758 Fix the short block transform for atrac1.
banan
parents: 10185
diff changeset
146 q->dsp.vector_fmul_window(&q->bands[band_num][start_pos], prev_buf,
10224
47f2b03e0c62 Use ff_sine_32 in atrac1.
banan
parents: 10218
diff changeset
147 &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
148
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
149 prev_buf = &su->spectrum[0][ref_pos+start_pos + 16];
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
150 start_pos += 32; // use hardcoded block_size
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
151 pos += 32;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
152 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
153 }
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
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
255 void at1_subband_synthesis(AT1Ctx *q, AT1SUCtx* su, float *pOut)
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
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
308 /* round, convert to 16bit and interleave */
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 */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
311 q->dsp.vector_clipf(samples, q->out_samples[0], -32700.0 / (1 << 15),
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
312 32700.0 / (1 << 15), AT1_SU_SAMPLES);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
313 } else {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
314 /* stereo */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
315 for (i = 0; i < AT1_SU_SAMPLES; i++) {
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
316 samples[i * 2] = av_clipf(q->out_samples[0][i],
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
317 -32700.0 / (1 << 15),
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
318 32700.0 / (1 << 15));
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
319 samples[i * 2 + 1] = av_clipf(q->out_samples[1][i],
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
320 -32700.0 / (1 << 15),
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
321 32700.0 / (1 << 15));
10157
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 *data_size = q->channels * AT1_SU_SAMPLES * sizeof(*samples);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
326 return avctx->block_align;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
327 }
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
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
330 static av_cold int atrac1_decode_init(AVCodecContext *avctx)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
331 {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
332 AT1Ctx *q = avctx->priv_data;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
333
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
334 avctx->sample_fmt = SAMPLE_FMT_FLT;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
335
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
336 q->channels = avctx->channels;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
337
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
338 /* Init the mdct transforms */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
339 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
340 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
341 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
342
10224
47f2b03e0c62 Use ff_sine_32 in atrac1.
banan
parents: 10218
diff changeset
343 ff_sine_window_init(ff_sine_32, 32);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
344
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
345 atrac_generate_tables();
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
346
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
347 dsputil_init(&q->dsp, avctx);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
348
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
349 q->bands[0] = q->low;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
350 q->bands[1] = q->mid;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
351 q->bands[2] = q->high;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
352
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
353 /* Prepare the mdct overlap buffers */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
354 q->SUs[0].spectrum[0] = q->SUs[0].spec1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
355 q->SUs[0].spectrum[1] = q->SUs[0].spec2;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
356 q->SUs[1].spectrum[0] = q->SUs[1].spec1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
357 q->SUs[1].spectrum[1] = q->SUs[1].spec2;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
358
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
359 return 0;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
360 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
361
10218
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
362
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
363 static av_cold int atrac1_decode_end(AVCodecContext * avctx) {
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
364 AT1Ctx *q = avctx->priv_data;
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 ff_mdct_end(&q->mdct_ctx[0]);
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
367 ff_mdct_end(&q->mdct_ctx[1]);
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
368 ff_mdct_end(&q->mdct_ctx[2]);
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
369 return 0;
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
370 }
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
371
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
372
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
373 AVCodec atrac1_decoder = {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
374 .name = "atrac1",
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
375 .type = CODEC_TYPE_AUDIO,
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
376 .id = CODEC_ID_ATRAC1,
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
377 .priv_data_size = sizeof(AT1Ctx),
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
378 .init = atrac1_decode_init,
10218
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
379 .close = atrac1_decode_end,
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
380 .decode = atrac1_decode_frame,
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
381 .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
382 };