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 44 enum DCALBRHeader { 45 DCA_LBR_HEADER_SYNC_ONLY = 1, 46 DCA_LBR_HEADER_DECODER_INIT = 2 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 { 59 AVCodecContext *avctx; 60 GetBitContext gb; 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 124 FFTContext imdct; 125 AVFloatDSPContext *fdsp; 126 DCADSPContext *dcadsp; 127 } DCALbrDecoder; 128 129 int ff_dca_lbr_parse(DCALbrDecoder *s, uint8_t *data, DCAExssAsset *asset); 130 int ff_dca_lbr_filter_frame(DCALbrDecoder *s, AVFrame *frame); 131 av_cold void ff_dca_lbr_flush(DCALbrDecoder *s); 132 av_cold int ff_dca_lbr_init(DCALbrDecoder *s); 133 av_cold void ff_dca_lbr_close(DCALbrDecoder *s); 134 135 #endif 136