Coverage Report

Created: 2026-10-28 08:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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