Mercurial > libavcodec.hg
annotate ac3dec.c @ 9896:bbefbca72722 libavcodec
Drop code that attempts to decode frames that are prefixed by junk.
Too often it ends up decoding random data into noise without detecting
it (for example after seeking of some MP3 data with oddly often occurring
startcode emulation).
Fixes issue1154.
| author | michael |
|---|---|
| date | Tue, 30 Jun 2009 03:57:27 +0000 |
| parents | 7ad7d4094d1f |
| children | daa53251c64d |
| rev | line source |
|---|---|
| 5328 | 1 /* |
| 2 * AC-3 Audio Decoder | |
| 7626 | 3 * This code was developed as part of Google Summer of Code 2006. |
| 4 * E-AC-3 support was added as part of Google Summer of Code 2007. | |
|
5316
a09b700fcfca
AC-3 decoder, soc revision 56, Aug 17 14:21:58 2006 UTC by cloud9
jbr
parents:
5315
diff
changeset
|
5 * |
|
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8545
diff
changeset
|
6 * Copyright (c) 2006 Kartikey Mahendra BHATT (bhattkm at gmail dot com) |
| 7626 | 7 * Copyright (c) 2007-2008 Bartlomiej Wolowiec <bartek.wolowiec@gmail.com> |
|
7594
cd6217c9ce92
update my email address to one which does not depend on my service provider
jbr
parents:
7564
diff
changeset
|
8 * Copyright (c) 2007 Justin Ruggles <justin.ruggles@gmail.com> |
|
5316
a09b700fcfca
AC-3 decoder, soc revision 56, Aug 17 14:21:58 2006 UTC by cloud9
jbr
parents:
5315
diff
changeset
|
9 * |
| 5328 | 10 * This file is part of FFmpeg. |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
11 * |
| 5328 | 12 * FFmpeg is free software; you can redistribute it and/or |
|
9673
3e1a08ba8481
The AC-3 decoder is now LGPL. Exchange the license header and change references
diego
parents:
9672
diff
changeset
|
13 * modify it under the terms of the GNU Lesser General Public |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
14 * License as published by the Free Software Foundation; either |
|
9673
3e1a08ba8481
The AC-3 decoder is now LGPL. Exchange the license header and change references
diego
parents:
9672
diff
changeset
|
15 * version 2.1 of the License, or (at your option) any later version. |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
16 * |
| 5328 | 17 * FFmpeg is distributed in the hope that it will be useful, |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
9673
3e1a08ba8481
The AC-3 decoder is now LGPL. Exchange the license header and change references
diego
parents:
9672
diff
changeset
|
20 * Lesser General Public License for more details. |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
21 * |
|
9673
3e1a08ba8481
The AC-3 decoder is now LGPL. Exchange the license header and change references
diego
parents:
9672
diff
changeset
|
22 * You should have received a copy of the GNU Lesser General Public |
| 5328 | 23 * License along with FFmpeg; if not, write to the Free Software |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
25 */ |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
26 |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
27 #include <stdio.h> |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
28 #include <stddef.h> |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
29 #include <math.h> |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
30 #include <string.h> |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
31 |
| 6763 | 32 #include "libavutil/crc.h" |
|
8281
f93efc084e41
Make av_log_missing_feature an internal function, and change its name
stefano
parents:
8280
diff
changeset
|
33 #include "internal.h" |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
34 #include "aac_ac3_parser.h" |
|
5386
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
35 #include "ac3_parser.h" |
|
7020
40a2db8dbaa2
move the decode context and some macro constants to a new file, ac3dec.h
jbr
parents:
7019
diff
changeset
|
36 #include "ac3dec.h" |
| 7033 | 37 #include "ac3dec_data.h" |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
38 |
|
7624
545305ba44a0
rename AC3_MAX_FRAME_SIZE to AC3_FRAME_BUFFER_SIZE and increase the size
jbr
parents:
7603
diff
changeset
|
39 /** Large enough for maximum possible frame size when the specification limit is ignored */ |
|
545305ba44a0
rename AC3_MAX_FRAME_SIZE to AC3_FRAME_BUFFER_SIZE and increase the size
jbr
parents:
7603
diff
changeset
|
40 #define AC3_FRAME_BUFFER_SIZE 32768 |
|
6536
8f2186d5daca
additional protection from segmentation faults and memory access errors by
jbr
parents:
6529
diff
changeset
|
41 |
|
7471
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
42 /** |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
43 * table for ungrouping 3 values in 7 bits. |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
44 * used for exponents and bap=2 mantissas |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
45 */ |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
46 static uint8_t ungroup_3_in_7_bits_tab[128][3]; |
|
5325
0d963101e0d7
AC-3 decoder, soc revision 402, Jul 14 13:45:14 2007 UTC by jbr
jbr
parents:
5324
diff
changeset
|
47 |
|
0d963101e0d7
AC-3 decoder, soc revision 402, Jul 14 13:45:14 2007 UTC by jbr
jbr
parents:
5324
diff
changeset
|
48 |
| 5456 | 49 /** tables for ungrouping mantissas */ |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
50 static int b1_mantissas[32][3]; |
|
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
51 static int b2_mantissas[128][3]; |
|
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
52 static int b3_mantissas[8]; |
|
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
53 static int b4_mantissas[128][2]; |
|
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
54 static int b5_mantissas[16]; |
|
5325
0d963101e0d7
AC-3 decoder, soc revision 402, Jul 14 13:45:14 2007 UTC by jbr
jbr
parents:
5324
diff
changeset
|
55 |
| 5456 | 56 /** |
| 57 * Quantization table: levels for symmetric. bits for asymmetric. | |
| 58 * reference: Table 7.18 Mapping of bap to Quantizer | |
| 59 */ | |
| 6006 | 60 static const uint8_t quantization_tab[16] = { |
| 5456 | 61 0, 3, 5, 7, 11, 15, |
| 62 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 | |
| 63 }; | |
|
5325
0d963101e0d7
AC-3 decoder, soc revision 402, Jul 14 13:45:14 2007 UTC by jbr
jbr
parents:
5324
diff
changeset
|
64 |
|
5457
0a5849a4858b
use table for converting dynamic range codes to scale factors
jbr
parents:
5456
diff
changeset
|
65 /** dynamic range table. converts codes to scale factors. */ |
| 6006 | 66 static float dynamic_range_tab[256]; |
|
5457
0a5849a4858b
use table for converting dynamic range codes to scale factors
jbr
parents:
5456
diff
changeset
|
67 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
68 /** Adjustments in dB gain */ |
|
7018
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
69 #define LEVEL_PLUS_3DB 1.4142135623730950 |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
70 #define LEVEL_PLUS_1POINT5DB 1.1892071150027209 |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
71 #define LEVEL_MINUS_1POINT5DB 0.8408964152537145 |
|
5325
0d963101e0d7
AC-3 decoder, soc revision 402, Jul 14 13:45:14 2007 UTC by jbr
jbr
parents:
5324
diff
changeset
|
72 #define LEVEL_MINUS_3DB 0.7071067811865476 |
|
0d963101e0d7
AC-3 decoder, soc revision 402, Jul 14 13:45:14 2007 UTC by jbr
jbr
parents:
5324
diff
changeset
|
73 #define LEVEL_MINUS_4POINT5DB 0.5946035575013605 |
|
0d963101e0d7
AC-3 decoder, soc revision 402, Jul 14 13:45:14 2007 UTC by jbr
jbr
parents:
5324
diff
changeset
|
74 #define LEVEL_MINUS_6DB 0.5000000000000000 |
| 5480 | 75 #define LEVEL_MINUS_9DB 0.3535533905932738 |
|
5325
0d963101e0d7
AC-3 decoder, soc revision 402, Jul 14 13:45:14 2007 UTC by jbr
jbr
parents:
5324
diff
changeset
|
76 #define LEVEL_ZERO 0.0000000000000000 |
| 5480 | 77 #define LEVEL_ONE 1.0000000000000000 |
| 78 | |
|
7018
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
79 static const float gain_levels[9] = { |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
80 LEVEL_PLUS_3DB, |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
81 LEVEL_PLUS_1POINT5DB, |
| 5480 | 82 LEVEL_ONE, |
|
7018
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
83 LEVEL_MINUS_1POINT5DB, |
| 5480 | 84 LEVEL_MINUS_3DB, |
| 85 LEVEL_MINUS_4POINT5DB, | |
| 86 LEVEL_MINUS_6DB, | |
|
7018
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
87 LEVEL_ZERO, |
| 5480 | 88 LEVEL_MINUS_9DB |
| 89 }; | |
| 90 | |
| 91 /** | |
|
7019
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
92 * Table for center mix levels |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
93 * reference: Section 5.4.2.4 cmixlev |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
94 */ |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
95 static const uint8_t center_levels[4] = { 4, 5, 6, 5 }; |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
96 |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
97 /** |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
98 * Table for surround mix levels |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
99 * reference: Section 5.4.2.5 surmixlev |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
100 */ |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
101 static const uint8_t surround_levels[4] = { 4, 6, 7, 6 }; |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
102 |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
103 /** |
| 5480 | 104 * Table for default stereo downmixing coefficients |
| 105 * reference: Section 7.8.2 Downmixing Into Two Channels | |
| 106 */ | |
| 107 static const uint8_t ac3_default_coeffs[8][5][2] = { | |
|
7018
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
108 { { 2, 7 }, { 7, 2 }, }, |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
109 { { 4, 4 }, }, |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
110 { { 2, 7 }, { 7, 2 }, }, |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
111 { { 2, 7 }, { 5, 5 }, { 7, 2 }, }, |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
112 { { 2, 7 }, { 7, 2 }, { 6, 6 }, }, |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
113 { { 2, 7 }, { 5, 5 }, { 7, 2 }, { 8, 8 }, }, |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
114 { { 2, 7 }, { 7, 2 }, { 6, 7 }, { 7, 6 }, }, |
|
885cad616170
add more gain levels and adjust mix level tables accordingly.
jbr
parents:
7017
diff
changeset
|
115 { { 2, 7 }, { 5, 5 }, { 7, 2 }, { 6, 7 }, { 7, 6 }, }, |
| 5480 | 116 }; |
|
5325
0d963101e0d7
AC-3 decoder, soc revision 402, Jul 14 13:45:14 2007 UTC by jbr
jbr
parents:
5324
diff
changeset
|
117 |
|
5310
9aa9197034d7
AC-3 decoder, soc revision 40, Aug 9 00:10:14 2006 UTC by cloud9
jbr
parents:
5309
diff
changeset
|
118 /** |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
119 * Symmetrical Dequantization |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
120 * reference: Section 7.3.3 Expansion of Mantissas for Symmetrical Quantization |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
121 * Tables 7.19 to 7.23 |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
122 */ |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
123 static inline int |
| 5456 | 124 symmetric_dequant(int code, int levels) |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
125 { |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
126 return ((code - (levels >> 1)) << 24) / levels; |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
127 } |
|
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
128 |
|
5321
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
129 /* |
|
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
130 * Initialize tables at runtime. |
|
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
131 */ |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6487
diff
changeset
|
132 static av_cold void ac3_tables_init(void) |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
133 { |
| 5375 | 134 int i; |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
135 |
|
7471
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
136 /* generate table for ungrouping 3 values in 7 bits |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
137 reference: Section 7.1.3 Exponent Decoding */ |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
138 for(i=0; i<128; i++) { |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
139 ungroup_3_in_7_bits_tab[i][0] = i / 25; |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
140 ungroup_3_in_7_bits_tab[i][1] = (i % 25) / 5; |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
141 ungroup_3_in_7_bits_tab[i][2] = (i % 25) % 5; |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
142 } |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
143 |
| 5456 | 144 /* generate grouped mantissa tables |
| 145 reference: Section 7.3.5 Ungrouping of Mantissas */ | |
| 146 for(i=0; i<32; i++) { | |
| 147 /* bap=1 mantissas */ | |
|
7472
83c16f531a90
Hardcode the table for ungrouping 3 values in 5 bits. It will be reused by
jbr
parents:
7471
diff
changeset
|
148 b1_mantissas[i][0] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][0], 3); |
|
83c16f531a90
Hardcode the table for ungrouping 3 values in 5 bits. It will be reused by
jbr
parents:
7471
diff
changeset
|
149 b1_mantissas[i][1] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][1], 3); |
|
83c16f531a90
Hardcode the table for ungrouping 3 values in 5 bits. It will be reused by
jbr
parents:
7471
diff
changeset
|
150 b1_mantissas[i][2] = symmetric_dequant(ff_ac3_ungroup_3_in_5_bits_tab[i][2], 3); |
| 5456 | 151 } |
| 152 for(i=0; i<128; i++) { | |
| 153 /* bap=2 mantissas */ | |
|
7471
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
154 b2_mantissas[i][0] = symmetric_dequant(ungroup_3_in_7_bits_tab[i][0], 5); |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
155 b2_mantissas[i][1] = symmetric_dequant(ungroup_3_in_7_bits_tab[i][1], 5); |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
156 b2_mantissas[i][2] = symmetric_dequant(ungroup_3_in_7_bits_tab[i][2], 5); |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
157 |
| 5456 | 158 /* bap=4 mantissas */ |
| 159 b4_mantissas[i][0] = symmetric_dequant(i / 11, 11); | |
| 160 b4_mantissas[i][1] = symmetric_dequant(i % 11, 11); | |
| 161 } | |
| 162 /* generate ungrouped mantissa tables | |
| 163 reference: Tables 7.21 and 7.23 */ | |
| 164 for(i=0; i<7; i++) { | |
| 165 /* bap=3 mantissas */ | |
| 166 b3_mantissas[i] = symmetric_dequant(i, 7); | |
| 167 } | |
| 168 for(i=0; i<15; i++) { | |
| 169 /* bap=5 mantissas */ | |
| 170 b5_mantissas[i] = symmetric_dequant(i, 15); | |
| 171 } | |
|
5321
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
172 |
|
5457
0a5849a4858b
use table for converting dynamic range codes to scale factors
jbr
parents:
5456
diff
changeset
|
173 /* generate dynamic range table |
|
0a5849a4858b
use table for converting dynamic range codes to scale factors
jbr
parents:
5456
diff
changeset
|
174 reference: Section 7.7.1 Dynamic Range Control */ |
|
0a5849a4858b
use table for converting dynamic range codes to scale factors
jbr
parents:
5456
diff
changeset
|
175 for(i=0; i<256; i++) { |
|
0a5849a4858b
use table for converting dynamic range codes to scale factors
jbr
parents:
5456
diff
changeset
|
176 int v = (i >> 5) - ((i >> 7) << 3) - 5; |
| 6006 | 177 dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0x1F) | 0x20); |
|
5457
0a5849a4858b
use table for converting dynamic range codes to scale factors
jbr
parents:
5456
diff
changeset
|
178 } |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
179 } |
|
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
180 |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
181 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
182 /** |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
183 * AVCodec initialization |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
184 */ |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6487
diff
changeset
|
185 static av_cold int ac3_decode_init(AVCodecContext *avctx) |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
186 { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
187 AC3DecodeContext *s = avctx->priv_data; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
188 s->avctx = avctx; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
189 |
| 5331 | 190 ac3_common_init(); |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
191 ac3_tables_init(); |
|
9658
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9608
diff
changeset
|
192 ff_mdct_init(&s->imdct_256, 8, 1, 1.0); |
|
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9608
diff
changeset
|
193 ff_mdct_init(&s->imdct_512, 9, 1, 1.0); |
|
6142
a35b838ab955
Add variable alpha and size of half window for Kaiser-Bessel Derived window
superdump
parents:
6139
diff
changeset
|
194 ff_kbd_window_init(s->window, 5.0, 256); |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
195 dsputil_init(&s->dsp, avctx); |
| 7601 | 196 av_lfg_init(&s->dith_state, 0); |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
197 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
198 /* set bias values for float to int16 conversion */ |
| 7550 | 199 if(s->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
200 s->add_bias = 385.0f; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
201 s->mul_bias = 1.0f; |
|
5479
943c732c905d
use dsputil for float to signed 16-bit sample conversion
jbr
parents:
5477
diff
changeset
|
202 } else { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
203 s->add_bias = 0.0f; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
204 s->mul_bias = 32767.0f; |
|
5479
943c732c905d
use dsputil for float to signed 16-bit sample conversion
jbr
parents:
5477
diff
changeset
|
205 } |
|
943c732c905d
use dsputil for float to signed 16-bit sample conversion
jbr
parents:
5477
diff
changeset
|
206 |
| 6112 | 207 /* allow downmixing to stereo or mono */ |
| 208 if (avctx->channels > 0 && avctx->request_channels > 0 && | |
| 209 avctx->request_channels < avctx->channels && | |
| 210 avctx->request_channels <= 2) { | |
| 211 avctx->channels = avctx->request_channels; | |
| 212 } | |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
213 s->downmixed = 1; |
| 6112 | 214 |
|
6538
b8f886bce6f5
only allocate context input buffer if AVCodecContext.error_reslience is greater than 0.
jbr
parents:
6537
diff
changeset
|
215 /* allocate context input buffer */ |
| 7831 | 216 if (avctx->error_recognition >= FF_ER_CAREFUL) { |
|
7624
545305ba44a0
rename AC3_MAX_FRAME_SIZE to AC3_FRAME_BUFFER_SIZE and increase the size
jbr
parents:
7603
diff
changeset
|
217 s->input_buffer = av_mallocz(AC3_FRAME_BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); |
|
6538
b8f886bce6f5
only allocate context input buffer if AVCodecContext.error_reslience is greater than 0.
jbr
parents:
6537
diff
changeset
|
218 if (!s->input_buffer) |
|
b8f886bce6f5
only allocate context input buffer if AVCodecContext.error_reslience is greater than 0.
jbr
parents:
6537
diff
changeset
|
219 return AVERROR_NOMEM; |
|
b8f886bce6f5
only allocate context input buffer if AVCodecContext.error_reslience is greater than 0.
jbr
parents:
6537
diff
changeset
|
220 } |
|
b8f886bce6f5
only allocate context input buffer if AVCodecContext.error_reslience is greater than 0.
jbr
parents:
6537
diff
changeset
|
221 |
|
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7328
diff
changeset
|
222 avctx->sample_fmt = SAMPLE_FMT_S16; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
223 return 0; |
|
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
224 } |
|
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
225 |
|
5386
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
226 /** |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
227 * Parse the 'sync info' and 'bit stream info' from the AC-3 bitstream. |
|
5321
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
228 * GetBitContext within AC3DecodeContext must point to |
|
7470
1a93d3bbe3ee
cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents:
7451
diff
changeset
|
229 * the start of the synchronized AC-3 bitstream. |
|
5321
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
230 */ |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
231 static int ac3_parse_header(AC3DecodeContext *s) |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
232 { |
| 7028 | 233 GetBitContext *gbc = &s->gbc; |
| 234 int i; | |
| 235 | |
| 236 /* read the rest of the bsi. read twice for dual mono mode. */ | |
| 237 i = !(s->channel_mode); | |
| 238 do { | |
| 239 skip_bits(gbc, 5); // skip dialog normalization | |
| 240 if (get_bits1(gbc)) | |
| 241 skip_bits(gbc, 8); //skip compression | |
| 242 if (get_bits1(gbc)) | |
| 243 skip_bits(gbc, 8); //skip language code | |
| 244 if (get_bits1(gbc)) | |
| 245 skip_bits(gbc, 7); //skip audio production information | |
| 246 } while (i--); | |
| 247 | |
| 248 skip_bits(gbc, 2); //skip copyright bit and original bitstream bit | |
| 249 | |
| 250 /* skip the timecodes (or extra bitstream information for Alternate Syntax) | |
| 251 TODO: read & use the xbsi1 downmix levels */ | |
| 252 if (get_bits1(gbc)) | |
| 253 skip_bits(gbc, 14); //skip timecode1 / xbsi1 | |
| 254 if (get_bits1(gbc)) | |
| 255 skip_bits(gbc, 14); //skip timecode2 / xbsi2 | |
| 256 | |
| 257 /* skip additional bitstream info */ | |
| 258 if (get_bits1(gbc)) { | |
| 259 i = get_bits(gbc, 6); | |
| 260 do { | |
| 261 skip_bits(gbc, 8); | |
| 262 } while(i--); | |
| 263 } | |
| 264 | |
| 265 return 0; | |
| 266 } | |
| 267 | |
| 268 /** | |
|
7470
1a93d3bbe3ee
cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents:
7451
diff
changeset
|
269 * Common function to parse AC-3 or E-AC-3 frame header |
| 7028 | 270 */ |
| 271 static int parse_frame_header(AC3DecodeContext *s) | |
| 272 { | |
|
5386
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
273 AC3HeaderInfo hdr; |
| 7028 | 274 int err; |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
275 |
| 7489 | 276 err = ff_ac3_parse_header(&s->gbc, &hdr); |
|
5386
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
277 if(err) |
|
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
278 return err; |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
279 |
|
5386
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
280 /* get decoding parameters from header info */ |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
281 s->bit_alloc_params.sr_code = hdr.sr_code; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
282 s->channel_mode = hdr.channel_mode; |
|
9512
ba5d9a97ab2f
Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents:
9454
diff
changeset
|
283 s->channel_layout = hdr.channel_layout; |
| 6091 | 284 s->lfe_on = hdr.lfe_on; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
285 s->bit_alloc_params.sr_shift = hdr.sr_shift; |
| 6093 | 286 s->sample_rate = hdr.sample_rate; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
287 s->bit_rate = hdr.bit_rate; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
288 s->channels = hdr.channels; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
289 s->fbw_channels = s->channels - s->lfe_on; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
290 s->lfe_ch = s->fbw_channels + 1; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
291 s->frame_size = hdr.frame_size; |
|
6661
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6540
diff
changeset
|
292 s->center_mix_level = hdr.center_mix_level; |
|
a409fbf1f42b
change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents:
6540
diff
changeset
|
293 s->surround_mix_level = hdr.surround_mix_level; |
|
7011
77f607fb4e8b
get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents:
6999
diff
changeset
|
294 s->num_blocks = hdr.num_blocks; |
| 7013 | 295 s->frame_type = hdr.frame_type; |
| 7012 | 296 s->substreamid = hdr.substreamid; |
|
5412
3f6a6dda6b2d
remove broken downmixing. will add new implementation later.
jbr
parents:
5393
diff
changeset
|
297 |
|
6958
1c523b5212cd
set lfe params at frame init instead of in every block
jbr
parents:
6957
diff
changeset
|
298 if(s->lfe_on) { |
|
1c523b5212cd
set lfe params at frame init instead of in every block
jbr
parents:
6957
diff
changeset
|
299 s->start_freq[s->lfe_ch] = 0; |
|
1c523b5212cd
set lfe params at frame init instead of in every block
jbr
parents:
6957
diff
changeset
|
300 s->end_freq[s->lfe_ch] = 7; |
|
1c523b5212cd
set lfe params at frame init instead of in every block
jbr
parents:
6957
diff
changeset
|
301 s->num_exp_groups[s->lfe_ch] = 2; |
|
1c523b5212cd
set lfe params at frame init instead of in every block
jbr
parents:
6957
diff
changeset
|
302 s->channel_in_cpl[s->lfe_ch] = 0; |
|
1c523b5212cd
set lfe params at frame init instead of in every block
jbr
parents:
6957
diff
changeset
|
303 } |
|
1c523b5212cd
set lfe params at frame init instead of in every block
jbr
parents:
6957
diff
changeset
|
304 |
| 7626 | 305 if (hdr.bitstream_id <= 10) { |
| 306 s->eac3 = 0; | |
| 307 s->snr_offset_strategy = 2; | |
| 308 s->block_switch_syntax = 1; | |
| 309 s->dither_flag_syntax = 1; | |
| 310 s->bit_allocation_syntax = 1; | |
| 311 s->fast_gain_syntax = 0; | |
| 312 s->first_cpl_leak = 0; | |
| 313 s->dba_syntax = 1; | |
| 314 s->skip_syntax = 1; | |
| 315 memset(s->channel_uses_aht, 0, sizeof(s->channel_uses_aht)); | |
| 7627 | 316 return ac3_parse_header(s); |
| 7626 | 317 } else { |
|
7756
2994fe74068f
turn on E-AC-3 decoding support and update the Changelog
jbr
parents:
7749
diff
changeset
|
318 s->eac3 = 1; |
|
2994fe74068f
turn on E-AC-3 decoding support and update the Changelog
jbr
parents:
7749
diff
changeset
|
319 return ff_eac3_parse_header(s); |
| 7626 | 320 } |
|
6126
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
321 } |
|
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
322 |
|
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
323 /** |
|
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
324 * Set stereo downmixing coefficients based on frame header info. |
|
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
325 * reference: Section 7.8.2 Downmixing Into Two Channels |
|
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
326 */ |
|
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
327 static void set_downmix_coeffs(AC3DecodeContext *s) |
|
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
328 { |
|
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
329 int i; |
|
7019
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
330 float cmix = gain_levels[center_levels[s->center_mix_level]]; |
|
81d5c68233e5
move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents:
7018
diff
changeset
|
331 float smix = gain_levels[surround_levels[s->surround_mix_level]]; |
| 7554 | 332 float norm0, norm1; |
|
6126
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
333 |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
334 for(i=0; i<s->fbw_channels; i++) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
335 s->downmix_coeffs[i][0] = gain_levels[ac3_default_coeffs[s->channel_mode][i][0]]; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
336 s->downmix_coeffs[i][1] = gain_levels[ac3_default_coeffs[s->channel_mode][i][1]]; |
| 5480 | 337 } |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
338 if(s->channel_mode > 1 && s->channel_mode & 1) { |
|
6126
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
339 s->downmix_coeffs[1][0] = s->downmix_coeffs[1][1] = cmix; |
| 5480 | 340 } |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
341 if(s->channel_mode == AC3_CHMODE_2F1R || s->channel_mode == AC3_CHMODE_3F1R) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
342 int nf = s->channel_mode - 2; |
|
6126
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
343 s->downmix_coeffs[nf][0] = s->downmix_coeffs[nf][1] = smix * LEVEL_MINUS_3DB; |
| 5480 | 344 } |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
345 if(s->channel_mode == AC3_CHMODE_2F2R || s->channel_mode == AC3_CHMODE_3F2R) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
346 int nf = s->channel_mode - 4; |
|
6126
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
347 s->downmix_coeffs[nf][0] = s->downmix_coeffs[nf+1][1] = smix; |
| 5480 | 348 } |
|
6431
305c49259b59
pre-calculate downmix coefficient sums. 2% faster 5.1-to-stereo downmixing.
jbr
parents:
6430
diff
changeset
|
349 |
| 7554 | 350 /* renormalize */ |
| 351 norm0 = norm1 = 0.0; | |
| 352 for(i=0; i<s->fbw_channels; i++) { | |
| 353 norm0 += s->downmix_coeffs[i][0]; | |
| 354 norm1 += s->downmix_coeffs[i][1]; | |
| 355 } | |
| 356 norm0 = 1.0f / norm0; | |
| 357 norm1 = 1.0f / norm1; | |
|
6431
305c49259b59
pre-calculate downmix coefficient sums. 2% faster 5.1-to-stereo downmixing.
jbr
parents:
6430
diff
changeset
|
358 for(i=0; i<s->fbw_channels; i++) { |
| 7554 | 359 s->downmix_coeffs[i][0] *= norm0; |
| 360 s->downmix_coeffs[i][1] *= norm1; | |
|
6431
305c49259b59
pre-calculate downmix coefficient sums. 2% faster 5.1-to-stereo downmixing.
jbr
parents:
6430
diff
changeset
|
361 } |
| 7554 | 362 |
| 363 if(s->output_mode == AC3_CHMODE_MONO) { | |
| 364 for(i=0; i<s->fbw_channels; i++) | |
| 365 s->downmix_coeffs[i][0] = (s->downmix_coeffs[i][0] + s->downmix_coeffs[i][1]) * LEVEL_MINUS_3DB; | |
| 366 } | |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
367 } |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
368 |
| 5376 | 369 /** |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
370 * Decode the grouped exponents according to exponent strategy. |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
371 * reference: Section 7.1.3 Exponent Decoding |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
372 */ |
| 8268 | 373 static int decode_exponents(GetBitContext *gbc, int exp_strategy, int ngrps, |
| 8270 | 374 uint8_t absexp, int8_t *dexps) |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
375 { |
| 6006 | 376 int i, j, grp, group_size; |
| 5375 | 377 int dexp[256]; |
| 378 int expacc, prevexp; | |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
379 |
| 5375 | 380 /* unpack groups */ |
| 6006 | 381 group_size = exp_strategy + (exp_strategy == EXP_D45); |
| 5375 | 382 for(grp=0,i=0; grp<ngrps; grp++) { |
| 6089 | 383 expacc = get_bits(gbc, 7); |
|
7471
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
384 dexp[i++] = ungroup_3_in_7_bits_tab[expacc][0]; |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
385 dexp[i++] = ungroup_3_in_7_bits_tab[expacc][1]; |
|
1788013cf23b
use the same table for ungrouping exponents and bap=2 mantissas
jbr
parents:
7470
diff
changeset
|
386 dexp[i++] = ungroup_3_in_7_bits_tab[expacc][2]; |
| 5375 | 387 } |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
388 |
| 5375 | 389 /* convert to absolute exps and expand groups */ |
| 390 prevexp = absexp; | |
|
8271
52af55b08c1d
ac3dec: unroll inner loop in exponent decoding. 46% faster decode_exponents().
jbr
parents:
8270
diff
changeset
|
391 for(i=0,j=0; i<ngrps*3; i++) { |
| 8268 | 392 prevexp += dexp[i] - 2; |
| 8275 | 393 if (prevexp > 24U) |
| 8268 | 394 return -1; |
|
8271
52af55b08c1d
ac3dec: unroll inner loop in exponent decoding. 46% faster decode_exponents().
jbr
parents:
8270
diff
changeset
|
395 switch (group_size) { |
|
52af55b08c1d
ac3dec: unroll inner loop in exponent decoding. 46% faster decode_exponents().
jbr
parents:
8270
diff
changeset
|
396 case 4: dexps[j++] = prevexp; |
|
52af55b08c1d
ac3dec: unroll inner loop in exponent decoding. 46% faster decode_exponents().
jbr
parents:
8270
diff
changeset
|
397 dexps[j++] = prevexp; |
|
52af55b08c1d
ac3dec: unroll inner loop in exponent decoding. 46% faster decode_exponents().
jbr
parents:
8270
diff
changeset
|
398 case 2: dexps[j++] = prevexp; |
|
52af55b08c1d
ac3dec: unroll inner loop in exponent decoding. 46% faster decode_exponents().
jbr
parents:
8270
diff
changeset
|
399 case 1: dexps[j++] = prevexp; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
400 } |
|
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
401 } |
| 8268 | 402 return 0; |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
403 } |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
404 |
|
5451
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
405 /** |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
406 * Generate transform coefficients for each coupled channel in the coupling |
|
5451
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
407 * range using the coupling coefficients and coupling coordinates. |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
408 * reference: Section 7.4.3 Coupling Coordinate Format |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
409 */ |
|
7491
0dbdc638270e
cosmetics: use a better function name than uncouple_channels()
jbr
parents:
7490
diff
changeset
|
410 static void calc_transform_coeffs_cpl(AC3DecodeContext *s) |
|
5451
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
411 { |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
412 int i, j, ch, bnd, subbnd; |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
413 |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
414 subbnd = -1; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
415 i = s->start_freq[CPL_CH]; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
416 for(bnd=0; bnd<s->num_cpl_bands; bnd++) { |
|
5451
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
417 do { |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
418 subbnd++; |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
419 for(j=0; j<12; j++) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
420 for(ch=1; ch<=s->fbw_channels; ch++) { |
|
6123
8d88831a2777
fix phase flag processing for the case when coupling coordinates are reused
jbr
parents:
6117
diff
changeset
|
421 if(s->channel_in_cpl[ch]) { |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
422 s->fixed_coeffs[ch][i] = ((int64_t)s->fixed_coeffs[CPL_CH][i] * (int64_t)s->cpl_coords[ch][bnd]) >> 23; |
|
6123
8d88831a2777
fix phase flag processing for the case when coupling coordinates are reused
jbr
parents:
6117
diff
changeset
|
423 if (ch == 2 && s->phase_flags[bnd]) |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
424 s->fixed_coeffs[ch][i] = -s->fixed_coeffs[ch][i]; |
|
6123
8d88831a2777
fix phase flag processing for the case when coupling coordinates are reused
jbr
parents:
6117
diff
changeset
|
425 } |
|
5451
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
426 } |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
427 i++; |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
428 } |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
429 } while(s->cpl_band_struct[subbnd]); |
|
5451
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
430 } |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
431 } |
|
19bb5e64a57c
split out coupling coefficient reconstruction into a separate function
jbr
parents:
5435
diff
changeset
|
432 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
433 /** |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
434 * Grouped mantissas for 3-level 5-level and 11-level quantization |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
435 */ |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
436 typedef struct { |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
437 int b1_mant[2]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
438 int b2_mant[2]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
439 int b4_mant; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
440 int b1; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
441 int b2; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
442 int b4; |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
443 } mant_groups; |
|
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
444 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
445 /** |
| 7719 | 446 * Decode the transform coefficients for a particular channel |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
447 * reference: Section 7.3 Quantization and Decoding of Mantissas |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
448 */ |
|
7702
f91e273722c8
add more OKed parts of the E-AC-3 decoder: structural changes to support AHT mode mantissa decoding
jbr
parents:
7701
diff
changeset
|
449 static void ac3_decode_transform_coeffs_ch(AC3DecodeContext *s, int ch_index, mant_groups *m) |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
450 { |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
451 int start_freq = s->start_freq[ch_index]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
452 int end_freq = s->end_freq[ch_index]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
453 uint8_t *baps = s->bap[ch_index]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
454 int8_t *exps = s->dexps[ch_index]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
455 int *coeffs = s->fixed_coeffs[ch_index]; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
456 GetBitContext *gbc = &s->gbc; |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
457 int freq; |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
458 |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
459 for(freq = start_freq; freq < end_freq; freq++){ |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
460 int bap = baps[freq]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
461 int mantissa; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
462 switch(bap){ |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
463 case 0: |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
464 mantissa = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000; |
| 5453 | 465 break; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
466 case 1: |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
467 if(m->b1){ |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
468 m->b1--; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
469 mantissa = m->b1_mant[m->b1]; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
470 } |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
471 else{ |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
472 int bits = get_bits(gbc, 5); |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
473 mantissa = b1_mantissas[bits][0]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
474 m->b1_mant[1] = b1_mantissas[bits][1]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
475 m->b1_mant[0] = b1_mantissas[bits][2]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
476 m->b1 = 2; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
477 } |
| 5453 | 478 break; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
479 case 2: |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
480 if(m->b2){ |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
481 m->b2--; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
482 mantissa = m->b2_mant[m->b2]; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
483 } |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
484 else{ |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
485 int bits = get_bits(gbc, 7); |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
486 mantissa = b2_mantissas[bits][0]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
487 m->b2_mant[1] = b2_mantissas[bits][1]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
488 m->b2_mant[0] = b2_mantissas[bits][2]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
489 m->b2 = 2; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
490 } |
| 5453 | 491 break; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
492 case 3: |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
493 mantissa = b3_mantissas[get_bits(gbc, 3)]; |
| 5453 | 494 break; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
495 case 4: |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
496 if(m->b4){ |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
497 m->b4 = 0; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
498 mantissa = m->b4_mant; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
499 } |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
500 else{ |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
501 int bits = get_bits(gbc, 7); |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
502 mantissa = b4_mantissas[bits][0]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
503 m->b4_mant = b4_mantissas[bits][1]; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
504 m->b4 = 1; |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
505 } |
| 5453 | 506 break; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
507 case 5: |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
508 mantissa = b5_mantissas[get_bits(gbc, 4)]; |
| 5453 | 509 break; |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
510 default: /* 6 to 15 */ |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
511 mantissa = get_bits(gbc, quantization_tab[bap]); |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
512 /* Shift mantissa and sign-extend it. */ |
|
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
513 mantissa = (mantissa << (32-quantization_tab[bap]))>>8; |
| 5453 | 514 break; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
515 } |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
516 coeffs[freq] = mantissa >> exps[freq]; |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
517 } |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
518 } |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
519 |
|
5454
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
520 /** |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
521 * Remove random dithering from coefficients with zero-bit mantissas |
|
5454
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
522 * reference: Section 7.3.4 Dither for Zero Bit Mantissas (bap=0) |
|
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
523 */ |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
524 static void remove_dithering(AC3DecodeContext *s) { |
|
5454
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
525 int ch, i; |
|
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
526 int end=0; |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
527 int *coeffs; |
|
5454
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
528 uint8_t *bap; |
|
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
529 |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
530 for(ch=1; ch<=s->fbw_channels; ch++) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
531 if(!s->dither_flag[ch]) { |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
532 coeffs = s->fixed_coeffs[ch]; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
533 bap = s->bap[ch]; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
534 if(s->channel_in_cpl[ch]) |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
535 end = s->start_freq[CPL_CH]; |
|
5454
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
536 else |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
537 end = s->end_freq[ch]; |
|
5454
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
538 for(i=0; i<end; i++) { |
| 6095 | 539 if(!bap[i]) |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
540 coeffs[i] = 0; |
|
5454
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
541 } |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
542 if(s->channel_in_cpl[ch]) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
543 bap = s->bap[CPL_CH]; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
544 for(; i<s->end_freq[CPL_CH]; i++) { |
| 6095 | 545 if(!bap[i]) |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
546 coeffs[i] = 0; |
|
5454
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
547 } |
|
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
548 } |
|
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
549 } |
|
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
550 } |
|
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
551 } |
|
5b497d971546
dither zero-bit mantissas by default. remove dithering only if it's explicitly turned off.
jbr
parents:
5453
diff
changeset
|
552 |
|
7701
20b27ee9b40f
cosmetics: rename some functions from *get_* to *decode_*
jbr
parents:
7667
diff
changeset
|
553 static void decode_transform_coeffs_ch(AC3DecodeContext *s, int blk, int ch, |
| 7626 | 554 mant_groups *m) |
| 555 { | |
| 556 if (!s->channel_uses_aht[ch]) { | |
|
7701
20b27ee9b40f
cosmetics: rename some functions from *get_* to *decode_*
jbr
parents:
7667
diff
changeset
|
557 ac3_decode_transform_coeffs_ch(s, ch, m); |
| 7626 | 558 } else { |
| 559 /* if AHT is used, mantissas for all blocks are encoded in the first | |
| 560 block of the frame. */ | |
| 561 int bin; | |
| 562 if (!blk) | |
|
7701
20b27ee9b40f
cosmetics: rename some functions from *get_* to *decode_*
jbr
parents:
7667
diff
changeset
|
563 ff_eac3_decode_transform_coeffs_aht_ch(s, ch); |
| 7626 | 564 for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) { |
|
9680
debe2623a70a
eac3dec: revert commit r18860. keep the AHT IDCT 24-bit. will make AHT GAQ
jbr
parents:
9673
diff
changeset
|
565 s->fixed_coeffs[ch][bin] = s->pre_mantissa[ch][bin][blk] >> s->dexps[ch][bin]; |
| 7626 | 566 } |
| 567 } | |
| 568 } | |
| 569 | |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
570 /** |
| 7718 | 571 * Decode the transform coefficients. |
|
5321
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
572 */ |
|
7702
f91e273722c8
add more OKed parts of the E-AC-3 decoder: structural changes to support AHT mode mantissa decoding
jbr
parents:
7701
diff
changeset
|
573 static void decode_transform_coeffs(AC3DecodeContext *s, int blk) |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
574 { |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
575 int ch, end; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
576 int got_cplchan = 0; |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
577 mant_groups m; |
|
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
578 |
|
9672
15276eb66180
LGPL version of ac3_decode_transform_coeffs_ch, ~12.4% faster.
darkshikari
parents:
9661
diff
changeset
|
579 m.b1 = m.b2 = m.b4 = 0; |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
580 |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
581 for (ch = 1; ch <= s->channels; ch++) { |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
582 /* transform coefficients for full-bandwidth channel */ |
|
7702
f91e273722c8
add more OKed parts of the E-AC-3 decoder: structural changes to support AHT mode mantissa decoding
jbr
parents:
7701
diff
changeset
|
583 decode_transform_coeffs_ch(s, blk, ch, &m); |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
584 /* tranform coefficients for coupling channel come right after the |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
585 coefficients for the first coupled channel*/ |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
586 if (s->channel_in_cpl[ch]) { |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
587 if (!got_cplchan) { |
|
7702
f91e273722c8
add more OKed parts of the E-AC-3 decoder: structural changes to support AHT mode mantissa decoding
jbr
parents:
7701
diff
changeset
|
588 decode_transform_coeffs_ch(s, blk, CPL_CH, &m); |
|
7491
0dbdc638270e
cosmetics: use a better function name than uncouple_channels()
jbr
parents:
7490
diff
changeset
|
589 calc_transform_coeffs_cpl(s); |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
590 got_cplchan = 1; |
|
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
591 } |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
592 end = s->end_freq[CPL_CH]; |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
593 } else { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
594 end = s->end_freq[ch]; |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
595 } |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
596 do |
|
6906
86e3dce7f723
zero the upper frequencies of the correct coefficients
jbr
parents:
6889
diff
changeset
|
597 s->fixed_coeffs[ch][end] = 0; |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
598 while(++end < 256); |
|
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
599 } |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
600 |
| 7740 | 601 /* zero the dithered coefficients for appropriate channels */ |
| 7717 | 602 remove_dithering(s); |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
603 } |
|
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
604 |
| 5415 | 605 /** |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
606 * Stereo rematrixing. |
| 5415 | 607 * reference: Section 7.5.4 Rematrixing : Decoding Technique |
| 608 */ | |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
609 static void do_rematrixing(AC3DecodeContext *s) |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
610 { |
| 5415 | 611 int bnd, i; |
|
5310
9aa9197034d7
AC-3 decoder, soc revision 40, Aug 9 00:10:14 2006 UTC by cloud9
jbr
parents:
5309
diff
changeset
|
612 int end, bndend; |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
613 int tmp0, tmp1; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
614 |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
615 end = FFMIN(s->end_freq[1], s->end_freq[2]); |
|
5310
9aa9197034d7
AC-3 decoder, soc revision 40, Aug 9 00:10:14 2006 UTC by cloud9
jbr
parents:
5309
diff
changeset
|
616 |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
617 for(bnd=0; bnd<s->num_rematrixing_bands; bnd++) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
618 if(s->rematrixing_flags[bnd]) { |
| 7033 | 619 bndend = FFMIN(end, ff_ac3_rematrix_band_tab[bnd+1]); |
| 620 for(i=ff_ac3_rematrix_band_tab[bnd]; i<bndend; i++) { | |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
621 tmp0 = s->fixed_coeffs[1][i]; |
|
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
622 tmp1 = s->fixed_coeffs[2][i]; |
|
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
623 s->fixed_coeffs[1][i] = tmp0 + tmp1; |
|
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
624 s->fixed_coeffs[2][i] = tmp0 - tmp1; |
| 5415 | 625 } |
| 626 } | |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
627 } |
|
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
628 } |
|
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
629 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
630 /** |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
631 * Inverse MDCT Transform. |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
632 * Convert frequency domain coefficients to time-domain audio samples. |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
633 * reference: Section 7.9.4 Transformation Equations |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
634 */ |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
635 static inline void do_imdct(AC3DecodeContext *s, int channels) |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
636 { |
| 5336 | 637 int ch; |
|
7561
be6d31643128
oops, non-normalized downmix to mono contaminated add_bias for non-simd float-to-int.
lorenm
parents:
7554
diff
changeset
|
638 float add_bias = s->add_bias; |
|
be6d31643128
oops, non-normalized downmix to mono contaminated add_bias for non-simd float-to-int.
lorenm
parents:
7554
diff
changeset
|
639 if(s->out_channels==1 && channels>1) |
|
be6d31643128
oops, non-normalized downmix to mono contaminated add_bias for non-simd float-to-int.
lorenm
parents:
7554
diff
changeset
|
640 add_bias *= LEVEL_MINUS_3DB; // compensate for the gain in downmix |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
641 |
| 6006 | 642 for (ch=1; ch<=channels; ch++) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
643 if (s->block_switch[ch]) { |
| 7549 | 644 int i; |
| 645 float *x = s->tmp_output+128; | |
| 646 for(i=0; i<128; i++) | |
| 647 x[i] = s->transform_coeffs[ch][2*i]; | |
| 648 ff_imdct_half(&s->imdct_256, s->tmp_output, x); | |
|
7561
be6d31643128
oops, non-normalized downmix to mono contaminated add_bias for non-simd float-to-int.
lorenm
parents:
7554
diff
changeset
|
649 s->dsp.vector_fmul_window(s->output[ch-1], s->delay[ch-1], s->tmp_output, s->window, add_bias, 128); |
| 7549 | 650 for(i=0; i<128; i++) |
| 651 x[i] = s->transform_coeffs[ch][2*i+1]; | |
| 652 ff_imdct_half(&s->imdct_256, s->delay[ch-1], x); | |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
653 } else { |
| 7549 | 654 ff_imdct_half(&s->imdct_512, s->tmp_output, s->transform_coeffs[ch]); |
|
7561
be6d31643128
oops, non-normalized downmix to mono contaminated add_bias for non-simd float-to-int.
lorenm
parents:
7554
diff
changeset
|
655 s->dsp.vector_fmul_window(s->output[ch-1], s->delay[ch-1], s->tmp_output, s->window, add_bias, 128); |
| 7549 | 656 memcpy(s->delay[ch-1], s->tmp_output+128, 128*sizeof(float)); |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
657 } |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
658 } |
|
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
659 } |
|
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
660 |
| 5480 | 661 /** |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
662 * Downmix the output to mono or stereo. |
| 5480 | 663 */ |
| 7563 | 664 void ff_ac3_downmix_c(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len) |
| 5480 | 665 { |
| 666 int i, j; | |
|
6431
305c49259b59
pre-calculate downmix coefficient sums. 2% faster 5.1-to-stereo downmixing.
jbr
parents:
6430
diff
changeset
|
667 float v0, v1; |
| 7563 | 668 if(out_ch == 2) { |
| 669 for(i=0; i<len; i++) { | |
| 7554 | 670 v0 = v1 = 0.0f; |
| 7563 | 671 for(j=0; j<in_ch; j++) { |
| 672 v0 += samples[j][i] * matrix[j][0]; | |
| 673 v1 += samples[j][i] * matrix[j][1]; | |
| 7554 | 674 } |
| 675 samples[0][i] = v0; | |
| 676 samples[1][i] = v1; | |
| 5480 | 677 } |
| 7563 | 678 } else if(out_ch == 1) { |
| 679 for(i=0; i<len; i++) { | |
| 7554 | 680 v0 = 0.0f; |
| 7563 | 681 for(j=0; j<in_ch; j++) |
| 682 v0 += samples[j][i] * matrix[j][0]; | |
| 7554 | 683 samples[0][i] = v0; |
| 5480 | 684 } |
| 685 } | |
| 686 } | |
| 687 | |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
688 /** |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
689 * Upmix delay samples from stereo to original channel layout. |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
690 */ |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
691 static void ac3_upmix_delay(AC3DecodeContext *s) |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
692 { |
|
7625
da9353cd6d71
get data size based on the actual data array instead of coding-in the calculation
jbr
parents:
7624
diff
changeset
|
693 int channel_data_size = sizeof(s->delay[0]); |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
694 switch(s->channel_mode) { |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
695 case AC3_CHMODE_DUALMONO: |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
696 case AC3_CHMODE_STEREO: |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
697 /* upmix mono to stereo */ |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
698 memcpy(s->delay[1], s->delay[0], channel_data_size); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
699 break; |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
700 case AC3_CHMODE_2F2R: |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
701 memset(s->delay[3], 0, channel_data_size); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
702 case AC3_CHMODE_2F1R: |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
703 memset(s->delay[2], 0, channel_data_size); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
704 break; |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
705 case AC3_CHMODE_3F2R: |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
706 memset(s->delay[4], 0, channel_data_size); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
707 case AC3_CHMODE_3F1R: |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
708 memset(s->delay[3], 0, channel_data_size); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
709 case AC3_CHMODE_3F: |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
710 memcpy(s->delay[2], s->delay[1], channel_data_size); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
711 memset(s->delay[1], 0, channel_data_size); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
712 break; |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
713 } |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
714 } |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
715 |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
716 /** |
|
8135
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
717 * Decode band structure for coupling, spectral extension, or enhanced coupling. |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
718 * @param[in] gbc bit reader context |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
719 * @param[in] blk block number |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
720 * @param[in] eac3 flag to indicate E-AC-3 |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
721 * @param[in] ecpl flag to indicate enhanced coupling |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
722 * @param[in] start_subband subband number for start of range |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
723 * @param[in] end_subband subband number for end of range |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
724 * @param[in] default_band_struct default band structure table |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
725 * @param[out] band_struct decoded band structure |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
726 * @param[out] num_bands number of bands (optionally NULL) |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
727 * @param[out] band_sizes array containing the number of bins in each band (optionally NULL) |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
728 */ |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
729 static void decode_band_structure(GetBitContext *gbc, int blk, int eac3, |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
730 int ecpl, int start_subband, int end_subband, |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
731 const uint8_t *default_band_struct, |
| 9608 | 732 uint8_t *band_struct, int *num_bands, |
| 733 uint8_t *band_sizes) | |
|
8135
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
734 { |
|
8255
1c4ec499557e
silence gcc warning: ?n_bands? may be used uninitialized
jbr
parents:
8254
diff
changeset
|
735 int subbnd, bnd, n_subbands, n_bands=0; |
| 8254 | 736 uint8_t bnd_sz[22]; |
|
8135
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
737 |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
738 n_subbands = end_subband - start_subband; |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
739 |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
740 /* decode band structure from bitstream or use default */ |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
741 if (!eac3 || get_bits1(gbc)) { |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
742 for (subbnd = 0; subbnd < n_subbands - 1; subbnd++) { |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
743 band_struct[subbnd] = get_bits1(gbc); |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
744 } |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
745 } else if (!blk) { |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
746 memcpy(band_struct, |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
747 &default_band_struct[start_subband+1], |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
748 n_subbands-1); |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
749 } |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
750 band_struct[n_subbands-1] = 0; |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
751 |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
752 /* calculate number of bands and band sizes based on band structure. |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
753 note that the first 4 subbands in enhanced coupling span only 6 bins |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
754 instead of 12. */ |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
755 if (num_bands || band_sizes ) { |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
756 n_bands = n_subbands; |
|
8135
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
757 bnd_sz[0] = ecpl ? 6 : 12; |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
758 for (bnd = 0, subbnd = 1; subbnd < n_subbands; subbnd++) { |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
759 int subbnd_size = (ecpl && subbnd < 4) ? 6 : 12; |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
760 if (band_struct[subbnd-1]) { |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
761 n_bands--; |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
762 bnd_sz[bnd] += subbnd_size; |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
763 } else { |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
764 bnd_sz[++bnd] = subbnd_size; |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
765 } |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
766 } |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
767 } |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
768 |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
769 /* set optional output params */ |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
770 if (num_bands) |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
771 *num_bands = n_bands; |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
772 if (band_sizes) |
| 8254 | 773 memcpy(band_sizes, bnd_sz, n_bands); |
|
8135
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
774 } |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
775 |
|
c82f8f5657ff
add a generic function to decode banding structure for coupling, spectral
jbr
parents:
8134
diff
changeset
|
776 /** |
|
7490
bddd15a1d167
cosmetics: change function name and comments to refer to block decoding
jbr
parents:
7489
diff
changeset
|
777 * Decode a single audio block from the AC-3 bitstream. |
|
5321
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
778 */ |
|
7490
bddd15a1d167
cosmetics: change function name and comments to refer to block decoding
jbr
parents:
7489
diff
changeset
|
779 static int decode_audio_block(AC3DecodeContext *s, int blk) |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
780 { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
781 int fbw_channels = s->fbw_channels; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
782 int channel_mode = s->channel_mode; |
|
5471
37c1944ca4ee
make exponent decoding consistent (prepare for merging coupling and lfe code with normal channel code).
jbr
parents:
5461
diff
changeset
|
783 int i, bnd, seg, ch; |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
784 int different_transforms; |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
785 int downmix_output; |
| 7026 | 786 int cpl_in_use; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
787 GetBitContext *gbc = &s->gbc; |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
788 uint8_t bit_alloc_stages[AC3_MAX_CHANNELS]; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
789 |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
790 memset(bit_alloc_stages, 0, AC3_MAX_CHANNELS); |
|
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
791 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
792 /* block switch flags */ |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
793 different_transforms = 0; |
| 7626 | 794 if (s->block_switch_syntax) { |
| 7627 | 795 for (ch = 1; ch <= fbw_channels; ch++) { |
| 796 s->block_switch[ch] = get_bits1(gbc); | |
| 797 if(ch > 1 && s->block_switch[ch] != s->block_switch[1]) | |
| 798 different_transforms = 1; | |
| 799 } | |
| 7626 | 800 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
801 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
802 /* dithering flags */ |
| 7626 | 803 if (s->dither_flag_syntax) { |
| 7627 | 804 for (ch = 1; ch <= fbw_channels; ch++) { |
| 805 s->dither_flag[ch] = get_bits1(gbc); | |
| 806 } | |
| 7626 | 807 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
808 |
| 5497 | 809 /* dynamic range */ |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
810 i = !(s->channel_mode); |
| 5497 | 811 do { |
| 6089 | 812 if(get_bits1(gbc)) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
813 s->dynamic_range[i] = ((dynamic_range_tab[get_bits(gbc, 8)]-1.0) * |
| 6091 | 814 s->avctx->drc_scale)+1.0; |
|
5386
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
815 } else if(blk == 0) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
816 s->dynamic_range[i] = 1.0f; |
|
5386
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
817 } |
| 5497 | 818 } while(i--); |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
819 |
| 7664 | 820 /* spectral extension strategy */ |
| 821 if (s->eac3 && (!blk || get_bits1(gbc))) { | |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
822 if (get_bits1(gbc)) { |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9680
diff
changeset
|
823 av_log_missing_feature(s->avctx, "Spectral extension", 1); |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
824 return -1; |
| 7664 | 825 } |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
826 /* TODO: parse spectral extension strategy info */ |
| 7664 | 827 } |
| 828 | |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
829 /* TODO: spectral extension coordinates */ |
| 7664 | 830 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
831 /* coupling strategy */ |
| 7746 | 832 if (s->eac3 ? s->cpl_strategy_exists[blk] : get_bits1(gbc)) { |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
833 memset(bit_alloc_stages, 3, AC3_MAX_CHANNELS); |
| 7664 | 834 if (!s->eac3) |
| 7665 | 835 s->cpl_in_use[blk] = get_bits1(gbc); |
|
7328
9309e19c2b98
read 'coupling in use' parameter from bitstream into decoder context first,
jbr
parents:
7311
diff
changeset
|
836 if (s->cpl_in_use[blk]) { |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
837 /* coupling in use */ |
| 8132 | 838 int cpl_start_subband, cpl_end_subband; |
| 5414 | 839 |
|
6868
5387096bf92a
add check for invalid channel mode when coupling is used
jbr
parents:
6763
diff
changeset
|
840 if (channel_mode < AC3_CHMODE_STEREO) { |
|
5387096bf92a
add check for invalid channel mode when coupling is used
jbr
parents:
6763
diff
changeset
|
841 av_log(s->avctx, AV_LOG_ERROR, "coupling not allowed in mono or dual-mono\n"); |
|
5387096bf92a
add check for invalid channel mode when coupling is used
jbr
parents:
6763
diff
changeset
|
842 return -1; |
|
5387096bf92a
add check for invalid channel mode when coupling is used
jbr
parents:
6763
diff
changeset
|
843 } |
|
5387096bf92a
add check for invalid channel mode when coupling is used
jbr
parents:
6763
diff
changeset
|
844 |
| 7664 | 845 /* check for enhanced coupling */ |
| 846 if (s->eac3 && get_bits1(gbc)) { | |
| 847 /* TODO: parse enhanced coupling strategy info */ | |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9680
diff
changeset
|
848 av_log_missing_feature(s->avctx, "Enhanced coupling", 1); |
| 7664 | 849 return -1; |
| 850 } | |
| 851 | |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
852 /* determine which channels are coupled */ |
| 7664 | 853 if (s->eac3 && s->channel_mode == AC3_CHMODE_STEREO) { |
| 854 s->channel_in_cpl[1] = 1; | |
| 855 s->channel_in_cpl[2] = 1; | |
| 856 } else { | |
| 7665 | 857 for (ch = 1; ch <= fbw_channels; ch++) |
| 858 s->channel_in_cpl[ch] = get_bits1(gbc); | |
| 7664 | 859 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
860 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
861 /* phase flags in use */ |
| 6005 | 862 if (channel_mode == AC3_CHMODE_STEREO) |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
863 s->phase_flags_in_use = get_bits1(gbc); |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
864 |
| 7664 | 865 /* coupling frequency range */ |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
866 /* TODO: modify coupling end freq if spectral extension is used */ |
| 8132 | 867 cpl_start_subband = get_bits(gbc, 4); |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
868 cpl_end_subband = get_bits(gbc, 4) + 3; |
|
9659
b4350a6fb24a
ac3dec: fix coupling range check. the start subband must be less than
jbr
parents:
9658
diff
changeset
|
869 if (cpl_start_subband >= cpl_end_subband) { |
|
b4350a6fb24a
ac3dec: fix coupling range check. the start subband must be less than
jbr
parents:
9658
diff
changeset
|
870 av_log(s->avctx, AV_LOG_ERROR, "invalid coupling range (%d >= %d)\n", |
| 8133 | 871 cpl_start_subband, cpl_end_subband); |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
872 return -1; |
|
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
873 } |
| 8132 | 874 s->start_freq[CPL_CH] = cpl_start_subband * 12 + 37; |
| 8133 | 875 s->end_freq[CPL_CH] = cpl_end_subband * 12 + 37; |
| 7664 | 876 |
| 9608 | 877 decode_band_structure(gbc, blk, s->eac3, 0, cpl_start_subband, |
| 878 cpl_end_subband, | |
| 879 ff_eac3_default_cpl_band_struct, | |
| 880 s->cpl_band_struct, &s->num_cpl_bands, NULL); | |
| 5388 | 881 } else { |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
882 /* coupling not in use */ |
| 7664 | 883 for (ch = 1; ch <= fbw_channels; ch++) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
884 s->channel_in_cpl[ch] = 0; |
| 7664 | 885 s->first_cpl_coords[ch] = 1; |
| 886 } | |
| 7667 | 887 s->first_cpl_leak = s->eac3; |
| 7664 | 888 s->phase_flags_in_use = 0; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
889 } |
| 7664 | 890 } else if (!s->eac3) { |
| 891 if(!blk) { | |
| 7665 | 892 av_log(s->avctx, AV_LOG_ERROR, "new coupling strategy must be present in block 0\n"); |
| 893 return -1; | |
| 894 } else { | |
| 895 s->cpl_in_use[blk] = s->cpl_in_use[blk-1]; | |
| 896 } | |
| 7664 | 897 } |
|
7328
9309e19c2b98
read 'coupling in use' parameter from bitstream into decoder context first,
jbr
parents:
7311
diff
changeset
|
898 cpl_in_use = s->cpl_in_use[blk]; |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
899 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
900 /* coupling coordinates */ |
| 7026 | 901 if (cpl_in_use) { |
| 6006 | 902 int cpl_coords_exist = 0; |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
903 |
| 6006 | 904 for (ch = 1; ch <= fbw_channels; ch++) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
905 if (s->channel_in_cpl[ch]) { |
| 7746 | 906 if ((s->eac3 && s->first_cpl_coords[ch]) || get_bits1(gbc)) { |
| 6006 | 907 int master_cpl_coord, cpl_coord_exp, cpl_coord_mant; |
| 7746 | 908 s->first_cpl_coords[ch] = 0; |
| 6006 | 909 cpl_coords_exist = 1; |
| 6089 | 910 master_cpl_coord = 3 * get_bits(gbc, 2); |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
911 for (bnd = 0; bnd < s->num_cpl_bands; bnd++) { |
| 6089 | 912 cpl_coord_exp = get_bits(gbc, 4); |
| 913 cpl_coord_mant = get_bits(gbc, 4); | |
| 6006 | 914 if (cpl_coord_exp == 15) |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
915 s->cpl_coords[ch][bnd] = cpl_coord_mant << 22; |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
916 else |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
917 s->cpl_coords[ch][bnd] = (cpl_coord_mant + 16) << 21; |
|
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
918 s->cpl_coords[ch][bnd] >>= (cpl_coord_exp + master_cpl_coord); |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
919 } |
| 6869 | 920 } else if (!blk) { |
| 921 av_log(s->avctx, AV_LOG_ERROR, "new coupling coordinates must be present in block 0\n"); | |
| 922 return -1; | |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
923 } |
| 7746 | 924 } else { |
| 925 /* channel not in coupling */ | |
| 926 s->first_cpl_coords[ch] = 1; | |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
927 } |
|
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
928 } |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
929 /* phase flags */ |
|
6123
8d88831a2777
fix phase flag processing for the case when coupling coordinates are reused
jbr
parents:
6117
diff
changeset
|
930 if (channel_mode == AC3_CHMODE_STEREO && cpl_coords_exist) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
931 for (bnd = 0; bnd < s->num_cpl_bands; bnd++) { |
|
6123
8d88831a2777
fix phase flag processing for the case when coupling coordinates are reused
jbr
parents:
6117
diff
changeset
|
932 s->phase_flags[bnd] = s->phase_flags_in_use? get_bits1(gbc) : 0; |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
933 } |
|
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
934 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
935 } |
|
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
936 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
937 /* stereo rematrixing strategy and band structure */ |
| 6005 | 938 if (channel_mode == AC3_CHMODE_STEREO) { |
| 7664 | 939 if ((s->eac3 && !blk) || get_bits1(gbc)) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
940 s->num_rematrixing_bands = 4; |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
941 if(cpl_in_use && s->start_freq[CPL_CH] <= 61) |
|
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
942 s->num_rematrixing_bands -= 1 + (s->start_freq[CPL_CH] == 37); |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
943 for(bnd=0; bnd<s->num_rematrixing_bands; bnd++) |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
944 s->rematrixing_flags[bnd] = get_bits1(gbc); |
| 6869 | 945 } else if (!blk) { |
| 946 av_log(s->avctx, AV_LOG_ERROR, "new rematrixing strategy must be present in block 0\n"); | |
| 947 return -1; | |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
948 } |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
949 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
950 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
951 /* exponent strategies for each channel */ |
| 7026 | 952 for (ch = !cpl_in_use; ch <= s->channels; ch++) { |
|
7709
0b11b0e7b404
do not read exponent strategies from each block for E-AC-3 since they are in the header
jbr
parents:
7703
diff
changeset
|
953 if (!s->eac3) |
| 7710 | 954 s->exp_strategy[blk][ch] = get_bits(gbc, 2 - (ch == s->lfe_ch)); |
| 7027 | 955 if(s->exp_strategy[blk][ch] != EXP_REUSE) |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
956 bit_alloc_stages[ch] = 3; |
|
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
957 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
958 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
959 /* channel bandwidth */ |
| 6006 | 960 for (ch = 1; ch <= fbw_channels; ch++) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
961 s->start_freq[ch] = 0; |
| 7027 | 962 if (s->exp_strategy[blk][ch] != EXP_REUSE) { |
|
6957
6eb895971766
only calculate number of exponent groups when exponents are not reused.
jbr
parents:
6956
diff
changeset
|
963 int group_size; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
964 int prev = s->end_freq[ch]; |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
965 if (s->channel_in_cpl[ch]) |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
966 s->end_freq[ch] = s->start_freq[CPL_CH]; |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
967 else { |
| 6089 | 968 int bandwidth_code = get_bits(gbc, 6); |
| 6006 | 969 if (bandwidth_code > 60) { |
| 8134 | 970 av_log(s->avctx, AV_LOG_ERROR, "bandwidth code = %d > 60\n", bandwidth_code); |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
971 return -1; |
|
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
972 } |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
973 s->end_freq[ch] = bandwidth_code * 3 + 73; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
974 } |
| 7027 | 975 group_size = 3 << (s->exp_strategy[blk][ch] - 1); |
|
6957
6eb895971766
only calculate number of exponent groups when exponents are not reused.
jbr
parents:
6956
diff
changeset
|
976 s->num_exp_groups[ch] = (s->end_freq[ch]+group_size-4) / group_size; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
977 if(blk > 0 && s->end_freq[ch] != prev) |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
978 memset(bit_alloc_stages, 3, AC3_MAX_CHANNELS); |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
979 } |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
980 } |
| 7027 | 981 if (cpl_in_use && s->exp_strategy[blk][CPL_CH] != EXP_REUSE) { |
|
6957
6eb895971766
only calculate number of exponent groups when exponents are not reused.
jbr
parents:
6956
diff
changeset
|
982 s->num_exp_groups[CPL_CH] = (s->end_freq[CPL_CH] - s->start_freq[CPL_CH]) / |
| 7027 | 983 (3 << (s->exp_strategy[blk][CPL_CH] - 1)); |
|
6957
6eb895971766
only calculate number of exponent groups when exponents are not reused.
jbr
parents:
6956
diff
changeset
|
984 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
985 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
986 /* decode exponents for each channel */ |
| 7026 | 987 for (ch = !cpl_in_use; ch <= s->channels; ch++) { |
| 7027 | 988 if (s->exp_strategy[blk][ch] != EXP_REUSE) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
989 s->dexps[ch][0] = get_bits(gbc, 4) << !ch; |
| 8268 | 990 if (decode_exponents(gbc, s->exp_strategy[blk][ch], |
| 8269 | 991 s->num_exp_groups[ch], s->dexps[ch][0], |
| 992 &s->dexps[ch][s->start_freq[ch]+!!ch])) { | |
| 8268 | 993 av_log(s->avctx, AV_LOG_ERROR, "exponent out-of-range\n"); |
| 994 return -1; | |
| 995 } | |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
996 if(ch != CPL_CH && ch != s->lfe_ch) |
| 6089 | 997 skip_bits(gbc, 2); /* skip gainrng */ |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
998 } |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
999 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
1000 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1001 /* bit allocation information */ |
| 7626 | 1002 if (s->bit_allocation_syntax) { |
| 7627 | 1003 if (get_bits1(gbc)) { |
| 1004 s->bit_alloc_params.slow_decay = ff_ac3_slow_decay_tab[get_bits(gbc, 2)] >> s->bit_alloc_params.sr_shift; | |
| 1005 s->bit_alloc_params.fast_decay = ff_ac3_fast_decay_tab[get_bits(gbc, 2)] >> s->bit_alloc_params.sr_shift; | |
| 1006 s->bit_alloc_params.slow_gain = ff_ac3_slow_gain_tab[get_bits(gbc, 2)]; | |
| 1007 s->bit_alloc_params.db_per_bit = ff_ac3_db_per_bit_tab[get_bits(gbc, 2)]; | |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
1008 s->bit_alloc_params.floor = ff_ac3_floor_tab[get_bits(gbc, 3)]; |
| 7627 | 1009 for(ch=!cpl_in_use; ch<=s->channels; ch++) |
| 1010 bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 2); | |
| 1011 } else if (!blk) { | |
| 1012 av_log(s->avctx, AV_LOG_ERROR, "new bit allocation info must be present in block 0\n"); | |
| 1013 return -1; | |
| 1014 } | |
| 7626 | 1015 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
1016 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1017 /* signal-to-noise ratio offsets and fast gains (signal-to-mask ratios) */ |
| 7747 | 1018 if(!s->eac3 || !blk){ |
| 1019 if(s->snr_offset_strategy && get_bits1(gbc)) { | |
| 7749 | 1020 int snr = 0; |
| 1021 int csnr; | |
| 1022 csnr = (get_bits(gbc, 6) - 15) << 4; | |
| 1023 for (i = ch = !cpl_in_use; ch <= s->channels; ch++) { | |
| 1024 /* snr offset */ | |
| 1025 if (ch == i || s->snr_offset_strategy == 2) | |
| 1026 snr = (csnr + get_bits(gbc, 4)) << 2; | |
| 1027 /* run at least last bit allocation stage if snr offset changes */ | |
| 1028 if(blk && s->snr_offset[ch] != snr) { | |
| 1029 bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 1); | |
| 1030 } | |
| 1031 s->snr_offset[ch] = snr; | |
| 7747 | 1032 |
| 1033 /* fast gain (normal AC-3 only) */ | |
| 1034 if (!s->eac3) { | |
| 1035 int prev = s->fast_gain[ch]; | |
| 7749 | 1036 s->fast_gain[ch] = ff_ac3_fast_gain_tab[get_bits(gbc, 3)]; |
| 7747 | 1037 /* run last 2 bit allocation stages if fast gain changes */ |
| 1038 if(blk && prev != s->fast_gain[ch]) | |
| 1039 bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 2); | |
| 1040 } | |
| 7749 | 1041 } |
| 7747 | 1042 } else if (!s->eac3 && !blk) { |
| 7749 | 1043 av_log(s->avctx, AV_LOG_ERROR, "new snr offsets must be present in block 0\n"); |
| 1044 return -1; | |
| 7747 | 1045 } |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
1046 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
1047 |
| 7664 | 1048 /* fast gain (E-AC-3 only) */ |
| 1049 if (s->fast_gain_syntax && get_bits1(gbc)) { | |
| 1050 for (ch = !cpl_in_use; ch <= s->channels; ch++) { | |
| 1051 int prev = s->fast_gain[ch]; | |
| 1052 s->fast_gain[ch] = ff_ac3_fast_gain_tab[get_bits(gbc, 3)]; | |
| 1053 /* run last 2 bit allocation stages if fast gain changes */ | |
| 1054 if(blk && prev != s->fast_gain[ch]) | |
| 1055 bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 2); | |
| 1056 } | |
| 1057 } else if (s->eac3 && !blk) { | |
| 1058 for (ch = !cpl_in_use; ch <= s->channels; ch++) | |
| 1059 s->fast_gain[ch] = ff_ac3_fast_gain_tab[4]; | |
| 1060 } | |
| 1061 | |
| 1062 /* E-AC-3 to AC-3 converter SNR offset */ | |
| 1063 if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT && get_bits1(gbc)) { | |
| 1064 skip_bits(gbc, 10); // skip converter snr offset | |
| 1065 } | |
| 1066 | |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1067 /* coupling leak information */ |
| 7026 | 1068 if (cpl_in_use) { |
| 7747 | 1069 if (s->first_cpl_leak || get_bits1(gbc)) { |
| 1070 int fl = get_bits(gbc, 3); | |
| 1071 int sl = get_bits(gbc, 3); | |
| 1072 /* run last 2 bit allocation stages for coupling channel if | |
| 1073 coupling leak changes */ | |
| 1074 if(blk && (fl != s->bit_alloc_params.cpl_fast_leak || | |
| 1075 sl != s->bit_alloc_params.cpl_slow_leak)) { | |
| 7749 | 1076 bit_alloc_stages[CPL_CH] = FFMAX(bit_alloc_stages[CPL_CH], 2); |
| 7747 | 1077 } |
| 1078 s->bit_alloc_params.cpl_fast_leak = fl; | |
| 1079 s->bit_alloc_params.cpl_slow_leak = sl; | |
| 1080 } else if (!s->eac3 && !blk) { | |
| 6872 | 1081 av_log(s->avctx, AV_LOG_ERROR, "new coupling leak info must be present in block 0\n"); |
| 1082 return -1; | |
| 1083 } | |
| 7747 | 1084 s->first_cpl_leak = 0; |
| 6871 | 1085 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
1086 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1087 /* delta bit allocation information */ |
| 7626 | 1088 if (s->dba_syntax && get_bits1(gbc)) { |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1089 /* delta bit allocation exists (strategy) */ |
| 7026 | 1090 for (ch = !cpl_in_use; ch <= fbw_channels; ch++) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1091 s->dba_mode[ch] = get_bits(gbc, 2); |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1092 if (s->dba_mode[ch] == DBA_RESERVED) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1093 av_log(s->avctx, AV_LOG_ERROR, "delta bit allocation strategy reserved\n"); |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1094 return -1; |
|
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1095 } |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
1096 bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 2); |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1097 } |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1098 /* channel delta offset, len and bit allocation */ |
| 7026 | 1099 for (ch = !cpl_in_use; ch <= fbw_channels; ch++) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1100 if (s->dba_mode[ch] == DBA_NEW) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1101 s->dba_nsegs[ch] = get_bits(gbc, 3); |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1102 for (seg = 0; seg <= s->dba_nsegs[ch]; seg++) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1103 s->dba_offsets[ch][seg] = get_bits(gbc, 5); |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1104 s->dba_lengths[ch][seg] = get_bits(gbc, 4); |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1105 s->dba_values[ch][seg] = get_bits(gbc, 3); |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1106 } |
|
6954
57797b6c9d59
new dba values requires running last 2 bit allocation stages
jbr
parents:
6953
diff
changeset
|
1107 /* run last 2 bit allocation stages if new dba values */ |
|
57797b6c9d59
new dba values requires running last 2 bit allocation stages
jbr
parents:
6953
diff
changeset
|
1108 bit_alloc_stages[ch] = FFMAX(bit_alloc_stages[ch], 2); |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1109 } |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
1110 } |
|
5386
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
1111 } else if(blk == 0) { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1112 for(ch=0; ch<=s->channels; ch++) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1113 s->dba_mode[ch] = DBA_NONE; |
|
5386
d6347c3cb329
Use shared AC-3 header parsing. Move some initializations to block parsing function.
jbr
parents:
5385
diff
changeset
|
1114 } |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
1115 } |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
1116 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1117 /* Bit allocation */ |
| 7026 | 1118 for(ch=!cpl_in_use; ch<=s->channels; ch++) { |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
1119 if(bit_alloc_stages[ch] > 2) { |
|
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
1120 /* Exponent mapping into PSD and PSD integration */ |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1121 ff_ac3_bit_alloc_calc_psd(s->dexps[ch], |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1122 s->start_freq[ch], s->end_freq[ch], |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1123 s->psd[ch], s->band_psd[ch]); |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
1124 } |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
1125 if(bit_alloc_stages[ch] > 1) { |
|
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
1126 /* Compute excitation function, Compute masking curve, and |
|
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
1127 Apply delta bit allocation */ |
|
8279
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
8275
diff
changeset
|
1128 if (ff_ac3_bit_alloc_calc_mask(&s->bit_alloc_params, s->band_psd[ch], |
| 8280 | 1129 s->start_freq[ch], s->end_freq[ch], |
| 1130 s->fast_gain[ch], (ch == s->lfe_ch), | |
| 1131 s->dba_mode[ch], s->dba_nsegs[ch], | |
| 1132 s->dba_offsets[ch], s->dba_lengths[ch], | |
| 1133 s->dba_values[ch], s->mask[ch])) { | |
|
8279
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
8275
diff
changeset
|
1134 av_log(s->avctx, AV_LOG_ERROR, "error in bit allocation\n"); |
|
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
8275
diff
changeset
|
1135 return -1; |
|
6c2dcc1410bb
ac3: detect dba errors and prevent writing past end of array
jbr
parents:
8275
diff
changeset
|
1136 } |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
1137 } |
|
5476
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
1138 if(bit_alloc_stages[ch] > 0) { |
|
e50f0d583a36
consolidate decoding of lfe and coupling channels with decoding of full-bandwidth channels.
jbr
parents:
5475
diff
changeset
|
1139 /* Compute bit allocation */ |
| 7626 | 1140 const uint8_t *bap_tab = s->channel_uses_aht[ch] ? |
| 1141 ff_eac3_hebap_tab : ff_ac3_bap_tab; | |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1142 ff_ac3_bit_alloc_calc_bap(s->mask[ch], s->psd[ch], |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1143 s->start_freq[ch], s->end_freq[ch], |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1144 s->snr_offset[ch], |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1145 s->bit_alloc_params.floor, |
| 7626 | 1146 bap_tab, s->bap[ch]); |
|
5461
c427d8950769
cosmetics: use braces when it makes the code easier to read.
jbr
parents:
5460
diff
changeset
|
1147 } |
|
5310
9aa9197034d7
AC-3 decoder, soc revision 40, Aug 9 00:10:14 2006 UTC by cloud9
jbr
parents:
5309
diff
changeset
|
1148 } |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
1149 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1150 /* unused dummy data */ |
| 7626 | 1151 if (s->skip_syntax && get_bits1(gbc)) { |
| 6089 | 1152 int skipl = get_bits(gbc, 9); |
|
5309
0662a270aab7
AC-3 decoder, soc revision 38, Aug 7 00:03:00 2006 UTC by cloud9
jbr
parents:
5308
diff
changeset
|
1153 while(skipl--) |
| 6089 | 1154 skip_bits(gbc, 8); |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1155 } |
| 5499 | 1156 |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1157 /* unpack the transform coefficients |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1158 this also uncouples channels if coupling is in use. */ |
|
7702
f91e273722c8
add more OKed parts of the E-AC-3 decoder: structural changes to support AHT mode mantissa decoding
jbr
parents:
7701
diff
changeset
|
1159 decode_transform_coeffs(s, blk); |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
1160 |
| 7626 | 1161 /* TODO: generate enhanced coupling coordinates and uncouple */ |
| 1162 | |
|
8142
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
1163 /* TODO: apply spectral extension */ |
|
f17b1eb9ccd1
revert r15812 (E-AC-3 Spectral Extension) pending further review
jbr
parents:
8139
diff
changeset
|
1164 |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1165 /* recover coefficients if rematrixing is in use */ |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1166 if(s->channel_mode == AC3_CHMODE_STEREO) |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1167 do_rematrixing(s); |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1168 |
|
6032
f74202e7e896
Skip dialog normalization. It shouldn't be used by the decoder, and there is
jbr
parents:
6031
diff
changeset
|
1169 /* apply scaling to coefficients (headroom, dynrng) */ |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1170 for(ch=1; ch<=s->channels; ch++) { |
|
6430
de7502093922
Use 24-bit fixed-point transform coefficients until just before MDCT. This
jbr
parents:
6142
diff
changeset
|
1171 float gain = s->mul_bias / 4194304.0f; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1172 if(s->channel_mode == AC3_CHMODE_DUALMONO) { |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1173 gain *= s->dynamic_range[ch-1]; |
|
5412
3f6a6dda6b2d
remove broken downmixing. will add new implementation later.
jbr
parents:
5393
diff
changeset
|
1174 } else { |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1175 gain *= s->dynamic_range[0]; |
|
5412
3f6a6dda6b2d
remove broken downmixing. will add new implementation later.
jbr
parents:
5393
diff
changeset
|
1176 } |
| 7564 | 1177 s->dsp.int32_to_float_fmul_scalar(s->transform_coeffs[ch], s->fixed_coeffs[ch], gain, 256); |
|
5412
3f6a6dda6b2d
remove broken downmixing. will add new implementation later.
jbr
parents:
5393
diff
changeset
|
1178 } |
|
5318
ef4ef249ca72
AC-3 decoder, soc revision 58, Aug 19 14:20:45 2006 UTC by cloud9
jbr
parents:
5317
diff
changeset
|
1179 |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1180 /* downmix and MDCT. order depends on whether block switching is used for |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1181 any channel in this block. this is because coefficients for the long |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1182 and short transforms cannot be mixed. */ |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1183 downmix_output = s->channels != s->out_channels && |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1184 !((s->output_mode & AC3_OUTPUT_LFEON) && |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1185 s->fbw_channels == s->out_channels); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1186 if(different_transforms) { |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1187 /* the delay samples have already been downmixed, so we upmix the delay |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1188 samples in order to reconstruct all channels before downmixing. */ |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1189 if(s->downmixed) { |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1190 s->downmixed = 0; |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1191 ac3_upmix_delay(s); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1192 } |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
1193 |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1194 do_imdct(s, s->channels); |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1195 |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1196 if(downmix_output) { |
| 7563 | 1197 s->dsp.ac3_downmix(s->output, s->downmix_coeffs, s->out_channels, s->fbw_channels, 256); |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1198 } |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1199 } else { |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1200 if(downmix_output) { |
| 7563 | 1201 s->dsp.ac3_downmix(s->transform_coeffs+1, s->downmix_coeffs, s->out_channels, s->fbw_channels, 256); |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1202 } |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1203 |
|
7562
ef456ee01ea2
don't mark the delayed samples for upmixing if they haven't been downmixed
lorenm
parents:
7561
diff
changeset
|
1204 if(downmix_output && !s->downmixed) { |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1205 s->downmixed = 1; |
| 7563 | 1206 s->dsp.ac3_downmix(s->delay, s->downmix_coeffs, s->out_channels, s->fbw_channels, 128); |
|
6480
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1207 } |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1208 |
|
6f01a499e785
downmix before imdct unless different size transforms are used. about 20%
jbr
parents:
6432
diff
changeset
|
1209 do_imdct(s, s->out_channels); |
| 5480 | 1210 } |
| 1211 | |
|
5479
943c732c905d
use dsputil for float to signed 16-bit sample conversion
jbr
parents:
5477
diff
changeset
|
1212 return 0; |
|
5306
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
1213 } |
|
abc5c130b448
AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9
jbr
parents:
5305
diff
changeset
|
1214 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1215 /** |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1216 * Decode a single AC-3 frame. |
|
5321
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
1217 */ |
|
6487
8f1b27d73a07
make input buffer const, as it should be. fixes a warning.
jbr
parents:
6480
diff
changeset
|
1218 static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8629
diff
changeset
|
1219 AVPacket *avpkt) |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1220 { |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8629
diff
changeset
|
1221 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8629
diff
changeset
|
1222 int buf_size = avpkt->size; |
| 6092 | 1223 AC3DecodeContext *s = avctx->priv_data; |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
1224 int16_t *out_samples = (int16_t *)data; |
| 7550 | 1225 int blk, ch, err; |
|
9454
7db61b0d21f9
ac3dec: reorder output channels to SMPTE channel order
jbr
parents:
9355
diff
changeset
|
1226 const uint8_t *channel_map; |
|
9605
93029f1a4c14
ac3dec: move channel remapping to outside of block loop
jbr
parents:
9512
diff
changeset
|
1227 const float *output[AC3_MAX_CHANNELS]; |
|
5318
ef4ef249ca72
AC-3 decoder, soc revision 58, Aug 19 14:20:45 2006 UTC by cloud9
jbr
parents:
5317
diff
changeset
|
1228 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1229 /* initialize the GetBitContext with the start of valid AC-3 Frame */ |
|
6538
b8f886bce6f5
only allocate context input buffer if AVCodecContext.error_reslience is greater than 0.
jbr
parents:
6537
diff
changeset
|
1230 if (s->input_buffer) { |
|
6536
8f2186d5daca
additional protection from segmentation faults and memory access errors by
jbr
parents:
6529
diff
changeset
|
1231 /* copy input buffer to decoder context to avoid reading past the end |
|
8f2186d5daca
additional protection from segmentation faults and memory access errors by
jbr
parents:
6529
diff
changeset
|
1232 of the buffer, which can be caused by a damaged input stream. */ |
|
7624
545305ba44a0
rename AC3_MAX_FRAME_SIZE to AC3_FRAME_BUFFER_SIZE and increase the size
jbr
parents:
7603
diff
changeset
|
1233 memcpy(s->input_buffer, buf, FFMIN(buf_size, AC3_FRAME_BUFFER_SIZE)); |
|
6536
8f2186d5daca
additional protection from segmentation faults and memory access errors by
jbr
parents:
6529
diff
changeset
|
1234 init_get_bits(&s->gbc, s->input_buffer, buf_size * 8); |
|
8f2186d5daca
additional protection from segmentation faults and memory access errors by
jbr
parents:
6529
diff
changeset
|
1235 } else { |
| 6537 | 1236 init_get_bits(&s->gbc, buf, buf_size * 8); |
|
6536
8f2186d5daca
additional protection from segmentation faults and memory access errors by
jbr
parents:
6529
diff
changeset
|
1237 } |
|
5305
5892b4a6380b
AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents:
5304
diff
changeset
|
1238 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1239 /* parse the syncinfo */ |
| 6950 | 1240 *data_size = 0; |
| 7028 | 1241 err = parse_frame_header(s); |
| 6950 | 1242 |
| 1243 /* check that reported frame size fits in input buffer */ | |
| 1244 if(s->frame_size > buf_size) { | |
| 1245 av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); | |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
1246 err = AAC_AC3_PARSE_ERROR_FRAME_SIZE; |
| 6950 | 1247 } |
| 1248 | |
| 1249 /* check for crc mismatch */ | |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
1250 if(err != AAC_AC3_PARSE_ERROR_FRAME_SIZE && avctx->error_recognition >= FF_ER_CAREFUL) { |
| 6950 | 1251 if(av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, &buf[2], s->frame_size-2)) { |
| 1252 av_log(avctx, AV_LOG_ERROR, "frame CRC mismatch\n"); | |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
1253 err = AAC_AC3_PARSE_ERROR_CRC; |
| 6950 | 1254 } |
| 1255 } | |
| 1256 | |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
1257 if(err && err != AAC_AC3_PARSE_ERROR_CRC) { |
| 5680 | 1258 switch(err) { |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
1259 case AAC_AC3_PARSE_ERROR_SYNC: |
| 6950 | 1260 av_log(avctx, AV_LOG_ERROR, "frame sync error\n"); |
| 6999 | 1261 return -1; |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
1262 case AAC_AC3_PARSE_ERROR_BSID: |
| 5680 | 1263 av_log(avctx, AV_LOG_ERROR, "invalid bitstream id\n"); |
| 1264 break; | |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
1265 case AAC_AC3_PARSE_ERROR_SAMPLE_RATE: |
| 5680 | 1266 av_log(avctx, AV_LOG_ERROR, "invalid sample rate\n"); |
| 1267 break; | |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
1268 case AAC_AC3_PARSE_ERROR_FRAME_SIZE: |
| 5680 | 1269 av_log(avctx, AV_LOG_ERROR, "invalid frame size\n"); |
| 1270 break; | |
|
8545
a5402e89a80c
Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents:
8281
diff
changeset
|
1271 case AAC_AC3_PARSE_ERROR_FRAME_TYPE: |
| 7014 | 1272 /* skip frame if CRC is ok. otherwise use error concealment. */ |
| 1273 /* TODO: add support for substreams and dependent frames */ | |
| 1274 if(s->frame_type == EAC3_FRAME_TYPE_DEPENDENT || s->substreamid) { | |
| 1275 av_log(avctx, AV_LOG_ERROR, "unsupported frame type : skipping frame\n"); | |
| 1276 return s->frame_size; | |
| 1277 } else { | |
| 7015 | 1278 av_log(avctx, AV_LOG_ERROR, "invalid frame type\n"); |
| 7014 | 1279 } |
| 6529 | 1280 break; |
| 5680 | 1281 default: |
| 1282 av_log(avctx, AV_LOG_ERROR, "invalid header\n"); | |
| 1283 break; | |
| 1284 } | |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1285 } |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
1286 |
| 6889 | 1287 /* if frame is ok, set audio parameters */ |
| 1288 if (!err) { | |
| 6885 | 1289 avctx->sample_rate = s->sample_rate; |
| 1290 avctx->bit_rate = s->bit_rate; | |
| 6098 | 1291 |
| 6885 | 1292 /* channel config */ |
| 1293 s->out_channels = s->channels; | |
| 6889 | 1294 s->output_mode = s->channel_mode; |
| 1295 if(s->lfe_on) | |
| 1296 s->output_mode |= AC3_OUTPUT_LFEON; | |
| 6885 | 1297 if (avctx->request_channels > 0 && avctx->request_channels <= 2 && |
| 1298 avctx->request_channels < s->channels) { | |
| 1299 s->out_channels = avctx->request_channels; | |
| 1300 s->output_mode = avctx->request_channels == 1 ? AC3_CHMODE_MONO : AC3_CHMODE_STEREO; | |
|
9512
ba5d9a97ab2f
Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents:
9454
diff
changeset
|
1301 s->channel_layout = ff_ac3_channel_layout_tab[s->output_mode]; |
| 6885 | 1302 } |
| 1303 avctx->channels = s->out_channels; | |
|
9512
ba5d9a97ab2f
Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents:
9454
diff
changeset
|
1304 avctx->channel_layout = s->channel_layout; |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
1305 |
| 6885 | 1306 /* set downmixing coefficients if needed */ |
| 1307 if(s->channels != s->out_channels && !((s->output_mode & AC3_OUTPUT_LFEON) && | |
| 1308 s->fbw_channels == s->out_channels)) { | |
| 1309 set_downmix_coeffs(s); | |
| 1310 } | |
| 6889 | 1311 } else if (!s->out_channels) { |
| 1312 s->out_channels = avctx->channels; | |
| 1313 if(s->out_channels < s->channels) | |
| 1314 s->output_mode = s->out_channels == 1 ? AC3_CHMODE_MONO : AC3_CHMODE_STEREO; | |
| 6884 | 1315 } |
|
6126
c24cd5282108
split out init of downmix coeffs into a separate function that can be called
jbr
parents:
6125
diff
changeset
|
1316 |
|
7490
bddd15a1d167
cosmetics: change function name and comments to refer to block decoding
jbr
parents:
7489
diff
changeset
|
1317 /* decode the audio blocks */ |
|
9454
7db61b0d21f9
ac3dec: reorder output channels to SMPTE channel order
jbr
parents:
9355
diff
changeset
|
1318 channel_map = ff_ac3_dec_channel_map[s->output_mode & ~AC3_OUTPUT_LFEON][s->lfe_on]; |
| 9606 | 1319 for (ch = 0; ch < s->out_channels; ch++) |
| 1320 output[ch] = s->output[channel_map[ch]]; | |
|
7011
77f607fb4e8b
get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents:
6999
diff
changeset
|
1321 for (blk = 0; blk < s->num_blocks; blk++) { |
|
7490
bddd15a1d167
cosmetics: change function name and comments to refer to block decoding
jbr
parents:
7489
diff
changeset
|
1322 if (!err && decode_audio_block(s, blk)) { |
|
bddd15a1d167
cosmetics: change function name and comments to refer to block decoding
jbr
parents:
7489
diff
changeset
|
1323 av_log(avctx, AV_LOG_ERROR, "error decoding the audio block\n"); |
|
8249
5057047bcc52
ac3dec: skip decoding and use error concealment for remaining blocks in
jbr
parents:
8142
diff
changeset
|
1324 err = 1; |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1325 } |
| 7550 | 1326 s->dsp.float_to_int16_interleave(out_samples, output, 256, s->out_channels); |
| 1327 out_samples += 256 * s->out_channels; | |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1328 } |
|
7011
77f607fb4e8b
get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents:
6999
diff
changeset
|
1329 *data_size = s->num_blocks * 256 * avctx->channels * sizeof (int16_t); |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1330 return s->frame_size; |
|
5303
b8821ff5c30d
AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff
changeset
|
1331 } |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1332 |
|
5515
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1333 /** |
|
b499866a3397
comments modification: add, clean up, Doxygenize, and reword
jbr
parents:
5499
diff
changeset
|
1334 * Uninitialize the AC-3 decoder. |
|
5321
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
1335 */ |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6487
diff
changeset
|
1336 static av_cold int ac3_decode_end(AVCodecContext *avctx) |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1337 { |
| 6092 | 1338 AC3DecodeContext *s = avctx->priv_data; |
|
6090
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1339 ff_mdct_end(&s->imdct_512); |
|
b7b19fbc4746
cosmetics: rename all AC3DecodeContext variables from ctx to s
jbr
parents:
6089
diff
changeset
|
1340 ff_mdct_end(&s->imdct_256); |
|
5321
fcb2a52c88fe
AC-3 decoder, soc revision 71, Sep 4 09:47:12 2006 UTC by cloud9
jbr
parents:
5320
diff
changeset
|
1341 |
|
6538
b8f886bce6f5
only allocate context input buffer if AVCodecContext.error_reslience is greater than 0.
jbr
parents:
6537
diff
changeset
|
1342 av_freep(&s->input_buffer); |
|
b8f886bce6f5
only allocate context input buffer if AVCodecContext.error_reslience is greater than 0.
jbr
parents:
6537
diff
changeset
|
1343 |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1344 return 0; |
|
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1345 } |
|
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1346 |
|
5334
d406baea3275
no need for the decoder to have the license as a prefix
jbr
parents:
5333
diff
changeset
|
1347 AVCodec ac3_decoder = { |
|
5315
31033309ebc9
AC-3 decoder, soc revision 55, Aug 17 12:25:24 2006 UTC by cloud9
jbr
parents:
5314
diff
changeset
|
1348 .name = "ac3", |
|
31033309ebc9
AC-3 decoder, soc revision 55, Aug 17 12:25:24 2006 UTC by cloud9
jbr
parents:
5314
diff
changeset
|
1349 .type = CODEC_TYPE_AUDIO, |
|
31033309ebc9
AC-3 decoder, soc revision 55, Aug 17 12:25:24 2006 UTC by cloud9
jbr
parents:
5314
diff
changeset
|
1350 .id = CODEC_ID_AC3, |
|
31033309ebc9
AC-3 decoder, soc revision 55, Aug 17 12:25:24 2006 UTC by cloud9
jbr
parents:
5314
diff
changeset
|
1351 .priv_data_size = sizeof (AC3DecodeContext), |
|
31033309ebc9
AC-3 decoder, soc revision 55, Aug 17 12:25:24 2006 UTC by cloud9
jbr
parents:
5314
diff
changeset
|
1352 .init = ac3_decode_init, |
|
31033309ebc9
AC-3 decoder, soc revision 55, Aug 17 12:25:24 2006 UTC by cloud9
jbr
parents:
5314
diff
changeset
|
1353 .close = ac3_decode_end, |
|
31033309ebc9
AC-3 decoder, soc revision 55, Aug 17 12:25:24 2006 UTC by cloud9
jbr
parents:
5314
diff
changeset
|
1354 .decode = ac3_decode_frame, |
| 7769 | 1355 .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), |
|
5304
eff51058fe13
AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents:
5303
diff
changeset
|
1356 }; |
| 7769 | 1357 |
| 1358 AVCodec eac3_decoder = { | |
| 1359 .name = "eac3", | |
| 1360 .type = CODEC_TYPE_AUDIO, | |
| 1361 .id = CODEC_ID_EAC3, | |
| 1362 .priv_data_size = sizeof (AC3DecodeContext), | |
| 1363 .init = ac3_decode_init, | |
| 1364 .close = ac3_decode_end, | |
| 1365 .decode = ac3_decode_frame, | |
| 1366 .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52B (AC-3, E-AC-3)"), | |
| 1367 }; |
