diff options
author | foo86 <foobaz86@gmail.com> | 2016-01-16 11:54:38 +0300 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-01-31 17:09:38 +0100 |
commit | ae5b2c52501d5009fe712334428138a9b758849b (patch) | |
tree | 8e30d705d98efe3b249ff3a57eb01789c3ff4c4f /libavcodec/dca_xll.h | |
parent | 0930b2dd1f01213ca1f08aff3a9b8b0d5515cede (diff) | |
download | ffmpeg-ae5b2c52501d5009fe712334428138a9b758849b.tar.gz |
avcodec/dca: add new decoder based on libdcadec
Diffstat (limited to 'libavcodec/dca_xll.h')
-rw-r--r-- | libavcodec/dca_xll.h | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/libavcodec/dca_xll.h b/libavcodec/dca_xll.h new file mode 100644 index 0000000000..bc0aa65b1a --- /dev/null +++ b/libavcodec/dca_xll.h @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2016 foo86 + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_DCA_XLL_H +#define AVCODEC_DCA_XLL_H + +#include "libavutil/common.h" +#include "libavutil/mem.h" + +#include "avcodec.h" +#include "internal.h" +#include "get_bits.h" +#include "dca.h" +#include "dcadsp.h" +#include "dca_exss.h" + +#define DCA_XLL_CHSETS_MAX 3 +#define DCA_XLL_CHANNELS_MAX 8 +#define DCA_XLL_BANDS_MAX 2 +#define DCA_XLL_ADAPT_PRED_ORDER_MAX 16 +#define DCA_XLL_DECI_HISTORY_MAX 8 +#define DCA_XLL_DMIX_SCALES_MAX ((DCA_XLL_CHSETS_MAX - 1) * DCA_XLL_CHANNELS_MAX) +#define DCA_XLL_DMIX_COEFFS_MAX (DCA_XLL_DMIX_SCALES_MAX * DCA_XLL_CHANNELS_MAX) +#define DCA_XLL_PBR_BUFFER_MAX (240 << 10) +#define DCA_XLL_SAMPLE_BUFFERS_MAX 3 + +typedef struct DCAXllBand { + int decor_enabled; ///< Pairwise channel decorrelation flag + int orig_order[DCA_XLL_CHANNELS_MAX]; ///< Original channel order + int decor_coeff[DCA_XLL_CHANNELS_MAX / 2]; ///< Pairwise channel coefficients + + int adapt_pred_order[DCA_XLL_CHANNELS_MAX]; ///< Adaptive predictor order + int highest_pred_order; ///< Highest adaptive predictor order + int fixed_pred_order[DCA_XLL_CHANNELS_MAX]; ///< Fixed predictor order + int adapt_refl_coeff[DCA_XLL_CHANNELS_MAX][DCA_XLL_ADAPT_PRED_ORDER_MAX]; ///< Adaptive predictor reflection coefficients + + int dmix_embedded; ///< Downmix performed by encoder in frequency band + + int lsb_section_size; ///< Size of LSB section in any segment + int nscalablelsbs[DCA_XLL_CHANNELS_MAX]; ///< Number of bits to represent the samples in LSB part + int bit_width_adjust[DCA_XLL_CHANNELS_MAX]; ///< Number of bits discarded by authoring + + int32_t *msb_sample_buffer[DCA_XLL_CHANNELS_MAX]; ///< MSB sample buffer pointers + int32_t *lsb_sample_buffer[DCA_XLL_CHANNELS_MAX]; ///< LSB sample buffer pointers or NULL +} DCAXllBand; + +typedef struct DCAXllChSet { + // Channel set header + int nchannels; ///< Number of channels in the channel set (N) + int residual_encode; ///< Residual encoding mask (0 - residual, 1 - full channel) + int pcm_bit_res; ///< PCM bit resolution (variable) + int storage_bit_res; ///< Storage bit resolution (16 or 24) + int freq; ///< Original sampling frequency (max. 96000 Hz) + + int primary_chset; ///< Primary channel set flag + int dmix_coeffs_present; ///< Downmix coefficients present in stream + int dmix_embedded; ///< Downmix already performed by encoder + int dmix_type; ///< Primary channel set downmix type + int hier_chset; ///< Whether the channel set is part of a hierarchy + int hier_ofs; ///< Number of preceding channels in a hierarchy (M) + int dmix_coeff[DCA_XLL_DMIX_COEFFS_MAX]; ///< Downmixing coefficients + int dmix_scale[DCA_XLL_DMIX_SCALES_MAX]; ///< Downmixing scales + int dmix_scale_inv[DCA_XLL_DMIX_SCALES_MAX]; ///< Inverse downmixing scales + int ch_mask; ///< Channel mask for set + int ch_remap[DCA_XLL_CHANNELS_MAX]; ///< Channel to speaker map + + int nfreqbands; ///< Number of frequency bands (1 or 2) + int nabits; ///< Number of bits to read bit allocation coding parameter + + DCAXllBand bands[DCA_XLL_BANDS_MAX]; ///< Frequency bands + + // Frequency band coding parameters + int seg_common; ///< Segment type + int rice_code_flag[DCA_XLL_CHANNELS_MAX]; ///< Rice coding flag + int bitalloc_hybrid_linear[DCA_XLL_CHANNELS_MAX]; ///< Binary code length for isolated samples + int bitalloc_part_a[DCA_XLL_CHANNELS_MAX]; ///< Coding parameter for part A of segment + int bitalloc_part_b[DCA_XLL_CHANNELS_MAX]; ///< Coding parameter for part B of segment + int nsamples_part_a[DCA_XLL_CHANNELS_MAX]; ///< Number of samples in part A of segment + + // Decimator history + DECLARE_ALIGNED(32, int32_t, deci_history)[DCA_XLL_CHANNELS_MAX][DCA_XLL_DECI_HISTORY_MAX]; ///< Decimator history for frequency band 1 + + // Sample buffers + unsigned int sample_size[DCA_XLL_SAMPLE_BUFFERS_MAX]; + int32_t *sample_buffer[DCA_XLL_SAMPLE_BUFFERS_MAX]; +} DCAXllChSet; + +typedef struct DCAXllDecoder { + AVCodecContext *avctx; + GetBitContext gb; + + int frame_size; ///< Number of bytes in a lossless frame + int nchsets; ///< Number of channels sets per frame + int nframesegs; ///< Number of segments per frame + int nsegsamples_log2; ///< log2(nsegsamples) + int nsegsamples; ///< Samples in segment per one frequency band + int nframesamples_log2; ///< log2(nframesamples) + int nframesamples; ///< Samples in frame per one frequency band + int seg_size_nbits; ///< Number of bits used to read segment size + int band_crc_present; ///< Presence of CRC16 within each frequency band + int scalable_lsbs; ///< MSB/LSB split flag + int ch_mask_nbits; ///< Number of bits used to read channel mask + int fixed_lsb_width; ///< Fixed LSB width + + DCAXllChSet chset[DCA_XLL_CHSETS_MAX]; ///< Channel sets + + int *navi; ///< NAVI table + unsigned int navi_size; + + int nfreqbands; ///< Highest number of frequency bands + int nchannels; ///< Total number of channels in a hierarchy + int nreschsets; ///< Number of channel sets that have residual encoded channels + int nactivechsets; ///< Number of active channel sets to decode + + int hd_stream_id; ///< Previous DTS-HD stream ID for detecting changes + + uint8_t *pbr_buffer; ///< Peak bit rate (PBR) smoothing buffer + int pbr_length; ///< Length in bytes of data currently buffered + int pbr_delay; ///< Delay in frames before decoding buffered data + + DCADSPContext *dcadsp; + + int output_mask; + int32_t *output_samples[DCA_SPEAKER_COUNT]; +} DCAXllDecoder; + +int ff_dca_xll_parse(DCAXllDecoder *s, uint8_t *data, DCAExssAsset *asset); +int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame); +av_cold void ff_dca_xll_flush(DCAXllDecoder *s); +av_cold void ff_dca_xll_close(DCAXllDecoder *s); + +#endif |