yading@10
|
1 /*
|
yading@10
|
2 * DCA encoder
|
yading@10
|
3 * Copyright (C) 2008 Alexander E. Patrakov
|
yading@10
|
4 * 2010 Benjamin Larsson
|
yading@10
|
5 * 2011 Xiang Wang
|
yading@10
|
6 *
|
yading@10
|
7 * This file is part of FFmpeg.
|
yading@10
|
8 *
|
yading@10
|
9 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
10 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
11 * License as published by the Free Software Foundation; either
|
yading@10
|
12 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
13 *
|
yading@10
|
14 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
17 * Lesser General Public License for more details.
|
yading@10
|
18 *
|
yading@10
|
19 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
20 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
22 */
|
yading@10
|
23
|
yading@10
|
24 #include "libavutil/channel_layout.h"
|
yading@10
|
25 #include "libavutil/common.h"
|
yading@10
|
26 #include "libavutil/avassert.h"
|
yading@10
|
27 #include "avcodec.h"
|
yading@10
|
28 #include "internal.h"
|
yading@10
|
29 #include "put_bits.h"
|
yading@10
|
30 #include "dcaenc.h"
|
yading@10
|
31 #include "dcadata.h"
|
yading@10
|
32 #include "dca.h"
|
yading@10
|
33
|
yading@10
|
34 #undef NDEBUG
|
yading@10
|
35
|
yading@10
|
36 #define MAX_CHANNELS 6
|
yading@10
|
37 #define DCA_SUBBANDS_32 32
|
yading@10
|
38 #define DCA_MAX_FRAME_SIZE 16383
|
yading@10
|
39 #define DCA_HEADER_SIZE 13
|
yading@10
|
40
|
yading@10
|
41 #define DCA_SUBBANDS 32 ///< Subband activity count
|
yading@10
|
42 #define QUANTIZER_BITS 16
|
yading@10
|
43 #define SUBFRAMES 1
|
yading@10
|
44 #define SUBSUBFRAMES 4
|
yading@10
|
45 #define PCM_SAMPLES (SUBFRAMES*SUBSUBFRAMES*8)
|
yading@10
|
46 #define LFE_BITS 8
|
yading@10
|
47 #define LFE_INTERPOLATION 64
|
yading@10
|
48 #define LFE_PRESENT 2
|
yading@10
|
49 #define LFE_MISSING 0
|
yading@10
|
50
|
yading@10
|
51 static const int8_t dca_lfe_index[] = {
|
yading@10
|
52 1,2,2,2,2,3,2,3,2,3,2,3,1,3,2,3
|
yading@10
|
53 };
|
yading@10
|
54
|
yading@10
|
55 static const int8_t dca_channel_reorder_lfe[][9] = {
|
yading@10
|
56 { 0, -1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
57 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
58 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
59 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
60 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
61 { 1, 2, 0, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
62 { 0, 1, -1, 2, -1, -1, -1, -1, -1 },
|
yading@10
|
63 { 1, 2, 0, -1, 3, -1, -1, -1, -1 },
|
yading@10
|
64 { 0, 1, -1, 2, 3, -1, -1, -1, -1 },
|
yading@10
|
65 { 1, 2, 0, -1, 3, 4, -1, -1, -1 },
|
yading@10
|
66 { 2, 3, -1, 0, 1, 4, 5, -1, -1 },
|
yading@10
|
67 { 1, 2, 0, -1, 3, 4, 5, -1, -1 },
|
yading@10
|
68 { 0, -1, 4, 5, 2, 3, 1, -1, -1 },
|
yading@10
|
69 { 3, 4, 1, -1, 0, 2, 5, 6, -1 },
|
yading@10
|
70 { 2, 3, -1, 5, 7, 0, 1, 4, 6 },
|
yading@10
|
71 { 3, 4, 1, -1, 0, 2, 5, 7, 6 },
|
yading@10
|
72 };
|
yading@10
|
73
|
yading@10
|
74 static const int8_t dca_channel_reorder_nolfe[][9] = {
|
yading@10
|
75 { 0, -1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
76 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
77 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
78 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
79 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
80 { 1, 2, 0, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
81 { 0, 1, 2, -1, -1, -1, -1, -1, -1 },
|
yading@10
|
82 { 1, 2, 0, 3, -1, -1, -1, -1, -1 },
|
yading@10
|
83 { 0, 1, 2, 3, -1, -1, -1, -1, -1 },
|
yading@10
|
84 { 1, 2, 0, 3, 4, -1, -1, -1, -1 },
|
yading@10
|
85 { 2, 3, 0, 1, 4, 5, -1, -1, -1 },
|
yading@10
|
86 { 1, 2, 0, 3, 4, 5, -1, -1, -1 },
|
yading@10
|
87 { 0, 4, 5, 2, 3, 1, -1, -1, -1 },
|
yading@10
|
88 { 3, 4, 1, 0, 2, 5, 6, -1, -1 },
|
yading@10
|
89 { 2, 3, 5, 7, 0, 1, 4, 6, -1 },
|
yading@10
|
90 { 3, 4, 1, 0, 2, 5, 7, 6, -1 },
|
yading@10
|
91 };
|
yading@10
|
92
|
yading@10
|
93 typedef struct {
|
yading@10
|
94 PutBitContext pb;
|
yading@10
|
95 int32_t history[MAX_CHANNELS][512]; /* This is a circular buffer */
|
yading@10
|
96 int start[MAX_CHANNELS];
|
yading@10
|
97 int frame_size;
|
yading@10
|
98 int prim_channels;
|
yading@10
|
99 int lfe_channel;
|
yading@10
|
100 int sample_rate_code;
|
yading@10
|
101 int scale_factor[MAX_CHANNELS][DCA_SUBBANDS_32];
|
yading@10
|
102 int lfe_scale_factor;
|
yading@10
|
103 int lfe_data[SUBFRAMES*SUBSUBFRAMES*4];
|
yading@10
|
104
|
yading@10
|
105 int a_mode; ///< audio channels arrangement
|
yading@10
|
106 int num_channel;
|
yading@10
|
107 int lfe_state;
|
yading@10
|
108 int lfe_offset;
|
yading@10
|
109 const int8_t *channel_order_tab; ///< channel reordering table, lfe and non lfe
|
yading@10
|
110
|
yading@10
|
111 int32_t pcm[FFMAX(LFE_INTERPOLATION, DCA_SUBBANDS_32)];
|
yading@10
|
112 int32_t subband[PCM_SAMPLES][MAX_CHANNELS][DCA_SUBBANDS_32]; /* [sample][channel][subband] */
|
yading@10
|
113 } DCAContext;
|
yading@10
|
114
|
yading@10
|
115 static int32_t cos_table[128];
|
yading@10
|
116
|
yading@10
|
117 static inline int32_t mul32(int32_t a, int32_t b)
|
yading@10
|
118 {
|
yading@10
|
119 int64_t r = (int64_t) a * b;
|
yading@10
|
120 /* round the result before truncating - improves accuracy */
|
yading@10
|
121 return (r + 0x80000000) >> 32;
|
yading@10
|
122 }
|
yading@10
|
123
|
yading@10
|
124 /* Integer version of the cosine modulated Pseudo QMF */
|
yading@10
|
125
|
yading@10
|
126 static void qmf_init(void)
|
yading@10
|
127 {
|
yading@10
|
128 int i;
|
yading@10
|
129 int32_t c[17], s[17];
|
yading@10
|
130 s[0] = 0; /* sin(index * PI / 64) * 0x7fffffff */
|
yading@10
|
131 c[0] = 0x7fffffff; /* cos(index * PI / 64) * 0x7fffffff */
|
yading@10
|
132
|
yading@10
|
133 for (i = 1; i <= 16; i++) {
|
yading@10
|
134 s[i] = 2 * (mul32(c[i - 1], 105372028) + mul32(s[i - 1], 2144896908));
|
yading@10
|
135 c[i] = 2 * (mul32(c[i - 1], 2144896908) - mul32(s[i - 1], 105372028));
|
yading@10
|
136 }
|
yading@10
|
137
|
yading@10
|
138 for (i = 0; i < 16; i++) {
|
yading@10
|
139 cos_table[i ] = c[i] >> 3; /* avoid output overflow */
|
yading@10
|
140 cos_table[i + 16] = s[16 - i] >> 3;
|
yading@10
|
141 cos_table[i + 32] = -s[i] >> 3;
|
yading@10
|
142 cos_table[i + 48] = -c[16 - i] >> 3;
|
yading@10
|
143 cos_table[i + 64] = -c[i] >> 3;
|
yading@10
|
144 cos_table[i + 80] = -s[16 - i] >> 3;
|
yading@10
|
145 cos_table[i + 96] = s[i] >> 3;
|
yading@10
|
146 cos_table[i + 112] = c[16 - i] >> 3;
|
yading@10
|
147 }
|
yading@10
|
148 }
|
yading@10
|
149
|
yading@10
|
150 static int32_t band_delta_factor(int band, int sample_num)
|
yading@10
|
151 {
|
yading@10
|
152 int index = band * (2 * sample_num + 1);
|
yading@10
|
153 if (band == 0)
|
yading@10
|
154 return 0x07ffffff;
|
yading@10
|
155 else
|
yading@10
|
156 return cos_table[index & 127];
|
yading@10
|
157 }
|
yading@10
|
158
|
yading@10
|
159 static void add_new_samples(DCAContext *c, const int32_t *in,
|
yading@10
|
160 int count, int channel)
|
yading@10
|
161 {
|
yading@10
|
162 int i;
|
yading@10
|
163
|
yading@10
|
164 /* Place new samples into the history buffer */
|
yading@10
|
165 for (i = 0; i < count; i++) {
|
yading@10
|
166 c->history[channel][c->start[channel] + i] = in[i];
|
yading@10
|
167 av_assert0(c->start[channel] + i < 512);
|
yading@10
|
168 }
|
yading@10
|
169 c->start[channel] += count;
|
yading@10
|
170 if (c->start[channel] == 512)
|
yading@10
|
171 c->start[channel] = 0;
|
yading@10
|
172 av_assert0(c->start[channel] < 512);
|
yading@10
|
173 }
|
yading@10
|
174
|
yading@10
|
175 static void qmf_decompose(DCAContext *c, int32_t in[32], int32_t out[32],
|
yading@10
|
176 int channel)
|
yading@10
|
177 {
|
yading@10
|
178 int band, i, j, k;
|
yading@10
|
179 int32_t resp;
|
yading@10
|
180 int32_t accum[DCA_SUBBANDS_32] = {0};
|
yading@10
|
181
|
yading@10
|
182 add_new_samples(c, in, DCA_SUBBANDS_32, channel);
|
yading@10
|
183
|
yading@10
|
184 /* Calculate the dot product of the signal with the (possibly inverted)
|
yading@10
|
185 reference decoder's response to this vector:
|
yading@10
|
186 (0.0, 0.0, ..., 0.0, -1.0, 1.0, 0.0, ..., 0.0)
|
yading@10
|
187 so that -1.0 cancels 1.0 from the previous step */
|
yading@10
|
188
|
yading@10
|
189 for (k = 48, j = 0, i = c->start[channel]; i < 512; k++, j++, i++)
|
yading@10
|
190 accum[(k & 32) ? (31 - (k & 31)) : (k & 31)] += mul32(c->history[channel][i], UnQMF[j]);
|
yading@10
|
191 for (i = 0; i < c->start[channel]; k++, j++, i++)
|
yading@10
|
192 accum[(k & 32) ? (31 - (k & 31)) : (k & 31)] += mul32(c->history[channel][i], UnQMF[j]);
|
yading@10
|
193
|
yading@10
|
194 resp = 0;
|
yading@10
|
195 /* TODO: implement FFT instead of this naive calculation */
|
yading@10
|
196 for (band = 0; band < DCA_SUBBANDS_32; band++) {
|
yading@10
|
197 for (j = 0; j < 32; j++)
|
yading@10
|
198 resp += mul32(accum[j], band_delta_factor(band, j));
|
yading@10
|
199
|
yading@10
|
200 out[band] = (band & 2) ? (-resp) : resp;
|
yading@10
|
201 }
|
yading@10
|
202 }
|
yading@10
|
203
|
yading@10
|
204 static int32_t lfe_fir_64i[512];
|
yading@10
|
205 static int lfe_downsample(DCAContext *c, int32_t in[LFE_INTERPOLATION])
|
yading@10
|
206 {
|
yading@10
|
207 int i, j;
|
yading@10
|
208 int channel = c->prim_channels;
|
yading@10
|
209 int32_t accum = 0;
|
yading@10
|
210
|
yading@10
|
211 add_new_samples(c, in, LFE_INTERPOLATION, channel);
|
yading@10
|
212 for (i = c->start[channel], j = 0; i < 512; i++, j++)
|
yading@10
|
213 accum += mul32(c->history[channel][i], lfe_fir_64i[j]);
|
yading@10
|
214 for (i = 0; i < c->start[channel]; i++, j++)
|
yading@10
|
215 accum += mul32(c->history[channel][i], lfe_fir_64i[j]);
|
yading@10
|
216 return accum;
|
yading@10
|
217 }
|
yading@10
|
218
|
yading@10
|
219 static void init_lfe_fir(void)
|
yading@10
|
220 {
|
yading@10
|
221 static int initialized = 0;
|
yading@10
|
222 int i;
|
yading@10
|
223 if (initialized)
|
yading@10
|
224 return;
|
yading@10
|
225
|
yading@10
|
226 for (i = 0; i < 512; i++)
|
yading@10
|
227 lfe_fir_64i[i] = lfe_fir_64[i] * (1 << 25); //float -> int32_t
|
yading@10
|
228 initialized = 1;
|
yading@10
|
229 }
|
yading@10
|
230
|
yading@10
|
231 static void put_frame_header(DCAContext *c)
|
yading@10
|
232 {
|
yading@10
|
233 /* SYNC */
|
yading@10
|
234 put_bits(&c->pb, 16, 0x7ffe);
|
yading@10
|
235 put_bits(&c->pb, 16, 0x8001);
|
yading@10
|
236
|
yading@10
|
237 /* Frame type: normal */
|
yading@10
|
238 put_bits(&c->pb, 1, 1);
|
yading@10
|
239
|
yading@10
|
240 /* Deficit sample count: none */
|
yading@10
|
241 put_bits(&c->pb, 5, 31);
|
yading@10
|
242
|
yading@10
|
243 /* CRC is not present */
|
yading@10
|
244 put_bits(&c->pb, 1, 0);
|
yading@10
|
245
|
yading@10
|
246 /* Number of PCM sample blocks */
|
yading@10
|
247 put_bits(&c->pb, 7, PCM_SAMPLES-1);
|
yading@10
|
248
|
yading@10
|
249 /* Primary frame byte size */
|
yading@10
|
250 put_bits(&c->pb, 14, c->frame_size-1);
|
yading@10
|
251
|
yading@10
|
252 /* Audio channel arrangement: L + R (stereo) */
|
yading@10
|
253 put_bits(&c->pb, 6, c->num_channel);
|
yading@10
|
254
|
yading@10
|
255 /* Core audio sampling frequency */
|
yading@10
|
256 put_bits(&c->pb, 4, c->sample_rate_code);
|
yading@10
|
257
|
yading@10
|
258 /* Transmission bit rate: 1411.2 kbps */
|
yading@10
|
259 put_bits(&c->pb, 5, 0x16); /* FIXME: magic number */
|
yading@10
|
260
|
yading@10
|
261 /* Embedded down mix: disabled */
|
yading@10
|
262 put_bits(&c->pb, 1, 0);
|
yading@10
|
263
|
yading@10
|
264 /* Embedded dynamic range flag: not present */
|
yading@10
|
265 put_bits(&c->pb, 1, 0);
|
yading@10
|
266
|
yading@10
|
267 /* Embedded time stamp flag: not present */
|
yading@10
|
268 put_bits(&c->pb, 1, 0);
|
yading@10
|
269
|
yading@10
|
270 /* Auxiliary data flag: not present */
|
yading@10
|
271 put_bits(&c->pb, 1, 0);
|
yading@10
|
272
|
yading@10
|
273 /* HDCD source: no */
|
yading@10
|
274 put_bits(&c->pb, 1, 0);
|
yading@10
|
275
|
yading@10
|
276 /* Extension audio ID: N/A */
|
yading@10
|
277 put_bits(&c->pb, 3, 0);
|
yading@10
|
278
|
yading@10
|
279 /* Extended audio data: not present */
|
yading@10
|
280 put_bits(&c->pb, 1, 0);
|
yading@10
|
281
|
yading@10
|
282 /* Audio sync word insertion flag: after each sub-frame */
|
yading@10
|
283 put_bits(&c->pb, 1, 0);
|
yading@10
|
284
|
yading@10
|
285 /* Low frequency effects flag: not present or interpolation factor=64 */
|
yading@10
|
286 put_bits(&c->pb, 2, c->lfe_state);
|
yading@10
|
287
|
yading@10
|
288 /* Predictor history switch flag: on */
|
yading@10
|
289 put_bits(&c->pb, 1, 1);
|
yading@10
|
290
|
yading@10
|
291 /* No CRC */
|
yading@10
|
292 /* Multirate interpolator switch: non-perfect reconstruction */
|
yading@10
|
293 put_bits(&c->pb, 1, 0);
|
yading@10
|
294
|
yading@10
|
295 /* Encoder software revision: 7 */
|
yading@10
|
296 put_bits(&c->pb, 4, 7);
|
yading@10
|
297
|
yading@10
|
298 /* Copy history: 0 */
|
yading@10
|
299 put_bits(&c->pb, 2, 0);
|
yading@10
|
300
|
yading@10
|
301 /* Source PCM resolution: 16 bits, not DTS ES */
|
yading@10
|
302 put_bits(&c->pb, 3, 0);
|
yading@10
|
303
|
yading@10
|
304 /* Front sum/difference coding: no */
|
yading@10
|
305 put_bits(&c->pb, 1, 0);
|
yading@10
|
306
|
yading@10
|
307 /* Surrounds sum/difference coding: no */
|
yading@10
|
308 put_bits(&c->pb, 1, 0);
|
yading@10
|
309
|
yading@10
|
310 /* Dialog normalization: 0 dB */
|
yading@10
|
311 put_bits(&c->pb, 4, 0);
|
yading@10
|
312 }
|
yading@10
|
313
|
yading@10
|
314 static void put_primary_audio_header(DCAContext *c)
|
yading@10
|
315 {
|
yading@10
|
316 static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 };
|
yading@10
|
317 static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 };
|
yading@10
|
318
|
yading@10
|
319 int ch, i;
|
yading@10
|
320 /* Number of subframes */
|
yading@10
|
321 put_bits(&c->pb, 4, SUBFRAMES - 1);
|
yading@10
|
322
|
yading@10
|
323 /* Number of primary audio channels */
|
yading@10
|
324 put_bits(&c->pb, 3, c->prim_channels - 1);
|
yading@10
|
325
|
yading@10
|
326 /* Subband activity count */
|
yading@10
|
327 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
328 put_bits(&c->pb, 5, DCA_SUBBANDS - 2);
|
yading@10
|
329
|
yading@10
|
330 /* High frequency VQ start subband */
|
yading@10
|
331 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
332 put_bits(&c->pb, 5, DCA_SUBBANDS - 1);
|
yading@10
|
333
|
yading@10
|
334 /* Joint intensity coding index: 0, 0 */
|
yading@10
|
335 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
336 put_bits(&c->pb, 3, 0);
|
yading@10
|
337
|
yading@10
|
338 /* Transient mode codebook: A4, A4 (arbitrary) */
|
yading@10
|
339 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
340 put_bits(&c->pb, 2, 0);
|
yading@10
|
341
|
yading@10
|
342 /* Scale factor code book: 7 bit linear, 7-bit sqrt table (for each channel) */
|
yading@10
|
343 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
344 put_bits(&c->pb, 3, 6);
|
yading@10
|
345
|
yading@10
|
346 /* Bit allocation quantizer select: linear 5-bit */
|
yading@10
|
347 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
348 put_bits(&c->pb, 3, 6);
|
yading@10
|
349
|
yading@10
|
350 /* Quantization index codebook select: dummy data
|
yading@10
|
351 to avoid transmission of scale factor adjustment */
|
yading@10
|
352
|
yading@10
|
353 for (i = 1; i < 11; i++)
|
yading@10
|
354 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
355 put_bits(&c->pb, bitlen[i], thr[i]);
|
yading@10
|
356
|
yading@10
|
357 /* Scale factor adjustment index: not transmitted */
|
yading@10
|
358 }
|
yading@10
|
359
|
yading@10
|
360 /**
|
yading@10
|
361 * 8-23 bits quantization
|
yading@10
|
362 * @param sample
|
yading@10
|
363 * @param bits
|
yading@10
|
364 */
|
yading@10
|
365 static inline uint32_t quantize(int32_t sample, int bits)
|
yading@10
|
366 {
|
yading@10
|
367 av_assert0(sample < 1 << (bits - 1));
|
yading@10
|
368 av_assert0(sample >= -(1 << (bits - 1)));
|
yading@10
|
369 return sample & ((1 << bits) - 1);
|
yading@10
|
370 }
|
yading@10
|
371
|
yading@10
|
372 static inline int find_scale_factor7(int64_t max_value, int bits)
|
yading@10
|
373 {
|
yading@10
|
374 int i = 0, j = 128, q;
|
yading@10
|
375 max_value = ((max_value << 15) / lossy_quant[bits + 3]) >> (bits - 1);
|
yading@10
|
376 while (i < j) {
|
yading@10
|
377 q = (i + j) >> 1;
|
yading@10
|
378 if (max_value < scale_factor_quant7[q])
|
yading@10
|
379 j = q;
|
yading@10
|
380 else
|
yading@10
|
381 i = q + 1;
|
yading@10
|
382 }
|
yading@10
|
383 av_assert1(i < 128);
|
yading@10
|
384 return i;
|
yading@10
|
385 }
|
yading@10
|
386
|
yading@10
|
387 static inline void put_sample7(DCAContext *c, int64_t sample, int bits,
|
yading@10
|
388 int scale_factor)
|
yading@10
|
389 {
|
yading@10
|
390 sample = (sample << 15) / ((int64_t) lossy_quant[bits + 3] * scale_factor_quant7[scale_factor]);
|
yading@10
|
391 put_bits(&c->pb, bits, quantize((int) sample, bits));
|
yading@10
|
392 }
|
yading@10
|
393
|
yading@10
|
394 static void put_subframe(DCAContext *c,
|
yading@10
|
395 int32_t subband_data[8 * SUBSUBFRAMES][MAX_CHANNELS][32],
|
yading@10
|
396 int subframe)
|
yading@10
|
397 {
|
yading@10
|
398 int i, sub, ss, ch, max_value;
|
yading@10
|
399 int32_t *lfe_data = c->lfe_data + 4 * SUBSUBFRAMES * subframe;
|
yading@10
|
400
|
yading@10
|
401 /* Subsubframes count */
|
yading@10
|
402 put_bits(&c->pb, 2, SUBSUBFRAMES -1);
|
yading@10
|
403
|
yading@10
|
404 /* Partial subsubframe sample count: dummy */
|
yading@10
|
405 put_bits(&c->pb, 3, 0);
|
yading@10
|
406
|
yading@10
|
407 /* Prediction mode: no ADPCM, in each channel and subband */
|
yading@10
|
408 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
409 for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
yading@10
|
410 put_bits(&c->pb, 1, 0);
|
yading@10
|
411
|
yading@10
|
412 /* Prediction VQ addres: not transmitted */
|
yading@10
|
413 /* Bit allocation index */
|
yading@10
|
414 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
415 for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
yading@10
|
416 put_bits(&c->pb, 5, QUANTIZER_BITS+3);
|
yading@10
|
417
|
yading@10
|
418 if (SUBSUBFRAMES > 1) {
|
yading@10
|
419 /* Transition mode: none for each channel and subband */
|
yading@10
|
420 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
421 for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
yading@10
|
422 put_bits(&c->pb, 1, 0); /* codebook A4 */
|
yading@10
|
423 }
|
yading@10
|
424
|
yading@10
|
425 /* Determine scale_factor */
|
yading@10
|
426 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
427 for (sub = 0; sub < DCA_SUBBANDS; sub++) {
|
yading@10
|
428 max_value = 0;
|
yading@10
|
429 for (i = 0; i < 8 * SUBSUBFRAMES; i++)
|
yading@10
|
430 max_value = FFMAX(max_value, FFABS(subband_data[i][ch][sub]));
|
yading@10
|
431 c->scale_factor[ch][sub] = find_scale_factor7(max_value, QUANTIZER_BITS);
|
yading@10
|
432 }
|
yading@10
|
433
|
yading@10
|
434 if (c->lfe_channel) {
|
yading@10
|
435 max_value = 0;
|
yading@10
|
436 for (i = 0; i < 4 * SUBSUBFRAMES; i++)
|
yading@10
|
437 max_value = FFMAX(max_value, FFABS(lfe_data[i]));
|
yading@10
|
438 c->lfe_scale_factor = find_scale_factor7(max_value, LFE_BITS);
|
yading@10
|
439 }
|
yading@10
|
440
|
yading@10
|
441 /* Scale factors: the same for each channel and subband,
|
yading@10
|
442 encoded according to Table D.1.2 */
|
yading@10
|
443 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
444 for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
yading@10
|
445 put_bits(&c->pb, 7, c->scale_factor[ch][sub]);
|
yading@10
|
446
|
yading@10
|
447 /* Joint subband scale factor codebook select: not transmitted */
|
yading@10
|
448 /* Scale factors for joint subband coding: not transmitted */
|
yading@10
|
449 /* Stereo down-mix coefficients: not transmitted */
|
yading@10
|
450 /* Dynamic range coefficient: not transmitted */
|
yading@10
|
451 /* Stde information CRC check word: not transmitted */
|
yading@10
|
452 /* VQ encoded high frequency subbands: not transmitted */
|
yading@10
|
453
|
yading@10
|
454 /* LFE data */
|
yading@10
|
455 if (c->lfe_channel) {
|
yading@10
|
456 for (i = 0; i < 4 * SUBSUBFRAMES; i++)
|
yading@10
|
457 put_sample7(c, lfe_data[i], LFE_BITS, c->lfe_scale_factor);
|
yading@10
|
458 put_bits(&c->pb, 8, c->lfe_scale_factor);
|
yading@10
|
459 }
|
yading@10
|
460
|
yading@10
|
461 /* Audio data (subsubframes) */
|
yading@10
|
462
|
yading@10
|
463 for (ss = 0; ss < SUBSUBFRAMES ; ss++)
|
yading@10
|
464 for (ch = 0; ch < c->prim_channels; ch++)
|
yading@10
|
465 for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
yading@10
|
466 for (i = 0; i < 8; i++)
|
yading@10
|
467 put_sample7(c, subband_data[ss * 8 + i][ch][sub], QUANTIZER_BITS, c->scale_factor[ch][sub]);
|
yading@10
|
468
|
yading@10
|
469 /* DSYNC */
|
yading@10
|
470 put_bits(&c->pb, 16, 0xffff);
|
yading@10
|
471 }
|
yading@10
|
472
|
yading@10
|
473 static void put_frame(DCAContext *c,
|
yading@10
|
474 int32_t subband_data[PCM_SAMPLES][MAX_CHANNELS][32],
|
yading@10
|
475 uint8_t *frame)
|
yading@10
|
476 {
|
yading@10
|
477 int i;
|
yading@10
|
478 init_put_bits(&c->pb, frame + DCA_HEADER_SIZE, DCA_MAX_FRAME_SIZE-DCA_HEADER_SIZE);
|
yading@10
|
479
|
yading@10
|
480 put_primary_audio_header(c);
|
yading@10
|
481 for (i = 0; i < SUBFRAMES; i++)
|
yading@10
|
482 put_subframe(c, &subband_data[SUBSUBFRAMES * 8 * i], i);
|
yading@10
|
483
|
yading@10
|
484 flush_put_bits(&c->pb);
|
yading@10
|
485 c->frame_size = (put_bits_count(&c->pb) >> 3) + DCA_HEADER_SIZE;
|
yading@10
|
486
|
yading@10
|
487 init_put_bits(&c->pb, frame, DCA_HEADER_SIZE);
|
yading@10
|
488 put_frame_header(c);
|
yading@10
|
489 flush_put_bits(&c->pb);
|
yading@10
|
490 }
|
yading@10
|
491
|
yading@10
|
492 static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
yading@10
|
493 const AVFrame *frame, int *got_packet_ptr)
|
yading@10
|
494 {
|
yading@10
|
495 int i, k, channel;
|
yading@10
|
496 DCAContext *c = avctx->priv_data;
|
yading@10
|
497 const int16_t *samples;
|
yading@10
|
498 int ret, real_channel = 0;
|
yading@10
|
499
|
yading@10
|
500 if ((ret = ff_alloc_packet2(avctx, avpkt, DCA_MAX_FRAME_SIZE + DCA_HEADER_SIZE)) < 0)
|
yading@10
|
501 return ret;
|
yading@10
|
502
|
yading@10
|
503 samples = (const int16_t *)frame->data[0];
|
yading@10
|
504 for (i = 0; i < PCM_SAMPLES; i ++) { /* i is the decimated sample number */
|
yading@10
|
505 for (channel = 0; channel < c->prim_channels + 1; channel++) {
|
yading@10
|
506 real_channel = c->channel_order_tab[channel];
|
yading@10
|
507 if (real_channel >= 0) {
|
yading@10
|
508 /* Get 32 PCM samples */
|
yading@10
|
509 for (k = 0; k < 32; k++) { /* k is the sample number in a 32-sample block */
|
yading@10
|
510 c->pcm[k] = samples[avctx->channels * (32 * i + k) + channel] << 16;
|
yading@10
|
511 }
|
yading@10
|
512 /* Put subband samples into the proper place */
|
yading@10
|
513 qmf_decompose(c, c->pcm, &c->subband[i][real_channel][0], real_channel);
|
yading@10
|
514 }
|
yading@10
|
515 }
|
yading@10
|
516 }
|
yading@10
|
517
|
yading@10
|
518 if (c->lfe_channel) {
|
yading@10
|
519 for (i = 0; i < PCM_SAMPLES / 2; i++) {
|
yading@10
|
520 for (k = 0; k < LFE_INTERPOLATION; k++) /* k is the sample number in a 32-sample block */
|
yading@10
|
521 c->pcm[k] = samples[avctx->channels * (LFE_INTERPOLATION*i+k) + c->lfe_offset] << 16;
|
yading@10
|
522 c->lfe_data[i] = lfe_downsample(c, c->pcm);
|
yading@10
|
523 }
|
yading@10
|
524 }
|
yading@10
|
525
|
yading@10
|
526 put_frame(c, c->subband, avpkt->data);
|
yading@10
|
527
|
yading@10
|
528 avpkt->size = c->frame_size;
|
yading@10
|
529 *got_packet_ptr = 1;
|
yading@10
|
530 return 0;
|
yading@10
|
531 }
|
yading@10
|
532
|
yading@10
|
533 static int encode_init(AVCodecContext *avctx)
|
yading@10
|
534 {
|
yading@10
|
535 DCAContext *c = avctx->priv_data;
|
yading@10
|
536 int i;
|
yading@10
|
537 uint64_t layout = avctx->channel_layout;
|
yading@10
|
538
|
yading@10
|
539 c->prim_channels = avctx->channels;
|
yading@10
|
540 c->lfe_channel = (avctx->channels == 3 || avctx->channels == 6);
|
yading@10
|
541
|
yading@10
|
542 if (!layout) {
|
yading@10
|
543 av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The "
|
yading@10
|
544 "encoder will guess the layout, but it "
|
yading@10
|
545 "might be incorrect.\n");
|
yading@10
|
546 layout = av_get_default_channel_layout(avctx->channels);
|
yading@10
|
547 }
|
yading@10
|
548 switch (layout) {
|
yading@10
|
549 case AV_CH_LAYOUT_STEREO: c->a_mode = 2; c->num_channel = 2; break;
|
yading@10
|
550 case AV_CH_LAYOUT_5POINT0: c->a_mode = 9; c->num_channel = 9; break;
|
yading@10
|
551 case AV_CH_LAYOUT_5POINT1: c->a_mode = 9; c->num_channel = 9; break;
|
yading@10
|
552 case AV_CH_LAYOUT_5POINT0_BACK: c->a_mode = 9; c->num_channel = 9; break;
|
yading@10
|
553 case AV_CH_LAYOUT_5POINT1_BACK: c->a_mode = 9; c->num_channel = 9; break;
|
yading@10
|
554 default:
|
yading@10
|
555 av_log(avctx, AV_LOG_ERROR,
|
yading@10
|
556 "Only stereo, 5.0, 5.1 channel layouts supported at the moment!\n");
|
yading@10
|
557 return AVERROR_PATCHWELCOME;
|
yading@10
|
558 }
|
yading@10
|
559
|
yading@10
|
560 if (c->lfe_channel) {
|
yading@10
|
561 init_lfe_fir();
|
yading@10
|
562 c->prim_channels--;
|
yading@10
|
563 c->channel_order_tab = dca_channel_reorder_lfe[c->a_mode];
|
yading@10
|
564 c->lfe_state = LFE_PRESENT;
|
yading@10
|
565 c->lfe_offset = dca_lfe_index[c->a_mode];
|
yading@10
|
566 } else {
|
yading@10
|
567 c->channel_order_tab = dca_channel_reorder_nolfe[c->a_mode];
|
yading@10
|
568 c->lfe_state = LFE_MISSING;
|
yading@10
|
569 }
|
yading@10
|
570
|
yading@10
|
571 for (i = 0; i < 16; i++) {
|
yading@10
|
572 if (avpriv_dca_sample_rates[i] && (avpriv_dca_sample_rates[i] == avctx->sample_rate))
|
yading@10
|
573 break;
|
yading@10
|
574 }
|
yading@10
|
575 if (i == 16) {
|
yading@10
|
576 av_log(avctx, AV_LOG_ERROR, "Sample rate %iHz not supported, only ", avctx->sample_rate);
|
yading@10
|
577 for (i = 0; i < 16; i++)
|
yading@10
|
578 av_log(avctx, AV_LOG_ERROR, "%d, ", avpriv_dca_sample_rates[i]);
|
yading@10
|
579 av_log(avctx, AV_LOG_ERROR, "supported.\n");
|
yading@10
|
580 return -1;
|
yading@10
|
581 }
|
yading@10
|
582 c->sample_rate_code = i;
|
yading@10
|
583
|
yading@10
|
584 avctx->frame_size = 32 * PCM_SAMPLES;
|
yading@10
|
585
|
yading@10
|
586 if (!cos_table[127])
|
yading@10
|
587 qmf_init();
|
yading@10
|
588 return 0;
|
yading@10
|
589 }
|
yading@10
|
590
|
yading@10
|
591 AVCodec ff_dca_encoder = {
|
yading@10
|
592 .name = "dca",
|
yading@10
|
593 .type = AVMEDIA_TYPE_AUDIO,
|
yading@10
|
594 .id = AV_CODEC_ID_DTS,
|
yading@10
|
595 .priv_data_size = sizeof(DCAContext),
|
yading@10
|
596 .init = encode_init,
|
yading@10
|
597 .encode2 = encode_frame,
|
yading@10
|
598 .capabilities = CODEC_CAP_EXPERIMENTAL,
|
yading@10
|
599 .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
|
yading@10
|
600 AV_SAMPLE_FMT_NONE },
|
yading@10
|
601 .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"),
|
yading@10
|
602 };
|