annotate ac3dec.c @ 11352:6e0af2cfdcfe libavcodec

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