FFmpeg
dca_lbr.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_LBR_H
22 #define AVCODEC_DCA_LBR_H
23 
24 #include "libavutil/float_dsp.h"
25 #include "libavutil/mem_internal.h"
26 #include "libavutil/tx.h"
27 
28 #include "avcodec.h"
29 #include "get_bits.h"
30 #include "dca.h"
31 #include "dca_exss.h"
32 #include "dcadsp.h"
33 
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
38 
39 #define DCA_LBR_TIME_SAMPLES 128
40 #define DCA_LBR_TIME_HISTORY 8
41 
45 };
46 
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
54 } DCALbrTone;
55 
56 typedef struct DCALbrDecoder {
59 
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
65 
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
77 
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
81 
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
84 
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
88 
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
91 
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
95 
96  uint8_t high_res_scf[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS][8]; ///< High-frequency resolution scale factors
97 
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
100 
101  float lpc_coeff[2][DCA_LBR_CHANNELS][3][2][8]; ///< Predictor coefficients
102 
103  float sb_scf[DCA_LBR_SUBBANDS]; ///< Subband randomization scale factors
104 
105  float *time_samples[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS]; ///< Time samples
106 
107  float *ts_buffer; ///< Time sample buffer base
108  unsigned int ts_size; ///< Time sample buffer size
109 
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
112 
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
116 
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
121 
126 } DCALbrDecoder;
127 
128 int ff_dca_lbr_parse(DCALbrDecoder *s, const uint8_t *data, DCAExssAsset *asset);
134 
135 #endif
DCALbrDecoder::bit_rate_orig
int bit_rate_orig
Original bit rate.
Definition: dca_lbr.h:63
DCALbrDecoder::ts_buffer
float * ts_buffer
Time sample buffer base.
Definition: dca_lbr.h:107
DCALbrDecoder::min_mono_subband
int min_mono_subband
Subband index where mono encoding starts.
Definition: dca_lbr.h:75
DCALbrDecoder::ch_mask
int ch_mask
LBR speaker mask.
Definition: dca_lbr.h:61
mem_internal.h
dca.h
DCALbrDecoder::lfe_history
float lfe_history[5][2]
LFE IIR filter history.
Definition: dca_lbr.h:114
AVTXContext
Definition: tx_priv.h:235
DCALbrDecoder::imdct_fn
av_tx_fn imdct_fn
Definition: dca_lbr.h:123
ff_dca_lbr_init_tables
av_cold void ff_dca_lbr_init_tables(void)
Definition: dca_lbr.c:135
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:389
DCALbrDecoder::tones
DCALbrTone tones[DCA_LBR_TONES]
Circular buffer of tones.
Definition: dca_lbr.h:119
DCALbrDecoder::dcadsp
DCADSPContext * dcadsp
Definition: dca_lbr.h:125
data
const char data[16]
Definition: mxf.c:149
DCALbrTone::phs
uint8_t phs[DCA_LBR_CHANNELS]
Per-channel phase.
Definition: dca_lbr.h:53
DCALbrDecoder::imdct
AVTXContext * imdct
Definition: dca_lbr.h:122
DCALbrTone::x_freq
uint8_t x_freq
Spectral line offset.
Definition: dca_lbr.h:48
DCALbrDecoder::grid_2_scf
uint8_t grid_2_scf[DCA_LBR_CHANNELS][3][64]
Grid 2 scale factors.
Definition: dca_lbr.h:90
DCALbrDecoder::max_mono_subband
int max_mono_subband
Subband index where mono encoding ends.
Definition: dca_lbr.h:76
DCAExssAsset
Definition: dca_exss.h:29
GetBitContext
Definition: get_bits.h:108
DCALbrTone::amp
uint8_t amp[DCA_LBR_CHANNELS]
Per-channel amplitude.
Definition: dca_lbr.h:52
DCALbrDecoder::part_stereo
uint8_t part_stereo[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS/4][5]
Partial stereo coefficients.
Definition: dca_lbr.h:98
DCALbrDecoder::nchannels_total
int nchannels_total
Total number of fullband channels.
Definition: dca_lbr.h:67
DCALbrDecoder::gb
GetBitContext gb
Definition: dca_lbr.h:58
av_cold
#define av_cold
Definition: attributes.h:90
av_tx_fn
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
DCALbrDecoder::g3_avg_only_start_sb
int g3_avg_only_start_sb
Subband index where grid 3 scale factors end.
Definition: dca_lbr.h:74
s
#define s(width, name)
Definition: cbs_vp9.c:198
DCALbrDecoder::res_profile
int res_profile
Resolution profile.
Definition: dca_lbr.h:72
DCALbrDecoder::tonal_scf
uint8_t tonal_scf[6]
Tonal scale factors.
Definition: dca_lbr.h:117
DCALbrDecoder::window
float window[DCA_LBR_SUBBANDS *4]
Long window for IMDCT.
Definition: dca_lbr.h:111
DCALbrDecoder::grid_3_scf
int8_t grid_3_scf[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS - 4][8]
Grid 3 scale factors.
Definition: dca_lbr.h:93
DCALbrDecoder::freq_range
int freq_range
Frequency range of LBR audio.
Definition: dca_lbr.h:68
get_bits.h
DCALbrDecoder::nchannels
int nchannels
Number of fullband channels to decode.
Definition: dca_lbr.h:66
DCALbrDecoder::limited_range
int limited_range
Band limited frequency range.
Definition: dca_lbr.h:71
dca_exss.h
DCALbrDecoder::sec_ch_sbms
uint8_t sec_ch_sbms[DCA_LBR_CHANNELS/2][DCA_LBR_SUBBANDS]
Right channel inversion or mid/side decoding flags.
Definition: dca_lbr.h:85
DCALbrDecoder::tonal_bounds
uint16_t tonal_bounds[5][32][2]
Per-group per-subframe start/end positions of tones.
Definition: dca_lbr.h:118
DCALbrDecoder
Definition: dca_lbr.h:56
DCALbrDecoder::lfe_scale
float lfe_scale
Scale factor of LFE samples before IIR filter.
Definition: dca_lbr.h:115
DCALbrTone
Definition: dca_lbr.h:47
DCALbrDecoder::part_stereo_pres
uint8_t part_stereo_pres
Partial stereo coefficients presence flags.
Definition: dca_lbr.h:99
DCADSPContext
Definition: dcadsp.h:30
float_dsp.h
DCALbrDecoder::warned
int warned
Flags for warning suppression.
Definition: dca_lbr.h:80
ff_dca_lbr_close
av_cold void ff_dca_lbr_close(DCALbrDecoder *s)
Definition: dca_lbr.c:1832
DCA_LBR_HEADER_SYNC_ONLY
@ DCA_LBR_HEADER_SYNC_ONLY
Definition: dca_lbr.h:43
DCALbrTone::ph_rot
uint8_t ph_rot
Phase rotation.
Definition: dca_lbr.h:50
DCALbrDecoder::lfe_data
float lfe_data[64]
Decimated LFE samples.
Definition: dca_lbr.h:113
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:102
DCALbrDecoder::sample_rate
int sample_rate
Sample rate of LBR audio.
Definition: dca_lbr.h:60
DCALbrDecoder::lbr_rand
int lbr_rand
Seed for subband randomization.
Definition: dca_lbr.h:79
AVFloatDSPContext
Definition: float_dsp.h:24
DCALbrDecoder::avctx
AVCodecContext * avctx
Definition: dca_lbr.h:57
DCALbrDecoder::sb_indices
uint8_t sb_indices[DCA_LBR_SUBBANDS]
Subband reordering indices.
Definition: dca_lbr.h:83
DCA_LBR_HEADER_DECODER_INIT
@ DCA_LBR_HEADER_DECODER_INIT
Definition: dca_lbr.h:44
DCALbrTone::f_delt
uint8_t f_delt
Difference between original and center frequency.
Definition: dca_lbr.h:49
dcadsp.h
ff_dca_lbr_filter_frame
int ff_dca_lbr_filter_frame(DCALbrDecoder *s, AVFrame *frame)
Definition: dca_lbr.c:1737
DCALbrDecoder::sec_ch_lrms
uint8_t sec_ch_lrms[DCA_LBR_CHANNELS/2][DCA_LBR_SUBBANDS]
Flags indicating if left/right channel are swapped.
Definition: dca_lbr.h:86
DCALbrDecoder::grid_3_pres
uint32_t grid_3_pres[DCA_LBR_CHANNELS]
Grid 3 scale factors presence flags.
Definition: dca_lbr.h:94
DCALbrDecoder::ch_pres
uint32_t ch_pres[DCA_LBR_CHANNELS]
Subband allocation flags.
Definition: dca_lbr.h:87
DCALBRHeader
DCALBRHeader
Definition: dca_lbr.h:42
DCALbrDecoder::band_limit
int band_limit
Band limit factor.
Definition: dca_lbr.h:69
avcodec.h
DCALbrDecoder::nsubbands
int nsubbands
Number of encoded subbands.
Definition: dca_lbr.h:73
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
DCA_LBR_TONES
#define DCA_LBR_TONES
Definition: dca_lbr.h:37
DCALbrDecoder::quant_levels
uint8_t quant_levels[DCA_LBR_CHANNELS/2][DCA_LBR_SUBBANDS]
Quantization levels.
Definition: dca_lbr.h:82
DCALbrDecoder::bit_rate_scaled
int bit_rate_scaled
Scaled bit rate.
Definition: dca_lbr.h:64
AVCodecContext
main external API structure.
Definition: avcodec.h:451
ff_dca_lbr_flush
av_cold void ff_dca_lbr_flush(DCALbrDecoder *s)
Definition: dca_lbr.c:1799
DCALbrDecoder::grid_3_avg
int8_t grid_3_avg[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS - 4]
Grid 3 average values.
Definition: dca_lbr.h:92
DCALbrDecoder::ts_size
unsigned int ts_size
Time sample buffer size.
Definition: dca_lbr.h:108
DCALbrDecoder::flags
int flags
Flags for LBR decoder initialization.
Definition: dca_lbr.h:62
DCALbrDecoder::limited_rate
int limited_rate
Band limited sample rate.
Definition: dca_lbr.h:70
DCALbrDecoder::lpc_coeff
float lpc_coeff[2][DCA_LBR_CHANNELS][3][2][8]
Predictor coefficients.
Definition: dca_lbr.h:101
DCA_LBR_CHANNELS
#define DCA_LBR_CHANNELS
Definition: dca_lbr.h:34
DCALbrDecoder::framenum
int framenum
Lower 5 bits of current frame number.
Definition: dca_lbr.h:78
DCALbrDecoder::high_res_scf
uint8_t high_res_scf[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS][8]
High-frequency resolution scale factors.
Definition: dca_lbr.h:96
DCALbrDecoder::grid_1_scf
uint8_t grid_1_scf[DCA_LBR_CHANNELS][12][8]
Grid 1 scale factors.
Definition: dca_lbr.h:89
DCALbrDecoder::ntones
int ntones
Circular buffer head position.
Definition: dca_lbr.h:120
ff_dca_lbr_init
av_cold int ff_dca_lbr_init(DCALbrDecoder *s)
Definition: dca_lbr.c:1823
DCALbrTone::pad
uint8_t pad
Padding field.
Definition: dca_lbr.h:51
DCALbrDecoder::time_samples
float * time_samples[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS]
Time samples.
Definition: dca_lbr.h:105
ff_dca_lbr_parse
int ff_dca_lbr_parse(DCALbrDecoder *s, const uint8_t *data, DCAExssAsset *asset)
Definition: dca_lbr.c:1170
DCA_LBR_SUBBANDS
#define DCA_LBR_SUBBANDS
Definition: dca_lbr.h:36
DCALbrDecoder::history
float history[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS *4]
IMDCT history.
Definition: dca_lbr.h:110
tx.h
DCALbrDecoder::sb_scf
float sb_scf[DCA_LBR_SUBBANDS]
Subband randomization scale factors.
Definition: dca_lbr.h:103
DCALbrDecoder::fdsp
AVFloatDSPContext * fdsp
Definition: dca_lbr.h:124