Mercurial > libavcodec.hg
annotate ac3.h @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 2887f410011f |
children | 7dd2a45249a9 |
rev | line source |
---|---|
782 | 1 /* |
7470
1a93d3bbe3ee
cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents:
7017
diff
changeset
|
2 * Common code between the AC-3 encoder and decoder |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8280
diff
changeset
|
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard |
782 | 4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
782 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
782 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
782 | 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 | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
782 | 20 */ |
21 | |
1106 | 22 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8629
diff
changeset
|
23 * @file libavcodec/ac3.h |
7470
1a93d3bbe3ee
cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents:
7017
diff
changeset
|
24 * Common code between the AC-3 encoder and decoder. |
1106 | 25 */ |
26 | |
7760 | 27 #ifndef AVCODEC_AC3_H |
28 #define AVCODEC_AC3_H | |
4940 | 29 |
4879 | 30 #include "ac3tab.h" |
31 | |
782 | 32 #define AC3_MAX_CODED_FRAME_SIZE 3840 /* in bytes */ |
33 #define AC3_MAX_CHANNELS 6 /* including LFE channel */ | |
34 | |
7470
1a93d3bbe3ee
cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents:
7017
diff
changeset
|
35 #define NB_BLOCKS 6 /* number of PCM blocks inside an AC-3 frame */ |
782 | 36 #define AC3_FRAME_SIZE (NB_BLOCKS * 256) |
37 | |
38 /* exponent encoding strategy */ | |
39 #define EXP_REUSE 0 | |
40 #define EXP_NEW 1 | |
41 | |
42 #define EXP_D15 1 | |
43 #define EXP_D25 2 | |
44 #define EXP_D45 3 | |
45 | |
5331 | 46 /** Delta bit allocation strategy */ |
47 typedef enum { | |
48 DBA_REUSE = 0, | |
49 DBA_NEW, | |
50 DBA_NONE, | |
51 DBA_RESERVED | |
52 } AC3DeltaStrategy; | |
53 | |
54 /** Channel mode (audio coding mode) */ | |
55 typedef enum { | |
6005 | 56 AC3_CHMODE_DUALMONO = 0, |
57 AC3_CHMODE_MONO, | |
58 AC3_CHMODE_STEREO, | |
59 AC3_CHMODE_3F, | |
60 AC3_CHMODE_2F1R, | |
61 AC3_CHMODE_3F1R, | |
62 AC3_CHMODE_2F2R, | |
63 AC3_CHMODE_3F2R | |
5331 | 64 } AC3ChannelMode; |
65 | |
782 | 66 typedef struct AC3BitAllocParameters { |
6003 | 67 int sr_code; |
68 int sr_shift; | |
69 int slow_gain, slow_decay, fast_decay, db_per_bit, floor; | |
70 int cpl_fast_leak, cpl_slow_leak; | |
782 | 71 } AC3BitAllocParameters; |
72 | |
4648 | 73 /** |
74 * @struct AC3HeaderInfo | |
75 * Coded AC-3 header values up to the lfeon element, plus derived values. | |
76 */ | |
77 typedef struct { | |
78 /** @defgroup coded Coded elements | |
79 * @{ | |
80 */ | |
81 uint16_t sync_word; | |
82 uint16_t crc1; | |
6003 | 83 uint8_t sr_code; |
6005 | 84 uint8_t bitstream_id; |
85 uint8_t channel_mode; | |
86 uint8_t lfe_on; | |
6540
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6529
diff
changeset
|
87 uint8_t frame_type; |
7012 | 88 int substreamid; ///< substream identification |
6976
4e96557381d9
move some AC3HeaderInfo struct fields to the Coded elements group.
jbr
parents:
6671
diff
changeset
|
89 int center_mix_level; ///< Center mix level index |
4e96557381d9
move some AC3HeaderInfo struct fields to the Coded elements group.
jbr
parents:
6671
diff
changeset
|
90 int surround_mix_level; ///< Surround mix level index |
4e96557381d9
move some AC3HeaderInfo struct fields to the Coded elements group.
jbr
parents:
6671
diff
changeset
|
91 uint16_t channel_map; |
7011
77f607fb4e8b
get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents:
6976
diff
changeset
|
92 int num_blocks; ///< number of audio blocks |
4648 | 93 /** @} */ |
94 | |
95 /** @defgroup derived Derived values | |
96 * @{ | |
97 */ | |
6003 | 98 uint8_t sr_shift; |
4648 | 99 uint16_t sample_rate; |
100 uint32_t bit_rate; | |
101 uint8_t channels; | |
102 uint16_t frame_size; | |
9512
ba5d9a97ab2f
Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents:
8718
diff
changeset
|
103 int64_t channel_layout; |
4648 | 104 /** @} */ |
105 } AC3HeaderInfo; | |
106 | |
6529 | 107 typedef enum { |
6540
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6529
diff
changeset
|
108 EAC3_FRAME_TYPE_INDEPENDENT = 0, |
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6529
diff
changeset
|
109 EAC3_FRAME_TYPE_DEPENDENT, |
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6529
diff
changeset
|
110 EAC3_FRAME_TYPE_AC3_CONVERT, |
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6529
diff
changeset
|
111 EAC3_FRAME_TYPE_RESERVED |
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6529
diff
changeset
|
112 } EAC3FrameType; |
782 | 113 |
4197 | 114 void ac3_common_init(void); |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
115 |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
116 /** |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
117 * Calculates the log power-spectral density of the input signal. |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
118 * This gives a rough estimate of signal power in the frequency domain by using |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
119 * the spectral envelope (exponents). The psd is also separately grouped |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
120 * into critical bands for use in the calculating the masking curve. |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
121 * 128 units in psd = -6 dB. The dbknee parameter in AC3BitAllocParameters |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
122 * determines the reference level. |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
123 * |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
124 * @param[in] exp frequency coefficient exponents |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
125 * @param[in] start starting bin location |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
126 * @param[in] end ending bin location |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
127 * @param[out] psd signal power for each frequency bin |
6003 | 128 * @param[out] band_psd signal power for each critical band |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
129 */ |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
130 void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd, |
6003 | 131 int16_t *band_psd); |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
132 |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
133 /** |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
134 * Calculates the masking curve. |
9822
2887f410011f
Remove '\p', '\c' and '\e' doxygen markup from doxy, as it should
stefano
parents:
9512
diff
changeset
|
135 * First, the excitation is calculated using parameters in s and the signal |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
136 * power in each critical band. The excitation is compared with a predefined |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
137 * hearing threshold table to produce the masking curve. If delta bit |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
138 * allocation information is provided, it is used for adjusting the masking |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
139 * curve, usually to give a closer match to a better psychoacoustic model. |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
140 * |
6004 | 141 * @param[in] s adjustable bit allocation parameters |
6003 | 142 * @param[in] band_psd signal power for each critical band |
6004 | 143 * @param[in] start starting bin location |
144 * @param[in] end ending bin location | |
145 * @param[in] fast_gain fast gain (estimated signal-to-mask ratio) | |
146 * @param[in] is_lfe whether or not the channel being processed is the LFE | |
6003 | 147 * @param[in] dba_mode delta bit allocation mode (none, reuse, or new) |
148 * @param[in] dba_nsegs number of delta segments | |
149 * @param[in] dba_offsets location offsets for each segment | |
150 * @param[in] dba_lengths length of each segment | |
151 * @param[in] dba_values delta bit allocation for each segment | |
6004 | 152 * @param[out] mask calculated masking curve |
8279
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
7760
diff
changeset
|
153 * @return returns 0 for success, non-zero for error |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
154 */ |
8279
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
7760
diff
changeset
|
155 int ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *band_psd, |
8280 | 156 int start, int end, int fast_gain, int is_lfe, |
157 int dba_mode, int dba_nsegs, uint8_t *dba_offsets, | |
158 uint8_t *dba_lengths, uint8_t *dba_values, | |
159 int16_t *mask); | |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
160 |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
161 /** |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
162 * Calculates bit allocation pointers. |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
163 * The SNR is the difference between the masking curve and the signal. AC-3 |
9822
2887f410011f
Remove '\p', '\c' and '\e' doxygen markup from doxy, as it should
stefano
parents:
9512
diff
changeset
|
164 * uses this value for each frequency bin to allocate bits. The snroffset |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
165 * parameter is a global adjustment to the SNR for all bins. |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
166 * |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
167 * @param[in] mask masking curve |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
168 * @param[in] psd signal power for each frequency bin |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
169 * @param[in] start starting bin location |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
170 * @param[in] end ending bin location |
6003 | 171 * @param[in] snr_offset SNR adjustment |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
172 * @param[in] floor noise floor |
7017 | 173 * @param[in] bap_tab look-up table for bit allocation pointers |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
174 * @param[out] bap bit allocation pointers |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
175 */ |
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
176 void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end, |
7017 | 177 int snr_offset, int floor, |
178 const uint8_t *bap_tab, uint8_t *bap); | |
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
179 |
4197 | 180 void ac3_parametric_bit_allocation(AC3BitAllocParameters *s, uint8_t *bap, |
181 int8_t *exp, int start, int end, | |
6003 | 182 int snr_offset, int fast_gain, int is_lfe, |
183 int dba_mode, int dba_nsegs, | |
184 uint8_t *dba_offsets, uint8_t *dba_lengths, | |
185 uint8_t *dba_values); | |
4940 | 186 |
7760 | 187 #endif /* AVCODEC_AC3_H */ |