FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/dca_core.h
Date: 2024-03-28 14:59:00
Exec Total Coverage
Lines: 20 20 100.0%
Functions: 2 2 100.0%
Branches: 16 18 88.9%

Line Branch Exec 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 #define DCA_CHANNELS 7
40 #define DCA_SUBBANDS 32
41 #define DCA_SUBBANDS_X96 64
42 #define DCA_SUBFRAMES 16
43 #define DCA_SUBBAND_SAMPLES 8
44 #define DCA_PCMBLOCK_SAMPLES 32
45 #define DCA_LFE_HISTORY 8
46 #define DCA_ABITS_MAX 26
47
48 #define DCA_CORE_CHANNELS_MAX 6
49 #define DCA_DMIX_CHANNELS_MAX 4
50 #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 #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 7775 static inline int ff_dca_core_map_spkr(DCACoreDecoder *core, int spkr)
216 {
217
2/2
✓ Branch 0 taken 7655 times.
✓ Branch 1 taken 120 times.
7775 if (core->ch_mask & (1U << spkr))
218 7655 return spkr;
219
3/4
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
120 if (spkr == DCA_SPEAKER_Lss && (core->ch_mask & DCA_SPEAKER_MASK_Ls))
220 48 return DCA_SPEAKER_Ls;
221
3/4
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
72 if (spkr == DCA_SPEAKER_Rss && (core->ch_mask & DCA_SPEAKER_MASK_Rs))
222 48 return DCA_SPEAKER_Rs;
223 24 return -1;
224 }
225
226 681852 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 {
229 // Account for quantizer step size
230 681852 int64_t step_scale = (int64_t)step_size * scale;
231 681852 int n, shift = 0;
232
233 // Limit scale factor resolution to 22 bits
234
2/2
✓ Branch 0 taken 471989 times.
✓ Branch 1 taken 209863 times.
681852 if (step_scale > (1 << 23)) {
235 471989 shift = av_log2(step_scale >> 23) + 1;
236 471989 step_scale >>= shift;
237 }
238
239 // Scale the samples
240
2/2
✓ Branch 0 taken 4662 times.
✓ Branch 1 taken 677190 times.
681852 if (residual) {
241
2/2
✓ Branch 0 taken 37296 times.
✓ Branch 1 taken 4662 times.
41958 for (n = 0; n < len; n++)
242 37296 output[n] += clip23(norm__(input[n] * step_scale, 22 - shift));
243 } else {
244
2/2
✓ Branch 0 taken 5152816 times.
✓ Branch 1 taken 677190 times.
5830006 for (n = 0; n < len; n++)
245 5152816 output[n] = clip23(norm__(input[n] * step_scale, 22 - shift));
246 }
247 681852 }
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
258