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/common.h"
25 #include "libavutil/float_dsp.h"
26 #include "libavutil/mem_internal.h"
27 
28 #include "avcodec.h"
29 #include "internal.h"
30 #include "get_bits.h"
31 #include "dca.h"
32 #include "dca_exss.h"
33 #include "dcadsp.h"
34 #include "fft.h"
35 
36 #define DCA_LBR_CHANNELS 6
37 #define DCA_LBR_CHANNELS_TOTAL 32
38 #define DCA_LBR_SUBBANDS 32
39 #define DCA_LBR_TONES 512
40 
41 #define DCA_LBR_TIME_SAMPLES 128
42 #define DCA_LBR_TIME_HISTORY 8
43 
47 };
48 
49 typedef struct DCALbrTone {
50  uint8_t x_freq; ///< Spectral line offset
51  uint8_t f_delt; ///< Difference between original and center frequency
52  uint8_t ph_rot; ///< Phase rotation
53  uint8_t pad; ///< Padding field
54  uint8_t amp[DCA_LBR_CHANNELS]; ///< Per-channel amplitude
55  uint8_t phs[DCA_LBR_CHANNELS]; ///< Per-channel phase
56 } DCALbrTone;
57 
58 typedef struct DCALbrDecoder {
61 
62  int sample_rate; ///< Sample rate of LBR audio
63  int ch_mask; ///< LBR speaker mask
64  int flags; ///< Flags for LBR decoder initialization
65  int bit_rate_orig; ///< Original bit rate
66  int bit_rate_scaled; ///< Scaled bit rate
67 
68  int nchannels; ///< Number of fullband channels to decode
69  int nchannels_total; ///< Total number of fullband channels
70  int freq_range; ///< Frequency range of LBR audio
71  int band_limit; ///< Band limit factor
72  int limited_rate; ///< Band limited sample rate
73  int limited_range; ///< Band limited frequency range
74  int res_profile; ///< Resolution profile
75  int nsubbands; ///< Number of encoded subbands
76  int g3_avg_only_start_sb; ///< Subband index where grid 3 scale factors end
77  int min_mono_subband; ///< Subband index where mono encoding starts
78  int max_mono_subband; ///< Subband index where mono encoding ends
79 
80  int framenum; ///< Lower 5 bits of current frame number
81  int lbr_rand; ///< Seed for subband randomization
82  int warned; ///< Flags for warning suppression
83 
84  uint8_t quant_levels[DCA_LBR_CHANNELS / 2][DCA_LBR_SUBBANDS]; ///< Quantization levels
85  uint8_t sb_indices[DCA_LBR_SUBBANDS]; ///< Subband reordering indices
86 
87  uint8_t sec_ch_sbms[DCA_LBR_CHANNELS / 2][DCA_LBR_SUBBANDS]; ///< Right channel inversion or mid/side decoding flags
88  uint8_t sec_ch_lrms[DCA_LBR_CHANNELS / 2][DCA_LBR_SUBBANDS]; ///< Flags indicating if left/right channel are swapped
89  uint32_t ch_pres[DCA_LBR_CHANNELS]; ///< Subband allocation flags
90 
91  uint8_t grid_1_scf[DCA_LBR_CHANNELS][12][8]; ///< Grid 1 scale factors
92  uint8_t grid_2_scf[DCA_LBR_CHANNELS][3][64]; ///< Grid 2 scale factors
93 
94  int8_t grid_3_avg[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS - 4]; ///< Grid 3 average values
95  int8_t grid_3_scf[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS - 4][8]; ///< Grid 3 scale factors
96  uint32_t grid_3_pres[DCA_LBR_CHANNELS]; ///< Grid 3 scale factors presence flags
97 
98  uint8_t high_res_scf[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS][8]; ///< High-frequency resolution scale factors
99 
100  uint8_t part_stereo[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS / 4][5]; ///< Partial stereo coefficients
101  uint8_t part_stereo_pres; ///< Partial stereo coefficients presence flags
102 
103  float lpc_coeff[2][DCA_LBR_CHANNELS][3][2][8]; ///< Predictor coefficients
104 
105  float sb_scf[DCA_LBR_SUBBANDS]; ///< Subband randomization scale factors
106 
107  float *time_samples[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS]; ///< Time samples
108 
109  float *ts_buffer; ///< Time sample buffer base
110  unsigned int ts_size; ///< Time sample buffer size
111 
112  DECLARE_ALIGNED(32, float, history)[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS * 4]; ///< IMDCT history
113  DECLARE_ALIGNED(32, float, window)[DCA_LBR_SUBBANDS * 4]; ///< Long window for IMDCT
114 
115  DECLARE_ALIGNED(32, float, lfe_data)[64]; ///< Decimated LFE samples
116  DECLARE_ALIGNED(32, float, lfe_history)[5][2]; ///< LFE IIR filter history
117  float lfe_scale; ///< Scale factor of LFE samples before IIR filter
118 
119  uint8_t tonal_scf[6]; ///< Tonal scale factors
120  uint16_t tonal_bounds[5][32][2]; ///< Per-group per-subframe start/end positions of tones
121  DCALbrTone tones[DCA_LBR_TONES]; ///< Circular buffer of tones
122  int ntones; ///< Circular buffer head position
123 
127 } DCALbrDecoder;
128 
129 int ff_dca_lbr_parse(DCALbrDecoder *s, uint8_t *data, DCAExssAsset *asset);
135 
136 #endif
DCALbrDecoder::bit_rate_orig
int bit_rate_orig
Original bit rate.
Definition: dca_lbr.h:65
DCALbrDecoder::ts_buffer
float * ts_buffer
Time sample buffer base.
Definition: dca_lbr.h:109
DCALbrDecoder::min_mono_subband
int min_mono_subband
Subband index where mono encoding starts.
Definition: dca_lbr.h:77
DCALbrDecoder::ch_mask
int ch_mask
LBR speaker mask.
Definition: dca_lbr.h:63
mem_internal.h
dca.h
DCALbrDecoder::lfe_history
float lfe_history[5][2]
LFE IIR filter history.
Definition: dca_lbr.h:116
ff_dca_lbr_init_tables
av_cold void ff_dca_lbr_init_tables(void)
Definition: dca_lbr.c:127
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:317
DCALbrDecoder::tones
DCALbrTone tones[DCA_LBR_TONES]
Circular buffer of tones.
Definition: dca_lbr.h:121
internal.h
DCALbrDecoder::dcadsp
DCADSPContext * dcadsp
Definition: dca_lbr.h:126
data
const char data[16]
Definition: mxf.c:143
DCALbrTone::phs
uint8_t phs[DCA_LBR_CHANNELS]
Per-channel phase.
Definition: dca_lbr.h:55
DCALbrTone::x_freq
uint8_t x_freq
Spectral line offset.
Definition: dca_lbr.h:50
DCALbrDecoder::grid_2_scf
uint8_t grid_2_scf[DCA_LBR_CHANNELS][3][64]
Grid 2 scale factors.
Definition: dca_lbr.h:92
DCALbrDecoder::max_mono_subband
int max_mono_subband
Subband index where mono encoding ends.
Definition: dca_lbr.h:78
DCAExssAsset
Definition: dca_exss.h:29
GetBitContext
Definition: get_bits.h:62
DCALbrTone::amp
uint8_t amp[DCA_LBR_CHANNELS]
Per-channel amplitude.
Definition: dca_lbr.h:54
DCALbrDecoder::part_stereo
uint8_t part_stereo[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS/4][5]
Partial stereo coefficients.
Definition: dca_lbr.h:100
DCALbrDecoder::nchannels_total
int nchannels_total
Total number of fullband channels.
Definition: dca_lbr.h:69
DCALbrDecoder::gb
GetBitContext gb
Definition: dca_lbr.h:60
av_cold
#define av_cold
Definition: attributes.h:90
DCALbrDecoder::g3_avg_only_start_sb
int g3_avg_only_start_sb
Subband index where grid 3 scale factors end.
Definition: dca_lbr.h:76
s
#define s(width, name)
Definition: cbs_vp9.c:257
DCALbrDecoder::res_profile
int res_profile
Resolution profile.
Definition: dca_lbr.h:74
DCALbrDecoder::tonal_scf
uint8_t tonal_scf[6]
Tonal scale factors.
Definition: dca_lbr.h:119
DCALbrDecoder::window
float window[DCA_LBR_SUBBANDS *4]
Long window for IMDCT.
Definition: dca_lbr.h:113
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:95
DCALbrDecoder::freq_range
int freq_range
Frequency range of LBR audio.
Definition: dca_lbr.h:70
get_bits.h
DCALbrDecoder::nchannels
int nchannels
Number of fullband channels to decode.
Definition: dca_lbr.h:68
DCALbrDecoder::limited_range
int limited_range
Band limited frequency range.
Definition: dca_lbr.h:73
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:87
DCALbrDecoder::tonal_bounds
uint16_t tonal_bounds[5][32][2]
Per-group per-subframe start/end positions of tones.
Definition: dca_lbr.h:120
DCALbrDecoder
Definition: dca_lbr.h:58
DCALbrDecoder::lfe_scale
float lfe_scale
Scale factor of LFE samples before IIR filter.
Definition: dca_lbr.h:117
DCALbrTone
Definition: dca_lbr.h:49
DCALbrDecoder::part_stereo_pres
uint8_t part_stereo_pres
Partial stereo coefficients presence flags.
Definition: dca_lbr.h:101
DCADSPContext
Definition: dcadsp.h:30
float_dsp.h
DCALbrDecoder::warned
int warned
Flags for warning suppression.
Definition: dca_lbr.h:82
ff_dca_lbr_close
av_cold void ff_dca_lbr_close(DCALbrDecoder *s)
Definition: dca_lbr.c:1822
DCA_LBR_HEADER_SYNC_ONLY
@ DCA_LBR_HEADER_SYNC_ONLY
Definition: dca_lbr.h:45
DCALbrTone::ph_rot
uint8_t ph_rot
Phase rotation.
Definition: dca_lbr.h:52
DCALbrDecoder::lfe_data
float lfe_data[64]
Decimated LFE samples.
Definition: dca_lbr.h:115
DCALbrDecoder::sample_rate
int sample_rate
Sample rate of LBR audio.
Definition: dca_lbr.h:62
DCALbrDecoder::lbr_rand
int lbr_rand
Seed for subband randomization.
Definition: dca_lbr.h:81
AVFloatDSPContext
Definition: float_dsp.h:24
DCALbrDecoder::avctx
AVCodecContext * avctx
Definition: dca_lbr.h:59
DCALbrDecoder::sb_indices
uint8_t sb_indices[DCA_LBR_SUBBANDS]
Subband reordering indices.
Definition: dca_lbr.h:85
DCA_LBR_HEADER_DECODER_INIT
@ DCA_LBR_HEADER_DECODER_INIT
Definition: dca_lbr.h:46
DCALbrTone::f_delt
uint8_t f_delt
Difference between original and center frequency.
Definition: dca_lbr.h:51
dcadsp.h
ff_dca_lbr_filter_frame
int ff_dca_lbr_filter_frame(DCALbrDecoder *s, AVFrame *frame)
Definition: dca_lbr.c:1729
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:116
FFTContext
Definition: fft.h:75
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:88
DCALbrDecoder::imdct
FFTContext imdct
Definition: dca_lbr.h:124
DCALbrDecoder::grid_3_pres
uint32_t grid_3_pres[DCA_LBR_CHANNELS]
Grid 3 scale factors presence flags.
Definition: dca_lbr.h:96
common.h
DCALbrDecoder::ch_pres
uint32_t ch_pres[DCA_LBR_CHANNELS]
Subband allocation flags.
Definition: dca_lbr.h:89
DCALBRHeader
DCALBRHeader
Definition: dca_lbr.h:44
DCALbrDecoder::band_limit
int band_limit
Band limit factor.
Definition: dca_lbr.h:71
avcodec.h
DCALbrDecoder::nsubbands
int nsubbands
Number of encoded subbands.
Definition: dca_lbr.h:75
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:39
DCALbrDecoder::quant_levels
uint8_t quant_levels[DCA_LBR_CHANNELS/2][DCA_LBR_SUBBANDS]
Quantization levels.
Definition: dca_lbr.h:84
DCALbrDecoder::bit_rate_scaled
int bit_rate_scaled
Scaled bit rate.
Definition: dca_lbr.h:66
fft.h
AVCodecContext
main external API structure.
Definition: avcodec.h:383
ff_dca_lbr_flush
av_cold void ff_dca_lbr_flush(DCALbrDecoder *s)
Definition: dca_lbr.c:1789
ff_dca_lbr_parse
int ff_dca_lbr_parse(DCALbrDecoder *s, uint8_t *data, DCAExssAsset *asset)
Definition: dca_lbr.c:1162
DCALbrDecoder::grid_3_avg
int8_t grid_3_avg[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS - 4]
Grid 3 average values.
Definition: dca_lbr.h:94
DCALbrDecoder::ts_size
unsigned int ts_size
Time sample buffer size.
Definition: dca_lbr.h:110
DCALbrDecoder::flags
int flags
Flags for LBR decoder initialization.
Definition: dca_lbr.h:64
DCALbrDecoder::limited_rate
int limited_rate
Band limited sample rate.
Definition: dca_lbr.h:72
DCALbrDecoder::lpc_coeff
float lpc_coeff[2][DCA_LBR_CHANNELS][3][2][8]
Predictor coefficients.
Definition: dca_lbr.h:103
DCA_LBR_CHANNELS
#define DCA_LBR_CHANNELS
Definition: dca_lbr.h:36
DCALbrDecoder::framenum
int framenum
Lower 5 bits of current frame number.
Definition: dca_lbr.h:80
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:98
DCALbrDecoder::grid_1_scf
uint8_t grid_1_scf[DCA_LBR_CHANNELS][12][8]
Grid 1 scale factors.
Definition: dca_lbr.h:91
DCALbrDecoder::ntones
int ntones
Circular buffer head position.
Definition: dca_lbr.h:122
ff_dca_lbr_init
av_cold int ff_dca_lbr_init(DCALbrDecoder *s)
Definition: dca_lbr.c:1813
DCALbrTone::pad
uint8_t pad
Padding field.
Definition: dca_lbr.h:53
DCALbrDecoder::time_samples
float * time_samples[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS]
Time samples.
Definition: dca_lbr.h:107
DCA_LBR_SUBBANDS
#define DCA_LBR_SUBBANDS
Definition: dca_lbr.h:38
DCALbrDecoder::history
float history[DCA_LBR_CHANNELS][DCA_LBR_SUBBANDS *4]
IMDCT history.
Definition: dca_lbr.h:112
DCALbrDecoder::sb_scf
float sb_scf[DCA_LBR_SUBBANDS]
Subband randomization scale factors.
Definition: dca_lbr.h:105
DCALbrDecoder::fdsp
AVFloatDSPContext * fdsp
Definition: dca_lbr.h:125