2 * Copyright (C) 2016 foo86
4 * This file is part of FFmpeg.
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.
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.
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
21 #ifndef AVCODEC_DCA_LBR_H
22 #define AVCODEC_DCA_LBR_H
24 #include "libavutil/float_dsp.h"
25 #include "libavutil/mem_internal.h"
26 #include "libavutil/tx.h"
34 #define DCA_LBR_CHANNELS 6
35 #define DCA_LBR_CHANNELS_TOTAL 32
36 #define DCA_LBR_SUBBANDS 32
37 #define DCA_LBR_TONES 512
39 #define DCA_LBR_TIME_SAMPLES 128
40 #define DCA_LBR_TIME_HISTORY 8
43 DCA_LBR_HEADER_SYNC_ONLY
= 1,
44 DCA_LBR_HEADER_DECODER_INIT
= 2
47 typedef struct DCALbrTone
{
48 uint8_t x_freq
; ///< Spectral line offset
49 uint8_t f_delt
; ///< Difference between original and center frequency
50 uint8_t ph_rot
; ///< Phase rotation
51 uint8_t pad
; ///< Padding field
52 uint8_t amp
[DCA_LBR_CHANNELS
]; ///< Per-channel amplitude
53 uint8_t phs
[DCA_LBR_CHANNELS
]; ///< Per-channel phase
56 typedef struct DCALbrDecoder
{
57 AVCodecContext
*avctx
;
60 int sample_rate
; ///< Sample rate of LBR audio
61 int ch_mask
; ///< LBR speaker mask
62 int flags
; ///< Flags for LBR decoder initialization
63 int bit_rate_orig
; ///< Original bit rate
64 int bit_rate_scaled
; ///< Scaled bit rate
66 int nchannels
; ///< Number of fullband channels to decode
67 int nchannels_total
; ///< Total number of fullband channels
68 int freq_range
; ///< Frequency range of LBR audio
69 int band_limit
; ///< Band limit factor
70 int limited_rate
; ///< Band limited sample rate
71 int limited_range
; ///< Band limited frequency range
72 int res_profile
; ///< Resolution profile
73 int nsubbands
; ///< Number of encoded subbands
74 int g3_avg_only_start_sb
; ///< Subband index where grid 3 scale factors end
75 int min_mono_subband
; ///< Subband index where mono encoding starts
76 int max_mono_subband
; ///< Subband index where mono encoding ends
78 int framenum
; ///< Lower 5 bits of current frame number
79 int lbr_rand
; ///< Seed for subband randomization
80 int warned
; ///< Flags for warning suppression
82 uint8_t quant_levels
[DCA_LBR_CHANNELS
/ 2][DCA_LBR_SUBBANDS
]; ///< Quantization levels
83 uint8_t sb_indices
[DCA_LBR_SUBBANDS
]; ///< Subband reordering indices
85 uint8_t sec_ch_sbms
[DCA_LBR_CHANNELS
/ 2][DCA_LBR_SUBBANDS
]; ///< Right channel inversion or mid/side decoding flags
86 uint8_t sec_ch_lrms
[DCA_LBR_CHANNELS
/ 2][DCA_LBR_SUBBANDS
]; ///< Flags indicating if left/right channel are swapped
87 uint32_t ch_pres
[DCA_LBR_CHANNELS
]; ///< Subband allocation flags
89 uint8_t grid_1_scf
[DCA_LBR_CHANNELS
][12][8]; ///< Grid 1 scale factors
90 uint8_t grid_2_scf
[DCA_LBR_CHANNELS
][3][64]; ///< Grid 2 scale factors
92 int8_t grid_3_avg
[DCA_LBR_CHANNELS
][DCA_LBR_SUBBANDS
- 4]; ///< Grid 3 average values
93 int8_t grid_3_scf
[DCA_LBR_CHANNELS
][DCA_LBR_SUBBANDS
- 4][8]; ///< Grid 3 scale factors
94 uint32_t grid_3_pres
[DCA_LBR_CHANNELS
]; ///< Grid 3 scale factors presence flags
96 uint8_t high_res_scf
[DCA_LBR_CHANNELS
][DCA_LBR_SUBBANDS
][8]; ///< High-frequency resolution scale factors
98 uint8_t part_stereo
[DCA_LBR_CHANNELS
][DCA_LBR_SUBBANDS
/ 4][5]; ///< Partial stereo coefficients
99 uint8_t part_stereo_pres
; ///< Partial stereo coefficients presence flags
101 float lpc_coeff
[2][DCA_LBR_CHANNELS
][3][2][8]; ///< Predictor coefficients
103 float sb_scf
[DCA_LBR_SUBBANDS
]; ///< Subband randomization scale factors
105 float *time_samples
[DCA_LBR_CHANNELS
][DCA_LBR_SUBBANDS
]; ///< Time samples
107 float *ts_buffer
; ///< Time sample buffer base
108 unsigned int ts_size
; ///< Time sample buffer size
110 DECLARE_ALIGNED(32, float, history
)[DCA_LBR_CHANNELS
][DCA_LBR_SUBBANDS
* 4]; ///< IMDCT history
111 DECLARE_ALIGNED(32, float, window
)[DCA_LBR_SUBBANDS
* 4]; ///< Long window for IMDCT
113 DECLARE_ALIGNED(32, float, lfe_data
)[64]; ///< Decimated LFE samples
114 DECLARE_ALIGNED(32, float, lfe_history
)[5][2]; ///< LFE IIR filter history
115 float lfe_scale
; ///< Scale factor of LFE samples before IIR filter
117 uint8_t tonal_scf
[6]; ///< Tonal scale factors
118 uint16_t tonal_bounds
[5][32][2]; ///< Per-group per-subframe start/end positions of tones
119 DCALbrTone tones
[DCA_LBR_TONES
]; ///< Circular buffer of tones
120 int ntones
; ///< Circular buffer head position
124 AVFloatDSPContext
*fdsp
;
125 DCADSPContext
*dcadsp
;
128 int ff_dca_lbr_parse(DCALbrDecoder
*s
, const uint8_t *data
, DCAExssAsset
*asset
);
129 int ff_dca_lbr_filter_frame(DCALbrDecoder
*s
, AVFrame
*frame
);
130 av_cold
void ff_dca_lbr_flush(DCALbrDecoder
*s
);
131 av_cold
void ff_dca_lbr_init_tables(void);
132 av_cold
int ff_dca_lbr_init(DCALbrDecoder
*s
);
133 av_cold
void ff_dca_lbr_close(DCALbrDecoder
*s
);