annotate atrac1.c @ 10483:afad312b9989 libavcodec

Implement AMR gain function that is used by both AMR and SIPR. Based on AMR SoC code by Robert Swain and Colin McQuillan.
author vitor
date Sat, 31 Oct 2009 02:02:30 +0000
parents ec0e313a00aa
children 3d011a01a6a0
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++) {
10266
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
111 float *prev_buf;
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
112 int j;
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
113
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
114 band_samples = samples_per_band[band_num];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
115 log2_block_count = su->log2_block_count[band_num];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
116
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
117 /* 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
118 /* 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
119 num_blocks = 1 << log2_block_count;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
120
10266
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
121 if (num_blocks == 1) {
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
122 /* mdct block size in samples: 128 (long mode, low & mid bands), */
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
123 /* 256 (long mode, high band) and 32 (short mode, all bands) */
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
124 block_size = band_samples >> log2_block_count;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
125
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
126 /* calc transform size in bits according to the block_size_mode */
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
127 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
128
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
129 if (nbits != 5 && nbits != 7 && nbits != 8)
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
130 return -1;
10266
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
131 } else {
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
132 block_size = 32;
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
133 nbits = 5;
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
134 }
10185
25752b5ce17a Only use one mdct window size in atrac1.
banan
parents: 10170
diff changeset
135
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
136 start_pos = 0;
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
137 prev_buf = &su->spectrum[1][ref_pos + band_samples - 16];
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
138 for (j=0; j < num_blocks; j++) {
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
139 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
140
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
141 /* overlap and window */
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
142 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
143 &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
144
10267
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
145 prev_buf = &su->spectrum[0][ref_pos+start_pos + 16];
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
146 start_pos += block_size;
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
147 pos += block_size;
ec0e313a00aa Reindent code folowing previous commit (r20019)
vitor
parents: 10266
diff changeset
148 }
10266
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
149
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
150 if (num_blocks == 1)
8695a5f212fc Factorize duplicated code in at1_imdct_block()
vitor
parents: 10225
diff changeset
151 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
152
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
153 ref_pos += band_samples;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
154 }
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 /* Swap buffers so the mdct overlap works */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
157 FFSWAP(float*, su->spectrum[0], su->spectrum[1]);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
158
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
159 return 0;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
160 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
161
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
162 /**
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
163 * Parse the block size mode byte
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
164 */
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
165
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
166 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
167 {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
168 int log2_block_count_tmp, i;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
169
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
170 for (i = 0; i < 2; i++) {
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
171 /* low and mid band */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
172 log2_block_count_tmp = get_bits(gb, 2);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
173 if (log2_block_count_tmp & 1)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
174 return -1;
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
175 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
176 }
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 /* high band */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
179 log2_block_count_tmp = get_bits(gb, 2);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
180 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
181 return -1;
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
182 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
183
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
184 skip_bits(gb, 2);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
185 return 0;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
186 }
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
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
189 static int at1_unpack_dequant(GetBitContext* gb, AT1SUCtx* su,
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
190 float spec[AT1_SU_SAMPLES])
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
191 {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
192 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
193 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
194 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
195
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
196 /* 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
197 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
198
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
199 /* calc number of consumed bits:
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
200 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
201 + info_byte_copy(8bits) + log2_block_count_copy(8bits) */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
202 bits_used = su->num_bfus * 10 + 32 +
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
203 bfu_amount_tab2[get_bits(gb, 2)] +
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
204 (bfu_amount_tab3[get_bits(gb, 3)] << 1);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
205
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
206 /* get word length index (idwl) for each BFU */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
207 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
208 idwls[i] = get_bits(gb, 4);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
209
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
210 /* get scalefactor index (idsf) for each BFU */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
211 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
212 idsfs[i] = get_bits(gb, 6);
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
213
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
214 /* zero idwl/idsf for empty BFUs */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
215 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
216 idwls[i] = idsfs[i] = 0;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
217
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
218 /* 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
219 for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) {
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
220 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
221 int pos;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
222
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
223 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
224 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
225 float scale_factor = sf_table[idsfs[bfu_num]];
10217
35f1814a6496 Cosmetics, indentation.
banan
parents: 10216
diff changeset
226 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
227
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
228 /* check for bitstream overflow */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
229 if (bits_used > AT1_SU_MAX_BITS)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
230 return -1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
231
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
232 /* 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
233 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
234
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
235 if (word_len) {
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
236 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
237
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
238 for (i = 0; i < num_specs; i++) {
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
239 /* read in a quantized spec and convert it to
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
240 * signed int and then inverse quantization
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
241 */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
242 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
243 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
244 } 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
245 memset(&spec[pos], 0, num_specs * sizeof(float));
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
246 }
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 return 0;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
251 }
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 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
255 {
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
256 float temp[256];
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
257 float iqmf_temp[512 + 46];
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
258
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
259 /* combine low and middle bands */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
260 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
261
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
262 /* delay the signal of the high band by 23 samples */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
263 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
264 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
265
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
266 /* combine (low + middle) and high bands */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
267 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
268 }
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
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
271 static int atrac1_decode_frame(AVCodecContext *avctx, void *data,
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
272 int *data_size, AVPacket *avpkt)
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
273 {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
274 const uint8_t *buf = avpkt->data;
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
275 int buf_size = avpkt->size;
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
276 AT1Ctx *q = avctx->priv_data;
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
277 int ch, ret, i;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
278 GetBitContext gb;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
279 float* samples = data;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
280
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 if (buf_size < 212 * q->channels) {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
283 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
284 return -1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
285 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
286
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
287 for (ch = 0; ch < q->channels; ch++) {
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
288 AT1SUCtx* su = &q->SUs[ch];
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
289
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
290 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
291
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
292 /* parse block_size_mode, 1st byte */
10170
e1bb4cf6e659 Cosmetics. Renames, indentation and spacing.
banan
parents: 10157
diff changeset
293 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
294 if (ret < 0)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
295 return ret;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
296
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
297 ret = at1_unpack_dequant(&gb, su, q->spec);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
298 if (ret < 0)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
299 return ret;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
300
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
301 ret = at1_imdct_block(su, q);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
302 if (ret < 0)
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
303 return ret;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
304 at1_subband_synthesis(q, su, q->out_samples[ch]);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
305 }
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 /* round, convert to 16bit and interleave */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
308 if (q->channels == 1) {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
309 /* mono */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
310 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
311 32700.0 / (1 << 15), AT1_SU_SAMPLES);
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++) {
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
315 samples[i * 2] = av_clipf(q->out_samples[0][i],
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
316 -32700.0 / (1 << 15),
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 samples[i * 2 + 1] = av_clipf(q->out_samples[1][i],
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
319 -32700.0 / (1 << 15),
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
320 32700.0 / (1 << 15));
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
321 }
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 *data_size = q->channels * AT1_SU_SAMPLES * sizeof(*samples);
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
325 return avctx->block_align;
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
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 static av_cold int atrac1_decode_init(AVCodecContext *avctx)
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 AT1Ctx *q = avctx->priv_data;
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 avctx->sample_fmt = SAMPLE_FMT_FLT;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
334
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
335 q->channels = avctx->channels;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
336
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
337 /* Init the mdct transforms */
10197
024dff84e511 K&R coding style whitespace cosmetics
diego
parents: 10190
diff changeset
338 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
339 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
340 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
341
10224
47f2b03e0c62 Use ff_sine_32 in atrac1.
banan
parents: 10218
diff changeset
342 ff_sine_window_init(ff_sine_32, 32);
10157
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 atrac_generate_tables();
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
345
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
346 dsputil_init(&q->dsp, avctx);
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 q->bands[0] = q->low;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
349 q->bands[1] = q->mid;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
350 q->bands[2] = q->high;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
351
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
352 /* Prepare the mdct overlap buffers */
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
353 q->SUs[0].spectrum[0] = q->SUs[0].spec1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
354 q->SUs[0].spectrum[1] = q->SUs[0].spec2;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
355 q->SUs[1].spectrum[0] = q->SUs[1].spec1;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
356 q->SUs[1].spectrum[1] = q->SUs[1].spec2;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
357
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
358 return 0;
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
359 }
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
360
10218
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
361
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
362 static av_cold int atrac1_decode_end(AVCodecContext * avctx) {
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
363 AT1Ctx *q = avctx->priv_data;
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
364
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
365 ff_mdct_end(&q->mdct_ctx[0]);
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
366 ff_mdct_end(&q->mdct_ctx[1]);
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
367 ff_mdct_end(&q->mdct_ctx[2]);
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
368 return 0;
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
369 }
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
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
372 AVCodec atrac1_decoder = {
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
373 .name = "atrac1",
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
374 .type = CODEC_TYPE_AUDIO,
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
375 .id = CODEC_ID_ATRAC1,
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
376 .priv_data_size = sizeof(AT1Ctx),
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
377 .init = atrac1_decode_init,
10218
84a9a55135f4 Add forgotten cleanup function in atrac1.
banan
parents: 10217
diff changeset
378 .close = atrac1_decode_end,
10157
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
379 .decode = atrac1_decode_frame,
178274d5fa1d Initial commit of the atrac1 decoder, not hooked up yet
banan
parents:
diff changeset
380 .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
381 };