/src/ffmpeg/libavcodec/dcaenc.c
Line | Count | Source |
1 | | /* |
2 | | * DCA encoder |
3 | | * Copyright (C) 2008-2012 Alexander E. Patrakov |
4 | | * 2010 Benjamin Larsson |
5 | | * 2011 Xiang Wang |
6 | | * |
7 | | * This file is part of FFmpeg. |
8 | | * |
9 | | * FFmpeg is free software; you can redistribute it and/or |
10 | | * modify it under the terms of the GNU Lesser General Public |
11 | | * License as published by the Free Software Foundation; either |
12 | | * version 2.1 of the License, or (at your option) any later version. |
13 | | * |
14 | | * FFmpeg is distributed in the hope that it will be useful, |
15 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 | | * Lesser General Public License for more details. |
18 | | * |
19 | | * You should have received a copy of the GNU Lesser General Public |
20 | | * License along with FFmpeg; if not, write to the Free Software |
21 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
22 | | */ |
23 | | |
24 | | #include "libavutil/avassert.h" |
25 | | #include "libavutil/channel_layout.h" |
26 | | #include "libavutil/common.h" |
27 | | #include "libavutil/ffmath.h" |
28 | | #include "libavutil/mem.h" |
29 | | #include "libavutil/mem_internal.h" |
30 | | #include "libavutil/opt.h" |
31 | | #include "libavutil/thread.h" |
32 | | #include "libavutil/tx.h" |
33 | | #include "avcodec.h" |
34 | | #include "codec_internal.h" |
35 | | #include "dcaadpcm.h" |
36 | | #include "dcamath.h" |
37 | | #include "dca_core.h" |
38 | | #include "dcadata.h" |
39 | | #include "dcaenc.h" |
40 | | #include "encode.h" |
41 | | #include "put_bits.h" |
42 | | |
43 | 0 | #define MAX_CHANNELS 6 |
44 | 0 | #define DCA_MAX_FRAME_SIZE 16384 |
45 | | #define DCA_HEADER_SIZE 13 |
46 | 0 | #define DCA_LFE_SAMPLES 8 |
47 | | |
48 | 0 | #define DCAENC_SUBBANDS 32 |
49 | 0 | #define SUBFRAMES 1 |
50 | 0 | #define SUBSUBFRAMES 2 |
51 | 0 | #define SUBBAND_SAMPLES (SUBFRAMES * SUBSUBFRAMES * 8) |
52 | 0 | #define AUBANDS 25 |
53 | | |
54 | 0 | #define COS_T(x) (c->cos_table[(x) & 2047]) |
55 | | |
56 | | typedef struct CompressionOptions { |
57 | | int adpcm_mode; |
58 | | } CompressionOptions; |
59 | | |
60 | | typedef struct DCAEncContext { |
61 | | AVClass *class; |
62 | | PutBitContext pb; |
63 | | DCAADPCMEncContext adpcm_ctx; |
64 | | AVTXContext *mdct; |
65 | | av_tx_fn mdct_fn; |
66 | | CompressionOptions options; |
67 | | int frame_size; |
68 | | int frame_bits; |
69 | | int fullband_channels; |
70 | | int channels; |
71 | | int lfe_channel; |
72 | | int samplerate_index; |
73 | | int bitrate_index; |
74 | | int channel_config; |
75 | | const int32_t *band_interpolation; |
76 | | const int32_t *band_spectrum; |
77 | | int lfe_scale_factor; |
78 | | softfloat lfe_quant; |
79 | | int32_t lfe_peak_cb; |
80 | | const int8_t *channel_order_tab; ///< channel reordering table, lfe and non lfe |
81 | | |
82 | | int32_t prediction_mode[MAX_CHANNELS][DCAENC_SUBBANDS]; |
83 | | int32_t adpcm_history[MAX_CHANNELS][DCAENC_SUBBANDS][DCA_ADPCM_COEFFS * 2]; |
84 | | int32_t history[MAX_CHANNELS][512]; /* This is a circular buffer */ |
85 | | int32_t *subband[MAX_CHANNELS][DCAENC_SUBBANDS]; |
86 | | int32_t quantized[MAX_CHANNELS][DCAENC_SUBBANDS][SUBBAND_SAMPLES]; |
87 | | int32_t peak_cb[MAX_CHANNELS][DCAENC_SUBBANDS]; |
88 | | int32_t diff_peak_cb[MAX_CHANNELS][DCAENC_SUBBANDS]; ///< expected peak of residual signal |
89 | | int32_t downsampled_lfe[DCA_LFE_SAMPLES]; |
90 | | int32_t masking_curve_cb[SUBSUBFRAMES][256]; |
91 | | int32_t bit_allocation_sel[MAX_CHANNELS]; |
92 | | int abits[MAX_CHANNELS][DCAENC_SUBBANDS]; |
93 | | int scale_factor[MAX_CHANNELS][DCAENC_SUBBANDS]; |
94 | | softfloat quant[MAX_CHANNELS][DCAENC_SUBBANDS]; |
95 | | int32_t quant_index_sel[MAX_CHANNELS][DCA_CODE_BOOKS]; |
96 | | int32_t eff_masking_curve_cb[256]; |
97 | | int32_t band_masking_cb[32]; |
98 | | int32_t worst_quantization_noise; |
99 | | int32_t worst_noise_ever; |
100 | | int consumed_bits; |
101 | | int consumed_adpcm_bits; ///< Number of bits to transmit ADPCM related info |
102 | | |
103 | | int32_t cos_table[2048]; |
104 | | int32_t band_interpolation_tab[2][512]; |
105 | | int32_t band_spectrum_tab[2][8]; |
106 | | int32_t auf[9][AUBANDS][256]; |
107 | | int32_t cb_to_add[256]; |
108 | | int32_t cb_to_level[2048]; |
109 | | int32_t lfe_fir_64i[512]; |
110 | | } DCAEncContext; |
111 | | |
112 | | /* Transfer function of outer and middle ear, Hz -> dB */ |
113 | | static double hom(double f) |
114 | 0 | { |
115 | 0 | double f1 = f / 1000; |
116 | |
|
117 | 0 | return -3.64 * pow(f1, -0.8) |
118 | 0 | + 6.8 * exp(-0.6 * (f1 - 3.4) * (f1 - 3.4)) |
119 | 0 | - 6.0 * exp(-0.15 * (f1 - 8.7) * (f1 - 8.7)) |
120 | 0 | - 0.0006 * (f1 * f1) * (f1 * f1); |
121 | 0 | } |
122 | | |
123 | | static double gammafilter(int i, double f) |
124 | 0 | { |
125 | 0 | double h = (f - fc[i]) / erb[i]; |
126 | |
|
127 | 0 | h = 1 + h * h; |
128 | 0 | h = 1 / (h * h); |
129 | 0 | return 20 * log10(h); |
130 | 0 | } |
131 | | |
132 | | static int subband_bufer_alloc(DCAEncContext *c) |
133 | 0 | { |
134 | 0 | int ch, band; |
135 | 0 | int32_t *bufer = av_calloc(MAX_CHANNELS * DCAENC_SUBBANDS * |
136 | 0 | (SUBBAND_SAMPLES + DCA_ADPCM_COEFFS), |
137 | 0 | sizeof(int32_t)); |
138 | 0 | if (!bufer) |
139 | 0 | return AVERROR(ENOMEM); |
140 | | |
141 | | /* we need a place for DCA_ADPCM_COEFF samples from previous frame |
142 | | * to calc prediction coefficients for each subband */ |
143 | 0 | for (ch = 0; ch < MAX_CHANNELS; ch++) { |
144 | 0 | for (band = 0; band < DCAENC_SUBBANDS; band++) { |
145 | 0 | c->subband[ch][band] = bufer + |
146 | 0 | ch * DCAENC_SUBBANDS * (SUBBAND_SAMPLES + DCA_ADPCM_COEFFS) + |
147 | 0 | band * (SUBBAND_SAMPLES + DCA_ADPCM_COEFFS) + DCA_ADPCM_COEFFS; |
148 | 0 | } |
149 | 0 | } |
150 | 0 | return 0; |
151 | 0 | } |
152 | | |
153 | | static void subband_bufer_free(DCAEncContext *c) |
154 | 0 | { |
155 | 0 | if (c->subband[0][0]) { |
156 | 0 | int32_t *bufer = c->subband[0][0] - DCA_ADPCM_COEFFS; |
157 | 0 | av_free(bufer); |
158 | 0 | c->subband[0][0] = NULL; |
159 | 0 | } |
160 | 0 | } |
161 | | |
162 | | static uint16_t bitalloc_12_table[DCA_BITALLOC_12_COUNT][12 + 1][2]; |
163 | | |
164 | | static uint16_t bitalloc_table[DCA_NUM_BITALLOC_CODES][2]; |
165 | | static const uint16_t (*bitalloc_tables[DCA_CODE_BOOKS][8])[2]; |
166 | | |
167 | | static av_cold void create_enc_table(uint16_t dst[][2], unsigned count, |
168 | | const uint8_t (**src_tablep)[2]) |
169 | 0 | { |
170 | 0 | const uint8_t (*src_table)[2] = *src_tablep; |
171 | 0 | uint16_t code = 0; |
172 | |
|
173 | 0 | for (unsigned i = 0; i < count; i++) { |
174 | 0 | unsigned dst_idx = src_table[i][0]; |
175 | |
|
176 | 0 | dst[dst_idx][0] = code >> (16 - src_table[i][1]); |
177 | 0 | dst[dst_idx][1] = src_table[i][1]; |
178 | |
|
179 | 0 | code += 1 << (16 - src_table[i][1]); |
180 | 0 | } |
181 | 0 | *src_tablep += count; |
182 | 0 | } |
183 | | |
184 | | static av_cold void dcaenc_init_static_tables(void) |
185 | 0 | { |
186 | 0 | uint16_t (*bitalloc_dst)[2] = bitalloc_table; |
187 | 0 | const uint8_t (*src_table)[2] = ff_dca_vlc_src_tables; |
188 | |
|
189 | 0 | for (unsigned i = 0; i < DCA_CODE_BOOKS; i++) { |
190 | 0 | for (unsigned j = 0; j < ff_dca_quant_index_group_size[i]; j++) { |
191 | 0 | create_enc_table(bitalloc_dst, ff_dca_bitalloc_sizes[i], |
192 | 0 | &src_table); |
193 | 0 | bitalloc_tables[i][j] = bitalloc_dst - ff_dca_bitalloc_offsets[i]; |
194 | 0 | bitalloc_dst += ff_dca_bitalloc_sizes[i]; |
195 | 0 | } |
196 | 0 | } |
197 | |
|
198 | 0 | for (unsigned i = 0; i < DCA_BITALLOC_12_COUNT; i++) |
199 | 0 | create_enc_table(&bitalloc_12_table[i][1], 12, &src_table); |
200 | 0 | } |
201 | | |
202 | | static av_cold int encode_init(AVCodecContext *avctx) |
203 | 0 | { |
204 | 0 | static AVOnce init_static_once = AV_ONCE_INIT; |
205 | 0 | DCAEncContext *c = avctx->priv_data; |
206 | 0 | AVChannelLayout layout = avctx->ch_layout; |
207 | 0 | int i, j, k, min_frame_bits; |
208 | 0 | float scale = 1.0f; |
209 | 0 | int ret; |
210 | |
|
211 | 0 | if ((ret = subband_bufer_alloc(c)) < 0) |
212 | 0 | return ret; |
213 | | |
214 | 0 | c->fullband_channels = c->channels = layout.nb_channels; |
215 | 0 | c->lfe_channel = (c->channels == 3 || c->channels == 6); |
216 | 0 | c->band_interpolation = c->band_interpolation_tab[1]; |
217 | 0 | c->band_spectrum = c->band_spectrum_tab[1]; |
218 | 0 | c->worst_quantization_noise = -2047; |
219 | 0 | c->worst_noise_ever = -2047; |
220 | 0 | c->consumed_adpcm_bits = 0; |
221 | |
|
222 | 0 | if (ff_dcaadpcm_init(&c->adpcm_ctx)) |
223 | 0 | return AVERROR(ENOMEM); |
224 | | |
225 | 0 | switch (layout.nb_channels) { |
226 | 0 | case 1: /* mono */ |
227 | 0 | c->channel_config = 0; |
228 | 0 | break; |
229 | 0 | case 2: /* stereo */ |
230 | 0 | c->channel_config = 2; |
231 | 0 | break; |
232 | 0 | case 4: /* 2.2 */ |
233 | 0 | c->channel_config = 8; |
234 | 0 | break; |
235 | 0 | case 5: /* 5.0 */ |
236 | 0 | c->channel_config = 9; |
237 | 0 | break; |
238 | 0 | case 6: /* 5.1 */ |
239 | 0 | c->channel_config = 9; |
240 | 0 | break; |
241 | 0 | default: |
242 | 0 | av_assert1(!"impossible channel layout"); |
243 | 0 | } |
244 | | |
245 | 0 | if (c->lfe_channel) { |
246 | 0 | c->fullband_channels--; |
247 | 0 | c->channel_order_tab = channel_reorder_lfe[c->channel_config]; |
248 | 0 | } else { |
249 | 0 | c->channel_order_tab = channel_reorder_nolfe[c->channel_config]; |
250 | 0 | } |
251 | |
|
252 | 0 | for (i = 0; i < MAX_CHANNELS; i++) { |
253 | 0 | for (j = 0; j < DCA_CODE_BOOKS; j++) { |
254 | 0 | c->quant_index_sel[i][j] = ff_dca_quant_index_group_size[j]; |
255 | 0 | } |
256 | | /* 6 - no Huffman */ |
257 | 0 | c->bit_allocation_sel[i] = 6; |
258 | |
|
259 | 0 | for (j = 0; j < DCAENC_SUBBANDS; j++) { |
260 | | /* -1 - no ADPCM */ |
261 | 0 | c->prediction_mode[i][j] = -1; |
262 | 0 | memset(c->adpcm_history[i][j], 0, sizeof(int32_t)*DCA_ADPCM_COEFFS); |
263 | 0 | } |
264 | 0 | } |
265 | |
|
266 | 0 | for (i = 0; i < 9; i++) { |
267 | 0 | if (sample_rates[i] == avctx->sample_rate) |
268 | 0 | break; |
269 | 0 | } |
270 | 0 | if (i == 9) |
271 | 0 | return AVERROR(EINVAL); |
272 | 0 | c->samplerate_index = i; |
273 | |
|
274 | 0 | if (avctx->bit_rate < 32000 || avctx->bit_rate > 3840000) { |
275 | 0 | av_log(avctx, AV_LOG_ERROR, "Bit rate %"PRId64" not supported.", avctx->bit_rate); |
276 | 0 | return AVERROR(EINVAL); |
277 | 0 | } |
278 | 0 | for (i = 0; ff_dca_bit_rates[i] < avctx->bit_rate; i++) |
279 | 0 | ; |
280 | 0 | c->bitrate_index = i; |
281 | 0 | c->frame_bits = FFALIGN((avctx->bit_rate * 512 + avctx->sample_rate - 1) / avctx->sample_rate, 32); |
282 | 0 | min_frame_bits = 132 + (493 + 28 * 32) * c->fullband_channels + c->lfe_channel * 72; |
283 | 0 | if (c->frame_bits < min_frame_bits || c->frame_bits > (DCA_MAX_FRAME_SIZE << 3)) |
284 | 0 | return AVERROR(EINVAL); |
285 | | |
286 | 0 | c->frame_size = (c->frame_bits + 7) / 8; |
287 | |
|
288 | 0 | avctx->frame_size = 32 * SUBBAND_SAMPLES; |
289 | |
|
290 | 0 | if ((ret = av_tx_init(&c->mdct, &c->mdct_fn, AV_TX_INT32_MDCT, 0, 256, &scale, 0)) < 0) |
291 | 0 | return ret; |
292 | | |
293 | | /* Init all tables */ |
294 | 0 | c->cos_table[0] = 0x7fffffff; |
295 | 0 | c->cos_table[512] = 0; |
296 | 0 | c->cos_table[1024] = -c->cos_table[0]; |
297 | 0 | for (i = 1; i < 512; i++) { |
298 | 0 | c->cos_table[i] = (int32_t)(0x7fffffff * cos(M_PI * i / 1024)); |
299 | 0 | c->cos_table[1024-i] = -c->cos_table[i]; |
300 | 0 | c->cos_table[1024+i] = -c->cos_table[i]; |
301 | 0 | c->cos_table[2048-i] = +c->cos_table[i]; |
302 | 0 | } |
303 | |
|
304 | 0 | for (i = 0; i < 2048; i++) |
305 | 0 | c->cb_to_level[i] = (int32_t)(0x7fffffff * ff_exp10(-0.005 * i)); |
306 | |
|
307 | 0 | for (k = 0; k < 32; k++) { |
308 | 0 | for (j = 0; j < 8; j++) { |
309 | 0 | c->lfe_fir_64i[64 * j + k] = (int32_t)(0xffffff800000ULL * ff_dca_lfe_fir_64[8 * k + j]); |
310 | 0 | c->lfe_fir_64i[64 * (7-j) + (63 - k)] = (int32_t)(0xffffff800000ULL * ff_dca_lfe_fir_64[8 * k + j]); |
311 | 0 | } |
312 | 0 | } |
313 | |
|
314 | 0 | for (i = 0; i < 512; i++) { |
315 | 0 | c->band_interpolation_tab[0][i] = (int32_t)(0x1000000000ULL * ff_dca_fir_32bands_perfect[i]); |
316 | 0 | c->band_interpolation_tab[1][i] = (int32_t)(0x1000000000ULL * ff_dca_fir_32bands_nonperfect[i]); |
317 | 0 | } |
318 | |
|
319 | 0 | for (i = 0; i < 9; i++) { |
320 | 0 | for (j = 0; j < AUBANDS; j++) { |
321 | 0 | for (k = 0; k < 256; k++) { |
322 | 0 | double freq = sample_rates[i] * (k + 0.5) / 512; |
323 | |
|
324 | 0 | c->auf[i][j][k] = (int32_t)(10 * (hom(freq) + gammafilter(j, freq))); |
325 | 0 | } |
326 | 0 | } |
327 | 0 | } |
328 | |
|
329 | 0 | for (i = 0; i < 256; i++) { |
330 | 0 | double add = 1 + ff_exp10(-0.01 * i); |
331 | 0 | c->cb_to_add[i] = (int32_t)(100 * log10(add)); |
332 | 0 | } |
333 | 0 | for (j = 0; j < 8; j++) { |
334 | 0 | double accum = 0; |
335 | 0 | for (i = 0; i < 512; i++) { |
336 | 0 | double reconst = ff_dca_fir_32bands_perfect[i] * ((i & 64) ? (-1) : 1); |
337 | 0 | accum += reconst * cos(2 * M_PI * (i + 0.5 - 256) * (j + 0.5) / 512); |
338 | 0 | } |
339 | 0 | c->band_spectrum_tab[0][j] = (int32_t)(200 * log10(accum)); |
340 | 0 | } |
341 | 0 | for (j = 0; j < 8; j++) { |
342 | 0 | double accum = 0; |
343 | 0 | for (i = 0; i < 512; i++) { |
344 | 0 | double reconst = ff_dca_fir_32bands_nonperfect[i] * ((i & 64) ? (-1) : 1); |
345 | 0 | accum += reconst * cos(2 * M_PI * (i + 0.5 - 256) * (j + 0.5) / 512); |
346 | 0 | } |
347 | 0 | c->band_spectrum_tab[1][j] = (int32_t)(200 * log10(accum)); |
348 | 0 | } |
349 | |
|
350 | 0 | ff_thread_once(&init_static_once, dcaenc_init_static_tables); |
351 | 0 | return 0; |
352 | 0 | } |
353 | | |
354 | | static av_cold int encode_close(AVCodecContext *avctx) |
355 | 0 | { |
356 | 0 | DCAEncContext *c = avctx->priv_data; |
357 | 0 | av_tx_uninit(&c->mdct); |
358 | 0 | subband_bufer_free(c); |
359 | 0 | ff_dcaadpcm_free(&c->adpcm_ctx); |
360 | |
|
361 | 0 | return 0; |
362 | 0 | } |
363 | | |
364 | | static void subband_transform(DCAEncContext *c, const int32_t *input) |
365 | 0 | { |
366 | 0 | int ch, subs, i, k, j; |
367 | |
|
368 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
369 | | /* History is copied because it is also needed for PSY */ |
370 | 0 | int32_t hist[512]; |
371 | 0 | int hist_start = 0; |
372 | 0 | const int chi = c->channel_order_tab[ch]; |
373 | |
|
374 | 0 | memcpy(hist, &c->history[ch][0], 512 * sizeof(int32_t)); |
375 | |
|
376 | 0 | for (subs = 0; subs < SUBBAND_SAMPLES; subs++) { |
377 | 0 | int32_t accum[64]; |
378 | 0 | int32_t resp; |
379 | 0 | int band; |
380 | | |
381 | | /* Calculate the convolutions at once */ |
382 | 0 | memset(accum, 0, 64 * sizeof(int32_t)); |
383 | |
|
384 | 0 | for (k = 0, i = hist_start, j = 0; |
385 | 0 | i < 512; k = (k + 1) & 63, i++, j++) |
386 | 0 | accum[k] += mul32(hist[i], c->band_interpolation[j]); |
387 | 0 | for (i = 0; i < hist_start; k = (k + 1) & 63, i++, j++) |
388 | 0 | accum[k] += mul32(hist[i], c->band_interpolation[j]); |
389 | |
|
390 | 0 | for (k = 16; k < 32; k++) |
391 | 0 | accum[k] = accum[k] - accum[31 - k]; |
392 | 0 | for (k = 32; k < 48; k++) |
393 | 0 | accum[k] = accum[k] + accum[95 - k]; |
394 | |
|
395 | 0 | for (band = 0; band < 32; band++) { |
396 | 0 | resp = 0; |
397 | 0 | for (i = 16; i < 48; i++) { |
398 | 0 | int s = (2 * band + 1) * (2 * (i + 16) + 1); |
399 | 0 | resp += mul32(accum[i], COS_T(s << 3)) >> 3; |
400 | 0 | } |
401 | |
|
402 | 0 | c->subband[ch][band][subs] = ((band + 1) & 2) ? -resp : resp; |
403 | 0 | } |
404 | | |
405 | | /* Copy in 32 new samples from input */ |
406 | 0 | for (i = 0; i < 32; i++) |
407 | 0 | hist[i + hist_start] = input[(subs * 32 + i) * c->channels + chi]; |
408 | |
|
409 | 0 | hist_start = (hist_start + 32) & 511; |
410 | 0 | } |
411 | 0 | } |
412 | 0 | } |
413 | | |
414 | | static void lfe_downsample(DCAEncContext *c, const int32_t *input) |
415 | 0 | { |
416 | | /* FIXME: make 128x LFE downsampling possible */ |
417 | 0 | const int lfech = lfe_index[c->channel_config]; |
418 | 0 | int i, j, lfes; |
419 | 0 | int32_t hist[512]; |
420 | 0 | int32_t accum; |
421 | 0 | int hist_start = 0; |
422 | |
|
423 | 0 | memcpy(hist, &c->history[c->channels - 1][0], 512 * sizeof(int32_t)); |
424 | |
|
425 | 0 | for (lfes = 0; lfes < DCA_LFE_SAMPLES; lfes++) { |
426 | | /* Calculate the convolution */ |
427 | 0 | accum = 0; |
428 | |
|
429 | 0 | for (i = hist_start, j = 0; i < 512; i++, j++) |
430 | 0 | accum += mul32(hist[i], c->lfe_fir_64i[j]); |
431 | 0 | for (i = 0; i < hist_start; i++, j++) |
432 | 0 | accum += mul32(hist[i], c->lfe_fir_64i[j]); |
433 | |
|
434 | 0 | c->downsampled_lfe[lfes] = accum; |
435 | | |
436 | | /* Copy in 64 new samples from input */ |
437 | 0 | for (i = 0; i < 64; i++) |
438 | 0 | hist[i + hist_start] = input[(lfes * 64 + i) * c->channels + lfech]; |
439 | |
|
440 | 0 | hist_start = (hist_start + 64) & 511; |
441 | 0 | } |
442 | 0 | } |
443 | | |
444 | | static uint32_t dca_vlc_calc_alloc_bits(const int values[], uint8_t n, uint8_t sel) |
445 | 0 | { |
446 | 0 | uint32_t sum = 0; |
447 | 0 | for (unsigned i = 0; i < n; i++) |
448 | 0 | sum += bitalloc_12_table[sel][values[i]][1]; |
449 | 0 | return sum; |
450 | 0 | } |
451 | | |
452 | | static void dca_vlc_enc_alloc(PutBitContext *pb, const int values[], |
453 | | uint8_t n, uint8_t sel) |
454 | 0 | { |
455 | 0 | for (unsigned i = 0; i < n; i++) |
456 | 0 | put_bits(pb, bitalloc_12_table[sel][values[i]][1], |
457 | 0 | bitalloc_12_table[sel][values[i]][0]); |
458 | 0 | } |
459 | | |
460 | | static uint32_t dca_vlc_calc_quant_bits(const int values[], uint8_t n, |
461 | | uint8_t sel, uint8_t table) |
462 | 0 | { |
463 | 0 | uint32_t sum = 0; |
464 | 0 | for (unsigned i = 0; i < n; i++) |
465 | 0 | sum += bitalloc_tables[table][sel][values[i]][1]; |
466 | 0 | return sum; |
467 | 0 | } |
468 | | |
469 | | static void dca_vlc_enc_quant(PutBitContext *pb, const int values[], |
470 | | uint8_t n, uint8_t sel, uint8_t table) |
471 | 0 | { |
472 | 0 | for (unsigned i = 0; i < n; i++) |
473 | 0 | put_bits(pb, bitalloc_tables[table][sel][values[i]][1], |
474 | 0 | bitalloc_tables[table][sel][values[i]][0]); |
475 | 0 | } |
476 | | |
477 | | static int32_t get_cb(DCAEncContext *c, int32_t in) |
478 | 0 | { |
479 | 0 | int i, res = 0; |
480 | 0 | in = FFABS(in); |
481 | |
|
482 | 0 | for (i = 1024; i > 0; i >>= 1) { |
483 | 0 | if (c->cb_to_level[i + res] >= in) |
484 | 0 | res += i; |
485 | 0 | } |
486 | 0 | return -res; |
487 | 0 | } |
488 | | |
489 | | static int32_t add_cb(DCAEncContext *c, int32_t a, int32_t b) |
490 | 0 | { |
491 | 0 | if (a < b) |
492 | 0 | FFSWAP(int32_t, a, b); |
493 | |
|
494 | 0 | if (a - b >= 256) |
495 | 0 | return a; |
496 | 0 | return a + c->cb_to_add[a - b]; |
497 | 0 | } |
498 | | |
499 | | static void calc_power(DCAEncContext *c, |
500 | | const int32_t in[2 * 256], int32_t power[256]) |
501 | 0 | { |
502 | 0 | int i; |
503 | 0 | LOCAL_ALIGNED_32(int32_t, data, [512]); |
504 | 0 | LOCAL_ALIGNED_32(int32_t, coeff, [256]); |
505 | |
|
506 | 0 | for (i = 0; i < 512; i++) |
507 | 0 | data[i] = norm__(mul32(in[i], 0x3fffffff - (COS_T(4 * i + 2) >> 1)), 4); |
508 | |
|
509 | 0 | c->mdct_fn(c->mdct, coeff, data, sizeof(int32_t)); |
510 | 0 | for (i = 0; i < 256; i++) { |
511 | 0 | const int32_t cb = get_cb(c, coeff[i]); |
512 | 0 | power[i] = add_cb(c, cb, cb); |
513 | 0 | } |
514 | 0 | } |
515 | | |
516 | | static void adjust_jnd(DCAEncContext *c, |
517 | | const int32_t in[512], int32_t out_cb[256]) |
518 | 0 | { |
519 | 0 | int32_t power[256]; |
520 | 0 | int32_t out_cb_unnorm[256]; |
521 | 0 | int32_t denom; |
522 | 0 | const int32_t ca_cb = -1114; |
523 | 0 | const int32_t cs_cb = 928; |
524 | 0 | const int samplerate_index = c->samplerate_index; |
525 | 0 | int i, j; |
526 | |
|
527 | 0 | calc_power(c, in, power); |
528 | |
|
529 | 0 | for (j = 0; j < 256; j++) |
530 | 0 | out_cb_unnorm[j] = -2047; /* and can only grow */ |
531 | |
|
532 | 0 | for (i = 0; i < AUBANDS; i++) { |
533 | 0 | denom = ca_cb; /* and can only grow */ |
534 | 0 | for (j = 0; j < 256; j++) |
535 | 0 | denom = add_cb(c, denom, power[j] + c->auf[samplerate_index][i][j]); |
536 | 0 | for (j = 0; j < 256; j++) |
537 | 0 | out_cb_unnorm[j] = add_cb(c, out_cb_unnorm[j], |
538 | 0 | -denom + c->auf[samplerate_index][i][j]); |
539 | 0 | } |
540 | |
|
541 | 0 | for (j = 0; j < 256; j++) |
542 | 0 | out_cb[j] = add_cb(c, out_cb[j], -out_cb_unnorm[j] - ca_cb - cs_cb); |
543 | 0 | } |
544 | | |
545 | | typedef void (*walk_band_t)(DCAEncContext *c, int band1, int band2, int f, |
546 | | int32_t spectrum1, int32_t spectrum2, int channel, |
547 | | int32_t * arg); |
548 | | |
549 | | static void walk_band_low(DCAEncContext *c, int band, int channel, |
550 | | walk_band_t walk, int32_t *arg) |
551 | 0 | { |
552 | 0 | int f; |
553 | |
|
554 | 0 | if (band == 0) { |
555 | 0 | for (f = 0; f < 4; f++) |
556 | 0 | walk(c, 0, 0, f, 0, -2047, channel, arg); |
557 | 0 | } else { |
558 | 0 | for (f = 0; f < 8; f++) |
559 | 0 | walk(c, band, band - 1, 8 * band - 4 + f, |
560 | 0 | c->band_spectrum[7 - f], c->band_spectrum[f], channel, arg); |
561 | 0 | } |
562 | 0 | } |
563 | | |
564 | | static void walk_band_high(DCAEncContext *c, int band, int channel, |
565 | | walk_band_t walk, int32_t *arg) |
566 | 0 | { |
567 | 0 | int f; |
568 | |
|
569 | 0 | if (band == 31) { |
570 | 0 | for (f = 0; f < 4; f++) |
571 | 0 | walk(c, 31, 31, 256 - 4 + f, 0, -2047, channel, arg); |
572 | 0 | } else { |
573 | 0 | for (f = 0; f < 8; f++) |
574 | 0 | walk(c, band, band + 1, 8 * band + 4 + f, |
575 | 0 | c->band_spectrum[f], c->band_spectrum[7 - f], channel, arg); |
576 | 0 | } |
577 | 0 | } |
578 | | |
579 | | static void update_band_masking(DCAEncContext *c, int band1, int band2, |
580 | | int f, int32_t spectrum1, int32_t spectrum2, |
581 | | int channel, int32_t * arg) |
582 | 0 | { |
583 | 0 | int32_t value = c->eff_masking_curve_cb[f] - spectrum1; |
584 | |
|
585 | 0 | if (value < c->band_masking_cb[band1]) |
586 | 0 | c->band_masking_cb[band1] = value; |
587 | 0 | } |
588 | | |
589 | | static void calc_masking(DCAEncContext *c, const int32_t *input) |
590 | 0 | { |
591 | 0 | int i, k, band, ch, ssf; |
592 | 0 | int32_t data[512]; |
593 | |
|
594 | 0 | for (i = 0; i < 256; i++) |
595 | 0 | for (ssf = 0; ssf < SUBSUBFRAMES; ssf++) |
596 | 0 | c->masking_curve_cb[ssf][i] = -2047; |
597 | |
|
598 | 0 | for (ssf = 0; ssf < SUBSUBFRAMES; ssf++) |
599 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
600 | 0 | const int chi = c->channel_order_tab[ch]; |
601 | |
|
602 | 0 | for (i = 0, k = 128 + 256 * ssf; k < 512; i++, k++) |
603 | 0 | data[i] = c->history[ch][k]; |
604 | 0 | for (k -= 512; i < 512; i++, k++) |
605 | 0 | data[i] = input[k * c->channels + chi]; |
606 | 0 | adjust_jnd(c, data, c->masking_curve_cb[ssf]); |
607 | 0 | } |
608 | 0 | for (i = 0; i < 256; i++) { |
609 | 0 | int32_t m = 2048; |
610 | |
|
611 | 0 | for (ssf = 0; ssf < SUBSUBFRAMES; ssf++) |
612 | 0 | if (c->masking_curve_cb[ssf][i] < m) |
613 | 0 | m = c->masking_curve_cb[ssf][i]; |
614 | 0 | c->eff_masking_curve_cb[i] = m; |
615 | 0 | } |
616 | |
|
617 | 0 | for (band = 0; band < 32; band++) { |
618 | 0 | c->band_masking_cb[band] = 2048; |
619 | 0 | walk_band_low(c, band, 0, update_band_masking, NULL); |
620 | 0 | walk_band_high(c, band, 0, update_band_masking, NULL); |
621 | 0 | } |
622 | 0 | } |
623 | | |
624 | | static inline int32_t find_peak(DCAEncContext *c, const int32_t *in, int len) |
625 | 0 | { |
626 | 0 | int sample; |
627 | 0 | int32_t m = 0; |
628 | 0 | for (sample = 0; sample < len; sample++) { |
629 | 0 | int32_t s = abs(in[sample]); |
630 | 0 | if (m < s) |
631 | 0 | m = s; |
632 | 0 | } |
633 | 0 | return get_cb(c, m); |
634 | 0 | } |
635 | | |
636 | | static void find_peaks(DCAEncContext *c) |
637 | 0 | { |
638 | 0 | int band, ch; |
639 | |
|
640 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
641 | 0 | for (band = 0; band < 32; band++) |
642 | 0 | c->peak_cb[ch][band] = find_peak(c, c->subband[ch][band], |
643 | 0 | SUBBAND_SAMPLES); |
644 | 0 | } |
645 | |
|
646 | 0 | if (c->lfe_channel) |
647 | 0 | c->lfe_peak_cb = find_peak(c, c->downsampled_lfe, DCA_LFE_SAMPLES); |
648 | 0 | } |
649 | | |
650 | | static void adpcm_analysis(DCAEncContext *c) |
651 | 0 | { |
652 | 0 | int ch, band; |
653 | 0 | int pred_vq_id; |
654 | 0 | int32_t *samples; |
655 | 0 | int32_t estimated_diff[SUBBAND_SAMPLES]; |
656 | |
|
657 | 0 | c->consumed_adpcm_bits = 0; |
658 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
659 | 0 | for (band = 0; band < 32; band++) { |
660 | 0 | samples = c->subband[ch][band] - DCA_ADPCM_COEFFS; |
661 | 0 | pred_vq_id = ff_dcaadpcm_subband_analysis(&c->adpcm_ctx, samples, |
662 | 0 | SUBBAND_SAMPLES, estimated_diff); |
663 | 0 | if (pred_vq_id >= 0) { |
664 | 0 | c->prediction_mode[ch][band] = pred_vq_id; |
665 | 0 | c->consumed_adpcm_bits += 12; //12 bits to transmit prediction vq index |
666 | 0 | c->diff_peak_cb[ch][band] = find_peak(c, estimated_diff, 16); |
667 | 0 | } else { |
668 | 0 | c->prediction_mode[ch][band] = -1; |
669 | 0 | } |
670 | 0 | } |
671 | 0 | } |
672 | 0 | } |
673 | | |
674 | | static const int snr_fudge = 128; |
675 | 0 | #define USED_1ABITS 1 |
676 | 0 | #define USED_26ABITS 4 |
677 | | |
678 | | static inline int32_t get_step_size(DCAEncContext *c, int ch, int band) |
679 | 0 | { |
680 | 0 | int32_t step_size; |
681 | |
|
682 | 0 | if (c->bitrate_index == 3) |
683 | 0 | step_size = ff_dca_lossless_quant[c->abits[ch][band]]; |
684 | 0 | else |
685 | 0 | step_size = ff_dca_lossy_quant[c->abits[ch][band]]; |
686 | |
|
687 | 0 | return step_size; |
688 | 0 | } |
689 | | |
690 | | static int calc_one_scale(DCAEncContext *c, int32_t peak_cb, int abits, |
691 | | softfloat *quant) |
692 | 0 | { |
693 | 0 | int32_t peak; |
694 | 0 | int our_nscale, try_remove; |
695 | 0 | softfloat our_quant; |
696 | |
|
697 | 0 | av_assert0(peak_cb <= 0); |
698 | 0 | av_assert0(peak_cb >= -2047); |
699 | | |
700 | 0 | our_nscale = 127; |
701 | 0 | peak = c->cb_to_level[-peak_cb]; |
702 | |
|
703 | 0 | for (try_remove = 64; try_remove > 0; try_remove >>= 1) { |
704 | 0 | if (scalefactor_inv[our_nscale - try_remove].e + stepsize_inv[abits].e <= 17) |
705 | 0 | continue; |
706 | 0 | our_quant.m = mul32(scalefactor_inv[our_nscale - try_remove].m, stepsize_inv[abits].m); |
707 | 0 | our_quant.e = scalefactor_inv[our_nscale - try_remove].e + stepsize_inv[abits].e - 17; |
708 | 0 | if ((ff_dca_quant_levels[abits] - 1) / 2 < quantize_value(peak, our_quant)) |
709 | 0 | continue; |
710 | 0 | our_nscale -= try_remove; |
711 | 0 | } |
712 | |
|
713 | 0 | if (our_nscale >= 125) |
714 | 0 | our_nscale = 124; |
715 | |
|
716 | 0 | quant->m = mul32(scalefactor_inv[our_nscale].m, stepsize_inv[abits].m); |
717 | 0 | quant->e = scalefactor_inv[our_nscale].e + stepsize_inv[abits].e - 17; |
718 | 0 | av_assert0((ff_dca_quant_levels[abits] - 1) / 2 >= quantize_value(peak, *quant)); |
719 | | |
720 | 0 | return our_nscale; |
721 | 0 | } |
722 | | |
723 | | static inline void quantize_adpcm_subband(DCAEncContext *c, int ch, int band) |
724 | 0 | { |
725 | 0 | int32_t step_size; |
726 | 0 | int32_t diff_peak_cb = c->diff_peak_cb[ch][band]; |
727 | 0 | c->scale_factor[ch][band] = calc_one_scale(c, diff_peak_cb, |
728 | 0 | c->abits[ch][band], |
729 | 0 | &c->quant[ch][band]); |
730 | |
|
731 | 0 | step_size = get_step_size(c, ch, band); |
732 | 0 | ff_dcaadpcm_do_real(c->prediction_mode[ch][band], |
733 | 0 | c->quant[ch][band], |
734 | 0 | ff_dca_scale_factor_quant7[c->scale_factor[ch][band]], |
735 | 0 | step_size, c->adpcm_history[ch][band], c->subband[ch][band], |
736 | 0 | c->adpcm_history[ch][band] + 4, c->quantized[ch][band], |
737 | 0 | SUBBAND_SAMPLES, c->cb_to_level[-diff_peak_cb]); |
738 | 0 | } |
739 | | |
740 | | static void quantize_adpcm(DCAEncContext *c) |
741 | 0 | { |
742 | 0 | int band, ch; |
743 | |
|
744 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
745 | 0 | for (band = 0; band < 32; band++) |
746 | 0 | if (c->prediction_mode[ch][band] >= 0) |
747 | 0 | quantize_adpcm_subband(c, ch, band); |
748 | 0 | } |
749 | | |
750 | | static void quantize_pcm(DCAEncContext *c) |
751 | 0 | { |
752 | 0 | int sample, band, ch; |
753 | |
|
754 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
755 | 0 | for (band = 0; band < 32; band++) { |
756 | 0 | if (c->prediction_mode[ch][band] == -1) { |
757 | 0 | for (sample = 0; sample < SUBBAND_SAMPLES; sample++) { |
758 | 0 | int32_t val = quantize_value(c->subband[ch][band][sample], |
759 | 0 | c->quant[ch][band]); |
760 | 0 | c->quantized[ch][band][sample] = val; |
761 | 0 | } |
762 | 0 | } |
763 | 0 | } |
764 | 0 | } |
765 | 0 | } |
766 | | |
767 | | static void accumulate_huff_bit_consumption(int abits, int32_t *quantized, |
768 | | uint32_t *result) |
769 | 0 | { |
770 | 0 | uint8_t sel, id = abits - 1; |
771 | 0 | for (sel = 0; sel < ff_dca_quant_index_group_size[id]; sel++) |
772 | 0 | result[sel] += dca_vlc_calc_quant_bits(quantized, SUBBAND_SAMPLES, |
773 | 0 | sel, id); |
774 | 0 | } |
775 | | |
776 | | static uint32_t set_best_code(uint32_t vlc_bits[DCA_CODE_BOOKS][7], |
777 | | uint32_t clc_bits[DCA_CODE_BOOKS], |
778 | | int32_t res[DCA_CODE_BOOKS]) |
779 | 0 | { |
780 | 0 | uint8_t i, sel; |
781 | 0 | uint32_t best_sel_bits[DCA_CODE_BOOKS]; |
782 | 0 | int32_t best_sel_id[DCA_CODE_BOOKS]; |
783 | 0 | uint32_t t, bits = 0; |
784 | |
|
785 | 0 | for (i = 0; i < DCA_CODE_BOOKS; i++) { |
786 | |
|
787 | 0 | av_assert0(!((!!vlc_bits[i][0]) ^ (!!clc_bits[i]))); |
788 | 0 | if (vlc_bits[i][0] == 0) { |
789 | | /* do not transmit adjustment index for empty codebooks */ |
790 | 0 | res[i] = ff_dca_quant_index_group_size[i]; |
791 | | /* and skip it */ |
792 | 0 | continue; |
793 | 0 | } |
794 | | |
795 | 0 | best_sel_bits[i] = vlc_bits[i][0]; |
796 | 0 | best_sel_id[i] = 0; |
797 | 0 | for (sel = 0; sel < ff_dca_quant_index_group_size[i]; sel++) { |
798 | 0 | if (best_sel_bits[i] > vlc_bits[i][sel] && vlc_bits[i][sel]) { |
799 | 0 | best_sel_bits[i] = vlc_bits[i][sel]; |
800 | 0 | best_sel_id[i] = sel; |
801 | 0 | } |
802 | 0 | } |
803 | | |
804 | | /* 2 bits to transmit scale factor adjustment index */ |
805 | 0 | t = best_sel_bits[i] + 2; |
806 | 0 | if (t < clc_bits[i]) { |
807 | 0 | res[i] = best_sel_id[i]; |
808 | 0 | bits += t; |
809 | 0 | } else { |
810 | 0 | res[i] = ff_dca_quant_index_group_size[i]; |
811 | 0 | bits += clc_bits[i]; |
812 | 0 | } |
813 | 0 | } |
814 | 0 | return bits; |
815 | 0 | } |
816 | | |
817 | | static uint32_t set_best_abits_code(int abits[DCAENC_SUBBANDS], int bands, |
818 | | int32_t *res) |
819 | 0 | { |
820 | 0 | uint8_t i; |
821 | 0 | uint32_t t; |
822 | 0 | int32_t best_sel = 6; |
823 | 0 | int32_t best_bits = bands * 5; |
824 | | |
825 | | /* Check do we have subband which cannot be encoded by Huffman tables */ |
826 | 0 | for (i = 0; i < bands; i++) { |
827 | 0 | if (abits[i] > 12 || abits[i] == 0) { |
828 | 0 | *res = best_sel; |
829 | 0 | return best_bits; |
830 | 0 | } |
831 | 0 | } |
832 | | |
833 | 0 | for (i = 0; i < DCA_BITALLOC_12_COUNT; i++) { |
834 | 0 | t = dca_vlc_calc_alloc_bits(abits, bands, i); |
835 | 0 | if (t < best_bits) { |
836 | 0 | best_bits = t; |
837 | 0 | best_sel = i; |
838 | 0 | } |
839 | 0 | } |
840 | |
|
841 | 0 | *res = best_sel; |
842 | 0 | return best_bits; |
843 | 0 | } |
844 | | |
845 | | static int init_quantization_noise(DCAEncContext *c, int noise, int forbid_zero) |
846 | 0 | { |
847 | 0 | int ch, band, ret = USED_26ABITS | USED_1ABITS; |
848 | 0 | uint32_t huff_bit_count_accum[MAX_CHANNELS][DCA_CODE_BOOKS][7]; |
849 | 0 | uint32_t clc_bit_count_accum[MAX_CHANNELS][DCA_CODE_BOOKS]; |
850 | 0 | uint32_t bits_counter = 0; |
851 | |
|
852 | 0 | c->consumed_bits = 132 + 333 * c->fullband_channels; |
853 | 0 | c->consumed_bits += c->consumed_adpcm_bits; |
854 | 0 | if (c->lfe_channel) |
855 | 0 | c->consumed_bits += 72; |
856 | | |
857 | | /* attempt to guess the bit distribution based on the previous frame */ |
858 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
859 | 0 | for (band = 0; band < 32; band++) { |
860 | 0 | int snr_cb = c->peak_cb[ch][band] - c->band_masking_cb[band] - noise; |
861 | |
|
862 | 0 | if (snr_cb >= 1312) { |
863 | 0 | c->abits[ch][band] = 26; |
864 | 0 | ret &= ~USED_1ABITS; |
865 | 0 | } else if (snr_cb >= 222) { |
866 | 0 | c->abits[ch][band] = 8 + mul32(snr_cb - 222, 69000000); |
867 | 0 | ret &= ~(USED_26ABITS | USED_1ABITS); |
868 | 0 | } else if (snr_cb >= 0) { |
869 | 0 | c->abits[ch][band] = 2 + mul32(snr_cb, 106000000); |
870 | 0 | ret &= ~(USED_26ABITS | USED_1ABITS); |
871 | 0 | } else if (forbid_zero || snr_cb >= -140) { |
872 | 0 | c->abits[ch][band] = 1; |
873 | 0 | ret &= ~USED_26ABITS; |
874 | 0 | } else { |
875 | 0 | c->abits[ch][band] = 0; |
876 | 0 | ret &= ~(USED_26ABITS | USED_1ABITS); |
877 | 0 | } |
878 | 0 | } |
879 | 0 | c->consumed_bits += set_best_abits_code(c->abits[ch], 32, |
880 | 0 | &c->bit_allocation_sel[ch]); |
881 | 0 | } |
882 | | |
883 | | /* Recalc scale_factor each time to get bits consumption in case of Huffman coding. |
884 | | It is suboptimal solution */ |
885 | | /* TODO: May be cache scaled values */ |
886 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
887 | 0 | for (band = 0; band < 32; band++) { |
888 | 0 | if (c->prediction_mode[ch][band] == -1) { |
889 | 0 | c->scale_factor[ch][band] = calc_one_scale(c, c->peak_cb[ch][band], |
890 | 0 | c->abits[ch][band], |
891 | 0 | &c->quant[ch][band]); |
892 | 0 | } |
893 | 0 | } |
894 | 0 | } |
895 | 0 | quantize_adpcm(c); |
896 | 0 | quantize_pcm(c); |
897 | |
|
898 | 0 | memset(huff_bit_count_accum, 0, MAX_CHANNELS * DCA_CODE_BOOKS * 7 * sizeof(uint32_t)); |
899 | 0 | memset(clc_bit_count_accum, 0, MAX_CHANNELS * DCA_CODE_BOOKS * sizeof(uint32_t)); |
900 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
901 | 0 | for (band = 0; band < 32; band++) { |
902 | 0 | if (c->abits[ch][band] && c->abits[ch][band] <= DCA_CODE_BOOKS) { |
903 | 0 | accumulate_huff_bit_consumption(c->abits[ch][band], |
904 | 0 | c->quantized[ch][band], |
905 | 0 | huff_bit_count_accum[ch][c->abits[ch][band] - 1]); |
906 | 0 | clc_bit_count_accum[ch][c->abits[ch][band] - 1] += bit_consumption[c->abits[ch][band]]; |
907 | 0 | } else { |
908 | 0 | bits_counter += bit_consumption[c->abits[ch][band]]; |
909 | 0 | } |
910 | 0 | } |
911 | 0 | } |
912 | |
|
913 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
914 | 0 | bits_counter += set_best_code(huff_bit_count_accum[ch], |
915 | 0 | clc_bit_count_accum[ch], |
916 | 0 | c->quant_index_sel[ch]); |
917 | 0 | } |
918 | |
|
919 | 0 | c->consumed_bits += bits_counter; |
920 | |
|
921 | 0 | return ret; |
922 | 0 | } |
923 | | |
924 | | static void assign_bits(DCAEncContext *c) |
925 | 0 | { |
926 | | /* Find the bounds where the binary search should work */ |
927 | 0 | int low, high, down; |
928 | 0 | int used_abits = 0; |
929 | 0 | int forbid_zero = 1; |
930 | 0 | restart: |
931 | 0 | init_quantization_noise(c, c->worst_quantization_noise, forbid_zero); |
932 | 0 | low = high = c->worst_quantization_noise; |
933 | 0 | if (c->consumed_bits > c->frame_bits) { |
934 | 0 | while (c->consumed_bits > c->frame_bits) { |
935 | 0 | if (used_abits == USED_1ABITS && forbid_zero) { |
936 | 0 | forbid_zero = 0; |
937 | 0 | goto restart; |
938 | 0 | } |
939 | 0 | low = high; |
940 | 0 | high += snr_fudge; |
941 | 0 | used_abits = init_quantization_noise(c, high, forbid_zero); |
942 | 0 | } |
943 | 0 | } else { |
944 | 0 | while (c->consumed_bits <= c->frame_bits) { |
945 | 0 | high = low; |
946 | 0 | if (used_abits == USED_26ABITS) |
947 | 0 | goto out; /* The requested bitrate is too high, pad with zeros */ |
948 | 0 | low -= snr_fudge; |
949 | 0 | used_abits = init_quantization_noise(c, low, forbid_zero); |
950 | 0 | } |
951 | 0 | } |
952 | | |
953 | | /* Now do a binary search between low and high to see what fits */ |
954 | 0 | for (down = snr_fudge >> 1; down; down >>= 1) { |
955 | 0 | init_quantization_noise(c, high - down, forbid_zero); |
956 | 0 | if (c->consumed_bits <= c->frame_bits) |
957 | 0 | high -= down; |
958 | 0 | } |
959 | 0 | init_quantization_noise(c, high, forbid_zero); |
960 | 0 | out: |
961 | 0 | c->worst_quantization_noise = high; |
962 | 0 | if (high > c->worst_noise_ever) |
963 | 0 | c->worst_noise_ever = high; |
964 | 0 | } |
965 | | |
966 | | static void shift_history(DCAEncContext *c, const int32_t *input) |
967 | 0 | { |
968 | 0 | int k, ch; |
969 | |
|
970 | 0 | for (k = 0; k < 512; k++) |
971 | 0 | for (ch = 0; ch < c->channels; ch++) { |
972 | 0 | const int chi = c->channel_order_tab[ch]; |
973 | |
|
974 | 0 | c->history[ch][k] = input[k * c->channels + chi]; |
975 | 0 | } |
976 | 0 | } |
977 | | |
978 | | static void fill_in_adpcm_bufer(DCAEncContext *c) |
979 | 0 | { |
980 | 0 | int ch, band; |
981 | 0 | int32_t step_size; |
982 | | /* We fill in ADPCM work buffer for subbands which hasn't been ADPCM coded |
983 | | * in current frame - we need this data if subband of next frame is |
984 | | * ADPCM |
985 | | */ |
986 | 0 | for (ch = 0; ch < c->channels; ch++) { |
987 | 0 | for (band = 0; band < 32; band++) { |
988 | 0 | int32_t *samples = c->subband[ch][band] - DCA_ADPCM_COEFFS; |
989 | 0 | if (c->prediction_mode[ch][band] == -1) { |
990 | 0 | step_size = get_step_size(c, ch, band); |
991 | |
|
992 | 0 | ff_dca_core_dequantize(c->adpcm_history[ch][band], |
993 | 0 | c->quantized[ch][band]+12, step_size, |
994 | 0 | ff_dca_scale_factor_quant7[c->scale_factor[ch][band]], 0, 4); |
995 | 0 | } else { |
996 | 0 | AV_COPY128U(c->adpcm_history[ch][band], c->adpcm_history[ch][band]+4); |
997 | 0 | } |
998 | | /* Copy dequantized values for LPC analysis. |
999 | | * It reduces artifacts in case of extreme quantization, |
1000 | | * example: in current frame abits is 1 and has no prediction flag, |
1001 | | * but end of this frame is sine like signal. In this case, if LPC analysis uses |
1002 | | * original values, likely LPC analysis returns good prediction gain, and sets prediction flag. |
1003 | | * But there are no proper value in decoder history, so likely result will be no good. |
1004 | | * Bitstream has "Predictor history flag switch", but this flag disables history for all subbands |
1005 | | */ |
1006 | 0 | samples[0] = c->adpcm_history[ch][band][0] * (1 << 7); |
1007 | 0 | samples[1] = c->adpcm_history[ch][band][1] * (1 << 7); |
1008 | 0 | samples[2] = c->adpcm_history[ch][band][2] * (1 << 7); |
1009 | 0 | samples[3] = c->adpcm_history[ch][band][3] * (1 << 7); |
1010 | 0 | } |
1011 | 0 | } |
1012 | 0 | } |
1013 | | |
1014 | | static void calc_lfe_scales(DCAEncContext *c) |
1015 | 0 | { |
1016 | 0 | if (c->lfe_channel) |
1017 | 0 | c->lfe_scale_factor = calc_one_scale(c, c->lfe_peak_cb, 11, &c->lfe_quant); |
1018 | 0 | } |
1019 | | |
1020 | | static void put_frame_header(DCAEncContext *c) |
1021 | 0 | { |
1022 | | /* SYNC */ |
1023 | 0 | put_bits(&c->pb, 16, 0x7ffe); |
1024 | 0 | put_bits(&c->pb, 16, 0x8001); |
1025 | | |
1026 | | /* Frame type: normal */ |
1027 | 0 | put_bits(&c->pb, 1, 1); |
1028 | | |
1029 | | /* Deficit sample count: none */ |
1030 | 0 | put_bits(&c->pb, 5, 31); |
1031 | | |
1032 | | /* CRC is not present */ |
1033 | 0 | put_bits(&c->pb, 1, 0); |
1034 | | |
1035 | | /* Number of PCM sample blocks */ |
1036 | 0 | put_bits(&c->pb, 7, SUBBAND_SAMPLES - 1); |
1037 | | |
1038 | | /* Primary frame byte size */ |
1039 | 0 | put_bits(&c->pb, 14, c->frame_size - 1); |
1040 | | |
1041 | | /* Audio channel arrangement */ |
1042 | 0 | put_bits(&c->pb, 6, c->channel_config); |
1043 | | |
1044 | | /* Core audio sampling frequency */ |
1045 | 0 | put_bits(&c->pb, 4, bitstream_sfreq[c->samplerate_index]); |
1046 | | |
1047 | | /* Transmission bit rate */ |
1048 | 0 | put_bits(&c->pb, 5, c->bitrate_index); |
1049 | | |
1050 | | /* Embedded down mix: disabled */ |
1051 | 0 | put_bits(&c->pb, 1, 0); |
1052 | | |
1053 | | /* Embedded dynamic range flag: not present */ |
1054 | 0 | put_bits(&c->pb, 1, 0); |
1055 | | |
1056 | | /* Embedded time stamp flag: not present */ |
1057 | 0 | put_bits(&c->pb, 1, 0); |
1058 | | |
1059 | | /* Auxiliary data flag: not present */ |
1060 | 0 | put_bits(&c->pb, 1, 0); |
1061 | | |
1062 | | /* HDCD source: no */ |
1063 | 0 | put_bits(&c->pb, 1, 0); |
1064 | | |
1065 | | /* Extension audio ID: N/A */ |
1066 | 0 | put_bits(&c->pb, 3, 0); |
1067 | | |
1068 | | /* Extended audio data: not present */ |
1069 | 0 | put_bits(&c->pb, 1, 0); |
1070 | | |
1071 | | /* Audio sync word insertion flag: after each sub-frame */ |
1072 | 0 | put_bits(&c->pb, 1, 0); |
1073 | | |
1074 | | /* Low frequency effects flag: not present or 64x subsampling */ |
1075 | 0 | put_bits(&c->pb, 2, c->lfe_channel ? 2 : 0); |
1076 | | |
1077 | | /* Predictor history switch flag: on */ |
1078 | 0 | put_bits(&c->pb, 1, 1); |
1079 | | |
1080 | | /* No CRC */ |
1081 | | /* Multirate interpolator switch: non-perfect reconstruction */ |
1082 | 0 | put_bits(&c->pb, 1, 0); |
1083 | | |
1084 | | /* Encoder software revision: 7 */ |
1085 | 0 | put_bits(&c->pb, 4, 7); |
1086 | | |
1087 | | /* Copy history: 0 */ |
1088 | 0 | put_bits(&c->pb, 2, 0); |
1089 | | |
1090 | | /* Source PCM resolution: 16 bits, not DTS ES */ |
1091 | 0 | put_bits(&c->pb, 3, 0); |
1092 | | |
1093 | | /* Front sum/difference coding: no */ |
1094 | 0 | put_bits(&c->pb, 1, 0); |
1095 | | |
1096 | | /* Surrounds sum/difference coding: no */ |
1097 | 0 | put_bits(&c->pb, 1, 0); |
1098 | | |
1099 | | /* Dialog normalization: 0 dB */ |
1100 | 0 | put_bits(&c->pb, 4, 0); |
1101 | 0 | } |
1102 | | |
1103 | | static void put_primary_audio_header(DCAEncContext *c) |
1104 | 0 | { |
1105 | 0 | int ch, i; |
1106 | | /* Number of subframes */ |
1107 | 0 | put_bits(&c->pb, 4, SUBFRAMES - 1); |
1108 | | |
1109 | | /* Number of primary audio channels */ |
1110 | 0 | put_bits(&c->pb, 3, c->fullband_channels - 1); |
1111 | | |
1112 | | /* Subband activity count */ |
1113 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1114 | 0 | put_bits(&c->pb, 5, DCAENC_SUBBANDS - 2); |
1115 | | |
1116 | | /* High frequency VQ start subband */ |
1117 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1118 | 0 | put_bits(&c->pb, 5, DCAENC_SUBBANDS - 1); |
1119 | | |
1120 | | /* Joint intensity coding index: 0, 0 */ |
1121 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1122 | 0 | put_bits(&c->pb, 3, 0); |
1123 | | |
1124 | | /* Transient mode codebook: A4, A4 (arbitrary) */ |
1125 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1126 | 0 | put_bits(&c->pb, 2, 0); |
1127 | | |
1128 | | /* Scale factor code book: 7 bit linear, 7-bit sqrt table (for each channel) */ |
1129 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1130 | 0 | put_bits(&c->pb, 3, 6); |
1131 | | |
1132 | | /* Bit allocation quantizer select: linear 5-bit */ |
1133 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1134 | 0 | put_bits(&c->pb, 3, c->bit_allocation_sel[ch]); |
1135 | | |
1136 | | /* Quantization index codebook select */ |
1137 | 0 | for (i = 0; i < DCA_CODE_BOOKS; i++) |
1138 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1139 | 0 | put_bits(&c->pb, ff_dca_quant_index_sel_nbits[i], c->quant_index_sel[ch][i]); |
1140 | | |
1141 | | /* Scale factor adjustment index: transmitted in case of Huffman coding */ |
1142 | 0 | for (i = 0; i < DCA_CODE_BOOKS; i++) |
1143 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1144 | 0 | if (c->quant_index_sel[ch][i] < ff_dca_quant_index_group_size[i]) |
1145 | 0 | put_bits(&c->pb, 2, 0); |
1146 | | |
1147 | | /* Audio header CRC check word: not transmitted */ |
1148 | 0 | } |
1149 | | |
1150 | | static void put_subframe_samples(DCAEncContext *c, int ss, int band, int ch) |
1151 | 0 | { |
1152 | 0 | int i, j, sum, bits, sel; |
1153 | 0 | if (c->abits[ch][band] <= DCA_CODE_BOOKS) { |
1154 | 0 | av_assert0(c->abits[ch][band] > 0); |
1155 | 0 | sel = c->quant_index_sel[ch][c->abits[ch][band] - 1]; |
1156 | | // Huffman codes |
1157 | 0 | if (sel < ff_dca_quant_index_group_size[c->abits[ch][band] - 1]) { |
1158 | 0 | dca_vlc_enc_quant(&c->pb, &c->quantized[ch][band][ss * 8], 8, |
1159 | 0 | sel, c->abits[ch][band] - 1); |
1160 | 0 | return; |
1161 | 0 | } |
1162 | | |
1163 | | // Block codes |
1164 | 0 | if (c->abits[ch][band] <= 7) { |
1165 | 0 | for (i = 0; i < 8; i += 4) { |
1166 | 0 | sum = 0; |
1167 | 0 | for (j = 3; j >= 0; j--) { |
1168 | 0 | sum *= ff_dca_quant_levels[c->abits[ch][band]]; |
1169 | 0 | sum += c->quantized[ch][band][ss * 8 + i + j]; |
1170 | 0 | sum += (ff_dca_quant_levels[c->abits[ch][band]] - 1) / 2; |
1171 | 0 | } |
1172 | 0 | put_bits(&c->pb, bit_consumption[c->abits[ch][band]] / 4, sum); |
1173 | 0 | } |
1174 | 0 | return; |
1175 | 0 | } |
1176 | 0 | } |
1177 | | |
1178 | 0 | for (i = 0; i < 8; i++) { |
1179 | 0 | bits = bit_consumption[c->abits[ch][band]] / 16; |
1180 | 0 | put_sbits(&c->pb, bits, c->quantized[ch][band][ss * 8 + i]); |
1181 | 0 | } |
1182 | 0 | } |
1183 | | |
1184 | | static void put_subframe(DCAEncContext *c, int subframe) |
1185 | 0 | { |
1186 | 0 | int i, band, ss, ch; |
1187 | | |
1188 | | /* Subsubframes count */ |
1189 | 0 | put_bits(&c->pb, 2, SUBSUBFRAMES -1); |
1190 | | |
1191 | | /* Partial subsubframe sample count: dummy */ |
1192 | 0 | put_bits(&c->pb, 3, 0); |
1193 | | |
1194 | | /* Prediction mode: no ADPCM, in each channel and subband */ |
1195 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1196 | 0 | for (band = 0; band < DCAENC_SUBBANDS; band++) |
1197 | 0 | put_bits(&c->pb, 1, !(c->prediction_mode[ch][band] == -1)); |
1198 | | |
1199 | | /* Prediction VQ address */ |
1200 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1201 | 0 | for (band = 0; band < DCAENC_SUBBANDS; band++) |
1202 | 0 | if (c->prediction_mode[ch][band] >= 0) |
1203 | 0 | put_bits(&c->pb, 12, c->prediction_mode[ch][band]); |
1204 | | |
1205 | | /* Bit allocation index */ |
1206 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) { |
1207 | 0 | if (c->bit_allocation_sel[ch] == 6) { |
1208 | 0 | for (band = 0; band < DCAENC_SUBBANDS; band++) { |
1209 | 0 | put_bits(&c->pb, 5, c->abits[ch][band]); |
1210 | 0 | } |
1211 | 0 | } else { |
1212 | 0 | dca_vlc_enc_alloc(&c->pb, c->abits[ch], DCAENC_SUBBANDS, |
1213 | 0 | c->bit_allocation_sel[ch]); |
1214 | 0 | } |
1215 | 0 | } |
1216 | |
|
1217 | 0 | if (SUBSUBFRAMES > 1) { |
1218 | | /* Transition mode: none for each channel and subband */ |
1219 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1220 | 0 | for (band = 0; band < DCAENC_SUBBANDS; band++) |
1221 | 0 | if (c->abits[ch][band]) |
1222 | 0 | put_bits(&c->pb, 1, 0); /* codebook A4 */ |
1223 | 0 | } |
1224 | | |
1225 | | /* Scale factors */ |
1226 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1227 | 0 | for (band = 0; band < DCAENC_SUBBANDS; band++) |
1228 | 0 | if (c->abits[ch][band]) |
1229 | 0 | put_bits(&c->pb, 7, c->scale_factor[ch][band]); |
1230 | | |
1231 | | /* Joint subband scale factor codebook select: not transmitted */ |
1232 | | /* Scale factors for joint subband coding: not transmitted */ |
1233 | | /* Stereo down-mix coefficients: not transmitted */ |
1234 | | /* Dynamic range coefficient: not transmitted */ |
1235 | | /* Stde information CRC check word: not transmitted */ |
1236 | | /* VQ encoded high frequency subbands: not transmitted */ |
1237 | | |
1238 | | /* LFE data: 8 samples and scalefactor */ |
1239 | 0 | if (c->lfe_channel) { |
1240 | 0 | for (i = 0; i < DCA_LFE_SAMPLES; i++) |
1241 | 0 | put_bits(&c->pb, 8, quantize_value(c->downsampled_lfe[i], c->lfe_quant) & 0xff); |
1242 | 0 | put_bits(&c->pb, 8, c->lfe_scale_factor); |
1243 | 0 | } |
1244 | | |
1245 | | /* Audio data (subsubframes) */ |
1246 | 0 | for (ss = 0; ss < SUBSUBFRAMES ; ss++) |
1247 | 0 | for (ch = 0; ch < c->fullband_channels; ch++) |
1248 | 0 | for (band = 0; band < DCAENC_SUBBANDS; band++) |
1249 | 0 | if (c->abits[ch][band]) |
1250 | 0 | put_subframe_samples(c, ss, band, ch); |
1251 | | |
1252 | | /* DSYNC */ |
1253 | 0 | put_bits(&c->pb, 16, 0xffff); |
1254 | 0 | } |
1255 | | |
1256 | | static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt, |
1257 | | const AVFrame *frame, int *got_packet_ptr) |
1258 | 0 | { |
1259 | 0 | DCAEncContext *c = avctx->priv_data; |
1260 | 0 | const int32_t *samples; |
1261 | 0 | int ret, i; |
1262 | |
|
1263 | 0 | if ((ret = ff_get_encode_buffer(avctx, avpkt, c->frame_size, 0)) < 0) |
1264 | 0 | return ret; |
1265 | | |
1266 | 0 | samples = (const int32_t *)frame->data[0]; |
1267 | |
|
1268 | 0 | subband_transform(c, samples); |
1269 | 0 | if (c->lfe_channel) |
1270 | 0 | lfe_downsample(c, samples); |
1271 | |
|
1272 | 0 | calc_masking(c, samples); |
1273 | 0 | if (c->options.adpcm_mode) |
1274 | 0 | adpcm_analysis(c); |
1275 | 0 | find_peaks(c); |
1276 | 0 | assign_bits(c); |
1277 | 0 | calc_lfe_scales(c); |
1278 | 0 | shift_history(c, samples); |
1279 | |
|
1280 | 0 | init_put_bits(&c->pb, avpkt->data, avpkt->size); |
1281 | 0 | fill_in_adpcm_bufer(c); |
1282 | 0 | put_frame_header(c); |
1283 | 0 | put_primary_audio_header(c); |
1284 | 0 | for (i = 0; i < SUBFRAMES; i++) |
1285 | 0 | put_subframe(c, i); |
1286 | |
|
1287 | 0 | flush_put_bits(&c->pb); |
1288 | 0 | memset(put_bits_ptr(&c->pb), 0, put_bytes_left(&c->pb, 0)); |
1289 | |
|
1290 | 0 | *got_packet_ptr = 1; |
1291 | 0 | return 0; |
1292 | 0 | } |
1293 | | |
1294 | | #define DCAENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM |
1295 | | |
1296 | | static const AVOption options[] = { |
1297 | | { "dca_adpcm", "Use ADPCM encoding", offsetof(DCAEncContext, options.adpcm_mode), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DCAENC_FLAGS }, |
1298 | | { NULL }, |
1299 | | }; |
1300 | | |
1301 | | static const AVClass dcaenc_class = { |
1302 | | .class_name = "DCA (DTS Coherent Acoustics)", |
1303 | | .item_name = av_default_item_name, |
1304 | | .option = options, |
1305 | | .version = LIBAVUTIL_VERSION_INT, |
1306 | | }; |
1307 | | |
1308 | | static const FFCodecDefault defaults[] = { |
1309 | | { "b", "1411200" }, |
1310 | | { NULL }, |
1311 | | }; |
1312 | | |
1313 | | const FFCodec ff_dca_encoder = { |
1314 | | .p.name = "dca", |
1315 | | CODEC_LONG_NAME("DCA (DTS Coherent Acoustics)"), |
1316 | | .p.type = AVMEDIA_TYPE_AUDIO, |
1317 | | .p.id = AV_CODEC_ID_DTS, |
1318 | | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_EXPERIMENTAL | |
1319 | | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, |
1320 | | .priv_data_size = sizeof(DCAEncContext), |
1321 | | .init = encode_init, |
1322 | | .close = encode_close, |
1323 | | FF_CODEC_ENCODE_CB(encode_frame), |
1324 | | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, |
1325 | | CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_S32), |
1326 | | CODEC_SAMPLERATES_ARRAY(sample_rates), |
1327 | | CODEC_CH_LAYOUTS(AV_CHANNEL_LAYOUT_MONO, AV_CHANNEL_LAYOUT_STEREO, |
1328 | | AV_CHANNEL_LAYOUT_2_2, AV_CHANNEL_LAYOUT_5POINT0, |
1329 | | AV_CHANNEL_LAYOUT_5POINT1), |
1330 | | .defaults = defaults, |
1331 | | .p.priv_class = &dcaenc_class, |
1332 | | }; |