ffmpeg / libavcodec / ac3.h @ be187388
History | View | Annotate | Download (6.33 KB)
1 |
/*
|
---|---|
2 |
* Common code between the AC-3 encoder and decoder
|
3 |
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
4 |
*
|
5 |
* This file is part of Libav.
|
6 |
*
|
7 |
* Libav is free software; you can redistribute it and/or
|
8 |
* modify it under the terms of the GNU Lesser General Public
|
9 |
* License as published by the Free Software Foundation; either
|
10 |
* version 2.1 of the License, or (at your option) any later version.
|
11 |
*
|
12 |
* Libav is distributed in the hope that it will be useful,
|
13 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 |
* Lesser General Public License for more details.
|
16 |
*
|
17 |
* You should have received a copy of the GNU Lesser General Public
|
18 |
* License along with Libav; if not, write to the Free Software
|
19 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 |
*/
|
21 |
|
22 |
/**
|
23 |
* @file
|
24 |
* Common code between the AC-3 encoder and decoder.
|
25 |
*/
|
26 |
|
27 |
#ifndef AVCODEC_AC3_H
|
28 |
#define AVCODEC_AC3_H
|
29 |
|
30 |
#define AC3_MAX_CODED_FRAME_SIZE 3840 /* in bytes */ |
31 |
#define AC3_MAX_CHANNELS 6 /* including LFE channel */ |
32 |
|
33 |
#define AC3_MAX_COEFS 256 |
34 |
#define AC3_BLOCK_SIZE 256 |
35 |
#define AC3_MAX_BLOCKS 6 |
36 |
#define AC3_FRAME_SIZE (AC3_MAX_BLOCKS * 256) |
37 |
#define AC3_WINDOW_SIZE (AC3_BLOCK_SIZE * 2) |
38 |
#define AC3_CRITICAL_BANDS 50 |
39 |
#define AC3_MAX_CPL_BANDS 18 |
40 |
|
41 |
#include "ac3tab.h" |
42 |
|
43 |
/* exponent encoding strategy */
|
44 |
#define EXP_REUSE 0 |
45 |
#define EXP_NEW 1 |
46 |
|
47 |
#define EXP_D15 1 |
48 |
#define EXP_D25 2 |
49 |
#define EXP_D45 3 |
50 |
|
51 |
/** Delta bit allocation strategy */
|
52 |
typedef enum { |
53 |
DBA_REUSE = 0,
|
54 |
DBA_NEW, |
55 |
DBA_NONE, |
56 |
DBA_RESERVED |
57 |
} AC3DeltaStrategy; |
58 |
|
59 |
/** Channel mode (audio coding mode) */
|
60 |
typedef enum { |
61 |
AC3_CHMODE_DUALMONO = 0,
|
62 |
AC3_CHMODE_MONO, |
63 |
AC3_CHMODE_STEREO, |
64 |
AC3_CHMODE_3F, |
65 |
AC3_CHMODE_2F1R, |
66 |
AC3_CHMODE_3F1R, |
67 |
AC3_CHMODE_2F2R, |
68 |
AC3_CHMODE_3F2R |
69 |
} AC3ChannelMode; |
70 |
|
71 |
typedef struct AC3BitAllocParameters { |
72 |
int sr_code;
|
73 |
int sr_shift;
|
74 |
int slow_gain, slow_decay, fast_decay, db_per_bit, floor;
|
75 |
int cpl_fast_leak, cpl_slow_leak;
|
76 |
} AC3BitAllocParameters; |
77 |
|
78 |
/**
|
79 |
* @struct AC3HeaderInfo
|
80 |
* Coded AC-3 header values up to the lfeon element, plus derived values.
|
81 |
*/
|
82 |
typedef struct { |
83 |
/** @defgroup coded Coded elements
|
84 |
* @{
|
85 |
*/
|
86 |
uint16_t sync_word; |
87 |
uint16_t crc1; |
88 |
uint8_t sr_code; |
89 |
uint8_t bitstream_id; |
90 |
uint8_t bitstream_mode; |
91 |
uint8_t channel_mode; |
92 |
uint8_t lfe_on; |
93 |
uint8_t frame_type; |
94 |
int substreamid; ///< substream identification |
95 |
int center_mix_level; ///< Center mix level index |
96 |
int surround_mix_level; ///< Surround mix level index |
97 |
uint16_t channel_map; |
98 |
int num_blocks; ///< number of audio blocks |
99 |
/** @} */
|
100 |
|
101 |
/** @defgroup derived Derived values
|
102 |
* @{
|
103 |
*/
|
104 |
uint8_t sr_shift; |
105 |
uint16_t sample_rate; |
106 |
uint32_t bit_rate; |
107 |
uint8_t channels; |
108 |
uint16_t frame_size; |
109 |
int64_t channel_layout; |
110 |
/** @} */
|
111 |
} AC3HeaderInfo; |
112 |
|
113 |
typedef enum { |
114 |
EAC3_FRAME_TYPE_INDEPENDENT = 0,
|
115 |
EAC3_FRAME_TYPE_DEPENDENT, |
116 |
EAC3_FRAME_TYPE_AC3_CONVERT, |
117 |
EAC3_FRAME_TYPE_RESERVED |
118 |
} EAC3FrameType; |
119 |
|
120 |
void ff_ac3_common_init(void); |
121 |
|
122 |
/**
|
123 |
* Calculate the log power-spectral density of the input signal.
|
124 |
* This gives a rough estimate of signal power in the frequency domain by using
|
125 |
* the spectral envelope (exponents). The psd is also separately grouped
|
126 |
* into critical bands for use in the calculating the masking curve.
|
127 |
* 128 units in psd = -6 dB. The dbknee parameter in AC3BitAllocParameters
|
128 |
* determines the reference level.
|
129 |
*
|
130 |
* @param[in] exp frequency coefficient exponents
|
131 |
* @param[in] start starting bin location
|
132 |
* @param[in] end ending bin location
|
133 |
* @param[out] psd signal power for each frequency bin
|
134 |
* @param[out] band_psd signal power for each critical band
|
135 |
*/
|
136 |
void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd, |
137 |
int16_t *band_psd); |
138 |
|
139 |
/**
|
140 |
* Calculate the masking curve.
|
141 |
* First, the excitation is calculated using parameters in s and the signal
|
142 |
* power in each critical band. The excitation is compared with a predefined
|
143 |
* hearing threshold table to produce the masking curve. If delta bit
|
144 |
* allocation information is provided, it is used for adjusting the masking
|
145 |
* curve, usually to give a closer match to a better psychoacoustic model.
|
146 |
*
|
147 |
* @param[in] s adjustable bit allocation parameters
|
148 |
* @param[in] band_psd signal power for each critical band
|
149 |
* @param[in] start starting bin location
|
150 |
* @param[in] end ending bin location
|
151 |
* @param[in] fast_gain fast gain (estimated signal-to-mask ratio)
|
152 |
* @param[in] is_lfe whether or not the channel being processed is the LFE
|
153 |
* @param[in] dba_mode delta bit allocation mode (none, reuse, or new)
|
154 |
* @param[in] dba_nsegs number of delta segments
|
155 |
* @param[in] dba_offsets location offsets for each segment
|
156 |
* @param[in] dba_lengths length of each segment
|
157 |
* @param[in] dba_values delta bit allocation for each segment
|
158 |
* @param[out] mask calculated masking curve
|
159 |
* @return returns 0 for success, non-zero for error
|
160 |
*/
|
161 |
int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd,
|
162 |
int start, int end, int fast_gain, int is_lfe, |
163 |
int dba_mode, int dba_nsegs, uint8_t *dba_offsets, |
164 |
uint8_t *dba_lengths, uint8_t *dba_values, |
165 |
int16_t *mask); |
166 |
|
167 |
/**
|
168 |
* Calculate bit allocation pointers.
|
169 |
* The SNR is the difference between the masking curve and the signal. AC-3
|
170 |
* uses this value for each frequency bin to allocate bits. The snroffset
|
171 |
* parameter is a global adjustment to the SNR for all bins.
|
172 |
*
|
173 |
* @param[in] mask masking curve
|
174 |
* @param[in] psd signal power for each frequency bin
|
175 |
* @param[in] start starting bin location
|
176 |
* @param[in] end ending bin location
|
177 |
* @param[in] snr_offset SNR adjustment
|
178 |
* @param[in] floor noise floor
|
179 |
* @param[in] bap_tab look-up table for bit allocation pointers
|
180 |
* @param[out] bap bit allocation pointers
|
181 |
*/
|
182 |
void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end, |
183 |
int snr_offset, int floor, |
184 |
const uint8_t *bap_tab, uint8_t *bap);
|
185 |
|
186 |
#endif /* AVCODEC_AC3_H */ |