Mercurial > libavcodec.hg
annotate dca.c @ 12092:de9e45d04063 libavcodec
DCA: Occasionally a false XCH sync word can turn up after the core DTS data,
to verify the sync word the extension fsize field should be compared to
the core data length field.
Patch by nick.nbrereton@net
author | banan |
---|---|
date | Mon, 05 Jul 2010 08:16:43 +0000 |
parents | c2a1bb63bd30 |
children | 8b28e74de2c0 |
rev | line source |
---|---|
4599 | 1 /* |
2 * DCA compatible decoder | |
3 * Copyright (C) 2004 Gildas Bazin | |
4 * Copyright (C) 2004 Benjamin Zores | |
5 * Copyright (C) 2006 Benjamin Larsson | |
6 * Copyright (C) 2007 Konstantin Shishkov | |
7 * | |
8 * This file is part of FFmpeg. | |
9 * | |
10 * FFmpeg is free software; you can redistribute it and/or | |
11 * modify it under the terms of the GNU Lesser General Public | |
12 * License as published by the Free Software Foundation; either | |
13 * version 2.1 of the License, or (at your option) any later version. | |
14 * | |
15 * FFmpeg is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 * Lesser General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU Lesser General Public | |
21 * License along with FFmpeg; if not, write to the Free Software | |
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
23 */ | |
24 | |
25 #include <math.h> | |
26 #include <stddef.h> | |
27 #include <stdio.h> | |
28 | |
11611 | 29 #include "libavutil/intmath.h" |
11606 | 30 #include "libavutil/intreadwrite.h" |
4599 | 31 #include "avcodec.h" |
32 #include "dsputil.h" | |
11370 | 33 #include "fft.h" |
9428 | 34 #include "get_bits.h" |
9411
4cb7c65fc775
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
9393
diff
changeset
|
35 #include "put_bits.h" |
4599 | 36 #include "dcadata.h" |
37 #include "dcahuff.h" | |
4899 | 38 #include "dca.h" |
10467 | 39 #include "synth_filter.h" |
11617
bb17732c00ef
DCA: break out lfe_interpolation_fir() inner loops to a function
mru
parents:
11611
diff
changeset
|
40 #include "dcadsp.h" |
4599 | 41 |
42 //#define TRACE | |
43 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
44 #define DCA_PRIM_CHANNELS_MAX (7) |
4599 | 45 #define DCA_SUBBANDS (32) |
46 #define DCA_ABITS_MAX (32) /* Should be 28 */ | |
11898 | 47 #define DCA_SUBSUBFRAMES_MAX (4) |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
48 #define DCA_SUBFRAMES_MAX (16) |
11908
9b1095b2616a
Support DTS-ES extension (XCh) in dca: move subband_samples into context structure
mstorsjo
parents:
11898
diff
changeset
|
49 #define DCA_BLOCKS_MAX (16) |
4599 | 50 #define DCA_LFE_MAX (3) |
51 | |
52 enum DCAMode { | |
53 DCA_MONO = 0, | |
54 DCA_CHANNEL, | |
55 DCA_STEREO, | |
56 DCA_STEREO_SUMDIFF, | |
57 DCA_STEREO_TOTAL, | |
58 DCA_3F, | |
59 DCA_2F1R, | |
60 DCA_3F1R, | |
61 DCA_2F2R, | |
62 DCA_3F2R, | |
63 DCA_4F2R | |
64 }; | |
65 | |
8100 | 66 /* Tables for mapping dts channel configurations to libavcodec multichannel api. |
67 * Some compromises have been made for special configurations. Most configurations | |
68 * are never used so complete accuracy is not needed. | |
69 * | |
70 * L = left, R = right, C = center, S = surround, F = front, R = rear, T = total, OV = overhead. | |
8126 | 71 * S -> side, when both rear and back are configured move one of them to the side channel |
8100 | 72 * OV -> center back |
8102
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8101
diff
changeset
|
73 * All 2 channel configurations -> CH_LAYOUT_STEREO |
8100 | 74 */ |
75 | |
76 static const int64_t dca_core_channel_layout[] = { | |
8102
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8101
diff
changeset
|
77 CH_FRONT_CENTER, ///< 1, A |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8101
diff
changeset
|
78 CH_LAYOUT_STEREO, ///< 2, A + B (dual mono) |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8101
diff
changeset
|
79 CH_LAYOUT_STEREO, ///< 2, L + R (stereo) |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8101
diff
changeset
|
80 CH_LAYOUT_STEREO, ///< 2, (L+R) + (L-R) (sum-difference) |
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8101
diff
changeset
|
81 CH_LAYOUT_STEREO, ///< 2, LT +RT (left and right total) |
8103 | 82 CH_LAYOUT_STEREO|CH_FRONT_CENTER, ///< 3, C+L+R |
83 CH_LAYOUT_STEREO|CH_BACK_CENTER, ///< 3, L+R+S | |
84 CH_LAYOUT_STEREO|CH_FRONT_CENTER|CH_BACK_CENTER, ///< 4, C + L + R+ S | |
85 CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT, ///< 4, L + R +SL+ SR | |
86 CH_LAYOUT_STEREO|CH_FRONT_CENTER|CH_SIDE_LEFT|CH_SIDE_RIGHT, ///< 5, C + L + R+ SL+SR | |
87 CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT|CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER, ///< 6, CL + CR + L + R + SL + SR | |
88 CH_LAYOUT_STEREO|CH_BACK_LEFT|CH_BACK_RIGHT|CH_FRONT_CENTER|CH_BACK_CENTER, ///< 6, C + L + R+ LR + RR + OV | |
89 CH_FRONT_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_FRONT_LEFT_OF_CENTER|CH_BACK_CENTER|CH_BACK_LEFT|CH_BACK_RIGHT, ///< 6, CF+ CR+LF+ RF+LR + RR | |
90 CH_FRONT_LEFT_OF_CENTER|CH_FRONT_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT, ///< 7, CL + C + CR + L + R + SL + SR | |
8102
04295cbc0e9b
Change multichannel API define prefix from "CHANNEL_" to "CH_".
andoma
parents:
8101
diff
changeset
|
91 CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT|CH_BACK_LEFT|CH_BACK_RIGHT, ///< 8, CL + CR + L + R + SL1 + SL2+ SR1 + SR2 |
8103 | 92 CH_FRONT_LEFT_OF_CENTER|CH_FRONT_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_BACK_CENTER|CH_SIDE_RIGHT, ///< 8, CL + C+ CR + L + R + SL + S+ SR |
8100 | 93 }; |
94 | |
8148
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
95 static const int8_t dca_lfe_index[] = { |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
96 1,2,2,2,2,3,2,3,2,3,2,3,1,3,2,3 |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
97 }; |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
98 |
11910
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
99 static const int8_t dca_channel_reorder_lfe[][9] = { |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
100 { 0, -1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
101 { 0, 1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
102 { 0, 1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
103 { 0, 1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
104 { 0, 1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
105 { 2, 0, 1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
106 { 0, 1, 3, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
107 { 2, 0, 1, 4, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
108 { 0, 1, 3, 4, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
109 { 2, 0, 1, 4, 5, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
110 { 3, 4, 0, 1, 5, 6, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
111 { 2, 0, 1, 4, 5, 6, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
112 { 0, 6, 4, 5, 2, 3, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
113 { 4, 2, 5, 0, 1, 6, 7, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
114 { 5, 6, 0, 1, 7, 3, 8, 4, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
115 { 4, 2, 5, 0, 1, 6, 8, 7, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
116 }; |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
117 |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
118 static const int8_t dca_channel_reorder_lfe_xch[][9] = { |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
119 { 0, 2, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
120 { 0, 1, 3, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
121 { 0, 1, 3, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
122 { 0, 1, 3, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
123 { 0, 1, 3, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
124 { 2, 0, 1, 4, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
125 { 0, 1, 3, 4, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
126 { 2, 0, 1, 4, 5, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
127 { 0, 1, 4, 5, 3, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
128 { 2, 0, 1, 5, 6, 4, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
129 { 3, 4, 0, 1, 6, 7, 5, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
130 { 2, 0, 1, 4, 5, 6, 7, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
131 { 0, 6, 4, 5, 2, 3, 7, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
132 { 4, 2, 5, 0, 1, 7, 8, 6, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
133 { 5, 6, 0, 1, 8, 3, 9, 4, 7}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
134 { 4, 2, 5, 0, 1, 6, 9, 8, 7}, |
8148
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
135 }; |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
136 |
11910
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
137 static const int8_t dca_channel_reorder_nolfe[][9] = { |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
138 { 0, -1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
139 { 0, 1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
140 { 0, 1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
141 { 0, 1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
142 { 0, 1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
143 { 2, 0, 1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
144 { 0, 1, 2, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
145 { 2, 0, 1, 3, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
146 { 0, 1, 2, 3, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
147 { 2, 0, 1, 3, 4, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
148 { 2, 3, 0, 1, 4, 5, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
149 { 2, 0, 1, 3, 4, 5, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
150 { 0, 5, 3, 4, 1, 2, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
151 { 3, 2, 4, 0, 1, 5, 6, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
152 { 4, 5, 0, 1, 6, 2, 7, 3, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
153 { 3, 2, 4, 0, 1, 5, 7, 6, -1}, |
8148
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
154 }; |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
155 |
11910
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
156 static const int8_t dca_channel_reorder_nolfe_xch[][9] = { |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
157 { 0, 1, -1, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
158 { 0, 1, 2, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
159 { 0, 1, 2, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
160 { 0, 1, 2, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
161 { 0, 1, 2, -1, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
162 { 2, 0, 1, 3, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
163 { 0, 1, 2, 3, -1, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
164 { 2, 0, 1, 3, 4, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
165 { 0, 1, 3, 4, 2, -1, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
166 { 2, 0, 1, 4, 5, 3, -1, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
167 { 2, 3, 0, 1, 5, 6, 4, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
168 { 2, 0, 1, 3, 4, 5, 6, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
169 { 0, 5, 3, 4, 1, 2, 6, -1, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
170 { 3, 2, 4, 0, 1, 6, 7, 5, -1}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
171 { 4, 5, 0, 1, 7, 2, 8, 3, 6}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
172 { 3, 2, 4, 0, 1, 5, 8, 7, 6}, |
284f85e281fc
Support DTS-ES extension (XCh) in dca: update and add channel mapping tables for DTS-ES mappings
mstorsjo
parents:
11909
diff
changeset
|
173 }; |
8100 | 174 |
4599 | 175 #define DCA_DOLBY 101 /* FIXME */ |
176 | |
177 #define DCA_CHANNEL_BITS 6 | |
178 #define DCA_CHANNEL_MASK 0x3F | |
179 | |
180 #define DCA_LFE 0x80 | |
181 | |
182 #define HEADER_SIZE 14 | |
183 | |
7670
dabe2516abe2
Increase buffer size to 16384 patch by Alexander E. Patrakov" patrakov gmail
michael
parents:
7451
diff
changeset
|
184 #define DCA_MAX_FRAME_SIZE 16384 |
4599 | 185 |
186 /** Bit allocation */ | |
187 typedef struct { | |
188 int offset; ///< code values offset | |
189 int maxbits[8]; ///< max bits in VLC | |
190 int wrap; ///< wrap for get_vlc2() | |
191 VLC vlc[8]; ///< actual codes | |
192 } BitAlloc; | |
193 | |
194 static BitAlloc dca_bitalloc_index; ///< indexes for samples VLC select | |
195 static BitAlloc dca_tmode; ///< transition mode VLCs | |
196 static BitAlloc dca_scalefactor; ///< scalefactor VLCs | |
197 static BitAlloc dca_smpl_bitalloc[11]; ///< samples VLCs | |
198 | |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4899
diff
changeset
|
199 static av_always_inline int get_bitalloc(GetBitContext *gb, BitAlloc *ba, int idx) |
4599 | 200 { |
201 return get_vlc2(gb, ba->vlc[idx].table, ba->vlc[idx].bits, ba->wrap) + ba->offset; | |
202 } | |
203 | |
204 typedef struct { | |
205 AVCodecContext *avctx; | |
206 /* Frame header */ | |
207 int frame_type; ///< type of the current frame | |
208 int samples_deficit; ///< deficit sample count | |
209 int crc_present; ///< crc is present in the bitstream | |
210 int sample_blocks; ///< number of PCM sample blocks | |
211 int frame_size; ///< primary frame byte size | |
212 int amode; ///< audio channels arrangement | |
213 int sample_rate; ///< audio sampling rate | |
214 int bit_rate; ///< transmission bit rate | |
8077 | 215 int bit_rate_index; ///< transmission bit rate index |
4599 | 216 |
217 int downmix; ///< embedded downmix enabled | |
218 int dynrange; ///< embedded dynamic range flag | |
219 int timestamp; ///< embedded time stamp flag | |
220 int aux_data; ///< auxiliary data flag | |
221 int hdcd; ///< source material is mastered in HDCD | |
222 int ext_descr; ///< extension audio descriptor flag | |
223 int ext_coding; ///< extended coding flag | |
224 int aspf; ///< audio sync word insertion flag | |
225 int lfe; ///< low frequency effects flag | |
226 int predictor_history; ///< predictor history flag | |
227 int header_crc; ///< header crc check bytes | |
228 int multirate_inter; ///< multirate interpolator switch | |
229 int version; ///< encoder software revision | |
230 int copy_history; ///< copy history | |
231 int source_pcm_res; ///< source pcm resolution | |
232 int front_sum; ///< front sum/difference flag | |
233 int surround_sum; ///< surround sum/difference flag | |
234 int dialog_norm; ///< dialog normalisation parameter | |
235 | |
236 /* Primary audio coding header */ | |
237 int subframes; ///< number of subframes | |
6463 | 238 int total_channels; ///< number of channels including extensions |
4599 | 239 int prim_channels; ///< number of primary audio channels |
240 int subband_activity[DCA_PRIM_CHANNELS_MAX]; ///< subband activity count | |
241 int vq_start_subband[DCA_PRIM_CHANNELS_MAX]; ///< high frequency vq start subband | |
242 int joint_intensity[DCA_PRIM_CHANNELS_MAX]; ///< joint intensity coding index | |
243 int transient_huffman[DCA_PRIM_CHANNELS_MAX]; ///< transient mode code book | |
244 int scalefactor_huffman[DCA_PRIM_CHANNELS_MAX]; ///< scale factor code book | |
245 int bitalloc_huffman[DCA_PRIM_CHANNELS_MAX]; ///< bit allocation quantizer select | |
246 int quant_index_huffman[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< quantization index codebook select | |
247 float scalefactor_adj[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< scale factor adjustment | |
248 | |
249 /* Primary audio coding side information */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
250 int subsubframes[DCA_SUBFRAMES_MAX]; ///< number of subsubframes |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
251 int partial_samples[DCA_SUBFRAMES_MAX]; ///< partial subsubframe samples count |
4599 | 252 int prediction_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction mode (ADPCM used or not) |
253 int prediction_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction VQ coefs | |
254 int bitalloc[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< bit allocation index | |
255 int transition_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< transition mode (transients) | |
256 int scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][2]; ///< scale factors (2 if transient) | |
257 int joint_huff[DCA_PRIM_CHANNELS_MAX]; ///< joint subband scale factors codebook | |
258 int joint_scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< joint subband scale factors | |
259 int downmix_coef[DCA_PRIM_CHANNELS_MAX][2]; ///< stereo downmix coefficients | |
260 int dynrange_coef; ///< dynamic range coefficient | |
261 | |
262 int high_freq_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< VQ encoded high frequency subbands | |
263 | |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
264 float lfe_data[2 * DCA_LFE_MAX * (DCA_BLOCKS_MAX + 4)]; ///< Low frequency effect data |
4599 | 265 int lfe_scale_factor; |
266 | |
267 /* Subband samples history (for ADPCM) */ | |
268 float subband_samples_hist[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][4]; | |
11369 | 269 DECLARE_ALIGNED(16, float, subband_fir_hist)[DCA_PRIM_CHANNELS_MAX][512]; |
11591 | 270 DECLARE_ALIGNED(16, float, subband_fir_noidea)[DCA_PRIM_CHANNELS_MAX][32]; |
7737 | 271 int hist_index[DCA_PRIM_CHANNELS_MAX]; |
11369 | 272 DECLARE_ALIGNED(16, float, raXin)[32]; |
4599 | 273 |
274 int output; ///< type of output | |
8062
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
275 float add_bias; ///< output bias |
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
276 float scale_bias; ///< output scale |
4599 | 277 |
11908
9b1095b2616a
Support DTS-ES extension (XCh) in dca: move subband_samples into context structure
mstorsjo
parents:
11898
diff
changeset
|
278 DECLARE_ALIGNED(16, float, subband_samples)[DCA_BLOCKS_MAX][DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][8]; |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
279 DECLARE_ALIGNED(16, float, samples)[(DCA_PRIM_CHANNELS_MAX+1)*256]; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
280 const float *samples_chanptr[DCA_PRIM_CHANNELS_MAX+1]; |
4599 | 281 |
282 uint8_t dca_buffer[DCA_MAX_FRAME_SIZE]; | |
283 int dca_buffer_size; ///< how much data is in the dca_buffer | |
284 | |
8148
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
285 const int8_t* channel_order_tab; ///< channel reordering table, lfe and non lfe |
4599 | 286 GetBitContext gb; |
287 /* Current position in DCA frame */ | |
288 int current_subframe; | |
289 int current_subsubframe; | |
290 | |
291 int debug_flag; ///< used for suppressing repeated error messages output | |
292 DSPContext dsp; | |
10199 | 293 FFTContext imdct; |
11592 | 294 SynthFilterContext synth; |
11617
bb17732c00ef
DCA: break out lfe_interpolation_fir() inner loops to a function
mru
parents:
11611
diff
changeset
|
295 DCADSPContext dcadsp; |
4599 | 296 } DCAContext; |
297 | |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
298 static const uint16_t dca_vlc_offs[] = { |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
299 0, 512, 640, 768, 1282, 1794, 2436, 3080, 3770, 4454, 5364, |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
300 5372, 5380, 5388, 5392, 5396, 5412, 5420, 5428, 5460, 5492, 5508, |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
301 5572, 5604, 5668, 5796, 5860, 5892, 6412, 6668, 6796, 7308, 7564, |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
302 7820, 8076, 8620, 9132, 9388, 9910, 10166, 10680, 11196, 11726, 12240, |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
303 12752, 13298, 13810, 14326, 14840, 15500, 16022, 16540, 17158, 17678, 18264, |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
304 18796, 19352, 19926, 20468, 21472, 22398, 23014, 23622, |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
305 }; |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
306 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6463
diff
changeset
|
307 static av_cold void dca_init_vlcs(void) |
4599 | 308 { |
6350 | 309 static int vlcs_initialized = 0; |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
310 int i, j, c = 14; |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
311 static VLC_TYPE dca_table[23622][2]; |
4599 | 312 |
6350 | 313 if (vlcs_initialized) |
4599 | 314 return; |
315 | |
316 dca_bitalloc_index.offset = 1; | |
5070 | 317 dca_bitalloc_index.wrap = 2; |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
318 for (i = 0; i < 5; i++) { |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
319 dca_bitalloc_index.vlc[i].table = &dca_table[dca_vlc_offs[i]]; |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
320 dca_bitalloc_index.vlc[i].table_allocated = dca_vlc_offs[i + 1] - dca_vlc_offs[i]; |
4599 | 321 init_vlc(&dca_bitalloc_index.vlc[i], bitalloc_12_vlc_bits[i], 12, |
322 bitalloc_12_bits[i], 1, 1, | |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
323 bitalloc_12_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
324 } |
4599 | 325 dca_scalefactor.offset = -64; |
326 dca_scalefactor.wrap = 2; | |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
327 for (i = 0; i < 5; i++) { |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
328 dca_scalefactor.vlc[i].table = &dca_table[dca_vlc_offs[i + 5]]; |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
329 dca_scalefactor.vlc[i].table_allocated = dca_vlc_offs[i + 6] - dca_vlc_offs[i + 5]; |
4599 | 330 init_vlc(&dca_scalefactor.vlc[i], SCALES_VLC_BITS, 129, |
331 scales_bits[i], 1, 1, | |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
332 scales_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
333 } |
4599 | 334 dca_tmode.offset = 0; |
335 dca_tmode.wrap = 1; | |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
336 for (i = 0; i < 4; i++) { |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
337 dca_tmode.vlc[i].table = &dca_table[dca_vlc_offs[i + 10]]; |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
338 dca_tmode.vlc[i].table_allocated = dca_vlc_offs[i + 11] - dca_vlc_offs[i + 10]; |
4599 | 339 init_vlc(&dca_tmode.vlc[i], tmode_vlc_bits[i], 4, |
340 tmode_bits[i], 1, 1, | |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
341 tmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
342 } |
4599 | 343 |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
344 for (i = 0; i < 10; i++) |
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
345 for (j = 0; j < 7; j++){ |
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
346 if (!bitalloc_codes[i][j]) break; |
4599 | 347 dca_smpl_bitalloc[i+1].offset = bitalloc_offsets[i]; |
348 dca_smpl_bitalloc[i+1].wrap = 1 + (j > 4); | |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
349 dca_smpl_bitalloc[i+1].vlc[j].table = &dca_table[dca_vlc_offs[c]]; |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
350 dca_smpl_bitalloc[i+1].vlc[j].table_allocated = dca_vlc_offs[c + 1] - dca_vlc_offs[c]; |
4599 | 351 init_vlc(&dca_smpl_bitalloc[i+1].vlc[j], bitalloc_maxbits[i][j], |
352 bitalloc_sizes[i], | |
353 bitalloc_bits[i][j], 1, 1, | |
9526
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
354 bitalloc_codes[i][j], 2, 2, INIT_VLC_USE_NEW_STATIC); |
b9216a975c7f
Make VLC tables in DCA decoder use INIT_VLC_USE_NEW_STATIC
kostya
parents:
9428
diff
changeset
|
355 c++; |
4599 | 356 } |
6350 | 357 vlcs_initialized = 1; |
4599 | 358 } |
359 | |
360 static inline void get_array(GetBitContext *gb, int *dst, int len, int bits) | |
361 { | |
362 while(len--) | |
363 *dst++ = get_bits(gb, bits); | |
364 } | |
365 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
366 static int dca_parse_audio_coding_header(DCAContext * s, int base_channel) |
4599 | 367 { |
368 int i, j; | |
369 static const float adj_table[4] = { 1.0, 1.1250, 1.2500, 1.4375 }; | |
370 static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 }; | |
371 static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 }; | |
372 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
373 s->total_channels = get_bits(&s->gb, 3) + 1 + base_channel; |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
374 s->prim_channels = s->total_channels; |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
375 |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
376 if (s->prim_channels > DCA_PRIM_CHANNELS_MAX) |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
377 s->prim_channels = DCA_PRIM_CHANNELS_MAX; |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
378 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
379 |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
380 for (i = base_channel; i < s->prim_channels; i++) { |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
381 s->subband_activity[i] = get_bits(&s->gb, 5) + 2; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
382 if (s->subband_activity[i] > DCA_SUBBANDS) |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
383 s->subband_activity[i] = DCA_SUBBANDS; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
384 } |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
385 for (i = base_channel; i < s->prim_channels; i++) { |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
386 s->vq_start_subband[i] = get_bits(&s->gb, 5) + 1; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
387 if (s->vq_start_subband[i] > DCA_SUBBANDS) |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
388 s->vq_start_subband[i] = DCA_SUBBANDS; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
389 } |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
390 get_array(&s->gb, s->joint_intensity + base_channel, s->prim_channels - base_channel, 3); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
391 get_array(&s->gb, s->transient_huffman + base_channel, s->prim_channels - base_channel, 2); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
392 get_array(&s->gb, s->scalefactor_huffman + base_channel, s->prim_channels - base_channel, 3); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
393 get_array(&s->gb, s->bitalloc_huffman + base_channel, s->prim_channels - base_channel, 3); |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
394 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
395 /* Get codebooks quantization indexes */ |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
396 if (!base_channel) |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
397 memset(s->quant_index_huffman, 0, sizeof(s->quant_index_huffman)); |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
398 for (j = 1; j < 11; j++) |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
399 for (i = base_channel; i < s->prim_channels; i++) |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
400 s->quant_index_huffman[i][j] = get_bits(&s->gb, bitlen[j]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
401 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
402 /* Get scale factor adjustment */ |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
403 for (j = 0; j < 11; j++) |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
404 for (i = base_channel; i < s->prim_channels; i++) |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
405 s->scalefactor_adj[i][j] = 1; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
406 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
407 for (j = 1; j < 11; j++) |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
408 for (i = base_channel; i < s->prim_channels; i++) |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
409 if (s->quant_index_huffman[i][j] < thr[j]) |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
410 s->scalefactor_adj[i][j] = adj_table[get_bits(&s->gb, 2)]; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
411 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
412 if (s->crc_present) { |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
413 /* Audio header CRC check */ |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
414 get_bits(&s->gb, 16); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
415 } |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
416 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
417 s->current_subframe = 0; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
418 s->current_subsubframe = 0; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
419 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
420 #ifdef TRACE |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
421 av_log(s->avctx, AV_LOG_DEBUG, "subframes: %i\n", s->subframes); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
422 av_log(s->avctx, AV_LOG_DEBUG, "prim channels: %i\n", s->prim_channels); |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
423 for (i = base_channel; i < s->prim_channels; i++){ |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
424 av_log(s->avctx, AV_LOG_DEBUG, "subband activity: %i\n", s->subband_activity[i]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
425 av_log(s->avctx, AV_LOG_DEBUG, "vq start subband: %i\n", s->vq_start_subband[i]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
426 av_log(s->avctx, AV_LOG_DEBUG, "joint intensity: %i\n", s->joint_intensity[i]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
427 av_log(s->avctx, AV_LOG_DEBUG, "transient mode codebook: %i\n", s->transient_huffman[i]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
428 av_log(s->avctx, AV_LOG_DEBUG, "scale factor codebook: %i\n", s->scalefactor_huffman[i]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
429 av_log(s->avctx, AV_LOG_DEBUG, "bit allocation quantizer: %i\n", s->bitalloc_huffman[i]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
430 av_log(s->avctx, AV_LOG_DEBUG, "quant index huff:"); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
431 for (j = 0; j < 11; j++) |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
432 av_log(s->avctx, AV_LOG_DEBUG, " %i", |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
433 s->quant_index_huffman[i][j]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
434 av_log(s->avctx, AV_LOG_DEBUG, "\n"); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
435 av_log(s->avctx, AV_LOG_DEBUG, "scalefac adj:"); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
436 for (j = 0; j < 11; j++) |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
437 av_log(s->avctx, AV_LOG_DEBUG, " %1.3f", s->scalefactor_adj[i][j]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
438 av_log(s->avctx, AV_LOG_DEBUG, "\n"); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
439 } |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
440 #endif |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
441 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
442 return 0; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
443 } |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
444 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
445 static int dca_parse_frame_header(DCAContext * s) |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
446 { |
4599 | 447 init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8); |
448 | |
449 /* Sync code */ | |
450 get_bits(&s->gb, 32); | |
451 | |
452 /* Frame header */ | |
453 s->frame_type = get_bits(&s->gb, 1); | |
454 s->samples_deficit = get_bits(&s->gb, 5) + 1; | |
455 s->crc_present = get_bits(&s->gb, 1); | |
456 s->sample_blocks = get_bits(&s->gb, 7) + 1; | |
457 s->frame_size = get_bits(&s->gb, 14) + 1; | |
458 if (s->frame_size < 95) | |
459 return -1; | |
460 s->amode = get_bits(&s->gb, 6); | |
461 s->sample_rate = dca_sample_rates[get_bits(&s->gb, 4)]; | |
462 if (!s->sample_rate) | |
463 return -1; | |
8078 | 464 s->bit_rate_index = get_bits(&s->gb, 5); |
8077 | 465 s->bit_rate = dca_bit_rates[s->bit_rate_index]; |
4599 | 466 if (!s->bit_rate) |
467 return -1; | |
468 | |
469 s->downmix = get_bits(&s->gb, 1); | |
470 s->dynrange = get_bits(&s->gb, 1); | |
471 s->timestamp = get_bits(&s->gb, 1); | |
472 s->aux_data = get_bits(&s->gb, 1); | |
473 s->hdcd = get_bits(&s->gb, 1); | |
474 s->ext_descr = get_bits(&s->gb, 3); | |
475 s->ext_coding = get_bits(&s->gb, 1); | |
476 s->aspf = get_bits(&s->gb, 1); | |
477 s->lfe = get_bits(&s->gb, 2); | |
478 s->predictor_history = get_bits(&s->gb, 1); | |
479 | |
480 /* TODO: check CRC */ | |
481 if (s->crc_present) | |
482 s->header_crc = get_bits(&s->gb, 16); | |
483 | |
484 s->multirate_inter = get_bits(&s->gb, 1); | |
485 s->version = get_bits(&s->gb, 4); | |
486 s->copy_history = get_bits(&s->gb, 2); | |
487 s->source_pcm_res = get_bits(&s->gb, 3); | |
488 s->front_sum = get_bits(&s->gb, 1); | |
489 s->surround_sum = get_bits(&s->gb, 1); | |
490 s->dialog_norm = get_bits(&s->gb, 4); | |
491 | |
492 /* FIXME: channels mixing levels */ | |
4893 | 493 s->output = s->amode; |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
494 if (s->lfe) s->output |= DCA_LFE; |
4599 | 495 |
496 #ifdef TRACE | |
497 av_log(s->avctx, AV_LOG_DEBUG, "frame type: %i\n", s->frame_type); | |
498 av_log(s->avctx, AV_LOG_DEBUG, "samples deficit: %i\n", s->samples_deficit); | |
499 av_log(s->avctx, AV_LOG_DEBUG, "crc present: %i\n", s->crc_present); | |
500 av_log(s->avctx, AV_LOG_DEBUG, "sample blocks: %i (%i samples)\n", | |
501 s->sample_blocks, s->sample_blocks * 32); | |
502 av_log(s->avctx, AV_LOG_DEBUG, "frame size: %i bytes\n", s->frame_size); | |
503 av_log(s->avctx, AV_LOG_DEBUG, "amode: %i (%i channels)\n", | |
504 s->amode, dca_channels[s->amode]); | |
8061 | 505 av_log(s->avctx, AV_LOG_DEBUG, "sample rate: %i Hz\n", |
506 s->sample_rate); | |
507 av_log(s->avctx, AV_LOG_DEBUG, "bit rate: %i bits/s\n", | |
508 s->bit_rate); | |
4599 | 509 av_log(s->avctx, AV_LOG_DEBUG, "downmix: %i\n", s->downmix); |
510 av_log(s->avctx, AV_LOG_DEBUG, "dynrange: %i\n", s->dynrange); | |
511 av_log(s->avctx, AV_LOG_DEBUG, "timestamp: %i\n", s->timestamp); | |
512 av_log(s->avctx, AV_LOG_DEBUG, "aux_data: %i\n", s->aux_data); | |
513 av_log(s->avctx, AV_LOG_DEBUG, "hdcd: %i\n", s->hdcd); | |
514 av_log(s->avctx, AV_LOG_DEBUG, "ext descr: %i\n", s->ext_descr); | |
515 av_log(s->avctx, AV_LOG_DEBUG, "ext coding: %i\n", s->ext_coding); | |
516 av_log(s->avctx, AV_LOG_DEBUG, "aspf: %i\n", s->aspf); | |
517 av_log(s->avctx, AV_LOG_DEBUG, "lfe: %i\n", s->lfe); | |
518 av_log(s->avctx, AV_LOG_DEBUG, "predictor history: %i\n", | |
519 s->predictor_history); | |
520 av_log(s->avctx, AV_LOG_DEBUG, "header crc: %i\n", s->header_crc); | |
521 av_log(s->avctx, AV_LOG_DEBUG, "multirate inter: %i\n", | |
522 s->multirate_inter); | |
523 av_log(s->avctx, AV_LOG_DEBUG, "version number: %i\n", s->version); | |
524 av_log(s->avctx, AV_LOG_DEBUG, "copy history: %i\n", s->copy_history); | |
525 av_log(s->avctx, AV_LOG_DEBUG, | |
526 "source pcm resolution: %i (%i bits/sample)\n", | |
527 s->source_pcm_res, dca_bits_per_sample[s->source_pcm_res]); | |
528 av_log(s->avctx, AV_LOG_DEBUG, "front sum: %i\n", s->front_sum); | |
529 av_log(s->avctx, AV_LOG_DEBUG, "surround sum: %i\n", s->surround_sum); | |
530 av_log(s->avctx, AV_LOG_DEBUG, "dialog norm: %i\n", s->dialog_norm); | |
531 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
532 #endif | |
533 | |
534 /* Primary audio coding header */ | |
535 s->subframes = get_bits(&s->gb, 4) + 1; | |
536 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
537 return dca_parse_audio_coding_header(s, 0); |
4599 | 538 } |
539 | |
540 | |
4876
384c95879d8b
1000l to myself as used VLC indexes were totally wrong
kostya
parents:
4783
diff
changeset
|
541 static inline int get_scale(GetBitContext *gb, int level, int value) |
4599 | 542 { |
543 if (level < 5) { | |
544 /* huffman encoded */ | |
4876
384c95879d8b
1000l to myself as used VLC indexes were totally wrong
kostya
parents:
4783
diff
changeset
|
545 value += get_bitalloc(gb, &dca_scalefactor, level); |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
546 } else if (level < 8) |
4599 | 547 value = get_bits(gb, level + 1); |
548 return value; | |
549 } | |
550 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
551 static int dca_subframe_header(DCAContext * s, int base_channel, int block_index) |
4599 | 552 { |
553 /* Primary audio coding side information */ | |
554 int j, k; | |
555 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
556 if (!base_channel) { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
557 s->subsubframes[s->current_subframe] = get_bits(&s->gb, 2) + 1; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
558 s->partial_samples[s->current_subframe] = get_bits(&s->gb, 3); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
559 } |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
560 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
561 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 562 for (k = 0; k < s->subband_activity[j]; k++) |
563 s->prediction_mode[j][k] = get_bits(&s->gb, 1); | |
564 } | |
565 | |
566 /* Get prediction codebook */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
567 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 568 for (k = 0; k < s->subband_activity[j]; k++) { |
569 if (s->prediction_mode[j][k] > 0) { | |
570 /* (Prediction coefficient VQ address) */ | |
571 s->prediction_vq[j][k] = get_bits(&s->gb, 12); | |
572 } | |
573 } | |
574 } | |
575 | |
576 /* Bit allocation index */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
577 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 578 for (k = 0; k < s->vq_start_subband[j]; k++) { |
579 if (s->bitalloc_huffman[j] == 6) | |
580 s->bitalloc[j][k] = get_bits(&s->gb, 5); | |
581 else if (s->bitalloc_huffman[j] == 5) | |
582 s->bitalloc[j][k] = get_bits(&s->gb, 4); | |
6463 | 583 else if (s->bitalloc_huffman[j] == 7) { |
584 av_log(s->avctx, AV_LOG_ERROR, | |
585 "Invalid bit allocation index\n"); | |
586 return -1; | |
587 } else { | |
4599 | 588 s->bitalloc[j][k] = |
4876
384c95879d8b
1000l to myself as used VLC indexes were totally wrong
kostya
parents:
4783
diff
changeset
|
589 get_bitalloc(&s->gb, &dca_bitalloc_index, s->bitalloc_huffman[j]); |
4599 | 590 } |
591 | |
592 if (s->bitalloc[j][k] > 26) { | |
593 // av_log(s->avctx,AV_LOG_DEBUG,"bitalloc index [%i][%i] too big (%i)\n", | |
594 // j, k, s->bitalloc[j][k]); | |
595 return -1; | |
596 } | |
597 } | |
598 } | |
599 | |
600 /* Transition mode */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
601 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 602 for (k = 0; k < s->subband_activity[j]; k++) { |
603 s->transition_mode[j][k] = 0; | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
604 if (s->subsubframes[s->current_subframe] > 1 && |
4599 | 605 k < s->vq_start_subband[j] && s->bitalloc[j][k] > 0) { |
606 s->transition_mode[j][k] = | |
607 get_bitalloc(&s->gb, &dca_tmode, s->transient_huffman[j]); | |
608 } | |
609 } | |
610 } | |
611 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
612 for (j = base_channel; j < s->prim_channels; j++) { |
6214 | 613 const uint32_t *scale_table; |
4599 | 614 int scale_sum; |
615 | |
616 memset(s->scale_factor[j], 0, s->subband_activity[j] * sizeof(s->scale_factor[0][0][0]) * 2); | |
617 | |
618 if (s->scalefactor_huffman[j] == 6) | |
6214 | 619 scale_table = scale_factor_quant7; |
4599 | 620 else |
6214 | 621 scale_table = scale_factor_quant6; |
4599 | 622 |
623 /* When huffman coded, only the difference is encoded */ | |
624 scale_sum = 0; | |
625 | |
626 for (k = 0; k < s->subband_activity[j]; k++) { | |
627 if (k >= s->vq_start_subband[j] || s->bitalloc[j][k] > 0) { | |
4876
384c95879d8b
1000l to myself as used VLC indexes were totally wrong
kostya
parents:
4783
diff
changeset
|
628 scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum); |
4599 | 629 s->scale_factor[j][k][0] = scale_table[scale_sum]; |
630 } | |
631 | |
632 if (k < s->vq_start_subband[j] && s->transition_mode[j][k]) { | |
633 /* Get second scale factor */ | |
4876
384c95879d8b
1000l to myself as used VLC indexes were totally wrong
kostya
parents:
4783
diff
changeset
|
634 scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum); |
4599 | 635 s->scale_factor[j][k][1] = scale_table[scale_sum]; |
636 } | |
637 } | |
638 } | |
639 | |
640 /* Joint subband scale factor codebook select */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
641 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 642 /* Transmitted only if joint subband coding enabled */ |
643 if (s->joint_intensity[j] > 0) | |
644 s->joint_huff[j] = get_bits(&s->gb, 3); | |
645 } | |
646 | |
647 /* Scale factors for joint subband coding */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
648 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 649 int source_channel; |
650 | |
651 /* Transmitted only if joint subband coding enabled */ | |
652 if (s->joint_intensity[j] > 0) { | |
653 int scale = 0; | |
654 source_channel = s->joint_intensity[j] - 1; | |
655 | |
656 /* When huffman coded, only the difference is encoded | |
657 * (is this valid as well for joint scales ???) */ | |
658 | |
659 for (k = s->subband_activity[j]; k < s->subband_activity[source_channel]; k++) { | |
4876
384c95879d8b
1000l to myself as used VLC indexes were totally wrong
kostya
parents:
4783
diff
changeset
|
660 scale = get_scale(&s->gb, s->joint_huff[j], 0); |
4599 | 661 scale += 64; /* bias */ |
662 s->joint_scale_factor[j][k] = scale; /*joint_scale_table[scale]; */ | |
663 } | |
664 | |
10380 | 665 if (!(s->debug_flag & 0x02)) { |
4599 | 666 av_log(s->avctx, AV_LOG_DEBUG, |
667 "Joint stereo coding not supported\n"); | |
668 s->debug_flag |= 0x02; | |
669 } | |
670 } | |
671 } | |
672 | |
673 /* Stereo downmix coefficients */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
674 if (!base_channel && s->prim_channels > 2) { |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
675 if (s->downmix) { |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
676 for (j = base_channel; j < s->prim_channels; j++) { |
4895 | 677 s->downmix_coef[j][0] = get_bits(&s->gb, 7); |
678 s->downmix_coef[j][1] = get_bits(&s->gb, 7); | |
679 } | |
4894 | 680 } else { |
681 int am = s->amode & DCA_CHANNEL_MASK; | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
682 for (j = base_channel; j < s->prim_channels; j++) { |
4894 | 683 s->downmix_coef[j][0] = dca_default_coeffs[am][j][0]; |
684 s->downmix_coef[j][1] = dca_default_coeffs[am][j][1]; | |
685 } | |
686 } | |
4599 | 687 } |
688 | |
689 /* Dynamic range coefficient */ | |
690 if (s->dynrange) | |
691 s->dynrange_coef = get_bits(&s->gb, 8); | |
692 | |
693 /* Side information CRC check word */ | |
694 if (s->crc_present) { | |
695 get_bits(&s->gb, 16); | |
696 } | |
697 | |
698 /* | |
699 * Primary audio data arrays | |
700 */ | |
701 | |
702 /* VQ encoded high frequency subbands */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
703 for (j = base_channel; j < s->prim_channels; j++) |
4599 | 704 for (k = s->vq_start_subband[j]; k < s->subband_activity[j]; k++) |
705 /* 1 vector -> 32 samples */ | |
706 s->high_freq_vq[j][k] = get_bits(&s->gb, 10); | |
707 | |
708 /* Low frequency effect data */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
709 if (!base_channel && s->lfe) { |
4599 | 710 /* LFE samples */ |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
711 int lfe_samples = 2 * s->lfe * (4 + block_index); |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
712 int lfe_end_sample = 2 * s->lfe * (4 + block_index + s->subsubframes[s->current_subframe]); |
4599 | 713 float lfe_scale; |
714 | |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
715 for (j = lfe_samples; j < lfe_end_sample; j++) { |
4599 | 716 /* Signed 8 bits int */ |
717 s->lfe_data[j] = get_sbits(&s->gb, 8); | |
718 } | |
719 | |
720 /* Scale factor index */ | |
721 s->lfe_scale_factor = scale_factor_quant7[get_bits(&s->gb, 8)]; | |
722 | |
723 /* Quantization step size * scale factor */ | |
724 lfe_scale = 0.035 * s->lfe_scale_factor; | |
725 | |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
726 for (j = lfe_samples; j < lfe_end_sample; j++) |
4599 | 727 s->lfe_data[j] *= lfe_scale; |
728 } | |
729 | |
730 #ifdef TRACE | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
731 av_log(s->avctx, AV_LOG_DEBUG, "subsubframes: %i\n", s->subsubframes[s->current_subframe]); |
4599 | 732 av_log(s->avctx, AV_LOG_DEBUG, "partial samples: %i\n", |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
733 s->partial_samples[s->current_subframe]); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
734 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 735 av_log(s->avctx, AV_LOG_DEBUG, "prediction mode:"); |
736 for (k = 0; k < s->subband_activity[j]; k++) | |
737 av_log(s->avctx, AV_LOG_DEBUG, " %i", s->prediction_mode[j][k]); | |
738 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
739 } | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
740 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 741 for (k = 0; k < s->subband_activity[j]; k++) |
742 av_log(s->avctx, AV_LOG_DEBUG, | |
743 "prediction coefs: %f, %f, %f, %f\n", | |
744 (float) adpcm_vb[s->prediction_vq[j][k]][0] / 8192, | |
745 (float) adpcm_vb[s->prediction_vq[j][k]][1] / 8192, | |
746 (float) adpcm_vb[s->prediction_vq[j][k]][2] / 8192, | |
747 (float) adpcm_vb[s->prediction_vq[j][k]][3] / 8192); | |
748 } | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
749 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 750 av_log(s->avctx, AV_LOG_DEBUG, "bitalloc index: "); |
751 for (k = 0; k < s->vq_start_subband[j]; k++) | |
752 av_log(s->avctx, AV_LOG_DEBUG, "%2.2i ", s->bitalloc[j][k]); | |
753 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
754 } | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
755 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 756 av_log(s->avctx, AV_LOG_DEBUG, "Transition mode:"); |
757 for (k = 0; k < s->subband_activity[j]; k++) | |
758 av_log(s->avctx, AV_LOG_DEBUG, " %i", s->transition_mode[j][k]); | |
759 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
760 } | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
761 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 762 av_log(s->avctx, AV_LOG_DEBUG, "Scale factor:"); |
763 for (k = 0; k < s->subband_activity[j]; k++) { | |
764 if (k >= s->vq_start_subband[j] || s->bitalloc[j][k] > 0) | |
765 av_log(s->avctx, AV_LOG_DEBUG, " %i", s->scale_factor[j][k][0]); | |
766 if (k < s->vq_start_subband[j] && s->transition_mode[j][k]) | |
767 av_log(s->avctx, AV_LOG_DEBUG, " %i(t)", s->scale_factor[j][k][1]); | |
768 } | |
769 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
770 } | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
771 for (j = base_channel; j < s->prim_channels; j++) { |
4599 | 772 if (s->joint_intensity[j] > 0) { |
5069 | 773 int source_channel = s->joint_intensity[j] - 1; |
4599 | 774 av_log(s->avctx, AV_LOG_DEBUG, "Joint scale factor index:\n"); |
775 for (k = s->subband_activity[j]; k < s->subband_activity[source_channel]; k++) | |
776 av_log(s->avctx, AV_LOG_DEBUG, " %i", s->joint_scale_factor[j][k]); | |
777 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
778 } | |
779 } | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
780 if (!base_channel && s->prim_channels > 2 && s->downmix) { |
4599 | 781 av_log(s->avctx, AV_LOG_DEBUG, "Downmix coeffs:\n"); |
782 for (j = 0; j < s->prim_channels; j++) { | |
783 av_log(s->avctx, AV_LOG_DEBUG, "Channel 0,%d = %f\n", j, dca_downmix_coeffs[s->downmix_coef[j][0]]); | |
784 av_log(s->avctx, AV_LOG_DEBUG, "Channel 1,%d = %f\n", j, dca_downmix_coeffs[s->downmix_coef[j][1]]); | |
785 } | |
786 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
787 } | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
788 for (j = base_channel; j < s->prim_channels; j++) |
4599 | 789 for (k = s->vq_start_subband[j]; k < s->subband_activity[j]; k++) |
790 av_log(s->avctx, AV_LOG_DEBUG, "VQ index: %i\n", s->high_freq_vq[j][k]); | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
791 if (!base_channel && s->lfe) { |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
792 int lfe_samples = 2 * s->lfe * (4 + block_index); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
793 int lfe_end_sample = 2 * s->lfe * (4 + block_index + s->subsubframes[s->current_subframe]); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
794 |
4599 | 795 av_log(s->avctx, AV_LOG_DEBUG, "LFE samples:\n"); |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
796 for (j = lfe_samples; j < lfe_end_sample; j++) |
4599 | 797 av_log(s->avctx, AV_LOG_DEBUG, " %f", s->lfe_data[j]); |
798 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
799 } | |
800 #endif | |
801 | |
802 return 0; | |
803 } | |
804 | |
805 static void qmf_32_subbands(DCAContext * s, int chans, | |
806 float samples_in[32][8], float *samples_out, | |
807 float scale, float bias) | |
808 { | |
5974
ae05d6d12f12
Use the correct "const float *" type for variable instead of casting const away.
reimar
parents:
5645
diff
changeset
|
809 const float *prCoeff; |
10468 | 810 int i; |
4599 | 811 |
11607 | 812 int sb_act = s->subband_activity[chans]; |
7738
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
813 int subindex; |
4599 | 814 |
7738
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
815 scale *= sqrt(1/8.0); |
4599 | 816 |
817 /* Select filter */ | |
818 if (!s->multirate_inter) /* Non-perfect reconstruction */ | |
5974
ae05d6d12f12
Use the correct "const float *" type for variable instead of casting const away.
reimar
parents:
5645
diff
changeset
|
819 prCoeff = fir_32bands_nonperfect; |
4599 | 820 else /* Perfect reconstruction */ |
5974
ae05d6d12f12
Use the correct "const float *" type for variable instead of casting const away.
reimar
parents:
5645
diff
changeset
|
821 prCoeff = fir_32bands_perfect; |
4599 | 822 |
823 /* Reconstructed channel sample index */ | |
824 for (subindex = 0; subindex < 8; subindex++) { | |
825 /* Load in one sample from each subband and clear inactive subbands */ | |
11607 | 826 for (i = 0; i < sb_act; i++){ |
11606 | 827 uint32_t v = AV_RN32A(&samples_in[i][subindex]) ^ ((i-1)&2)<<30; |
828 AV_WN32A(&s->raXin[i], v); | |
7738
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
829 } |
4599 | 830 for (; i < 32; i++) |
10152 | 831 s->raXin[i] = 0.0; |
4599 | 832 |
11592 | 833 s->synth.synth_filter_float(&s->imdct, |
10467 | 834 s->subband_fir_hist[chans], &s->hist_index[chans], |
835 s->subband_fir_noidea[chans], prCoeff, | |
836 samples_out, s->raXin, scale, bias); | |
7738
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
837 samples_out+= 32; |
4599 | 838 |
839 } | |
840 } | |
841 | |
11617
bb17732c00ef
DCA: break out lfe_interpolation_fir() inner loops to a function
mru
parents:
11611
diff
changeset
|
842 static void lfe_interpolation_fir(DCAContext *s, int decimation_select, |
4599 | 843 int num_deci_sample, float *samples_in, |
844 float *samples_out, float scale, | |
845 float bias) | |
846 { | |
847 /* samples_in: An array holding decimated samples. | |
848 * Samples in current subframe starts from samples_in[0], | |
849 * while samples_in[-1], samples_in[-2], ..., stores samples | |
850 * from last subframe as history. | |
851 * | |
852 * samples_out: An array holding interpolated samples | |
853 */ | |
854 | |
11617
bb17732c00ef
DCA: break out lfe_interpolation_fir() inner loops to a function
mru
parents:
11611
diff
changeset
|
855 int decifactor; |
4599 | 856 const float *prCoeff; |
857 int deciindex; | |
858 | |
859 /* Select decimation filter */ | |
860 if (decimation_select == 1) { | |
11608 | 861 decifactor = 64; |
4599 | 862 prCoeff = lfe_fir_128; |
863 } else { | |
11608 | 864 decifactor = 32; |
4599 | 865 prCoeff = lfe_fir_64; |
866 } | |
867 /* Interpolation */ | |
868 for (deciindex = 0; deciindex < num_deci_sample; deciindex++) { | |
11617
bb17732c00ef
DCA: break out lfe_interpolation_fir() inner loops to a function
mru
parents:
11611
diff
changeset
|
869 s->dcadsp.lfe_fir(samples_out, samples_in, prCoeff, decifactor, |
bb17732c00ef
DCA: break out lfe_interpolation_fir() inner loops to a function
mru
parents:
11611
diff
changeset
|
870 scale, bias); |
11608 | 871 samples_in++; |
11617
bb17732c00ef
DCA: break out lfe_interpolation_fir() inner loops to a function
mru
parents:
11611
diff
changeset
|
872 samples_out += 2 * decifactor; |
4599 | 873 } |
874 } | |
875 | |
876 /* downmixing routines */ | |
4894 | 877 #define MIX_REAR1(samples, si1, rs, coef) \ |
878 samples[i] += samples[si1] * coef[rs][0]; \ | |
879 samples[i+256] += samples[si1] * coef[rs][1]; | |
4599 | 880 |
4894 | 881 #define MIX_REAR2(samples, si1, si2, rs, coef) \ |
882 samples[i] += samples[si1] * coef[rs][0] + samples[si2] * coef[rs+1][0]; \ | |
883 samples[i+256] += samples[si1] * coef[rs][1] + samples[si2] * coef[rs+1][1]; | |
4599 | 884 |
4894 | 885 #define MIX_FRONT3(samples, coef) \ |
4599 | 886 t = samples[i]; \ |
4894 | 887 samples[i] = t * coef[0][0] + samples[i+256] * coef[1][0] + samples[i+512] * coef[2][0]; \ |
888 samples[i+256] = t * coef[0][1] + samples[i+256] * coef[1][1] + samples[i+512] * coef[2][1]; | |
4599 | 889 |
890 #define DOWNMIX_TO_STEREO(op1, op2) \ | |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
891 for (i = 0; i < 256; i++){ \ |
4599 | 892 op1 \ |
893 op2 \ | |
894 } | |
895 | |
4894 | 896 static void dca_downmix(float *samples, int srcfmt, |
897 int downmix_coef[DCA_PRIM_CHANNELS_MAX][2]) | |
4599 | 898 { |
899 int i; | |
900 float t; | |
4894 | 901 float coef[DCA_PRIM_CHANNELS_MAX][2]; |
902 | |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
903 for (i=0; i<DCA_PRIM_CHANNELS_MAX; i++) { |
4894 | 904 coef[i][0] = dca_downmix_coeffs[downmix_coef[i][0]]; |
905 coef[i][1] = dca_downmix_coeffs[downmix_coef[i][1]]; | |
906 } | |
4599 | 907 |
908 switch (srcfmt) { | |
909 case DCA_MONO: | |
910 case DCA_CHANNEL: | |
911 case DCA_STEREO_TOTAL: | |
912 case DCA_STEREO_SUMDIFF: | |
913 case DCA_4F2R: | |
914 av_log(NULL, 0, "Not implemented!\n"); | |
915 break; | |
916 case DCA_STEREO: | |
917 break; | |
918 case DCA_3F: | |
4894 | 919 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef),); |
4599 | 920 break; |
921 case DCA_2F1R: | |
4894 | 922 DOWNMIX_TO_STEREO(MIX_REAR1(samples, i + 512, 2, coef),); |
4599 | 923 break; |
924 case DCA_3F1R: | |
4894 | 925 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef), |
926 MIX_REAR1(samples, i + 768, 3, coef)); | |
4599 | 927 break; |
928 case DCA_2F2R: | |
4894 | 929 DOWNMIX_TO_STEREO(MIX_REAR2(samples, i + 512, i + 768, 2, coef),); |
4599 | 930 break; |
931 case DCA_3F2R: | |
4894 | 932 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef), |
933 MIX_REAR2(samples, i + 768, i + 1024, 3, coef)); | |
4599 | 934 break; |
935 } | |
936 } | |
937 | |
938 | |
939 /* Very compact version of the block code decoder that does not use table | |
940 * look-up but is slightly slower */ | |
941 static int decode_blockcode(int code, int levels, int *values) | |
942 { | |
943 int i; | |
944 int offset = (levels - 1) >> 1; | |
945 | |
946 for (i = 0; i < 4; i++) { | |
11611 | 947 int div = FASTDIV(code, levels); |
948 values[i] = code - offset - div*levels; | |
949 code = div; | |
4599 | 950 } |
951 | |
952 if (code == 0) | |
953 return 0; | |
954 else { | |
955 av_log(NULL, AV_LOG_ERROR, "ERROR: block code look-up failed\n"); | |
956 return -1; | |
957 } | |
958 } | |
959 | |
960 static const uint8_t abits_sizes[7] = { 7, 10, 12, 13, 15, 17, 19 }; | |
961 static const uint8_t abits_levels[7] = { 3, 5, 7, 9, 13, 17, 25 }; | |
962 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
963 static int dca_subsubframe(DCAContext * s, int base_channel, int block_index) |
4599 | 964 { |
965 int k, l; | |
966 int subsubframe = s->current_subsubframe; | |
967 | |
6214 | 968 const float *quant_step_table; |
4599 | 969 |
970 /* FIXME */ | |
11908
9b1095b2616a
Support DTS-ES extension (XCh) in dca: move subband_samples into context structure
mstorsjo
parents:
11898
diff
changeset
|
971 float (*subband_samples)[DCA_SUBBANDS][8] = s->subband_samples[block_index]; |
11625 | 972 LOCAL_ALIGNED_16(int, block, [8]); |
4599 | 973 |
974 /* | |
975 * Audio data | |
976 */ | |
977 | |
978 /* Select quantization step size table */ | |
8077 | 979 if (s->bit_rate_index == 0x1f) |
6214 | 980 quant_step_table = lossless_quant_d; |
4599 | 981 else |
6214 | 982 quant_step_table = lossy_quant_d; |
4599 | 983 |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
984 for (k = base_channel; k < s->prim_channels; k++) { |
4599 | 985 for (l = 0; l < s->vq_start_subband[k]; l++) { |
986 int m; | |
987 | |
988 /* Select the mid-tread linear quantizer */ | |
989 int abits = s->bitalloc[k][l]; | |
990 | |
991 float quant_step_size = quant_step_table[abits]; | |
992 | |
993 /* | |
994 * Determine quantization index code book and its type | |
995 */ | |
996 | |
997 /* Select quantization index code book */ | |
998 int sel = s->quant_index_huffman[k][abits]; | |
999 | |
1000 /* | |
1001 * Extract bits from the bit stream | |
1002 */ | |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1003 if (!abits){ |
4599 | 1004 memset(subband_samples[k][l], 0, 8 * sizeof(subband_samples[0][0][0])); |
11625 | 1005 } else { |
1006 /* Deal with transients */ | |
1007 int sfi = s->transition_mode[k][l] && subsubframe >= s->transition_mode[k][l]; | |
1008 float rscale = quant_step_size * s->scale_factor[k][l][sfi] * s->scalefactor_adj[k][sel]; | |
1009 | |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1010 if (abits >= 11 || !dca_smpl_bitalloc[abits].vlc[sel].table){ |
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1011 if (abits <= 7){ |
11626 | 1012 /* Block code */ |
1013 int block_code1, block_code2, size, levels; | |
4599 | 1014 |
11626 | 1015 size = abits_sizes[abits-1]; |
1016 levels = abits_levels[abits-1]; | |
4599 | 1017 |
11626 | 1018 block_code1 = get_bits(&s->gb, size); |
1019 /* FIXME Should test return value */ | |
1020 decode_blockcode(block_code1, levels, block); | |
1021 block_code2 = get_bits(&s->gb, size); | |
1022 decode_blockcode(block_code2, levels, &block[4]); | |
1023 }else{ | |
1024 /* no coding */ | |
1025 for (m = 0; m < 8; m++) | |
1026 block[m] = get_sbits(&s->gb, abits - 3); | |
1027 } | |
4599 | 1028 }else{ |
11626 | 1029 /* Huffman coded */ |
4599 | 1030 for (m = 0; m < 8; m++) |
11626 | 1031 block[m] = get_bitalloc(&s->gb, &dca_smpl_bitalloc[abits], sel); |
4599 | 1032 } |
1033 | |
11625 | 1034 s->dsp.int32_to_float_fmul_scalar(subband_samples[k][l], |
1035 block, rscale, 8); | |
1036 } | |
4599 | 1037 |
1038 /* | |
1039 * Inverse ADPCM if in prediction mode | |
1040 */ | |
1041 if (s->prediction_mode[k][l]) { | |
1042 int n; | |
1043 for (m = 0; m < 8; m++) { | |
1044 for (n = 1; n <= 4; n++) | |
1045 if (m >= n) | |
1046 subband_samples[k][l][m] += | |
1047 (adpcm_vb[s->prediction_vq[k][l]][n - 1] * | |
1048 subband_samples[k][l][m - n] / 8192); | |
1049 else if (s->predictor_history) | |
1050 subband_samples[k][l][m] += | |
1051 (adpcm_vb[s->prediction_vq[k][l]][n - 1] * | |
1052 s->subband_samples_hist[k][l][m - n + | |
1053 4] / 8192); | |
1054 } | |
1055 } | |
1056 } | |
1057 | |
1058 /* | |
1059 * Decode VQ encoded high frequencies | |
1060 */ | |
1061 for (l = s->vq_start_subband[k]; l < s->subband_activity[k]; l++) { | |
1062 /* 1 vector -> 32 samples but we only need the 8 samples | |
1063 * for this subsubframe. */ | |
1064 int m; | |
1065 | |
1066 if (!s->debug_flag & 0x01) { | |
1067 av_log(s->avctx, AV_LOG_DEBUG, "Stream with high frequencies VQ coding\n"); | |
1068 s->debug_flag |= 0x01; | |
1069 } | |
1070 | |
1071 for (m = 0; m < 8; m++) { | |
1072 subband_samples[k][l][m] = | |
1073 high_freq_vq[s->high_freq_vq[k][l]][subsubframe * 8 + | |
1074 m] | |
1075 * (float) s->scale_factor[k][l][0] / 16.0; | |
1076 } | |
1077 } | |
1078 } | |
1079 | |
1080 /* Check for DSYNC after subsubframe */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1081 if (s->aspf || subsubframe == s->subsubframes[s->current_subframe] - 1) { |
4599 | 1082 if (0xFFFF == get_bits(&s->gb, 16)) { /* 0xFFFF */ |
1083 #ifdef TRACE | |
1084 av_log(s->avctx, AV_LOG_DEBUG, "Got subframe DSYNC\n"); | |
1085 #endif | |
1086 } else { | |
1087 av_log(s->avctx, AV_LOG_ERROR, "Didn't get subframe DSYNC\n"); | |
1088 } | |
1089 } | |
1090 | |
1091 /* Backup predictor history for adpcm */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1092 for (k = base_channel; k < s->prim_channels; k++) |
4599 | 1093 for (l = 0; l < s->vq_start_subband[k]; l++) |
1094 memcpy(s->subband_samples_hist[k][l], &subband_samples[k][l][4], | |
1095 4 * sizeof(subband_samples[0][0][0])); | |
1096 | |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1097 return 0; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1098 } |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1099 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1100 static int dca_filter_channels(DCAContext * s, int block_index) |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1101 { |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1102 float (*subband_samples)[DCA_SUBBANDS][8] = s->subband_samples[block_index]; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1103 int k; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1104 |
4599 | 1105 /* 32 subbands QMF */ |
1106 for (k = 0; k < s->prim_channels; k++) { | |
1107 /* static float pcm_to_double[8] = | |
1108 {32768.0, 32768.0, 524288.0, 524288.0, 0, 8388608.0, 8388608.0};*/ | |
8148
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1109 qmf_32_subbands(s, k, subband_samples[k], &s->samples[256 * s->channel_order_tab[k]], |
8062
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1110 M_SQRT1_2*s->scale_bias /*pcm_to_double[s->source_pcm_res] */ , |
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1111 s->add_bias ); |
4599 | 1112 } |
1113 | |
1114 /* Down mixing */ | |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1115 if (s->avctx->request_channels == 2 && s->prim_channels > 2) { |
4894 | 1116 dca_downmix(s->samples, s->amode, s->downmix_coef); |
4599 | 1117 } |
1118 | |
1119 /* Generate LFE samples for this subsubframe FIXME!!! */ | |
1120 if (s->output & DCA_LFE) { | |
11617
bb17732c00ef
DCA: break out lfe_interpolation_fir() inner loops to a function
mru
parents:
11611
diff
changeset
|
1121 lfe_interpolation_fir(s, s->lfe, 2 * s->lfe, |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1122 s->lfe_data + 2 * s->lfe * (block_index + 4), |
8148
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1123 &s->samples[256 * dca_lfe_index[s->amode]], |
8062
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1124 (1.0/256.0)*s->scale_bias, s->add_bias); |
4599 | 1125 /* Outputs 20bits pcm samples */ |
1126 } | |
1127 | |
1128 return 0; | |
1129 } | |
1130 | |
1131 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1132 static int dca_subframe_footer(DCAContext * s, int base_channel) |
4599 | 1133 { |
1134 int aux_data_count = 0, i; | |
1135 | |
1136 /* | |
1137 * Unpack optional information | |
1138 */ | |
1139 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1140 /* presumably optional information only appears in the core? */ |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1141 if (!base_channel) { |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1142 if (s->timestamp) |
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1143 get_bits(&s->gb, 32); |
4599 | 1144 |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1145 if (s->aux_data) |
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1146 aux_data_count = get_bits(&s->gb, 6); |
4599 | 1147 |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1148 for (i = 0; i < aux_data_count; i++) |
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1149 get_bits(&s->gb, 8); |
4599 | 1150 |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1151 if (s->crc_present && (s->downmix || s->dynrange)) |
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1152 get_bits(&s->gb, 16); |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1153 } |
4599 | 1154 |
1155 return 0; | |
1156 } | |
1157 | |
1158 /** | |
1159 * Decode a dca frame block | |
1160 * | |
1161 * @param s pointer to the DCAContext | |
1162 */ | |
1163 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1164 static int dca_decode_block(DCAContext * s, int base_channel, int block_index) |
4599 | 1165 { |
1166 | |
1167 /* Sanity check */ | |
1168 if (s->current_subframe >= s->subframes) { | |
1169 av_log(s->avctx, AV_LOG_DEBUG, "check failed: %i>%i", | |
1170 s->current_subframe, s->subframes); | |
1171 return -1; | |
1172 } | |
1173 | |
1174 if (!s->current_subsubframe) { | |
1175 #ifdef TRACE | |
1176 av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_header\n"); | |
1177 #endif | |
1178 /* Read subframe header */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1179 if (dca_subframe_header(s, base_channel, block_index)) |
4599 | 1180 return -1; |
1181 } | |
1182 | |
1183 /* Read subsubframe */ | |
1184 #ifdef TRACE | |
1185 av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subsubframe\n"); | |
1186 #endif | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1187 if (dca_subsubframe(s, base_channel, block_index)) |
4599 | 1188 return -1; |
1189 | |
1190 /* Update state */ | |
1191 s->current_subsubframe++; | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1192 if (s->current_subsubframe >= s->subsubframes[s->current_subframe]) { |
4599 | 1193 s->current_subsubframe = 0; |
1194 s->current_subframe++; | |
1195 } | |
1196 if (s->current_subframe >= s->subframes) { | |
1197 #ifdef TRACE | |
1198 av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_footer\n"); | |
1199 #endif | |
1200 /* Read subframe footer */ | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1201 if (dca_subframe_footer(s, base_channel)) |
4599 | 1202 return -1; |
1203 } | |
1204 | |
1205 return 0; | |
1206 } | |
1207 | |
1208 /** | |
1209 * Convert bitstream to one representation based on sync marker | |
1210 */ | |
6214 | 1211 static int dca_convert_bitstream(const uint8_t * src, int src_size, uint8_t * dst, |
4599 | 1212 int max_size) |
1213 { | |
1214 uint32_t mrk; | |
1215 int i, tmp; | |
6214 | 1216 const uint16_t *ssrc = (const uint16_t *) src; |
1217 uint16_t *sdst = (uint16_t *) dst; | |
4599 | 1218 PutBitContext pb; |
1219 | |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1220 if ((unsigned)src_size > (unsigned)max_size) { |
8226
ee1b8c54a603
Add support for parsing and decoding DCA-HD streams.
kostya
parents:
8148
diff
changeset
|
1221 // av_log(NULL, AV_LOG_ERROR, "Input frame size larger then DCA_MAX_FRAME_SIZE!\n"); |
ee1b8c54a603
Add support for parsing and decoding DCA-HD streams.
kostya
parents:
8148
diff
changeset
|
1222 // return -1; |
ee1b8c54a603
Add support for parsing and decoding DCA-HD streams.
kostya
parents:
8148
diff
changeset
|
1223 src_size = max_size; |
5027 | 1224 } |
4883 | 1225 |
4599 | 1226 mrk = AV_RB32(src); |
1227 switch (mrk) { | |
1228 case DCA_MARKER_RAW_BE: | |
7671 | 1229 memcpy(dst, src, src_size); |
1230 return src_size; | |
4599 | 1231 case DCA_MARKER_RAW_LE: |
7671 | 1232 for (i = 0; i < (src_size + 1) >> 1; i++) |
4599 | 1233 *sdst++ = bswap_16(*ssrc++); |
7671 | 1234 return src_size; |
4599 | 1235 case DCA_MARKER_14B_BE: |
1236 case DCA_MARKER_14B_LE: | |
1237 init_put_bits(&pb, dst, max_size); | |
1238 for (i = 0; i < (src_size + 1) >> 1; i++, src += 2) { | |
1239 tmp = ((mrk == DCA_MARKER_14B_BE) ? AV_RB16(src) : AV_RL16(src)) & 0x3FFF; | |
1240 put_bits(&pb, 14, tmp); | |
1241 } | |
1242 flush_put_bits(&pb); | |
1243 return (put_bits_count(&pb) + 7) >> 3; | |
1244 default: | |
1245 return -1; | |
1246 } | |
1247 } | |
1248 | |
1249 /** | |
1250 * Main frame decoding function | |
1251 * FIXME add arguments | |
1252 */ | |
1253 static int dca_decode_frame(AVCodecContext * avctx, | |
1254 void *data, int *data_size, | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
1255 AVPacket *avpkt) |
4599 | 1256 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
1257 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
1258 int buf_size = avpkt->size; |
4599 | 1259 |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1260 int lfe_samples; |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1261 int num_core_channels = 0; |
7724
ea9aa2aa4caa
dca: Do float -> int16 interleaving in-place using s->dsp.float_to_int16_interleave()
andoma
parents:
7680
diff
changeset
|
1262 int i; |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1263 int xch_present = 0; |
4599 | 1264 int16_t *samples = data; |
1265 DCAContext *s = avctx->priv_data; | |
1266 int channels; | |
1267 | |
1268 | |
1269 s->dca_buffer_size = dca_convert_bitstream(buf, buf_size, s->dca_buffer, DCA_MAX_FRAME_SIZE); | |
1270 if (s->dca_buffer_size == -1) { | |
5027 | 1271 av_log(avctx, AV_LOG_ERROR, "Not a valid DCA frame\n"); |
4599 | 1272 return -1; |
1273 } | |
1274 | |
1275 init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8); | |
1276 if (dca_parse_frame_header(s) < 0) { | |
1277 //seems like the frame is corrupt, try with the next one | |
5645 | 1278 *data_size=0; |
4599 | 1279 return buf_size; |
1280 } | |
1281 //set AVCodec values with parsed data | |
1282 avctx->sample_rate = s->sample_rate; | |
1283 avctx->bit_rate = s->bit_rate; | |
1284 | |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1285 for (i = 0; i < (s->sample_blocks / 8); i++) { |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1286 dca_decode_block(s, 0, i); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1287 } |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1288 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1289 /* record number of core channels incase less than max channels are requested */ |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1290 num_core_channels = s->prim_channels; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1291 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1292 /* extensions start at 32-bit boundaries into bitstream */ |
12091
c2a1bb63bd30
DCA: *_bits() -> *_bits_long() where needed, half fix for broken bitstream parsing
banan
parents:
11912
diff
changeset
|
1293 skip_bits_long(&s->gb, (-get_bits_count(&s->gb)) & 31); |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1294 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1295 while(get_bits_left(&s->gb) >= 32) { |
12091
c2a1bb63bd30
DCA: *_bits() -> *_bits_long() where needed, half fix for broken bitstream parsing
banan
parents:
11912
diff
changeset
|
1296 uint32_t bits = get_bits_long(&s->gb, 32); |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1297 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1298 switch(bits) { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1299 case 0x5a5a5a5a: { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1300 int ext_base_ch = s->prim_channels; |
12092
de9e45d04063
DCA: Occasionally a false XCH sync word can turn up after the core DTS data,
banan
parents:
12091
diff
changeset
|
1301 int ext_amode, xch_fsize; |
de9e45d04063
DCA: Occasionally a false XCH sync word can turn up after the core DTS data,
banan
parents:
12091
diff
changeset
|
1302 |
de9e45d04063
DCA: Occasionally a false XCH sync word can turn up after the core DTS data,
banan
parents:
12091
diff
changeset
|
1303 /* validate sync word using XCHFSIZE field */ |
de9e45d04063
DCA: Occasionally a false XCH sync word can turn up after the core DTS data,
banan
parents:
12091
diff
changeset
|
1304 xch_fsize = show_bits(&s->gb, 10); |
de9e45d04063
DCA: Occasionally a false XCH sync word can turn up after the core DTS data,
banan
parents:
12091
diff
changeset
|
1305 if((s->frame_size != (get_bits_count(&s->gb) >> 3) - 4 + xch_fsize) && |
de9e45d04063
DCA: Occasionally a false XCH sync word can turn up after the core DTS data,
banan
parents:
12091
diff
changeset
|
1306 (s->frame_size != (get_bits_count(&s->gb) >> 3) - 4 + xch_fsize + 1)) |
de9e45d04063
DCA: Occasionally a false XCH sync word can turn up after the core DTS data,
banan
parents:
12091
diff
changeset
|
1307 continue; |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1308 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1309 /* skip length-to-end-of-frame field for the moment */ |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1310 skip_bits(&s->gb, 10); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1311 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1312 /* extension amode should == 1, number of channels in extension */ |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1313 /* AFAIK XCh is not used for more channels */ |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1314 if ((ext_amode = get_bits(&s->gb, 4)) != 1) { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1315 av_log(avctx, AV_LOG_ERROR, "XCh extension amode %d not" |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1316 " supported!\n",ext_amode); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1317 continue; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1318 } |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1319 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1320 /* much like core primary audio coding header */ |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1321 dca_parse_audio_coding_header(s, ext_base_ch); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1322 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1323 for (i = 0; i < (s->sample_blocks / 8); i++) { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1324 dca_decode_block(s, ext_base_ch, i); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1325 } |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1326 |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1327 xch_present = 1; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1328 break; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1329 } |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1330 case 0x1d95f262: |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1331 av_log(avctx, AV_LOG_DEBUG, "Possible X96 extension found at %d bits\n", get_bits_count(&s->gb)); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1332 av_log(avctx, AV_LOG_DEBUG, "FSIZE96 = %d bytes\n", get_bits(&s->gb, 12)+1); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1333 av_log(avctx, AV_LOG_DEBUG, "REVNO = %d\n", get_bits(&s->gb, 4)); |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1334 break; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1335 } |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1336 |
12091
c2a1bb63bd30
DCA: *_bits() -> *_bits_long() where needed, half fix for broken bitstream parsing
banan
parents:
11912
diff
changeset
|
1337 skip_bits_long(&s->gb, (-get_bits_count(&s->gb)) & 31); |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1338 } |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1339 |
4893 | 1340 channels = s->prim_channels + !!s->lfe; |
8148
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1341 |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1342 if (s->amode<16) { |
8100 | 1343 avctx->channel_layout = dca_core_channel_layout[s->amode]; |
1344 | |
11911
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1345 if (xch_present && (!avctx->request_channels || |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1346 avctx->request_channels > num_core_channels)) { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1347 avctx->channel_layout |= CH_BACK_CENTER; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1348 if (s->lfe) { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1349 avctx->channel_layout |= CH_LOW_FREQUENCY; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1350 s->channel_order_tab = dca_channel_reorder_lfe_xch[s->amode]; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1351 } else { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1352 s->channel_order_tab = dca_channel_reorder_nolfe_xch[s->amode]; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1353 } |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1354 } else { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1355 if (s->lfe) { |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1356 avctx->channel_layout |= CH_LOW_FREQUENCY; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1357 s->channel_order_tab = dca_channel_reorder_lfe[s->amode]; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1358 } else |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1359 s->channel_order_tab = dca_channel_reorder_nolfe[s->amode]; |
180c6aca1f6e
Support DTS-ES extension (XCh) in dca: add code to handle DTS-ES extension
mstorsjo
parents:
11910
diff
changeset
|
1360 } |
8148
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1361 |
11304
3ef04d1190f0
Fixed a segfault in the DCA decoder with corrupted streams.
fenrir
parents:
10961
diff
changeset
|
1362 if (s->prim_channels > 0 && |
3ef04d1190f0
Fixed a segfault in the DCA decoder with corrupted streams.
fenrir
parents:
10961
diff
changeset
|
1363 s->channel_order_tab[s->prim_channels - 1] < 0) |
3ef04d1190f0
Fixed a segfault in the DCA decoder with corrupted streams.
fenrir
parents:
10961
diff
changeset
|
1364 return -1; |
3ef04d1190f0
Fixed a segfault in the DCA decoder with corrupted streams.
fenrir
parents:
10961
diff
changeset
|
1365 |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1366 if (avctx->request_channels == 2 && s->prim_channels > 2) { |
8148
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1367 channels = 2; |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1368 s->output = DCA_STEREO; |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1369 avctx->channel_layout = CH_LAYOUT_STEREO; |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1370 } |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1371 } else { |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1372 av_log(avctx, AV_LOG_ERROR, "Non standard configuration %d !\n",s->amode); |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1373 return -1; |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1374 } |
146ac82af1e5
Proper channel output reordering for the dca decoder.
banan
parents:
8126
diff
changeset
|
1375 |
4893 | 1376 |
6577
1b90003d4d60
Only set channels in the stream if previously unset, fixes resampling crash on broken dca frames
banan
parents:
6517
diff
changeset
|
1377 /* There is nothing that prevents a dts frame to change channel configuration |
1b90003d4d60
Only set channels in the stream if previously unset, fixes resampling crash on broken dca frames
banan
parents:
6517
diff
changeset
|
1378 but FFmpeg doesn't support that so only set the channels if it is previously |
1b90003d4d60
Only set channels in the stream if previously unset, fixes resampling crash on broken dca frames
banan
parents:
6517
diff
changeset
|
1379 unset. Ideally during the first probe for channels the crc should be checked |
1b90003d4d60
Only set channels in the stream if previously unset, fixes resampling crash on broken dca frames
banan
parents:
6517
diff
changeset
|
1380 and only set avctx->channels when the crc is ok. Right now the decoder could |
1b90003d4d60
Only set channels in the stream if previously unset, fixes resampling crash on broken dca frames
banan
parents:
6517
diff
changeset
|
1381 set the channels based on a broken first frame.*/ |
1b90003d4d60
Only set channels in the stream if previously unset, fixes resampling crash on broken dca frames
banan
parents:
6517
diff
changeset
|
1382 if (!avctx->channels) |
1b90003d4d60
Only set channels in the stream if previously unset, fixes resampling crash on broken dca frames
banan
parents:
6517
diff
changeset
|
1383 avctx->channels = channels; |
1b90003d4d60
Only set channels in the stream if previously unset, fixes resampling crash on broken dca frames
banan
parents:
6517
diff
changeset
|
1384 |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1385 if (*data_size < (s->sample_blocks / 8) * 256 * sizeof(int16_t) * channels) |
4599 | 1386 return -1; |
7725 | 1387 *data_size = 256 / 8 * s->sample_blocks * sizeof(int16_t) * channels; |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1388 |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1389 /* filter to get final output */ |
4599 | 1390 for (i = 0; i < (s->sample_blocks / 8); i++) { |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1391 dca_filter_channels(s, i); |
7724
ea9aa2aa4caa
dca: Do float -> int16 interleaving in-place using s->dsp.float_to_int16_interleave()
andoma
parents:
7680
diff
changeset
|
1392 s->dsp.float_to_int16_interleave(samples, s->samples_chanptr, 256, channels); |
ea9aa2aa4caa
dca: Do float -> int16 interleaving in-place using s->dsp.float_to_int16_interleave()
andoma
parents:
7680
diff
changeset
|
1393 samples += 256 * channels; |
4599 | 1394 } |
1395 | |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1396 /* update lfe history */ |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1397 lfe_samples = 2 * s->lfe * (s->sample_blocks / 8); |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1398 for (i = 0; i < 2 * s->lfe * 4; i++) { |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1399 s->lfe_data[i] = s->lfe_data[i + lfe_samples]; |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1400 } |
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1401 |
4599 | 1402 return buf_size; |
1403 } | |
1404 | |
1405 | |
1406 | |
1407 /** | |
1408 * DCA initialization | |
1409 * | |
1410 * @param avctx pointer to the AVCodecContext | |
1411 */ | |
1412 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6463
diff
changeset
|
1413 static av_cold int dca_decode_init(AVCodecContext * avctx) |
4599 | 1414 { |
1415 DCAContext *s = avctx->priv_data; | |
7724
ea9aa2aa4caa
dca: Do float -> int16 interleaving in-place using s->dsp.float_to_int16_interleave()
andoma
parents:
7680
diff
changeset
|
1416 int i; |
4599 | 1417 |
1418 s->avctx = avctx; | |
1419 dca_init_vlcs(); | |
1420 | |
1421 dsputil_init(&s->dsp, avctx); | |
9658
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9526
diff
changeset
|
1422 ff_mdct_init(&s->imdct, 6, 1, 1.0); |
11592 | 1423 ff_synth_filter_init(&s->synth); |
11617
bb17732c00ef
DCA: break out lfe_interpolation_fir() inner loops to a function
mru
parents:
11611
diff
changeset
|
1424 ff_dcadsp_init(&s->dcadsp); |
6120 | 1425 |
11909
3bfcb8fd3dc9
Support DTS-ES extension (XCh) in dca: move original code around to allow reused by DTS-ES code
mstorsjo
parents:
11908
diff
changeset
|
1426 for (i = 0; i < DCA_PRIM_CHANNELS_MAX+1; i++) |
7724
ea9aa2aa4caa
dca: Do float -> int16 interleaving in-place using s->dsp.float_to_int16_interleave()
andoma
parents:
7680
diff
changeset
|
1427 s->samples_chanptr[i] = s->samples + i * 256; |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7040
diff
changeset
|
1428 avctx->sample_fmt = SAMPLE_FMT_S16; |
8062
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1429 |
11912
6db8c8adf407
Support DTS-ES extension (XCh) in dca: Cosmetic cleanup
mstorsjo
parents:
11911
diff
changeset
|
1430 if (s->dsp.float_to_int16_interleave == ff_float_to_int16_interleave_c) { |
8062
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1431 s->add_bias = 385.0f; |
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1432 s->scale_bias = 1.0 / 32768.0; |
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1433 } else { |
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1434 s->add_bias = 0.0f; |
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1435 s->scale_bias = 1.0; |
8063
6bc70b15451d
Disable codec downmix when not using simd instead of silently produce silence
banan
parents:
8062
diff
changeset
|
1436 |
6bc70b15451d
Disable codec downmix when not using simd instead of silently produce silence
banan
parents:
8062
diff
changeset
|
1437 /* allow downmixing to stereo */ |
6bc70b15451d
Disable codec downmix when not using simd instead of silently produce silence
banan
parents:
8062
diff
changeset
|
1438 if (avctx->channels > 0 && avctx->request_channels < avctx->channels && |
6bc70b15451d
Disable codec downmix when not using simd instead of silently produce silence
banan
parents:
8062
diff
changeset
|
1439 avctx->request_channels == 2) { |
6bc70b15451d
Disable codec downmix when not using simd instead of silently produce silence
banan
parents:
8062
diff
changeset
|
1440 avctx->channels = avctx->request_channels; |
6bc70b15451d
Disable codec downmix when not using simd instead of silently produce silence
banan
parents:
8062
diff
changeset
|
1441 } |
8062
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1442 } |
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1443 |
17aeecee2a97
Fix dca decoder with non simd float2int16 conversion
banan
parents:
8061
diff
changeset
|
1444 |
4599 | 1445 return 0; |
1446 } | |
1447 | |
7738
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
1448 static av_cold int dca_decode_end(AVCodecContext * avctx) |
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
1449 { |
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
1450 DCAContext *s = avctx->priv_data; |
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
1451 ff_mdct_end(&s->imdct); |
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
1452 return 0; |
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
1453 } |
4599 | 1454 |
1455 AVCodec dca_decoder = { | |
1456 .name = "dca", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11370
diff
changeset
|
1457 .type = AVMEDIA_TYPE_AUDIO, |
4599 | 1458 .id = CODEC_ID_DTS, |
1459 .priv_data_size = sizeof(DCAContext), | |
1460 .init = dca_decode_init, | |
1461 .decode = dca_decode_frame, | |
7738
93ba37a9098c
Replace obfuscated mdct in qmf_32_subbands() by ff_imdct_half().
michael
parents:
7737
diff
changeset
|
1462 .close = dca_decode_end, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6710
diff
changeset
|
1463 .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"), |
4599 | 1464 }; |