Mercurial > libavcodec.hg
annotate ac3.h @ 5319:40af705cef7e libavcodec
AC-3 decoder, soc revision 69, Aug 31 07:12:56 2006 UTC by cloud9
Fix the bugs:
1. The quality of output because of incorrect windowing coefficients.
New code for window generation.
2. Dynrng values were reset where dynrng value is present in the first block,
but not in the subsequent block.
| author | jbr |
|---|---|
| date | Sat, 14 Jul 2007 16:03:14 +0000 |
| parents | f8e21b3014f7 |
| children | b24bcdd0ae86 |
| rev | line source |
|---|---|
| 782 | 1 /* |
| 2 * Common code between AC3 encoder and decoder | |
| 3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. | |
| 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 /** |
| 23 * @file ac3.h | |
| 24 * Common code between AC3 encoder and decoder. | |
| 25 */ | |
| 26 | |
| 4940 | 27 #ifndef AC3_H |
| 28 #define AC3_H | |
| 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 | |
| 35 #define NB_BLOCKS 6 /* number of PCM blocks inside an AC3 frame */ | |
| 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 | |
| 46 typedef struct AC3BitAllocParameters { | |
| 47 int fscod; /* frequency */ | |
| 48 int halfratecod; | |
| 49 int sgain, sdecay, fdecay, dbknee, floor; | |
| 50 int cplfleak, cplsleak; | |
| 51 } AC3BitAllocParameters; | |
| 52 | |
| 4648 | 53 /** |
| 54 * @struct AC3HeaderInfo | |
| 55 * Coded AC-3 header values up to the lfeon element, plus derived values. | |
| 56 */ | |
| 57 typedef struct { | |
| 58 /** @defgroup coded Coded elements | |
| 59 * @{ | |
| 60 */ | |
| 61 uint16_t sync_word; | |
| 62 uint16_t crc1; | |
| 63 uint8_t fscod; | |
| 64 uint8_t frmsizecod; | |
| 65 uint8_t bsid; | |
| 66 uint8_t bsmod; | |
| 67 uint8_t acmod; | |
| 68 uint8_t cmixlev; | |
| 69 uint8_t surmixlev; | |
| 70 uint8_t dsurmod; | |
| 71 uint8_t lfeon; | |
| 72 /** @} */ | |
| 73 | |
| 74 /** @defgroup derived Derived values | |
| 75 * @{ | |
| 76 */ | |
| 77 uint8_t halfratecod; | |
| 78 uint16_t sample_rate; | |
| 79 uint32_t bit_rate; | |
| 80 uint8_t channels; | |
| 81 uint16_t frame_size; | |
| 82 /** @} */ | |
| 83 } AC3HeaderInfo; | |
| 84 | |
| 782 | 85 |
| 4197 | 86 void ac3_common_init(void); |
|
4684
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
87 |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
88 /** |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
89 * 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
|
90 * 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
|
91 * 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
|
92 * 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
|
93 * 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
|
94 * determines the reference level. |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
95 * |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
96 * @param[in] exp frequency coefficient exponents |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
97 * @param[in] start starting bin location |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
98 * @param[in] end ending bin location |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
99 * @param[out] psd signal power for each frequency bin |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
100 * @param[out] bndpsd signal power for each critical band |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
101 */ |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
102 void ff_ac3_bit_alloc_calc_psd(int8_t *exp, int start, int end, int16_t *psd, |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
103 int16_t *bndpsd); |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
104 |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
105 /** |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
106 * Calculates the masking curve. |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
107 * First, the excitation is calculated using parameters in \p s and the signal |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
108 * 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
|
109 * 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
|
110 * 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
|
111 * 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
|
112 * |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
113 * @param[in] s adjustable bit allocation parameters |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
114 * @param[in] bndpsd signal power for each critical band |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
115 * @param[in] start starting bin location |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
116 * @param[in] end ending bin location |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
117 * @param[in] fgain fast gain (estimated signal-to-mask ratio) |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
118 * @param[in] is_lfe whether or not the channel being processed is the LFE |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
119 * @param[in] deltbae delta bit allocation exists (none, reuse, or new) |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
120 * @param[in] deltnseg number of delta segments |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
121 * @param[in] deltoffst location offsets for each segment |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
122 * @param[in] deltlen length of each segment |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
123 * @param[in] deltba delta bit allocation for each segment |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
124 * @param[out] mask calculated masking curve |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
125 */ |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
126 void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters *s, int16_t *bndpsd, |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
127 int start, int end, int fgain, int is_lfe, |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
128 int deltbae, int deltnseg, uint8_t *deltoffst, |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
129 uint8_t *deltlen, uint8_t *deltba, |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
130 int16_t *mask); |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
131 |
|
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 * Calculates bit allocation pointers. |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
134 * The SNR is the difference between the masking curve and the signal. AC-3 |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
135 * uses this value for each frequency bin to allocate bits. The \p snroffset |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
136 * 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
|
137 * |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
138 * @param[in] mask masking curve |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
139 * @param[in] psd signal power for each frequency bin |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
140 * @param[in] start starting bin location |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
141 * @param[in] end ending bin location |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
142 * @param[in] snroffset SNR adjustment |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
143 * @param[in] floor noise floor |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
144 * @param[out] bap bit allocation pointers |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
145 */ |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
146 void ff_ac3_bit_alloc_calc_bap(int16_t *mask, int16_t *psd, int start, int end, |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
147 int snroffset, int floor, uint8_t *bap); |
|
6ec0afffc572
split ac3_parametric_bit_allocation into 3 separate functions
jbr
parents:
4679
diff
changeset
|
148 |
| 4197 | 149 void ac3_parametric_bit_allocation(AC3BitAllocParameters *s, uint8_t *bap, |
| 150 int8_t *exp, int start, int end, | |
| 151 int snroffset, int fgain, int is_lfe, | |
| 152 int deltbae,int deltnseg, | |
| 153 uint8_t *deltoffst, uint8_t *deltlen, uint8_t *deltba); | |
| 4940 | 154 |
| 155 #endif /* AC3_H */ |
