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