FFmpeg
Loading...
Searching...
No Matches
dca_core.h
Go to the documentation of this file.
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"
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
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
70};
71
77
84
85typedef struct DCADSPData {
86 union {
87 struct {
88 DECLARE_ALIGNED(32, float, hist1)[1024];
89 DECLARE_ALIGNED(32, float, hist2)[64];
90 } flt;
91 struct {
94 } fix;
95 } u;
96 int offset;
98
99typedef struct DCACoreDecoder {
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
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
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
183
184 unsigned int subband_size;
185 int32_t *subband_buffer; ///< Subband sample buffer base
187 int32_t *lfe_samples; ///< Decimated LFE samples
188
189 // DSP contexts
190 DCADSPData dcadsp_data[DCA_CHANNELS]; ///< FIR history buffers
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
214
215static inline int ff_dca_core_map_spkr(DCACoreDecoder *core, int spkr)
216{
217 if (core->ch_mask & (1U << spkr))
218 return spkr;
219 if (spkr == DCA_SPEAKER_Lss && (core->ch_mask & DCA_SPEAKER_MASK_Ls))
220 return DCA_SPEAKER_Ls;
221 if (spkr == DCA_SPEAKER_Rss && (core->ch_mask & DCA_SPEAKER_MASK_Rs))
222 return DCA_SPEAKER_Rs;
223 return -1;
224}
225
226static 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 int64_t step_scale = (int64_t)step_size * scale;
231 int n, shift = 0;
232
233 // Limit scale factor resolution to 22 bits
234 if (step_scale > (1 << 23)) {
235 shift = av_log2(step_scale >> 23) + 1;
236 step_scale >>= shift;
237 }
238
239 // Scale the samples
240 if (residual) {
241 for (n = 0; n < len; n++)
242 output[n] += clip23(norm__(input[n] * step_scale, 22 - shift));
243 } else {
244 for (n = 0; n < len; n++)
245 output[n] = clip23(norm__(input[n] * step_scale, 22 - shift));
246 }
247}
248
249int ff_dca_core_parse(DCACoreDecoder *s, const uint8_t *data, int size);
250int ff_dca_core_parse_exss(DCACoreDecoder *s, const uint8_t *data, DCAExssAsset *asset);
251int ff_dca_core_filter_fixed(DCACoreDecoder *s, int x96_synth);
256
257#endif
int32_t
Libavcodec external API header.
#define s(width, name)
Definition cbs_vp9.c:198
long long int64_t
Definition coverity.c:34
@ DCA_SPEAKER_Rs
Definition dca.h:79
@ DCA_SPEAKER_COUNT
Definition dca.h:87
@ DCA_SPEAKER_Lss
Definition dca.h:80
@ DCA_SPEAKER_Rss
Definition dca.h:80
@ DCA_SPEAKER_Ls
Definition dca.h:78
@ DCA_SPEAKER_MASK_Ls
Definition dca.h:94
@ DCA_SPEAKER_MASK_Rs
Definition dca.h:95
DCACoreExtAudioType
Definition dca_core.h:72
@ DCA_EXT_AUDIO_X96
Definition dca_core.h:74
@ DCA_EXT_AUDIO_XXCH
Definition dca_core.h:75
@ DCA_EXT_AUDIO_XCH
Definition dca_core.h:73
static void ff_dca_core_dequantize(int32_t *output, const int32_t *input, int32_t step_size, int32_t scale, int residual, int len)
Definition dca_core.h:226
#define DCA_SUBFRAMES
Definition dca_core.h:42
#define DCA_XXCH_CHANNELS_MAX
Definition dca_core.h:50
int ff_dca_core_filter_fixed(DCACoreDecoder *s, int x96_synth)
Definition dca_core.c:1957
int ff_dca_core_parse_exss(DCACoreDecoder *s, const uint8_t *data, DCAExssAsset *asset)
Definition dca_core.c:1829
#define DCA_CHANNELS
Definition dca_core.h:39
#define DCA_CORE_CHANNELS_MAX
Definition dca_core.h:48
static int ff_dca_core_map_spkr(DCACoreDecoder *core, int spkr)
Definition dca_core.h:215
av_cold int ff_dca_core_init(DCACoreDecoder *s)
Definition dca_core.c:2422
av_cold void ff_dca_core_flush(DCACoreDecoder *s)
Definition dca_core.c:2409
DCACoreAudioMode
Definition dca_core.h:57
@ DCA_AMODE_2F2R
Definition dca_core.h:66
@ DCA_AMODE_STEREO_TOTAL
Definition dca_core.h:62
@ DCA_AMODE_STEREO_SUMDIFF
Definition dca_core.h:61
@ DCA_AMODE_STEREO
Definition dca_core.h:60
@ DCA_AMODE_3F
Definition dca_core.h:63
@ DCA_AMODE_3F2R
Definition dca_core.h:67
@ DCA_AMODE_MONO
Definition dca_core.h:58
@ DCA_AMODE_2F1R
Definition dca_core.h:64
@ DCA_AMODE_COUNT
Definition dca_core.h:69
@ DCA_AMODE_3F1R
Definition dca_core.h:65
@ DCA_AMODE_MONO_DUAL
Definition dca_core.h:59
#define DCA_SUBBANDS
Definition dca_core.h:40
#define DCA_DMIX_CHANNELS_MAX
Definition dca_core.h:49
av_cold void ff_dca_core_close(DCACoreDecoder *s)
Definition dca_core.c:2448
int ff_dca_core_parse(DCACoreDecoder *s, const uint8_t *data, int size)
Definition dca_core.c:1796
int ff_dca_core_filter_frame(DCACoreDecoder *s, AVFrame *frame)
Definition dca_core.c:2344
DCACoreLFEFlag
Definition dca_core.h:78
@ DCA_LFE_FLAG_NONE
Definition dca_core.h:79
@ DCA_LFE_FLAG_INVALID
Definition dca_core.h:82
@ DCA_LFE_FLAG_64
Definition dca_core.h:81
@ DCA_LFE_FLAG_128
Definition dca_core.h:80
#define DCA_SUBBANDS_X96
Definition dca_core.h:41
#define DCA_CODE_BOOKS
Definition dcahuff.h:32
static int32_t norm__(int64_t a, int bits)
Definition dcamath.h:27
static int32_t clip23(int32_t a)
Definition dcamath.h:54
static AVFrame * frame
bitstream reader API header.
#define av_log2
Definition intmath.h:84
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition intra.c:278
static int shift(int a, int b)
Definition bonk.c:261
#define u(width, name, range_min, range_max)
Definition cbs_apv.c:68
#define av_cold
Definition attributes.h:117
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
const char data[16]
Definition mxf.c:149
main external API structure.
Definition avcodec.h:443
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
int x96_subband_start
First encoded subband in X96 extension.
Definition dca_core.h:175
int filter_perfect
Multirate interpolator switch.
Definition dca_core.h:119
int nchannels
Number of primary audio channels (incl. extension channels)
Definition dca_core.h:127
int xxch_dmix_coeff[DCA_XXCH_CHANNELS_MAX *DCA_CORE_CHANNELS_MAX]
Downmix coefficients.
Definition dca_core.h:167
int prim_dmix_embedded
Auxiliary dynamic downmix flag.
Definition dca_core.h:149
int32_t * subband_buffer
Subband sample buffer base.
Definition dca_core.h:185
int filter_mode
Previous filtering mode for detecting changes.
Definition dca_core.h:212
int x96_high_res
X96 high resolution flag.
Definition dca_core.h:174
int8_t nsubbands[DCA_CHANNELS]
Subband activity count.
Definition dca_core.h:129
int npcmblocks
Number of PCM sample blocks.
Definition dca_core.h:106
int sync_ssf
Audio sync word insertion flag.
Definition dca_core.h:116
DCADCTContext dcadct
Definition dca_core.h:192
AVFloatDSPContext * float_dsp
Definition dca_core.h:196
int xxch_spkr_mask
Loudspeaker layout mask.
Definition dca_core.h:163
int source_pcm_res
Source PCM resolution.
Definition dca_core.h:120
int16_t prediction_vq_index[DCA_CHANNELS][DCA_SUBBANDS_X96]
Prediction coefficients VQ address.
Definition dca_core.h:141
int x96_pos
Bit position of X96 frame in core substream.
Definition dca_core.h:177
float output_history_lfe_float
LFE PCM history for X96 filter.
Definition dca_core.h:204
int x96_crc_present
CRC presence flag for X96 channel set header.
Definition dca_core.h:172
DCADSPData dcadsp_data[DCA_CHANNELS]
FIR history buffers.
Definition dca_core.h:190
int es_format
Extended surround (ES) mastering flag.
Definition dca_core.h:121
int xch_pos
Bit position of XCH frame in core substream.
Definition dca_core.h:157
AVFixedDSPContext * fixed_dsp
Definition dca_core.h:197
int8_t transition_mode_sel[DCA_CHANNELS]
Transient mode code book.
Definition dca_core.h:132
int8_t prediction_mode[DCA_CHANNELS][DCA_SUBBANDS_X96]
Prediction mode.
Definition dca_core.h:140
int8_t bit_allocation_sel[DCA_CHANNELS]
Bit allocation quantizer select.
Definition dca_core.h:134
int8_t bit_allocation[DCA_CHANNELS][DCA_SUBBANDS_X96]
Bit allocation index.
Definition dca_core.h:142
int npcmsamples
Number of PCM samples per channel.
Definition dca_core.h:209
int xxch_core_mask
Core loudspeaker activity mask.
Definition dca_core.h:162
int ext_audio_mask
Bit mask of fully decoded core extensions.
Definition dca_core.h:154
int prim_dmix_type
Auxiliary primary channel downmix type.
Definition dca_core.h:150
AVCodecContext * avctx
Definition dca_core.h:100
int8_t quant_index_sel[DCA_CHANNELS][DCA_CODE_BOOKS]
Quantization index codebook select.
Definition dca_core.h:135
int audio_mode
Audio channel arrangement.
Definition dca_core.h:108
int crc_present
CRC present flag.
Definition dca_core.h:105
int ch_remap[DCA_SPEAKER_COUNT]
Channel to speaker map.
Definition dca_core.h:206
SynthFilterContext synth
Definition dca_core.h:195
int32_t scale_factor_adj[DCA_CHANNELS][DCA_CODE_BOOKS]
Scale factor adjustment.
Definition dca_core.h:136
int aux_present
Auxiliary data flag.
Definition dca_core.h:113
int nsubframes
Number of subframes.
Definition dca_core.h:126
AVTXContext * imdct[2]
Definition dca_core.h:193
int request_mask
Requested channel layout (for stereo downmix)
Definition dca_core.h:207
int32_t output_history_lfe_fixed
LFE PCM history for X96 filter.
Definition dca_core.h:203
void * output_buffer
PCM output buffer base.
Definition dca_core.h:201
int xxch_dmix_embedded
Downmix already performed by encoder.
Definition dca_core.h:164
int32_t * lfe_samples
Decimated LFE samples.
Definition dca_core.h:187
int32_t * x96_subband_buffer
X96 subband sample buffer base.
Definition dca_core.h:181
int8_t nsubsubframes[DCA_SUBFRAMES]
Subsubframe count for each subframe.
Definition dca_core.h:139
int output_rate
Output sample rate (1x or 2x header rate)
Definition dca_core.h:210
int8_t joint_intensity_index[DCA_CHANNELS]
Joint intensity coding index.
Definition dca_core.h:131
GetBitContext gb
Definition dca_core.h:101
int32_t * x96_subband_samples[DCA_CHANNELS][DCA_SUBBANDS_X96]
X96 subband samples.
Definition dca_core.h:182
int ext_audio_type
Extension audio descriptor flag.
Definition dca_core.h:114
int x96_nchannels
Number of primary channels in X96 extension.
Definition dca_core.h:173
int8_t scale_factor_sel[DCA_CHANNELS]
Scale factor code book.
Definition dca_core.h:133
int lfe_present
Low frequency effects flag.
Definition dca_core.h:117
int xxch_crc_present
CRC presence flag for XXCH channel set header.
Definition dca_core.h:160
int ts_present
Embedded time stamp flag.
Definition dca_core.h:112
int8_t joint_scale_sel[DCA_CHANNELS]
Joint subband codebook select.
Definition dca_core.h:145
int frame_size
Primary frame byte size.
Definition dca_core.h:107
int predictor_history
Predictor history flag switch.
Definition dca_core.h:118
int8_t subband_vq_start[DCA_CHANNELS]
High frequency VQ start subband.
Definition dca_core.h:130
int32_t * subband_samples[DCA_CHANNELS][DCA_SUBBANDS]
Subband samples.
Definition dca_core.h:186
int prim_dmix_coeff[DCA_DMIX_CHANNELS_MAX *DCA_CORE_CHANNELS_MAX]
Dynamic downmix code coefficients.
Definition dca_core.h:151
int xxch_mask_nbits
Number of bits for loudspeaker mask.
Definition dca_core.h:161
DCADSPContext * dcadsp
Definition dca_core.h:191
unsigned int subband_size
Definition dca_core.h:184
int sumdiff_surround
Surround sum/difference flag.
Definition dca_core.h:123
unsigned int x96_subband_size
Definition dca_core.h:180
GetBitContext gb_in
Definition dca_core.h:102
int bit_rate
Transmission bit rate.
Definition dca_core.h:110
int xxch_dmix_mask[DCA_XXCH_CHANNELS_MAX]
Downmix channel mapping mask.
Definition dca_core.h:166
int drc_present
Embedded dynamic range flag.
Definition dca_core.h:111
int sample_rate
Core audio sampling frequency.
Definition dca_core.h:109
av_tx_fn imdct_fn[2]
Definition dca_core.h:194
int x96_rev_no
X96 revision number.
Definition dca_core.h:171
int32_t scale_factors[DCA_CHANNELS][DCA_SUBBANDS][2]
Scale factors (2x for transients and X96)
Definition dca_core.h:144
int xxch_pos
Bit position of XXCH frame in core substream.
Definition dca_core.h:168
int sumdiff_front
Front sum/difference flag.
Definition dca_core.h:122
int8_t transition_mode[DCA_SUBFRAMES][DCA_CHANNELS][DCA_SUBBANDS]
Transition mode.
Definition dca_core.h:143
int ch_mask
Speaker layout mask (incl. LFE and extension channels)
Definition dca_core.h:128
int ext_audio_present
Extended coding flag.
Definition dca_core.h:115
int x96_rand
Random seed for generating samples for unallocated X96 subbands.
Definition dca_core.h:176
int32_t * output_samples[DCA_SPEAKER_COUNT]
PCM output for fixed point mode.
Definition dca_core.h:202
int32_t joint_scale_factors[DCA_CHANNELS][DCA_SUBBANDS_X96]
Scale factors for joint subband coding.
Definition dca_core.h:146
unsigned int output_size
Definition dca_core.h:200
int xxch_dmix_scale_inv
Downmix scale factor.
Definition dca_core.h:165
float hist1[1024]
Definition dca_core.h:88
struct DCADSPData::@026267330317102125164006340076120167260057005157::@257110016357037026175163252007121244125223142343 flt
int offset
Definition dca_core.h:96
float hist2[64]
Definition dca_core.h:89
struct DCADSPData::@026267330317102125164006340076120167260057005157::@146356104373250037003266246367200042267265323314 fix
int size
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition tx.h:151
int len