summaryrefslogtreecommitdiff
path: root/libavcodec/dca_xll.h (plain)
blob: bc0aa65b1af3df4654423a79cc67f5e98479d1ee
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_XLL_H
22#define AVCODEC_DCA_XLL_H
23
24#include "libavutil/common.h"
25#include "libavutil/mem.h"
26
27#include "avcodec.h"
28#include "internal.h"
29#include "get_bits.h"
30#include "dca.h"
31#include "dcadsp.h"
32#include "dca_exss.h"
33
34#define DCA_XLL_CHSETS_MAX 3
35#define DCA_XLL_CHANNELS_MAX 8
36#define DCA_XLL_BANDS_MAX 2
37#define DCA_XLL_ADAPT_PRED_ORDER_MAX 16
38#define DCA_XLL_DECI_HISTORY_MAX 8
39#define DCA_XLL_DMIX_SCALES_MAX ((DCA_XLL_CHSETS_MAX - 1) * DCA_XLL_CHANNELS_MAX)
40#define DCA_XLL_DMIX_COEFFS_MAX (DCA_XLL_DMIX_SCALES_MAX * DCA_XLL_CHANNELS_MAX)
41#define DCA_XLL_PBR_BUFFER_MAX (240 << 10)
42#define DCA_XLL_SAMPLE_BUFFERS_MAX 3
43
44typedef struct DCAXllBand {
45 int decor_enabled; ///< Pairwise channel decorrelation flag
46 int orig_order[DCA_XLL_CHANNELS_MAX]; ///< Original channel order
47 int decor_coeff[DCA_XLL_CHANNELS_MAX / 2]; ///< Pairwise channel coefficients
48
49 int adapt_pred_order[DCA_XLL_CHANNELS_MAX]; ///< Adaptive predictor order
50 int highest_pred_order; ///< Highest adaptive predictor order
51 int fixed_pred_order[DCA_XLL_CHANNELS_MAX]; ///< Fixed predictor order
52 int adapt_refl_coeff[DCA_XLL_CHANNELS_MAX][DCA_XLL_ADAPT_PRED_ORDER_MAX]; ///< Adaptive predictor reflection coefficients
53
54 int dmix_embedded; ///< Downmix performed by encoder in frequency band
55
56 int lsb_section_size; ///< Size of LSB section in any segment
57 int nscalablelsbs[DCA_XLL_CHANNELS_MAX]; ///< Number of bits to represent the samples in LSB part
58 int bit_width_adjust[DCA_XLL_CHANNELS_MAX]; ///< Number of bits discarded by authoring
59
60 int32_t *msb_sample_buffer[DCA_XLL_CHANNELS_MAX]; ///< MSB sample buffer pointers
61 int32_t *lsb_sample_buffer[DCA_XLL_CHANNELS_MAX]; ///< LSB sample buffer pointers or NULL
62} DCAXllBand;
63
64typedef struct DCAXllChSet {
65 // Channel set header
66 int nchannels; ///< Number of channels in the channel set (N)
67 int residual_encode; ///< Residual encoding mask (0 - residual, 1 - full channel)
68 int pcm_bit_res; ///< PCM bit resolution (variable)
69 int storage_bit_res; ///< Storage bit resolution (16 or 24)
70 int freq; ///< Original sampling frequency (max. 96000 Hz)
71
72 int primary_chset; ///< Primary channel set flag
73 int dmix_coeffs_present; ///< Downmix coefficients present in stream
74 int dmix_embedded; ///< Downmix already performed by encoder
75 int dmix_type; ///< Primary channel set downmix type
76 int hier_chset; ///< Whether the channel set is part of a hierarchy
77 int hier_ofs; ///< Number of preceding channels in a hierarchy (M)
78 int dmix_coeff[DCA_XLL_DMIX_COEFFS_MAX]; ///< Downmixing coefficients
79 int dmix_scale[DCA_XLL_DMIX_SCALES_MAX]; ///< Downmixing scales
80 int dmix_scale_inv[DCA_XLL_DMIX_SCALES_MAX]; ///< Inverse downmixing scales
81 int ch_mask; ///< Channel mask for set
82 int ch_remap[DCA_XLL_CHANNELS_MAX]; ///< Channel to speaker map
83
84 int nfreqbands; ///< Number of frequency bands (1 or 2)
85 int nabits; ///< Number of bits to read bit allocation coding parameter
86
87 DCAXllBand bands[DCA_XLL_BANDS_MAX]; ///< Frequency bands
88
89 // Frequency band coding parameters
90 int seg_common; ///< Segment type
91 int rice_code_flag[DCA_XLL_CHANNELS_MAX]; ///< Rice coding flag
92 int bitalloc_hybrid_linear[DCA_XLL_CHANNELS_MAX]; ///< Binary code length for isolated samples
93 int bitalloc_part_a[DCA_XLL_CHANNELS_MAX]; ///< Coding parameter for part A of segment
94 int bitalloc_part_b[DCA_XLL_CHANNELS_MAX]; ///< Coding parameter for part B of segment
95 int nsamples_part_a[DCA_XLL_CHANNELS_MAX]; ///< Number of samples in part A of segment
96
97 // Decimator history
98 DECLARE_ALIGNED(32, int32_t, deci_history)[DCA_XLL_CHANNELS_MAX][DCA_XLL_DECI_HISTORY_MAX]; ///< Decimator history for frequency band 1
99
100 // Sample buffers
101 unsigned int sample_size[DCA_XLL_SAMPLE_BUFFERS_MAX];
102 int32_t *sample_buffer[DCA_XLL_SAMPLE_BUFFERS_MAX];
103} DCAXllChSet;
104
105typedef struct DCAXllDecoder {
106 AVCodecContext *avctx;
107 GetBitContext gb;
108
109 int frame_size; ///< Number of bytes in a lossless frame
110 int nchsets; ///< Number of channels sets per frame
111 int nframesegs; ///< Number of segments per frame
112 int nsegsamples_log2; ///< log2(nsegsamples)
113 int nsegsamples; ///< Samples in segment per one frequency band
114 int nframesamples_log2; ///< log2(nframesamples)
115 int nframesamples; ///< Samples in frame per one frequency band
116 int seg_size_nbits; ///< Number of bits used to read segment size
117 int band_crc_present; ///< Presence of CRC16 within each frequency band
118 int scalable_lsbs; ///< MSB/LSB split flag
119 int ch_mask_nbits; ///< Number of bits used to read channel mask
120 int fixed_lsb_width; ///< Fixed LSB width
121
122 DCAXllChSet chset[DCA_XLL_CHSETS_MAX]; ///< Channel sets
123
124 int *navi; ///< NAVI table
125 unsigned int navi_size;
126
127 int nfreqbands; ///< Highest number of frequency bands
128 int nchannels; ///< Total number of channels in a hierarchy
129 int nreschsets; ///< Number of channel sets that have residual encoded channels
130 int nactivechsets; ///< Number of active channel sets to decode
131
132 int hd_stream_id; ///< Previous DTS-HD stream ID for detecting changes
133
134 uint8_t *pbr_buffer; ///< Peak bit rate (PBR) smoothing buffer
135 int pbr_length; ///< Length in bytes of data currently buffered
136 int pbr_delay; ///< Delay in frames before decoding buffered data
137
138 DCADSPContext *dcadsp;
139
140 int output_mask;
141 int32_t *output_samples[DCA_SPEAKER_COUNT];
142} DCAXllDecoder;
143
144int ff_dca_xll_parse(DCAXllDecoder *s, uint8_t *data, DCAExssAsset *asset);
145int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame);
146av_cold void ff_dca_xll_flush(DCAXllDecoder *s);
147av_cold void ff_dca_xll_close(DCAXllDecoder *s);
148
149#endif
150