/src/ffmpeg/libavcodec/dca_core.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (C) 2016 foo86 |
3 | | * |
4 | | * This file is part of FFmpeg. |
5 | | * |
6 | | * FFmpeg is free software; you can redistribute it and/or |
7 | | * modify it under the terms of the GNU Lesser General Public |
8 | | * License as published by the Free Software Foundation; either |
9 | | * version 2.1 of the License, or (at your option) any later version. |
10 | | * |
11 | | * FFmpeg is distributed in the hope that it will be useful, |
12 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | | * Lesser General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU Lesser General Public |
17 | | * License along with FFmpeg; if not, write to the Free Software |
18 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | | */ |
20 | | |
21 | | #ifndef AVCODEC_DCA_CORE_H |
22 | | #define AVCODEC_DCA_CORE_H |
23 | | |
24 | | #include "libavutil/float_dsp.h" |
25 | | #include "libavutil/fixed_dsp.h" |
26 | | #include "libavutil/mem_internal.h" |
27 | | #include "libavutil/tx.h" |
28 | | |
29 | | #include "avcodec.h" |
30 | | #include "get_bits.h" |
31 | | #include "dca.h" |
32 | | #include "dca_exss.h" |
33 | | #include "dcadsp.h" |
34 | | #include "dcadct.h" |
35 | | #include "dcamath.h" |
36 | | #include "dcahuff.h" |
37 | | #include "synth_filter.h" |
38 | | |
39 | 2.33M | #define DCA_CHANNELS 7 |
40 | 57.6M | #define DCA_SUBBANDS 32 |
41 | 22.3M | #define DCA_SUBBANDS_X96 64 |
42 | | #define DCA_SUBFRAMES 16 |
43 | 69.8M | #define DCA_SUBBAND_SAMPLES 8 |
44 | 588k | #define DCA_PCMBLOCK_SAMPLES 32 |
45 | 470k | #define DCA_LFE_HISTORY 8 |
46 | 5.56M | #define DCA_ABITS_MAX 26 |
47 | | |
48 | | #define DCA_CORE_CHANNELS_MAX 6 |
49 | | #define DCA_DMIX_CHANNELS_MAX 4 |
50 | 3.21k | #define DCA_XXCH_CHANNELS_MAX 2 |
51 | | #define DCA_EXSS_CHANNELS_MAX 8 |
52 | | #define DCA_EXSS_CHSETS_MAX 4 |
53 | | |
54 | | #define DCA_FILTER_MODE_X96 0x01 |
55 | 76.9k | #define DCA_FILTER_MODE_FIXED 0x02 |
56 | | |
57 | | enum DCACoreAudioMode { |
58 | | DCA_AMODE_MONO, // Mode 0: A (mono) |
59 | | DCA_AMODE_MONO_DUAL, // Mode 1: A + B (dual mono) |
60 | | DCA_AMODE_STEREO, // Mode 2: L + R (stereo) |
61 | | DCA_AMODE_STEREO_SUMDIFF, // Mode 3: (L+R) + (L-R) (sum-diff) |
62 | | DCA_AMODE_STEREO_TOTAL, // Mode 4: LT + RT (left and right total) |
63 | | DCA_AMODE_3F, // Mode 5: C + L + R |
64 | | DCA_AMODE_2F1R, // Mode 6: L + R + S |
65 | | DCA_AMODE_3F1R, // Mode 7: C + L + R + S |
66 | | DCA_AMODE_2F2R, // Mode 8: L + R + SL + SR |
67 | | DCA_AMODE_3F2R, // Mode 9: C + L + R + SL + SR |
68 | | |
69 | | DCA_AMODE_COUNT |
70 | | }; |
71 | | |
72 | | enum DCACoreExtAudioType { |
73 | | DCA_EXT_AUDIO_XCH = 0, |
74 | | DCA_EXT_AUDIO_X96 = 2, |
75 | | DCA_EXT_AUDIO_XXCH = 6 |
76 | | }; |
77 | | |
78 | | enum DCACoreLFEFlag { |
79 | | DCA_LFE_FLAG_NONE, |
80 | | DCA_LFE_FLAG_128, |
81 | | DCA_LFE_FLAG_64, |
82 | | DCA_LFE_FLAG_INVALID |
83 | | }; |
84 | | |
85 | | typedef struct DCADSPData { |
86 | | union { |
87 | | struct { |
88 | | DECLARE_ALIGNED(32, float, hist1)[1024]; |
89 | | DECLARE_ALIGNED(32, float, hist2)[64]; |
90 | | } flt; |
91 | | struct { |
92 | | DECLARE_ALIGNED(32, int32_t, hist1)[1024]; |
93 | | DECLARE_ALIGNED(32, int32_t, hist2)[64]; |
94 | | } fix; |
95 | | } u; |
96 | | int offset; |
97 | | } DCADSPData; |
98 | | |
99 | | typedef struct DCACoreDecoder { |
100 | | AVCodecContext *avctx; |
101 | | GetBitContext gb; |
102 | | GetBitContext gb_in; |
103 | | |
104 | | // Bit stream header |
105 | | int crc_present; ///< CRC present flag |
106 | | int npcmblocks; ///< Number of PCM sample blocks |
107 | | int frame_size; ///< Primary frame byte size |
108 | | int audio_mode; ///< Audio channel arrangement |
109 | | int sample_rate; ///< Core audio sampling frequency |
110 | | int bit_rate; ///< Transmission bit rate |
111 | | int drc_present; ///< Embedded dynamic range flag |
112 | | int ts_present; ///< Embedded time stamp flag |
113 | | int aux_present; ///< Auxiliary data flag |
114 | | int ext_audio_type; ///< Extension audio descriptor flag |
115 | | int ext_audio_present; ///< Extended coding flag |
116 | | int sync_ssf; ///< Audio sync word insertion flag |
117 | | int lfe_present; ///< Low frequency effects flag |
118 | | int predictor_history; ///< Predictor history flag switch |
119 | | int filter_perfect; ///< Multirate interpolator switch |
120 | | int source_pcm_res; ///< Source PCM resolution |
121 | | int es_format; ///< Extended surround (ES) mastering flag |
122 | | int sumdiff_front; ///< Front sum/difference flag |
123 | | int sumdiff_surround; ///< Surround sum/difference flag |
124 | | |
125 | | // Primary audio coding header |
126 | | int nsubframes; ///< Number of subframes |
127 | | int nchannels; ///< Number of primary audio channels (incl. extension channels) |
128 | | int ch_mask; ///< Speaker layout mask (incl. LFE and extension channels) |
129 | | int8_t nsubbands[DCA_CHANNELS]; ///< Subband activity count |
130 | | int8_t subband_vq_start[DCA_CHANNELS]; ///< High frequency VQ start subband |
131 | | int8_t joint_intensity_index[DCA_CHANNELS]; ///< Joint intensity coding index |
132 | | int8_t transition_mode_sel[DCA_CHANNELS]; ///< Transient mode code book |
133 | | int8_t scale_factor_sel[DCA_CHANNELS]; ///< Scale factor code book |
134 | | int8_t bit_allocation_sel[DCA_CHANNELS]; ///< Bit allocation quantizer select |
135 | | int8_t quant_index_sel[DCA_CHANNELS][DCA_CODE_BOOKS]; ///< Quantization index codebook select |
136 | | int32_t scale_factor_adj[DCA_CHANNELS][DCA_CODE_BOOKS]; ///< Scale factor adjustment |
137 | | |
138 | | // Primary audio coding side information |
139 | | int8_t nsubsubframes[DCA_SUBFRAMES]; ///< Subsubframe count for each subframe |
140 | | int8_t prediction_mode[DCA_CHANNELS][DCA_SUBBANDS_X96]; ///< Prediction mode |
141 | | int16_t prediction_vq_index[DCA_CHANNELS][DCA_SUBBANDS_X96]; ///< Prediction coefficients VQ address |
142 | | int8_t bit_allocation[DCA_CHANNELS][DCA_SUBBANDS_X96]; ///< Bit allocation index |
143 | | int8_t transition_mode[DCA_SUBFRAMES][DCA_CHANNELS][DCA_SUBBANDS]; ///< Transition mode |
144 | | int32_t scale_factors[DCA_CHANNELS][DCA_SUBBANDS][2]; ///< Scale factors (2x for transients and X96) |
145 | | int8_t joint_scale_sel[DCA_CHANNELS]; ///< Joint subband codebook select |
146 | | int32_t joint_scale_factors[DCA_CHANNELS][DCA_SUBBANDS_X96]; ///< Scale factors for joint subband coding |
147 | | |
148 | | // Auxiliary data |
149 | | int prim_dmix_embedded; ///< Auxiliary dynamic downmix flag |
150 | | int prim_dmix_type; ///< Auxiliary primary channel downmix type |
151 | | int prim_dmix_coeff[DCA_DMIX_CHANNELS_MAX * DCA_CORE_CHANNELS_MAX]; ///< Dynamic downmix code coefficients |
152 | | |
153 | | // Core extensions |
154 | | int ext_audio_mask; ///< Bit mask of fully decoded core extensions |
155 | | |
156 | | // XCH extension data |
157 | | int xch_pos; ///< Bit position of XCH frame in core substream |
158 | | |
159 | | // XXCH extension data |
160 | | int xxch_crc_present; ///< CRC presence flag for XXCH channel set header |
161 | | int xxch_mask_nbits; ///< Number of bits for loudspeaker mask |
162 | | int xxch_core_mask; ///< Core loudspeaker activity mask |
163 | | int xxch_spkr_mask; ///< Loudspeaker layout mask |
164 | | int xxch_dmix_embedded; ///< Downmix already performed by encoder |
165 | | int xxch_dmix_scale_inv; ///< Downmix scale factor |
166 | | int xxch_dmix_mask[DCA_XXCH_CHANNELS_MAX]; ///< Downmix channel mapping mask |
167 | | int xxch_dmix_coeff[DCA_XXCH_CHANNELS_MAX * DCA_CORE_CHANNELS_MAX]; ///< Downmix coefficients |
168 | | int xxch_pos; ///< Bit position of XXCH frame in core substream |
169 | | |
170 | | // X96 extension data |
171 | | int x96_rev_no; ///< X96 revision number |
172 | | int x96_crc_present; ///< CRC presence flag for X96 channel set header |
173 | | int x96_nchannels; ///< Number of primary channels in X96 extension |
174 | | int x96_high_res; ///< X96 high resolution flag |
175 | | int x96_subband_start; ///< First encoded subband in X96 extension |
176 | | int x96_rand; ///< Random seed for generating samples for unallocated X96 subbands |
177 | | int x96_pos; ///< Bit position of X96 frame in core substream |
178 | | |
179 | | // Sample buffers |
180 | | unsigned int x96_subband_size; |
181 | | int32_t *x96_subband_buffer; ///< X96 subband sample buffer base |
182 | | int32_t *x96_subband_samples[DCA_CHANNELS][DCA_SUBBANDS_X96]; ///< X96 subband samples |
183 | | |
184 | | unsigned int subband_size; |
185 | | int32_t *subband_buffer; ///< Subband sample buffer base |
186 | | int32_t *subband_samples[DCA_CHANNELS][DCA_SUBBANDS]; ///< Subband samples |
187 | | int32_t *lfe_samples; ///< Decimated LFE samples |
188 | | |
189 | | // DSP contexts |
190 | | DCADSPData dcadsp_data[DCA_CHANNELS]; ///< FIR history buffers |
191 | | DCADSPContext *dcadsp; |
192 | | DCADCTContext dcadct; |
193 | | AVTXContext *imdct[2]; |
194 | | av_tx_fn imdct_fn[2]; |
195 | | SynthFilterContext synth; |
196 | | AVFloatDSPContext *float_dsp; |
197 | | AVFixedDSPContext *fixed_dsp; |
198 | | |
199 | | // PCM output data |
200 | | unsigned int output_size; |
201 | | void *output_buffer; ///< PCM output buffer base |
202 | | int32_t *output_samples[DCA_SPEAKER_COUNT]; ///< PCM output for fixed point mode |
203 | | int32_t output_history_lfe_fixed; ///< LFE PCM history for X96 filter |
204 | | float output_history_lfe_float; ///< LFE PCM history for X96 filter |
205 | | |
206 | | int ch_remap[DCA_SPEAKER_COUNT]; ///< Channel to speaker map |
207 | | int request_mask; ///< Requested channel layout (for stereo downmix) |
208 | | |
209 | | int npcmsamples; ///< Number of PCM samples per channel |
210 | | int output_rate; ///< Output sample rate (1x or 2x header rate) |
211 | | |
212 | | int filter_mode; ///< Previous filtering mode for detecting changes |
213 | | } DCACoreDecoder; |
214 | | |
215 | | static inline int ff_dca_core_map_spkr(DCACoreDecoder *core, int spkr) |
216 | 23.3k | { |
217 | 23.3k | if (core->ch_mask & (1U << spkr)) |
218 | 16.5k | return spkr; |
219 | 6.81k | if (spkr == DCA_SPEAKER_Lss && (core->ch_mask & DCA_SPEAKER_MASK_Ls)) |
220 | 352 | return DCA_SPEAKER_Ls; |
221 | 6.46k | if (spkr == DCA_SPEAKER_Rss && (core->ch_mask & DCA_SPEAKER_MASK_Rs)) |
222 | 378 | return DCA_SPEAKER_Rs; |
223 | 6.08k | return -1; |
224 | 6.46k | } Unexecuted instantiation: dca_parser.c:ff_dca_core_map_spkr Unexecuted instantiation: dca.c:ff_dca_core_map_spkr Unexecuted instantiation: dca_exss.c:ff_dca_core_map_spkr Unexecuted instantiation: dcaenc.c:ff_dca_core_map_spkr Unexecuted instantiation: dcaadpcm.c:ff_dca_core_map_spkr Unexecuted instantiation: dcadec.c:ff_dca_core_map_spkr Unexecuted instantiation: dca_core.c:ff_dca_core_map_spkr Unexecuted instantiation: dca_lbr.c:ff_dca_core_map_spkr dca_xll.c:ff_dca_core_map_spkr Line | Count | Source | 216 | 23.3k | { | 217 | 23.3k | if (core->ch_mask & (1U << spkr)) | 218 | 16.5k | return spkr; | 219 | 6.81k | if (spkr == DCA_SPEAKER_Lss && (core->ch_mask & DCA_SPEAKER_MASK_Ls)) | 220 | 352 | return DCA_SPEAKER_Ls; | 221 | 6.46k | if (spkr == DCA_SPEAKER_Rss && (core->ch_mask & DCA_SPEAKER_MASK_Rs)) | 222 | 378 | return DCA_SPEAKER_Rs; | 223 | 6.08k | return -1; | 224 | 6.46k | } |
|
225 | | |
226 | | static inline void ff_dca_core_dequantize(int32_t *output, const int32_t *input, |
227 | | int32_t step_size, int32_t scale, int residual, int len) |
228 | 8.73M | { |
229 | | // Account for quantizer step size |
230 | 8.73M | int64_t step_scale = (int64_t)step_size * scale; |
231 | 8.73M | int n, shift = 0; |
232 | | |
233 | | // Limit scale factor resolution to 22 bits |
234 | 8.73M | if (step_scale > (1 << 23)) { |
235 | 5.51M | shift = av_log2(step_scale >> 23) + 1; |
236 | 5.51M | step_scale >>= shift; |
237 | 5.51M | } |
238 | | |
239 | | // Scale the samples |
240 | 8.73M | if (residual) { |
241 | 4.20M | for (n = 0; n < len; n++) |
242 | 3.73M | output[n] += clip23(norm__(input[n] * step_scale, 22 - shift)); |
243 | 8.26M | } else { |
244 | 74.4M | for (n = 0; n < len; n++) |
245 | 66.1M | output[n] = clip23(norm__(input[n] * step_scale, 22 - shift)); |
246 | 8.26M | } |
247 | 8.73M | } Unexecuted instantiation: dca_parser.c:ff_dca_core_dequantize Unexecuted instantiation: dca.c:ff_dca_core_dequantize Unexecuted instantiation: dca_exss.c:ff_dca_core_dequantize Unexecuted instantiation: dcaenc.c:ff_dca_core_dequantize Unexecuted instantiation: dcaadpcm.c:ff_dca_core_dequantize Unexecuted instantiation: dcadec.c:ff_dca_core_dequantize dca_core.c:ff_dca_core_dequantize Line | Count | Source | 228 | 8.73M | { | 229 | | // Account for quantizer step size | 230 | 8.73M | int64_t step_scale = (int64_t)step_size * scale; | 231 | 8.73M | int n, shift = 0; | 232 | | | 233 | | // Limit scale factor resolution to 22 bits | 234 | 8.73M | if (step_scale > (1 << 23)) { | 235 | 5.51M | shift = av_log2(step_scale >> 23) + 1; | 236 | 5.51M | step_scale >>= shift; | 237 | 5.51M | } | 238 | | | 239 | | // Scale the samples | 240 | 8.73M | if (residual) { | 241 | 4.20M | for (n = 0; n < len; n++) | 242 | 3.73M | output[n] += clip23(norm__(input[n] * step_scale, 22 - shift)); | 243 | 8.26M | } else { | 244 | 74.4M | for (n = 0; n < len; n++) | 245 | 66.1M | output[n] = clip23(norm__(input[n] * step_scale, 22 - shift)); | 246 | 8.26M | } | 247 | 8.73M | } |
Unexecuted instantiation: dca_lbr.c:ff_dca_core_dequantize Unexecuted instantiation: dca_xll.c:ff_dca_core_dequantize |
248 | | |
249 | | int ff_dca_core_parse(DCACoreDecoder *s, const uint8_t *data, int size); |
250 | | int ff_dca_core_parse_exss(DCACoreDecoder *s, const uint8_t *data, DCAExssAsset *asset); |
251 | | int ff_dca_core_filter_fixed(DCACoreDecoder *s, int x96_synth); |
252 | | int ff_dca_core_filter_frame(DCACoreDecoder *s, AVFrame *frame); |
253 | | av_cold void ff_dca_core_flush(DCACoreDecoder *s); |
254 | | av_cold int ff_dca_core_init(DCACoreDecoder *s); |
255 | | av_cold void ff_dca_core_close(DCACoreDecoder *s); |
256 | | |
257 | | #endif |