00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "libavutil/common.h"
00025 #include "libavutil/avassert.h"
00026 #include "libavutil/audioconvert.h"
00027 #include "avcodec.h"
00028 #include "get_bits.h"
00029 #include "put_bits.h"
00030 #include "dcaenc.h"
00031 #include "dcadata.h"
00032
00033 #undef NDEBUG
00034
00035 #define MAX_CHANNELS 6
00036 #define DCA_SUBBANDS_32 32
00037 #define DCA_MAX_FRAME_SIZE 16383
00038 #define DCA_HEADER_SIZE 13
00039
00040 #define DCA_SUBBANDS 32
00041 #define QUANTIZER_BITS 16
00042 #define SUBFRAMES 1
00043 #define SUBSUBFRAMES 4
00044 #define PCM_SAMPLES (SUBFRAMES*SUBSUBFRAMES*8)
00045 #define LFE_BITS 8
00046 #define LFE_INTERPOLATION 64
00047 #define LFE_PRESENT 2
00048 #define LFE_MISSING 0
00049
00050 static const int8_t dca_lfe_index[] = {
00051 1,2,2,2,2,3,2,3,2,3,2,3,1,3,2,3
00052 };
00053
00054 static const int8_t dca_channel_reorder_lfe[][9] = {
00055 { 0, -1, -1, -1, -1, -1, -1, -1, -1 },
00056 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
00057 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
00058 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
00059 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
00060 { 1, 2, 0, -1, -1, -1, -1, -1, -1 },
00061 { 0, 1, -1, 2, -1, -1, -1, -1, -1 },
00062 { 1, 2, 0, -1, 3, -1, -1, -1, -1 },
00063 { 0, 1, -1, 2, 3, -1, -1, -1, -1 },
00064 { 1, 2, 0, -1, 3, 4, -1, -1, -1 },
00065 { 2, 3, -1, 0, 1, 4, 5, -1, -1 },
00066 { 1, 2, 0, -1, 3, 4, 5, -1, -1 },
00067 { 0, -1, 4, 5, 2, 3, 1, -1, -1 },
00068 { 3, 4, 1, -1, 0, 2, 5, 6, -1 },
00069 { 2, 3, -1, 5, 7, 0, 1, 4, 6 },
00070 { 3, 4, 1, -1, 0, 2, 5, 7, 6 },
00071 };
00072
00073 static const int8_t dca_channel_reorder_nolfe[][9] = {
00074 { 0, -1, -1, -1, -1, -1, -1, -1, -1 },
00075 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
00076 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
00077 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
00078 { 0, 1, -1, -1, -1, -1, -1, -1, -1 },
00079 { 1, 2, 0, -1, -1, -1, -1, -1, -1 },
00080 { 0, 1, 2, -1, -1, -1, -1, -1, -1 },
00081 { 1, 2, 0, 3, -1, -1, -1, -1, -1 },
00082 { 0, 1, 2, 3, -1, -1, -1, -1, -1 },
00083 { 1, 2, 0, 3, 4, -1, -1, -1, -1 },
00084 { 2, 3, 0, 1, 4, 5, -1, -1, -1 },
00085 { 1, 2, 0, 3, 4, 5, -1, -1, -1 },
00086 { 0, 4, 5, 2, 3, 1, -1, -1, -1 },
00087 { 3, 4, 1, 0, 2, 5, 6, -1, -1 },
00088 { 2, 3, 5, 7, 0, 1, 4, 6, -1 },
00089 { 3, 4, 1, 0, 2, 5, 7, 6, -1 },
00090 };
00091
00092 typedef struct {
00093 PutBitContext pb;
00094 int32_t history[MAX_CHANNELS][512];
00095 int start[MAX_CHANNELS];
00096 int frame_size;
00097 int prim_channels;
00098 int lfe_channel;
00099 int sample_rate_code;
00100 int scale_factor[MAX_CHANNELS][DCA_SUBBANDS_32];
00101 int lfe_scale_factor;
00102 int lfe_data[SUBFRAMES*SUBSUBFRAMES*4];
00103
00104 int a_mode;
00105 int num_channel;
00106 int lfe_state;
00107 int lfe_offset;
00108 const int8_t *channel_order_tab;
00109
00110 int32_t pcm[FFMAX(LFE_INTERPOLATION, DCA_SUBBANDS_32)];
00111 int32_t subband[PCM_SAMPLES][MAX_CHANNELS][DCA_SUBBANDS_32];
00112 } DCAContext;
00113
00114 static int32_t cos_table[128];
00115
00116 static inline int32_t mul32(int32_t a, int32_t b)
00117 {
00118 int64_t r = (int64_t) a * b;
00119
00120 return (r + 0x80000000) >> 32;
00121 }
00122
00123
00124
00125 static void qmf_init(void)
00126 {
00127 int i;
00128 int32_t c[17], s[17];
00129 s[0] = 0;
00130 c[0] = 0x7fffffff;
00131
00132 for (i = 1; i <= 16; i++) {
00133 s[i] = 2 * (mul32(c[i - 1], 105372028) + mul32(s[i - 1], 2144896908));
00134 c[i] = 2 * (mul32(c[i - 1], 2144896908) - mul32(s[i - 1], 105372028));
00135 }
00136
00137 for (i = 0; i < 16; i++) {
00138 cos_table[i ] = c[i] >> 3;
00139 cos_table[i + 16] = s[16 - i] >> 3;
00140 cos_table[i + 32] = -s[i] >> 3;
00141 cos_table[i + 48] = -c[16 - i] >> 3;
00142 cos_table[i + 64] = -c[i] >> 3;
00143 cos_table[i + 80] = -s[16 - i] >> 3;
00144 cos_table[i + 96] = s[i] >> 3;
00145 cos_table[i + 112] = c[16 - i] >> 3;
00146 }
00147 }
00148
00149 static int32_t band_delta_factor(int band, int sample_num)
00150 {
00151 int index = band * (2 * sample_num + 1);
00152 if (band == 0)
00153 return 0x07ffffff;
00154 else
00155 return cos_table[index & 127];
00156 }
00157
00158 static void add_new_samples(DCAContext *c, const int32_t *in,
00159 int count, int channel)
00160 {
00161 int i;
00162
00163
00164 for (i = 0; i < count; i++) {
00165 c->history[channel][c->start[channel] + i] = in[i];
00166 av_assert0(c->start[channel] + i < 512);
00167 }
00168 c->start[channel] += count;
00169 if (c->start[channel] == 512)
00170 c->start[channel] = 0;
00171 av_assert0(c->start[channel] < 512);
00172 }
00173
00174 static void qmf_decompose(DCAContext *c, int32_t in[32], int32_t out[32],
00175 int channel)
00176 {
00177 int band, i, j, k;
00178 int32_t resp;
00179 int32_t accum[DCA_SUBBANDS_32] = {0};
00180
00181 add_new_samples(c, in, DCA_SUBBANDS_32, channel);
00182
00183
00184
00185
00186
00187
00188 for (k = 48, j = 0, i = c->start[channel]; i < 512; k++, j++, i++)
00189 accum[(k & 32) ? (31 - (k & 31)) : (k & 31)] += mul32(c->history[channel][i], UnQMF[j]);
00190 for (i = 0; i < c->start[channel]; k++, j++, i++)
00191 accum[(k & 32) ? (31 - (k & 31)) : (k & 31)] += mul32(c->history[channel][i], UnQMF[j]);
00192
00193 resp = 0;
00194
00195 for (band = 0; band < DCA_SUBBANDS_32; band++) {
00196 for (j = 0; j < 32; j++)
00197 resp += mul32(accum[j], band_delta_factor(band, j));
00198
00199 out[band] = (band & 2) ? (-resp) : resp;
00200 }
00201 }
00202
00203 static int32_t lfe_fir_64i[512];
00204 static int lfe_downsample(DCAContext *c, int32_t in[LFE_INTERPOLATION])
00205 {
00206 int i, j;
00207 int channel = c->prim_channels;
00208 int32_t accum = 0;
00209
00210 add_new_samples(c, in, LFE_INTERPOLATION, channel);
00211 for (i = c->start[channel], j = 0; i < 512; i++, j++)
00212 accum += mul32(c->history[channel][i], lfe_fir_64i[j]);
00213 for (i = 0; i < c->start[channel]; i++, j++)
00214 accum += mul32(c->history[channel][i], lfe_fir_64i[j]);
00215 return accum;
00216 }
00217
00218 static void init_lfe_fir(void)
00219 {
00220 static int initialized = 0;
00221 int i;
00222 if (initialized)
00223 return;
00224
00225 for (i = 0; i < 512; i++)
00226 lfe_fir_64i[i] = lfe_fir_64[i] * (1 << 25);
00227 initialized = 1;
00228 }
00229
00230 static void put_frame_header(DCAContext *c)
00231 {
00232
00233 put_bits(&c->pb, 16, 0x7ffe);
00234 put_bits(&c->pb, 16, 0x8001);
00235
00236
00237 put_bits(&c->pb, 1, 1);
00238
00239
00240 put_bits(&c->pb, 5, 31);
00241
00242
00243 put_bits(&c->pb, 1, 0);
00244
00245
00246 put_bits(&c->pb, 7, PCM_SAMPLES-1);
00247
00248
00249 put_bits(&c->pb, 14, c->frame_size-1);
00250
00251
00252 put_bits(&c->pb, 6, c->num_channel);
00253
00254
00255 put_bits(&c->pb, 4, c->sample_rate_code);
00256
00257
00258 put_bits(&c->pb, 5, 0x16);
00259
00260
00261 put_bits(&c->pb, 1, 0);
00262
00263
00264 put_bits(&c->pb, 1, 0);
00265
00266
00267 put_bits(&c->pb, 1, 0);
00268
00269
00270 put_bits(&c->pb, 1, 0);
00271
00272
00273 put_bits(&c->pb, 1, 0);
00274
00275
00276 put_bits(&c->pb, 3, 0);
00277
00278
00279 put_bits(&c->pb, 1, 0);
00280
00281
00282 put_bits(&c->pb, 1, 0);
00283
00284
00285 put_bits(&c->pb, 2, c->lfe_state);
00286
00287
00288 put_bits(&c->pb, 1, 1);
00289
00290
00291
00292 put_bits(&c->pb, 1, 0);
00293
00294
00295 put_bits(&c->pb, 4, 7);
00296
00297
00298 put_bits(&c->pb, 2, 0);
00299
00300
00301 put_bits(&c->pb, 3, 0);
00302
00303
00304 put_bits(&c->pb, 1, 0);
00305
00306
00307 put_bits(&c->pb, 1, 0);
00308
00309
00310 put_bits(&c->pb, 4, 0);
00311 }
00312
00313 static void put_primary_audio_header(DCAContext *c)
00314 {
00315 static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 };
00316 static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 };
00317
00318 int ch, i;
00319
00320 put_bits(&c->pb, 4, SUBFRAMES - 1);
00321
00322
00323 put_bits(&c->pb, 3, c->prim_channels - 1);
00324
00325
00326 for (ch = 0; ch < c->prim_channels; ch++)
00327 put_bits(&c->pb, 5, DCA_SUBBANDS - 2);
00328
00329
00330 for (ch = 0; ch < c->prim_channels; ch++)
00331 put_bits(&c->pb, 5, DCA_SUBBANDS - 1);
00332
00333
00334 for (ch = 0; ch < c->prim_channels; ch++)
00335 put_bits(&c->pb, 3, 0);
00336
00337
00338 for (ch = 0; ch < c->prim_channels; ch++)
00339 put_bits(&c->pb, 2, 0);
00340
00341
00342 for (ch = 0; ch < c->prim_channels; ch++)
00343 put_bits(&c->pb, 3, 6);
00344
00345
00346 for (ch = 0; ch < c->prim_channels; ch++)
00347 put_bits(&c->pb, 3, 6);
00348
00349
00350
00351
00352 for (i = 1; i < 11; i++)
00353 for (ch = 0; ch < c->prim_channels; ch++)
00354 put_bits(&c->pb, bitlen[i], thr[i]);
00355
00356
00357 }
00358
00364 static inline uint32_t quantize(int32_t sample, int bits)
00365 {
00366 av_assert0(sample < 1 << (bits - 1));
00367 av_assert0(sample >= -(1 << (bits - 1)));
00368 return sample & ((1 << bits) - 1);
00369 }
00370
00371 static inline int find_scale_factor7(int64_t max_value, int bits)
00372 {
00373 int i = 0, j = 128, q;
00374 max_value = ((max_value << 15) / lossy_quant[bits + 3]) >> (bits - 1);
00375 while (i < j) {
00376 q = (i + j) >> 1;
00377 if (max_value < scale_factor_quant7[q])
00378 j = q;
00379 else
00380 i = q + 1;
00381 }
00382 av_assert1(i < 128);
00383 return i;
00384 }
00385
00386 static inline void put_sample7(DCAContext *c, int64_t sample, int bits,
00387 int scale_factor)
00388 {
00389 sample = (sample << 15) / ((int64_t) lossy_quant[bits + 3] * scale_factor_quant7[scale_factor]);
00390 put_bits(&c->pb, bits, quantize((int) sample, bits));
00391 }
00392
00393 static void put_subframe(DCAContext *c,
00394 int32_t subband_data[8 * SUBSUBFRAMES][MAX_CHANNELS][32],
00395 int subframe)
00396 {
00397 int i, sub, ss, ch, max_value;
00398 int32_t *lfe_data = c->lfe_data + 4 * SUBSUBFRAMES * subframe;
00399
00400
00401 put_bits(&c->pb, 2, SUBSUBFRAMES -1);
00402
00403
00404 put_bits(&c->pb, 3, 0);
00405
00406
00407 for (ch = 0; ch < c->prim_channels; ch++)
00408 for (sub = 0; sub < DCA_SUBBANDS; sub++)
00409 put_bits(&c->pb, 1, 0);
00410
00411
00412
00413 for (ch = 0; ch < c->prim_channels; ch++)
00414 for (sub = 0; sub < DCA_SUBBANDS; sub++)
00415 put_bits(&c->pb, 5, QUANTIZER_BITS+3);
00416
00417 if (SUBSUBFRAMES > 1) {
00418
00419 for (ch = 0; ch < c->prim_channels; ch++)
00420 for (sub = 0; sub < DCA_SUBBANDS; sub++)
00421 put_bits(&c->pb, 1, 0);
00422 }
00423
00424
00425 for (ch = 0; ch < c->prim_channels; ch++)
00426 for (sub = 0; sub < DCA_SUBBANDS; sub++) {
00427 max_value = 0;
00428 for (i = 0; i < 8 * SUBSUBFRAMES; i++)
00429 max_value = FFMAX(max_value, FFABS(subband_data[i][ch][sub]));
00430 c->scale_factor[ch][sub] = find_scale_factor7(max_value, QUANTIZER_BITS);
00431 }
00432
00433 if (c->lfe_channel) {
00434 max_value = 0;
00435 for (i = 0; i < 4 * SUBSUBFRAMES; i++)
00436 max_value = FFMAX(max_value, FFABS(lfe_data[i]));
00437 c->lfe_scale_factor = find_scale_factor7(max_value, LFE_BITS);
00438 }
00439
00440
00441
00442 for (ch = 0; ch < c->prim_channels; ch++)
00443 for (sub = 0; sub < DCA_SUBBANDS; sub++)
00444 put_bits(&c->pb, 7, c->scale_factor[ch][sub]);
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454 if (c->lfe_channel) {
00455 for (i = 0; i < 4 * SUBSUBFRAMES; i++)
00456 put_sample7(c, lfe_data[i], LFE_BITS, c->lfe_scale_factor);
00457 put_bits(&c->pb, 8, c->lfe_scale_factor);
00458 }
00459
00460
00461
00462 for (ss = 0; ss < SUBSUBFRAMES ; ss++)
00463 for (ch = 0; ch < c->prim_channels; ch++)
00464 for (sub = 0; sub < DCA_SUBBANDS; sub++)
00465 for (i = 0; i < 8; i++)
00466 put_sample7(c, subband_data[ss * 8 + i][ch][sub], QUANTIZER_BITS, c->scale_factor[ch][sub]);
00467
00468
00469 put_bits(&c->pb, 16, 0xffff);
00470 }
00471
00472 static void put_frame(DCAContext *c,
00473 int32_t subband_data[PCM_SAMPLES][MAX_CHANNELS][32],
00474 uint8_t *frame)
00475 {
00476 int i;
00477 init_put_bits(&c->pb, frame + DCA_HEADER_SIZE, DCA_MAX_FRAME_SIZE-DCA_HEADER_SIZE);
00478
00479 put_primary_audio_header(c);
00480 for (i = 0; i < SUBFRAMES; i++)
00481 put_subframe(c, &subband_data[SUBSUBFRAMES * 8 * i], i);
00482
00483 flush_put_bits(&c->pb);
00484 c->frame_size = (put_bits_count(&c->pb) >> 3) + DCA_HEADER_SIZE;
00485
00486 init_put_bits(&c->pb, frame, DCA_HEADER_SIZE);
00487 put_frame_header(c);
00488 flush_put_bits(&c->pb);
00489 }
00490
00491 static int encode_frame(AVCodecContext *avctx, uint8_t *frame,
00492 int buf_size, void *data)
00493 {
00494 int i, k, channel;
00495 DCAContext *c = avctx->priv_data;
00496 int16_t *samples = data;
00497 int real_channel = 0;
00498
00499 for (i = 0; i < PCM_SAMPLES; i ++) {
00500 for (channel = 0; channel < c->prim_channels + 1; channel++) {
00501
00502 for (k = 0; k < 32; k++) {
00503 c->pcm[k] = samples[avctx->channels * (32 * i + k) + channel] << 16;
00504 }
00505
00506 real_channel = c->channel_order_tab[channel];
00507 if (real_channel >= 0) {
00508 qmf_decompose(c, c->pcm, &c->subband[i][real_channel][0], real_channel);
00509 }
00510 }
00511 }
00512
00513 if (c->lfe_channel) {
00514 for (i = 0; i < PCM_SAMPLES / 2; i++) {
00515 for (k = 0; k < LFE_INTERPOLATION; k++)
00516 c->pcm[k] = samples[avctx->channels * (LFE_INTERPOLATION*i+k) + c->lfe_offset] << 16;
00517 c->lfe_data[i] = lfe_downsample(c, c->pcm);
00518 }
00519 }
00520
00521 put_frame(c, c->subband, frame);
00522
00523 return c->frame_size;
00524 }
00525
00526 static int encode_init(AVCodecContext *avctx)
00527 {
00528 DCAContext *c = avctx->priv_data;
00529 int i;
00530
00531 c->prim_channels = avctx->channels;
00532 c->lfe_channel = (avctx->channels == 3 || avctx->channels == 6);
00533
00534 switch (avctx->channel_layout) {
00535 case AV_CH_LAYOUT_STEREO: c->a_mode = 2; c->num_channel = 2; break;
00536 case AV_CH_LAYOUT_5POINT0: c->a_mode = 9; c->num_channel = 9; break;
00537 case AV_CH_LAYOUT_5POINT1: c->a_mode = 9; c->num_channel = 9; break;
00538 case AV_CH_LAYOUT_5POINT0_BACK: c->a_mode = 9; c->num_channel = 9; break;
00539 case AV_CH_LAYOUT_5POINT1_BACK: c->a_mode = 9; c->num_channel = 9; break;
00540 default:
00541 av_log(avctx, AV_LOG_ERROR,
00542 "Only stereo, 5.0, 5.1 channel layouts supported at the moment!\n");
00543 return AVERROR_PATCHWELCOME;
00544 }
00545
00546 if (c->lfe_channel) {
00547 init_lfe_fir();
00548 c->prim_channels--;
00549 c->channel_order_tab = dca_channel_reorder_lfe[c->a_mode];
00550 c->lfe_state = LFE_PRESENT;
00551 c->lfe_offset = dca_lfe_index[c->a_mode];
00552 } else {
00553 c->channel_order_tab = dca_channel_reorder_nolfe[c->a_mode];
00554 c->lfe_state = LFE_MISSING;
00555 }
00556
00557 for (i = 0; i < 16; i++) {
00558 if (dca_sample_rates[i] && (dca_sample_rates[i] == avctx->sample_rate))
00559 break;
00560 }
00561 if (i == 16) {
00562 av_log(avctx, AV_LOG_ERROR, "Sample rate %iHz not supported, only ", avctx->sample_rate);
00563 for (i = 0; i < 16; i++)
00564 av_log(avctx, AV_LOG_ERROR, "%d, ", dca_sample_rates[i]);
00565 av_log(avctx, AV_LOG_ERROR, "supported.\n");
00566 return -1;
00567 }
00568 c->sample_rate_code = i;
00569
00570 avctx->frame_size = 32 * PCM_SAMPLES;
00571
00572 if (!cos_table[127])
00573 qmf_init();
00574 return 0;
00575 }
00576
00577 AVCodec ff_dca_encoder = {
00578 .name = "dca",
00579 .type = AVMEDIA_TYPE_AUDIO,
00580 .id = CODEC_ID_DTS,
00581 .priv_data_size = sizeof(DCAContext),
00582 .init = encode_init,
00583 .encode = encode_frame,
00584 .capabilities = CODEC_CAP_EXPERIMENTAL,
00585 .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
00586 .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"),
00587 };