annotate ac3dec.c @ 8991:ca768cb2bfb6 libavcodec

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