Commit | Line | Data |
---|---|---|
2ba45a60 DM |
1 | /* |
2 | * ATRAC3+ compatible decoder | |
3 | * | |
4 | * Copyright (c) 2010-2013 Maxim Poliakovski | |
5 | * | |
6 | * This file is part of FFmpeg. | |
7 | * | |
8 | * FFmpeg is free software; you can redistribute it and/or | |
9 | * modify it under the terms of the GNU Lesser General Public | |
10 | * License as published by the Free Software Foundation; either | |
11 | * version 2.1 of the License, or (at your option) any later version. | |
12 | * | |
13 | * FFmpeg is distributed in the hope that it will be useful, | |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 | * Lesser General Public License for more details. | |
17 | * | |
18 | * You should have received a copy of the GNU Lesser General Public | |
19 | * License along with FFmpeg; if not, write to the Free Software | |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 | */ | |
22 | ||
23 | /** | |
24 | * @file | |
25 | * Global structures, constants and data for ATRAC3+ decoder. | |
26 | */ | |
27 | ||
28 | #ifndef AVCODEC_ATRAC3PLUS_H | |
29 | #define AVCODEC_ATRAC3PLUS_H | |
30 | ||
31 | #include <stdint.h> | |
32 | ||
33 | #include "libavutil/float_dsp.h" | |
34 | #include "atrac.h" | |
35 | #include "avcodec.h" | |
36 | #include "fft.h" | |
37 | #include "get_bits.h" | |
38 | ||
39 | /** Global unit sizes */ | |
40 | #define ATRAC3P_SUBBANDS 16 ///< number of PQF subbands | |
41 | #define ATRAC3P_SUBBAND_SAMPLES 128 ///< number of samples per subband | |
42 | #define ATRAC3P_FRAME_SAMPLES (ATRAC3P_SUBBAND_SAMPLES * ATRAC3P_SUBBANDS) | |
43 | ||
44 | #define ATRAC3P_PQF_FIR_LEN 12 ///< length of the prototype FIR of the PQF | |
45 | ||
46 | /** Global constants */ | |
47 | #define ATRAC3P_POWER_COMP_OFF 15 ///< disable power compensation | |
48 | ||
49 | /** ATRAC3+ channel unit types */ | |
50 | enum Atrac3pChannelUnitTypes { | |
51 | CH_UNIT_MONO = 0, ///< unit containing one coded channel | |
52 | CH_UNIT_STEREO = 1, ///< unit containing two jointly-coded channels | |
53 | CH_UNIT_EXTENSION = 2, ///< unit containing extension information | |
54 | CH_UNIT_TERMINATOR = 3 ///< unit sequence terminator | |
55 | }; | |
56 | ||
57 | /** Per-channel IPQF history */ | |
58 | typedef struct Atrac3pIPQFChannelCtx { | |
59 | DECLARE_ALIGNED(32, float, buf1)[ATRAC3P_PQF_FIR_LEN * 2][8]; | |
60 | DECLARE_ALIGNED(32, float, buf2)[ATRAC3P_PQF_FIR_LEN * 2][8]; | |
61 | int pos; | |
62 | } Atrac3pIPQFChannelCtx; | |
63 | ||
64 | /** Amplitude envelope of a group of sine waves */ | |
65 | typedef struct Atrac3pWaveEnvelope { | |
66 | int has_start_point; ///< indicates start point within the GHA window | |
67 | int has_stop_point; ///< indicates stop point within the GHA window | |
68 | int start_pos; ///< start position expressed in n*4 samples | |
69 | int stop_pos; ///< stop position expressed in n*4 samples | |
70 | } Atrac3pWaveEnvelope; | |
71 | ||
72 | /** Parameters of a group of sine waves */ | |
73 | typedef struct Atrac3pWavesData { | |
74 | Atrac3pWaveEnvelope pend_env; ///< pending envelope from the previous frame | |
75 | Atrac3pWaveEnvelope curr_env; ///< group envelope from the current frame | |
76 | int num_wavs; ///< number of sine waves in the group | |
77 | int start_index; ///< start index into global tones table for that subband | |
78 | } Atrac3pWavesData; | |
79 | ||
80 | /** Parameters of a single sine wave */ | |
81 | typedef struct Atrac3pWaveParam { | |
82 | int freq_index; ///< wave frequency index | |
83 | int amp_sf; ///< quantized amplitude scale factor | |
84 | int amp_index; ///< quantized amplitude index | |
85 | int phase_index; ///< quantized phase index | |
86 | } Atrac3pWaveParam; | |
87 | ||
88 | /** Sound channel parameters */ | |
89 | typedef struct Atrac3pChanParams { | |
90 | int ch_num; | |
91 | int num_coded_vals; ///< number of transmitted quant unit values | |
92 | int fill_mode; | |
93 | int split_point; | |
94 | int table_type; ///< table type: 0 - tone?, 1- noise? | |
95 | int qu_wordlen[32]; ///< array of word lengths for each quant unit | |
96 | int qu_sf_idx[32]; ///< array of scale factor indexes for each quant unit | |
97 | int qu_tab_idx[32]; ///< array of code table indexes for each quant unit | |
98 | int16_t spectrum[2048]; ///< decoded IMDCT spectrum | |
99 | uint8_t power_levs[5]; ///< power compensation levels | |
100 | ||
101 | /* imdct window shape history (2 frames) for overlapping. */ | |
102 | uint8_t wnd_shape_hist[2][ATRAC3P_SUBBANDS]; ///< IMDCT window shape, 0=sine/1=steep | |
103 | uint8_t *wnd_shape; ///< IMDCT window shape for current frame | |
104 | uint8_t *wnd_shape_prev; ///< IMDCT window shape for previous frame | |
105 | ||
106 | /* gain control data history (2 frames) for overlapping. */ | |
107 | AtracGainInfo gain_data_hist[2][ATRAC3P_SUBBANDS]; ///< gain control data for all subbands | |
108 | AtracGainInfo *gain_data; ///< gain control data for next frame | |
109 | AtracGainInfo *gain_data_prev; ///< gain control data for previous frame | |
110 | int num_gain_subbands; ///< number of subbands with gain control data | |
111 | ||
112 | /* tones data history (2 frames) for overlapping. */ | |
113 | Atrac3pWavesData tones_info_hist[2][ATRAC3P_SUBBANDS]; | |
114 | Atrac3pWavesData *tones_info; | |
115 | Atrac3pWavesData *tones_info_prev; | |
116 | } Atrac3pChanParams; | |
117 | ||
118 | /* Per-unit sine wave parameters */ | |
119 | typedef struct Atrac3pWaveSynthParams { | |
120 | int tones_present; ///< 1 - tones info present | |
121 | int amplitude_mode; ///< 1 - low range, 0 - high range | |
122 | int num_tone_bands; ///< number of PQF bands with tones | |
123 | uint8_t tone_sharing[ATRAC3P_SUBBANDS]; ///< 1 - subband-wise tone sharing flags | |
124 | uint8_t tone_master[ATRAC3P_SUBBANDS]; ///< 1 - subband-wise tone channel swapping | |
125 | uint8_t phase_shift[ATRAC3P_SUBBANDS]; ///< 1 - subband-wise 180° phase shifting | |
126 | int tones_index; ///< total sum of tones in this unit | |
127 | Atrac3pWaveParam waves[48]; | |
128 | } Atrac3pWaveSynthParams; | |
129 | ||
130 | /** Channel unit parameters */ | |
131 | typedef struct Atrac3pChanUnitCtx { | |
132 | /* channel unit variables */ | |
133 | int unit_type; ///< unit type (mono/stereo) | |
134 | int num_quant_units; | |
135 | int num_subbands; | |
136 | int used_quant_units; ///< number of quant units with coded spectrum | |
137 | int num_coded_subbands; ///< number of subbands with coded spectrum | |
138 | int mute_flag; ///< mute flag | |
139 | int use_full_table; ///< 1 - full table list, 0 - restricted one | |
140 | int noise_present; ///< 1 - global noise info present | |
141 | int noise_level_index; ///< global noise level index | |
142 | int noise_table_index; ///< global noise RNG table index | |
143 | uint8_t swap_channels[ATRAC3P_SUBBANDS]; ///< 1 - perform subband-wise channel swapping | |
144 | uint8_t negate_coeffs[ATRAC3P_SUBBANDS]; ///< 1 - subband-wise IMDCT coefficients negation | |
145 | Atrac3pChanParams channels[2]; | |
146 | ||
147 | /* Variables related to GHA tones */ | |
148 | Atrac3pWaveSynthParams wave_synth_hist[2]; ///< waves synth history for two frames | |
149 | Atrac3pWaveSynthParams *waves_info; | |
150 | Atrac3pWaveSynthParams *waves_info_prev; | |
151 | ||
152 | Atrac3pIPQFChannelCtx ipqf_ctx[2]; | |
153 | DECLARE_ALIGNED(32, float, prev_buf)[2][ATRAC3P_FRAME_SAMPLES]; ///< overlapping buffer | |
154 | } Atrac3pChanUnitCtx; | |
155 | ||
156 | /** | |
157 | * Initialize VLC tables for bitstream parsing. | |
158 | */ | |
159 | void ff_atrac3p_init_vlcs(void); | |
160 | ||
161 | /** | |
162 | * Decode bitstream data of a channel unit. | |
163 | * | |
164 | * @param[in] gb the GetBit context | |
165 | * @param[in,out] ctx ptr to the channel unit context | |
166 | * @param[in] num_channels number of channels to process | |
167 | * @param[in] avctx ptr to the AVCodecContext | |
168 | * @return result code: 0 = OK, otherwise - error code | |
169 | */ | |
170 | int ff_atrac3p_decode_channel_unit(GetBitContext *gb, Atrac3pChanUnitCtx *ctx, | |
171 | int num_channels, AVCodecContext *avctx); | |
172 | ||
173 | /** | |
174 | * Initialize IMDCT transform. | |
175 | * | |
176 | * @param[in] avctx ptr to the AVCodecContext | |
177 | * @param[in] mdct_ctx pointer to MDCT transform context | |
178 | */ | |
179 | void ff_atrac3p_init_imdct(AVCodecContext *avctx, FFTContext *mdct_ctx); | |
180 | ||
181 | /** | |
182 | * Initialize sine waves synthesizer. | |
183 | */ | |
184 | void ff_atrac3p_init_wave_synth(void); | |
185 | ||
186 | /** | |
187 | * Synthesize sine waves for a particular subband. | |
188 | * | |
189 | * @param[in] ch_unit pointer to the channel unit context | |
190 | * @param[in] fdsp pointer to float DSP context | |
191 | * @param[in] ch_num which channel to process | |
192 | * @param[in] sb which subband to process | |
193 | * @param[out] out receives processed data | |
194 | */ | |
195 | void ff_atrac3p_generate_tones(Atrac3pChanUnitCtx *ch_unit, AVFloatDSPContext *fdsp, | |
196 | int ch_num, int sb, float *out); | |
197 | ||
198 | /** | |
199 | * Perform power compensation aka noise dithering. | |
200 | * | |
201 | * @param[in] ctx ptr to the channel context | |
202 | * @param[in] ch_index which channel to process | |
203 | * @param[in,out] sp ptr to channel spectrum to process | |
204 | * @param[in] rng_index indicates which RNG table to use | |
205 | * @param[in] sb_num which subband to process | |
206 | */ | |
207 | void ff_atrac3p_power_compensation(Atrac3pChanUnitCtx *ctx, int ch_index, | |
208 | float *sp, int rng_index, int sb_num); | |
209 | ||
210 | /** | |
211 | * Regular IMDCT and windowing without overlapping, | |
212 | * with spectrum reversal in the odd subbands. | |
213 | * | |
214 | * @param[in] fdsp pointer to float DSP context | |
215 | * @param[in] mdct_ctx pointer to MDCT transform context | |
216 | * @param[in] pIn float input | |
217 | * @param[out] pOut float output | |
218 | * @param[in] wind_id which MDCT window to apply | |
219 | * @param[in] sb subband number | |
220 | */ | |
221 | void ff_atrac3p_imdct(AVFloatDSPContext *fdsp, FFTContext *mdct_ctx, float *pIn, | |
222 | float *pOut, int wind_id, int sb); | |
223 | ||
224 | /** | |
225 | * Subband synthesis filter based on the polyphase quadrature (pseudo-QMF) | |
226 | * filter bank. | |
227 | * | |
228 | * @param[in] dct_ctx ptr to the pre-initialized IDCT context | |
229 | * @param[in,out] hist ptr to the filter history | |
230 | * @param[in] in input data to process | |
231 | * @param[out] out receives processed data | |
232 | */ | |
233 | void ff_atrac3p_ipqf(FFTContext *dct_ctx, Atrac3pIPQFChannelCtx *hist, | |
234 | const float *in, float *out); | |
235 | ||
236 | extern const uint16_t ff_atrac3p_qu_to_spec_pos[33]; | |
237 | extern const float ff_atrac3p_sf_tab[64]; | |
238 | extern const float ff_atrac3p_mant_tab[8]; | |
239 | ||
240 | #endif /* AVCODEC_ATRAC3PLUS_H */ |