diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-03-15 21:44:06 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-03-15 22:18:41 +0100 |
commit | 209001073adf190ccf2e578f25d4b3d41b1640a0 (patch) | |
tree | 11d04d4bd1eb083cfe3019bddd5e99587026fef7 /libavcodec/dca.h | |
parent | e46a7fdc8748c286e391c1e7f2921d98a4486681 (diff) | |
parent | 217e4ff4d1f845b76e44634e29371cd09313d1c2 (diff) | |
download | ffmpeg-209001073adf190ccf2e578f25d4b3d41b1640a0.tar.gz |
Merge commit '217e4ff4d1f845b76e44634e29371cd09313d1c2'
* commit '217e4ff4d1f845b76e44634e29371cd09313d1c2':
dca: Support for XLL (lossless extension)
Conflicts:
Changelog
doc/general.texi
libavcodec/Makefile
libavcodec/dca.h
libavcodec/dca_exss.c
libavcodec/dcadata.h
libavcodec/dcadec.c
libavcodec/version.h
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/dca.h')
-rw-r--r-- | libavcodec/dca.h | 101 |
1 files changed, 99 insertions, 2 deletions
diff --git a/libavcodec/dca.h b/libavcodec/dca.h index c83fb891ce..897ebf4b73 100644 --- a/libavcodec/dca.h +++ b/libavcodec/dca.h @@ -44,6 +44,21 @@ #define DCA_CHSETS_MAX (4) #define DCA_CHSET_CHANS_MAX (8) +#define DCA_PRIM_CHANNELS_MAX (7) +#define DCA_ABITS_MAX (32) /* Should be 28 */ +#define DCA_SUBSUBFRAMES_MAX (4) +#define DCA_SUBFRAMES_MAX (16) +#define DCA_BLOCKS_MAX (16) +#define DCA_LFE_MAX (3) +#define DCA_XLL_FBANDS_MAX (4) +#define DCA_XLL_SEGMENTS_MAX (16) +#define DCA_XLL_CHSETS_MAX (16) +#define DCA_XLL_CHANNELS_MAX (16) +#define DCA_XLL_AORDER_MAX (15) + +/* Arbitrary limit; not sure what the maximum really is, but much larger. */ +#define DCA_XLL_DMIX_NCOEFFS_MAX (18) + #define DCA_MAX_FRAME_SIZE 16384 #define DCA_MAX_EXSS_HEADER_SIZE 4096 @@ -62,6 +77,61 @@ enum DCAExtensionMask { DCA_EXT_EXSS_XLL = 0x200, ///< lossless extension in ExSS }; +typedef struct XllChSetSubHeader { + int channels; ///< number of channels in channel set, at most 16 + int residual_encode; ///< residual channel encoding + int bit_resolution; ///< input sample bit-width + int bit_width; ///< original input sample bit-width + int sampling_frequency; ///< sampling frequency + int samp_freq_interp; ///< sampling frequency interpolation multiplier + int replacement_set; ///< replacement channel set group + int active_replace_set; ///< current channel set is active channel set + int primary_ch_set; + int downmix_coeff_code_embedded; + int downmix_embedded; + int downmix_type; + int hier_chset; ///< hierarchical channel set + int downmix_ncoeffs; + int downmix_coeffs[DCA_XLL_DMIX_NCOEFFS_MAX]; + int ch_mask_enabled; + int ch_mask; + int mapping_coeffs_present; + int num_freq_bands; + + /* m_nOrigChanOrder */ + uint8_t orig_chan_order[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX]; + uint8_t orig_chan_order_inv[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX]; + /* Coefficients for channel pairs (at most 8), m_anPWChPairsCoeffs */ + int8_t pw_ch_pairs_coeffs[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX/2]; + /* m_nCurrHighestLPCOrder */ + uint8_t adapt_order_max[DCA_XLL_FBANDS_MAX]; + /* m_pnAdaptPredOrder */ + uint8_t adapt_order[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX]; + /* m_pnFixedPredOrder */ + uint8_t fixed_order[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX]; + /* m_pnLPCReflCoeffsQInd, unsigned version */ + uint8_t lpc_refl_coeffs_q_ind[DCA_XLL_FBANDS_MAX] + [DCA_XLL_CHANNELS_MAX][DCA_XLL_AORDER_MAX]; + + int lsb_fsize[DCA_XLL_FBANDS_MAX]; + int8_t scalable_lsbs[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX]; + int8_t bit_width_adj_per_ch[DCA_XLL_FBANDS_MAX][DCA_XLL_CHANNELS_MAX]; +} XllChSetSubHeader; + +typedef struct XllNavi { + GetBitContext gb; // Context for parsing the data segments + unsigned band_size[DCA_XLL_FBANDS_MAX]; + unsigned segment_size[DCA_XLL_FBANDS_MAX][DCA_XLL_SEGMENTS_MAX]; + unsigned chset_size[DCA_XLL_FBANDS_MAX][DCA_XLL_SEGMENTS_MAX][DCA_XLL_CHSETS_MAX]; +} XllNavi; + +typedef struct QMF64_table { + float dct4_coeff[32][32]; + float dct2_coeff[32][32]; + float rcos[32]; + float rsin[32]; +} QMF64_table; + typedef struct DCAContext { const AVClass *class; ///< class for AVOptions AVCodecContext *avctx; @@ -134,8 +204,10 @@ typedef struct DCAContext { /* Subband samples history (for ADPCM) */ DECLARE_ALIGNED(16, float, subband_samples_hist)[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][4]; - DECLARE_ALIGNED(32, float, subband_fir_hist)[DCA_PRIM_CHANNELS_MAX][512]; - DECLARE_ALIGNED(32, float, subband_fir_noidea)[DCA_PRIM_CHANNELS_MAX][32]; + /* Half size is sufficient for core decoding, but for 96 kHz data + * we need QMF with 64 subbands and 1024 samples. */ + DECLARE_ALIGNED(32, float, subband_fir_hist)[DCA_PRIM_CHANNELS_MAX][1024]; + DECLARE_ALIGNED(32, float, subband_fir_noidea)[DCA_PRIM_CHANNELS_MAX][64]; int hist_index[DCA_PRIM_CHANNELS_MAX]; DECLARE_ALIGNED(32, float, raXin)[32]; @@ -157,6 +229,7 @@ typedef struct DCAContext { int current_subsubframe; int core_ext_mask; ///< present extensions in the core substream + int exss_ext_mask; ///< Non-core extensions /* XCh extension information */ int xch_present; ///< XCh extension present and valid @@ -177,6 +250,24 @@ typedef struct DCAContext { int8_t xxch_order_tab[32]; int8_t lfe_index; + /* XLL extension information */ + int xll_disable; + int xll_nch_sets; ///< number of channel sets per frame + int xll_channels; ///< total number of channels (in all channel sets) + int xll_residual_channels; ///< number of residual channels + int xll_segments; ///< number of segments per frame + int xll_log_smpl_in_seg; ///< supposedly this is "nBits4SamplLoci" + int xll_smpl_in_seg; ///< samples in segment per one frequency band for the first channel set + int xll_bits4seg_size; ///< number of bits used to read segment size + int xll_banddata_crc; ///< presence of CRC16 within each frequency band + int xll_scalable_lsb; + int xll_bits4ch_mask; ///< channel position mask + int xll_fixed_lsb_width; + XllChSetSubHeader xll_chsets[DCA_XLL_CHSETS_MAX]; + XllNavi xll_navi; + int *xll_sample_buf; + unsigned int xll_sample_buf_size; + /* ExSS header parser */ int static_fields; ///< static fields present int mix_metadata; ///< mixing metadata present @@ -184,12 +275,14 @@ typedef struct DCAContext { int mix_config_num_ch[4]; ///< number of channels in each mix out configuration int profile; + int one2one_map_chtospkr; int debug_flag; ///< used for suppressing repeated error messages output AVFloatDSPContext *fdsp; FFTContext imdct; SynthFilterContext synth; DCADSPContext dcadsp; + QMF64_table *qmf64_table; FmtConvertContext fmt_conv; } DCAContext; @@ -206,4 +299,8 @@ int ff_dca_xxch_decode_frame(DCAContext *s); void ff_dca_exss_parse_header(DCAContext *s); +int ff_dca_xll_decode_header(DCAContext *s); +int ff_dca_xll_decode_navi(DCAContext *s, int asset_end); +int ff_dca_xll_decode_audio(DCAContext *s, AVFrame *frame); + #endif /* AVCODEC_DCA_H */ |