summaryrefslogtreecommitdiff
path: root/libavcodec/dca_xll.h
diff options
context:
space:
mode:
authorfoo86 <foobaz86@gmail.com>2016-01-16 11:54:38 +0300
committerHendrik Leppkes <h.leppkes@gmail.com>2016-01-31 17:09:38 +0100
commitae5b2c52501d5009fe712334428138a9b758849b (patch)
tree8e30d705d98efe3b249ff3a57eb01789c3ff4c4f /libavcodec/dca_xll.h
parent0930b2dd1f01213ca1f08aff3a9b8b0d5515cede (diff)
downloadffmpeg-ae5b2c52501d5009fe712334428138a9b758849b.tar.gz
avcodec/dca: add new decoder based on libdcadec
Diffstat (limited to 'libavcodec/dca_xll.h')
-rw-r--r--libavcodec/dca_xll.h149
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