yading@10: /* yading@10: * DCA encoder yading@10: * Copyright (C) 2008 Alexander E. Patrakov yading@10: * 2010 Benjamin Larsson yading@10: * 2011 Xiang Wang yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #include "libavutil/channel_layout.h" yading@10: #include "libavutil/common.h" yading@10: #include "libavutil/avassert.h" yading@10: #include "avcodec.h" yading@10: #include "internal.h" yading@10: #include "put_bits.h" yading@10: #include "dcaenc.h" yading@10: #include "dcadata.h" yading@10: #include "dca.h" yading@10: yading@10: #undef NDEBUG yading@10: yading@10: #define MAX_CHANNELS 6 yading@10: #define DCA_SUBBANDS_32 32 yading@10: #define DCA_MAX_FRAME_SIZE 16383 yading@10: #define DCA_HEADER_SIZE 13 yading@10: yading@10: #define DCA_SUBBANDS 32 ///< Subband activity count yading@10: #define QUANTIZER_BITS 16 yading@10: #define SUBFRAMES 1 yading@10: #define SUBSUBFRAMES 4 yading@10: #define PCM_SAMPLES (SUBFRAMES*SUBSUBFRAMES*8) yading@10: #define LFE_BITS 8 yading@10: #define LFE_INTERPOLATION 64 yading@10: #define LFE_PRESENT 2 yading@10: #define LFE_MISSING 0 yading@10: yading@10: static const int8_t dca_lfe_index[] = { yading@10: 1,2,2,2,2,3,2,3,2,3,2,3,1,3,2,3 yading@10: }; yading@10: yading@10: static const int8_t dca_channel_reorder_lfe[][9] = { yading@10: { 0, -1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 1, 2, 0, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, 2, -1, -1, -1, -1, -1 }, yading@10: { 1, 2, 0, -1, 3, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, 2, 3, -1, -1, -1, -1 }, yading@10: { 1, 2, 0, -1, 3, 4, -1, -1, -1 }, yading@10: { 2, 3, -1, 0, 1, 4, 5, -1, -1 }, yading@10: { 1, 2, 0, -1, 3, 4, 5, -1, -1 }, yading@10: { 0, -1, 4, 5, 2, 3, 1, -1, -1 }, yading@10: { 3, 4, 1, -1, 0, 2, 5, 6, -1 }, yading@10: { 2, 3, -1, 5, 7, 0, 1, 4, 6 }, yading@10: { 3, 4, 1, -1, 0, 2, 5, 7, 6 }, yading@10: }; yading@10: yading@10: static const int8_t dca_channel_reorder_nolfe[][9] = { yading@10: { 0, -1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, -1, -1, -1, -1, -1, -1, -1 }, yading@10: { 1, 2, 0, -1, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, 2, -1, -1, -1, -1, -1, -1 }, yading@10: { 1, 2, 0, 3, -1, -1, -1, -1, -1 }, yading@10: { 0, 1, 2, 3, -1, -1, -1, -1, -1 }, yading@10: { 1, 2, 0, 3, 4, -1, -1, -1, -1 }, yading@10: { 2, 3, 0, 1, 4, 5, -1, -1, -1 }, yading@10: { 1, 2, 0, 3, 4, 5, -1, -1, -1 }, yading@10: { 0, 4, 5, 2, 3, 1, -1, -1, -1 }, yading@10: { 3, 4, 1, 0, 2, 5, 6, -1, -1 }, yading@10: { 2, 3, 5, 7, 0, 1, 4, 6, -1 }, yading@10: { 3, 4, 1, 0, 2, 5, 7, 6, -1 }, yading@10: }; yading@10: yading@10: typedef struct { yading@10: PutBitContext pb; yading@10: int32_t history[MAX_CHANNELS][512]; /* This is a circular buffer */ yading@10: int start[MAX_CHANNELS]; yading@10: int frame_size; yading@10: int prim_channels; yading@10: int lfe_channel; yading@10: int sample_rate_code; yading@10: int scale_factor[MAX_CHANNELS][DCA_SUBBANDS_32]; yading@10: int lfe_scale_factor; yading@10: int lfe_data[SUBFRAMES*SUBSUBFRAMES*4]; yading@10: yading@10: int a_mode; ///< audio channels arrangement yading@10: int num_channel; yading@10: int lfe_state; yading@10: int lfe_offset; yading@10: const int8_t *channel_order_tab; ///< channel reordering table, lfe and non lfe yading@10: yading@10: int32_t pcm[FFMAX(LFE_INTERPOLATION, DCA_SUBBANDS_32)]; yading@10: int32_t subband[PCM_SAMPLES][MAX_CHANNELS][DCA_SUBBANDS_32]; /* [sample][channel][subband] */ yading@10: } DCAContext; yading@10: yading@10: static int32_t cos_table[128]; yading@10: yading@10: static inline int32_t mul32(int32_t a, int32_t b) yading@10: { yading@10: int64_t r = (int64_t) a * b; yading@10: /* round the result before truncating - improves accuracy */ yading@10: return (r + 0x80000000) >> 32; yading@10: } yading@10: yading@10: /* Integer version of the cosine modulated Pseudo QMF */ yading@10: yading@10: static void qmf_init(void) yading@10: { yading@10: int i; yading@10: int32_t c[17], s[17]; yading@10: s[0] = 0; /* sin(index * PI / 64) * 0x7fffffff */ yading@10: c[0] = 0x7fffffff; /* cos(index * PI / 64) * 0x7fffffff */ yading@10: yading@10: for (i = 1; i <= 16; i++) { yading@10: s[i] = 2 * (mul32(c[i - 1], 105372028) + mul32(s[i - 1], 2144896908)); yading@10: c[i] = 2 * (mul32(c[i - 1], 2144896908) - mul32(s[i - 1], 105372028)); yading@10: } yading@10: yading@10: for (i = 0; i < 16; i++) { yading@10: cos_table[i ] = c[i] >> 3; /* avoid output overflow */ yading@10: cos_table[i + 16] = s[16 - i] >> 3; yading@10: cos_table[i + 32] = -s[i] >> 3; yading@10: cos_table[i + 48] = -c[16 - i] >> 3; yading@10: cos_table[i + 64] = -c[i] >> 3; yading@10: cos_table[i + 80] = -s[16 - i] >> 3; yading@10: cos_table[i + 96] = s[i] >> 3; yading@10: cos_table[i + 112] = c[16 - i] >> 3; yading@10: } yading@10: } yading@10: yading@10: static int32_t band_delta_factor(int band, int sample_num) yading@10: { yading@10: int index = band * (2 * sample_num + 1); yading@10: if (band == 0) yading@10: return 0x07ffffff; yading@10: else yading@10: return cos_table[index & 127]; yading@10: } yading@10: yading@10: static void add_new_samples(DCAContext *c, const int32_t *in, yading@10: int count, int channel) yading@10: { yading@10: int i; yading@10: yading@10: /* Place new samples into the history buffer */ yading@10: for (i = 0; i < count; i++) { yading@10: c->history[channel][c->start[channel] + i] = in[i]; yading@10: av_assert0(c->start[channel] + i < 512); yading@10: } yading@10: c->start[channel] += count; yading@10: if (c->start[channel] == 512) yading@10: c->start[channel] = 0; yading@10: av_assert0(c->start[channel] < 512); yading@10: } yading@10: yading@10: static void qmf_decompose(DCAContext *c, int32_t in[32], int32_t out[32], yading@10: int channel) yading@10: { yading@10: int band, i, j, k; yading@10: int32_t resp; yading@10: int32_t accum[DCA_SUBBANDS_32] = {0}; yading@10: yading@10: add_new_samples(c, in, DCA_SUBBANDS_32, channel); yading@10: yading@10: /* Calculate the dot product of the signal with the (possibly inverted) yading@10: reference decoder's response to this vector: yading@10: (0.0, 0.0, ..., 0.0, -1.0, 1.0, 0.0, ..., 0.0) yading@10: so that -1.0 cancels 1.0 from the previous step */ yading@10: yading@10: for (k = 48, j = 0, i = c->start[channel]; i < 512; k++, j++, i++) yading@10: accum[(k & 32) ? (31 - (k & 31)) : (k & 31)] += mul32(c->history[channel][i], UnQMF[j]); yading@10: for (i = 0; i < c->start[channel]; k++, j++, i++) yading@10: accum[(k & 32) ? (31 - (k & 31)) : (k & 31)] += mul32(c->history[channel][i], UnQMF[j]); yading@10: yading@10: resp = 0; yading@10: /* TODO: implement FFT instead of this naive calculation */ yading@10: for (band = 0; band < DCA_SUBBANDS_32; band++) { yading@10: for (j = 0; j < 32; j++) yading@10: resp += mul32(accum[j], band_delta_factor(band, j)); yading@10: yading@10: out[band] = (band & 2) ? (-resp) : resp; yading@10: } yading@10: } yading@10: yading@10: static int32_t lfe_fir_64i[512]; yading@10: static int lfe_downsample(DCAContext *c, int32_t in[LFE_INTERPOLATION]) yading@10: { yading@10: int i, j; yading@10: int channel = c->prim_channels; yading@10: int32_t accum = 0; yading@10: yading@10: add_new_samples(c, in, LFE_INTERPOLATION, channel); yading@10: for (i = c->start[channel], j = 0; i < 512; i++, j++) yading@10: accum += mul32(c->history[channel][i], lfe_fir_64i[j]); yading@10: for (i = 0; i < c->start[channel]; i++, j++) yading@10: accum += mul32(c->history[channel][i], lfe_fir_64i[j]); yading@10: return accum; yading@10: } yading@10: yading@10: static void init_lfe_fir(void) yading@10: { yading@10: static int initialized = 0; yading@10: int i; yading@10: if (initialized) yading@10: return; yading@10: yading@10: for (i = 0; i < 512; i++) yading@10: lfe_fir_64i[i] = lfe_fir_64[i] * (1 << 25); //float -> int32_t yading@10: initialized = 1; yading@10: } yading@10: yading@10: static void put_frame_header(DCAContext *c) yading@10: { yading@10: /* SYNC */ yading@10: put_bits(&c->pb, 16, 0x7ffe); yading@10: put_bits(&c->pb, 16, 0x8001); yading@10: yading@10: /* Frame type: normal */ yading@10: put_bits(&c->pb, 1, 1); yading@10: yading@10: /* Deficit sample count: none */ yading@10: put_bits(&c->pb, 5, 31); yading@10: yading@10: /* CRC is not present */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Number of PCM sample blocks */ yading@10: put_bits(&c->pb, 7, PCM_SAMPLES-1); yading@10: yading@10: /* Primary frame byte size */ yading@10: put_bits(&c->pb, 14, c->frame_size-1); yading@10: yading@10: /* Audio channel arrangement: L + R (stereo) */ yading@10: put_bits(&c->pb, 6, c->num_channel); yading@10: yading@10: /* Core audio sampling frequency */ yading@10: put_bits(&c->pb, 4, c->sample_rate_code); yading@10: yading@10: /* Transmission bit rate: 1411.2 kbps */ yading@10: put_bits(&c->pb, 5, 0x16); /* FIXME: magic number */ yading@10: yading@10: /* Embedded down mix: disabled */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Embedded dynamic range flag: not present */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Embedded time stamp flag: not present */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Auxiliary data flag: not present */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* HDCD source: no */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Extension audio ID: N/A */ yading@10: put_bits(&c->pb, 3, 0); yading@10: yading@10: /* Extended audio data: not present */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Audio sync word insertion flag: after each sub-frame */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Low frequency effects flag: not present or interpolation factor=64 */ yading@10: put_bits(&c->pb, 2, c->lfe_state); yading@10: yading@10: /* Predictor history switch flag: on */ yading@10: put_bits(&c->pb, 1, 1); yading@10: yading@10: /* No CRC */ yading@10: /* Multirate interpolator switch: non-perfect reconstruction */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Encoder software revision: 7 */ yading@10: put_bits(&c->pb, 4, 7); yading@10: yading@10: /* Copy history: 0 */ yading@10: put_bits(&c->pb, 2, 0); yading@10: yading@10: /* Source PCM resolution: 16 bits, not DTS ES */ yading@10: put_bits(&c->pb, 3, 0); yading@10: yading@10: /* Front sum/difference coding: no */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Surrounds sum/difference coding: no */ yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Dialog normalization: 0 dB */ yading@10: put_bits(&c->pb, 4, 0); yading@10: } yading@10: yading@10: static void put_primary_audio_header(DCAContext *c) yading@10: { yading@10: static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 }; yading@10: static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 }; yading@10: yading@10: int ch, i; yading@10: /* Number of subframes */ yading@10: put_bits(&c->pb, 4, SUBFRAMES - 1); yading@10: yading@10: /* Number of primary audio channels */ yading@10: put_bits(&c->pb, 3, c->prim_channels - 1); yading@10: yading@10: /* Subband activity count */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: put_bits(&c->pb, 5, DCA_SUBBANDS - 2); yading@10: yading@10: /* High frequency VQ start subband */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: put_bits(&c->pb, 5, DCA_SUBBANDS - 1); yading@10: yading@10: /* Joint intensity coding index: 0, 0 */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: put_bits(&c->pb, 3, 0); yading@10: yading@10: /* Transient mode codebook: A4, A4 (arbitrary) */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: put_bits(&c->pb, 2, 0); yading@10: yading@10: /* Scale factor code book: 7 bit linear, 7-bit sqrt table (for each channel) */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: put_bits(&c->pb, 3, 6); yading@10: yading@10: /* Bit allocation quantizer select: linear 5-bit */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: put_bits(&c->pb, 3, 6); yading@10: yading@10: /* Quantization index codebook select: dummy data yading@10: to avoid transmission of scale factor adjustment */ yading@10: yading@10: for (i = 1; i < 11; i++) yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: put_bits(&c->pb, bitlen[i], thr[i]); yading@10: yading@10: /* Scale factor adjustment index: not transmitted */ yading@10: } yading@10: yading@10: /** yading@10: * 8-23 bits quantization yading@10: * @param sample yading@10: * @param bits yading@10: */ yading@10: static inline uint32_t quantize(int32_t sample, int bits) yading@10: { yading@10: av_assert0(sample < 1 << (bits - 1)); yading@10: av_assert0(sample >= -(1 << (bits - 1))); yading@10: return sample & ((1 << bits) - 1); yading@10: } yading@10: yading@10: static inline int find_scale_factor7(int64_t max_value, int bits) yading@10: { yading@10: int i = 0, j = 128, q; yading@10: max_value = ((max_value << 15) / lossy_quant[bits + 3]) >> (bits - 1); yading@10: while (i < j) { yading@10: q = (i + j) >> 1; yading@10: if (max_value < scale_factor_quant7[q]) yading@10: j = q; yading@10: else yading@10: i = q + 1; yading@10: } yading@10: av_assert1(i < 128); yading@10: return i; yading@10: } yading@10: yading@10: static inline void put_sample7(DCAContext *c, int64_t sample, int bits, yading@10: int scale_factor) yading@10: { yading@10: sample = (sample << 15) / ((int64_t) lossy_quant[bits + 3] * scale_factor_quant7[scale_factor]); yading@10: put_bits(&c->pb, bits, quantize((int) sample, bits)); yading@10: } yading@10: yading@10: static void put_subframe(DCAContext *c, yading@10: int32_t subband_data[8 * SUBSUBFRAMES][MAX_CHANNELS][32], yading@10: int subframe) yading@10: { yading@10: int i, sub, ss, ch, max_value; yading@10: int32_t *lfe_data = c->lfe_data + 4 * SUBSUBFRAMES * subframe; yading@10: yading@10: /* Subsubframes count */ yading@10: put_bits(&c->pb, 2, SUBSUBFRAMES -1); yading@10: yading@10: /* Partial subsubframe sample count: dummy */ yading@10: put_bits(&c->pb, 3, 0); yading@10: yading@10: /* Prediction mode: no ADPCM, in each channel and subband */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: for (sub = 0; sub < DCA_SUBBANDS; sub++) yading@10: put_bits(&c->pb, 1, 0); yading@10: yading@10: /* Prediction VQ addres: not transmitted */ yading@10: /* Bit allocation index */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: for (sub = 0; sub < DCA_SUBBANDS; sub++) yading@10: put_bits(&c->pb, 5, QUANTIZER_BITS+3); yading@10: yading@10: if (SUBSUBFRAMES > 1) { yading@10: /* Transition mode: none for each channel and subband */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: for (sub = 0; sub < DCA_SUBBANDS; sub++) yading@10: put_bits(&c->pb, 1, 0); /* codebook A4 */ yading@10: } yading@10: yading@10: /* Determine scale_factor */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: for (sub = 0; sub < DCA_SUBBANDS; sub++) { yading@10: max_value = 0; yading@10: for (i = 0; i < 8 * SUBSUBFRAMES; i++) yading@10: max_value = FFMAX(max_value, FFABS(subband_data[i][ch][sub])); yading@10: c->scale_factor[ch][sub] = find_scale_factor7(max_value, QUANTIZER_BITS); yading@10: } yading@10: yading@10: if (c->lfe_channel) { yading@10: max_value = 0; yading@10: for (i = 0; i < 4 * SUBSUBFRAMES; i++) yading@10: max_value = FFMAX(max_value, FFABS(lfe_data[i])); yading@10: c->lfe_scale_factor = find_scale_factor7(max_value, LFE_BITS); yading@10: } yading@10: yading@10: /* Scale factors: the same for each channel and subband, yading@10: encoded according to Table D.1.2 */ yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: for (sub = 0; sub < DCA_SUBBANDS; sub++) yading@10: put_bits(&c->pb, 7, c->scale_factor[ch][sub]); yading@10: yading@10: /* Joint subband scale factor codebook select: not transmitted */ yading@10: /* Scale factors for joint subband coding: not transmitted */ yading@10: /* Stereo down-mix coefficients: not transmitted */ yading@10: /* Dynamic range coefficient: not transmitted */ yading@10: /* Stde information CRC check word: not transmitted */ yading@10: /* VQ encoded high frequency subbands: not transmitted */ yading@10: yading@10: /* LFE data */ yading@10: if (c->lfe_channel) { yading@10: for (i = 0; i < 4 * SUBSUBFRAMES; i++) yading@10: put_sample7(c, lfe_data[i], LFE_BITS, c->lfe_scale_factor); yading@10: put_bits(&c->pb, 8, c->lfe_scale_factor); yading@10: } yading@10: yading@10: /* Audio data (subsubframes) */ yading@10: yading@10: for (ss = 0; ss < SUBSUBFRAMES ; ss++) yading@10: for (ch = 0; ch < c->prim_channels; ch++) yading@10: for (sub = 0; sub < DCA_SUBBANDS; sub++) yading@10: for (i = 0; i < 8; i++) yading@10: put_sample7(c, subband_data[ss * 8 + i][ch][sub], QUANTIZER_BITS, c->scale_factor[ch][sub]); yading@10: yading@10: /* DSYNC */ yading@10: put_bits(&c->pb, 16, 0xffff); yading@10: } yading@10: yading@10: static void put_frame(DCAContext *c, yading@10: int32_t subband_data[PCM_SAMPLES][MAX_CHANNELS][32], yading@10: uint8_t *frame) yading@10: { yading@10: int i; yading@10: init_put_bits(&c->pb, frame + DCA_HEADER_SIZE, DCA_MAX_FRAME_SIZE-DCA_HEADER_SIZE); yading@10: yading@10: put_primary_audio_header(c); yading@10: for (i = 0; i < SUBFRAMES; i++) yading@10: put_subframe(c, &subband_data[SUBSUBFRAMES * 8 * i], i); yading@10: yading@10: flush_put_bits(&c->pb); yading@10: c->frame_size = (put_bits_count(&c->pb) >> 3) + DCA_HEADER_SIZE; yading@10: yading@10: init_put_bits(&c->pb, frame, DCA_HEADER_SIZE); yading@10: put_frame_header(c); yading@10: flush_put_bits(&c->pb); yading@10: } yading@10: yading@10: static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt, yading@10: const AVFrame *frame, int *got_packet_ptr) yading@10: { yading@10: int i, k, channel; yading@10: DCAContext *c = avctx->priv_data; yading@10: const int16_t *samples; yading@10: int ret, real_channel = 0; yading@10: yading@10: if ((ret = ff_alloc_packet2(avctx, avpkt, DCA_MAX_FRAME_SIZE + DCA_HEADER_SIZE)) < 0) yading@10: return ret; yading@10: yading@10: samples = (const int16_t *)frame->data[0]; yading@10: for (i = 0; i < PCM_SAMPLES; i ++) { /* i is the decimated sample number */ yading@10: for (channel = 0; channel < c->prim_channels + 1; channel++) { yading@10: real_channel = c->channel_order_tab[channel]; yading@10: if (real_channel >= 0) { yading@10: /* Get 32 PCM samples */ yading@10: for (k = 0; k < 32; k++) { /* k is the sample number in a 32-sample block */ yading@10: c->pcm[k] = samples[avctx->channels * (32 * i + k) + channel] << 16; yading@10: } yading@10: /* Put subband samples into the proper place */ yading@10: qmf_decompose(c, c->pcm, &c->subband[i][real_channel][0], real_channel); yading@10: } yading@10: } yading@10: } yading@10: yading@10: if (c->lfe_channel) { yading@10: for (i = 0; i < PCM_SAMPLES / 2; i++) { yading@10: for (k = 0; k < LFE_INTERPOLATION; k++) /* k is the sample number in a 32-sample block */ yading@10: c->pcm[k] = samples[avctx->channels * (LFE_INTERPOLATION*i+k) + c->lfe_offset] << 16; yading@10: c->lfe_data[i] = lfe_downsample(c, c->pcm); yading@10: } yading@10: } yading@10: yading@10: put_frame(c, c->subband, avpkt->data); yading@10: yading@10: avpkt->size = c->frame_size; yading@10: *got_packet_ptr = 1; yading@10: return 0; yading@10: } yading@10: yading@10: static int encode_init(AVCodecContext *avctx) yading@10: { yading@10: DCAContext *c = avctx->priv_data; yading@10: int i; yading@10: uint64_t layout = avctx->channel_layout; yading@10: yading@10: c->prim_channels = avctx->channels; yading@10: c->lfe_channel = (avctx->channels == 3 || avctx->channels == 6); yading@10: yading@10: if (!layout) { yading@10: av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The " yading@10: "encoder will guess the layout, but it " yading@10: "might be incorrect.\n"); yading@10: layout = av_get_default_channel_layout(avctx->channels); yading@10: } yading@10: switch (layout) { yading@10: case AV_CH_LAYOUT_STEREO: c->a_mode = 2; c->num_channel = 2; break; yading@10: case AV_CH_LAYOUT_5POINT0: c->a_mode = 9; c->num_channel = 9; break; yading@10: case AV_CH_LAYOUT_5POINT1: c->a_mode = 9; c->num_channel = 9; break; yading@10: case AV_CH_LAYOUT_5POINT0_BACK: c->a_mode = 9; c->num_channel = 9; break; yading@10: case AV_CH_LAYOUT_5POINT1_BACK: c->a_mode = 9; c->num_channel = 9; break; yading@10: default: yading@10: av_log(avctx, AV_LOG_ERROR, yading@10: "Only stereo, 5.0, 5.1 channel layouts supported at the moment!\n"); yading@10: return AVERROR_PATCHWELCOME; yading@10: } yading@10: yading@10: if (c->lfe_channel) { yading@10: init_lfe_fir(); yading@10: c->prim_channels--; yading@10: c->channel_order_tab = dca_channel_reorder_lfe[c->a_mode]; yading@10: c->lfe_state = LFE_PRESENT; yading@10: c->lfe_offset = dca_lfe_index[c->a_mode]; yading@10: } else { yading@10: c->channel_order_tab = dca_channel_reorder_nolfe[c->a_mode]; yading@10: c->lfe_state = LFE_MISSING; yading@10: } yading@10: yading@10: for (i = 0; i < 16; i++) { yading@10: if (avpriv_dca_sample_rates[i] && (avpriv_dca_sample_rates[i] == avctx->sample_rate)) yading@10: break; yading@10: } yading@10: if (i == 16) { yading@10: av_log(avctx, AV_LOG_ERROR, "Sample rate %iHz not supported, only ", avctx->sample_rate); yading@10: for (i = 0; i < 16; i++) yading@10: av_log(avctx, AV_LOG_ERROR, "%d, ", avpriv_dca_sample_rates[i]); yading@10: av_log(avctx, AV_LOG_ERROR, "supported.\n"); yading@10: return -1; yading@10: } yading@10: c->sample_rate_code = i; yading@10: yading@10: avctx->frame_size = 32 * PCM_SAMPLES; yading@10: yading@10: if (!cos_table[127]) yading@10: qmf_init(); yading@10: return 0; yading@10: } yading@10: yading@10: AVCodec ff_dca_encoder = { yading@10: .name = "dca", yading@10: .type = AVMEDIA_TYPE_AUDIO, yading@10: .id = AV_CODEC_ID_DTS, yading@10: .priv_data_size = sizeof(DCAContext), yading@10: .init = encode_init, yading@10: .encode2 = encode_frame, yading@10: .capabilities = CODEC_CAP_EXPERIMENTAL, yading@10: .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, yading@10: AV_SAMPLE_FMT_NONE }, yading@10: .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"), yading@10: };