annotate ffmpeg/libavcodec/dcaenc.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
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 };