]> git.sesse.net Git - ffmpeg/blob - libavcodec/dca_xll.h
x86/tx_float: Fixes compilation with old yasm
[ffmpeg] / libavcodec / dca_xll.h
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_internal.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
44 typedef 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
64 typedef 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
105 typedef 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
144 int ff_dca_xll_parse(DCAXllDecoder *s, uint8_t *data, DCAExssAsset *asset);
145 int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame);
146 av_cold void ff_dca_xll_flush(DCAXllDecoder *s);
147 av_cold void ff_dca_xll_close(DCAXllDecoder *s);
148
149 #endif