mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
DCA/DTA encoder
This commit is contained in:
parent
d84f191d37
commit
d439ba15fd
@ -604,7 +604,7 @@ following image formats are supported:
|
||||
@tab Codec used in Delphine Software International games.
|
||||
@item COOK @tab @tab X
|
||||
@tab All versions except 5.1 are supported.
|
||||
@item DCA (DTS Coherent Acoustics) @tab @tab X
|
||||
@item DCA (DTS Coherent Acoustics) @tab X @tab X
|
||||
@item DPCM id RoQ @tab X @tab X
|
||||
@tab Used in Quake III, Jedi Knight 2, other computer games.
|
||||
@item DPCM Interplay @tab @tab X
|
||||
|
@ -105,6 +105,7 @@ OBJS-$(CONFIG_COOK_DECODER) += cook.o
|
||||
OBJS-$(CONFIG_CSCD_DECODER) += cscd.o
|
||||
OBJS-$(CONFIG_CYUV_DECODER) += cyuv.o
|
||||
OBJS-$(CONFIG_DCA_DECODER) += dca.o synth_filter.o dcadsp.o
|
||||
OBJS-$(CONFIG_DCA_ENCODER) += dcaenc.o
|
||||
OBJS-$(CONFIG_DFA_DECODER) += dfa.o
|
||||
OBJS-$(CONFIG_DNXHD_DECODER) += dnxhddec.o dnxhddata.o
|
||||
OBJS-$(CONFIG_DNXHD_ENCODER) += dnxhdenc.o dnxhddata.o \
|
||||
|
@ -246,7 +246,7 @@ void avcodec_register_all(void)
|
||||
REGISTER_DECODER (BINKAUDIO_DCT, binkaudio_dct);
|
||||
REGISTER_DECODER (BINKAUDIO_RDFT, binkaudio_rdft);
|
||||
REGISTER_DECODER (COOK, cook);
|
||||
REGISTER_DECODER (DCA, dca);
|
||||
REGISTER_ENCDEC (DCA, dca);
|
||||
REGISTER_DECODER (DSICINAUDIO, dsicinaudio);
|
||||
REGISTER_DECODER (EAC3, eac3);
|
||||
REGISTER_ENCDEC (FLAC, flac);
|
||||
|
587
libavcodec/dcaenc.c
Normal file
587
libavcodec/dcaenc.c
Normal file
@ -0,0 +1,587 @@
|
||||
/*
|
||||
* DCA encoder
|
||||
* Copyright (C) 2008 Alexander E. Patrakov
|
||||
* 2010 Benjamin Larsson
|
||||
* 2011 Xiang Wang
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/audioconvert.h"
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
#include "put_bits.h"
|
||||
#include "dcaenc.h"
|
||||
#include "dcadata.h"
|
||||
|
||||
#undef NDEBUG
|
||||
|
||||
#define MAX_CHANNELS 6
|
||||
#define DCA_SUBBANDS_32 32
|
||||
#define DCA_MAX_FRAME_SIZE 16383
|
||||
#define DCA_HEADER_SIZE 13
|
||||
|
||||
#define DCA_SUBBANDS 32 ///< Subband activity count
|
||||
#define QUANTIZER_BITS 16
|
||||
#define SUBFRAMES 1
|
||||
#define SUBSUBFRAMES 4
|
||||
#define PCM_SAMPLES (SUBFRAMES*SUBSUBFRAMES*8)
|
||||
#define LFE_BITS 8
|
||||
#define LFE_INTERPOLATION 64
|
||||
#define LFE_PRESENT 2
|
||||
#define LFE_MISSING 0
|
||||
|
||||
static const int8_t dca_lfe_index[] = {
|
||||
1,2,2,2,2,3,2,3,2,3,2,3,1,3,2,3
|
||||
};
|
||||
|
||||
static const int8_t dca_channel_reorder_lfe[][9] = {
|
||||
{ 0, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 0, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, 2, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 0, -1, 3, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, 2, 3, -1, -1, -1, -1 },
|
||||
{ 1, 2, 0, -1, 3, 4, -1, -1, -1 },
|
||||
{ 2, 3, -1, 0, 1, 4, 5, -1, -1 },
|
||||
{ 1, 2, 0, -1, 3, 4, 5, -1, -1 },
|
||||
{ 0, -1, 4, 5, 2, 3, 1, -1, -1 },
|
||||
{ 3, 4, 1, -1, 0, 2, 5, 6, -1 },
|
||||
{ 2, 3, -1, 5, 7, 0, 1, 4, 6 },
|
||||
{ 3, 4, 1, -1, 0, 2, 5, 7, 6 },
|
||||
};
|
||||
|
||||
static const int8_t dca_channel_reorder_nolfe[][9] = {
|
||||
{ 0, -1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, -1, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 0, -1, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, 2, -1, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 0, 3, -1, -1, -1, -1, -1 },
|
||||
{ 0, 1, 2, 3, -1, -1, -1, -1, -1 },
|
||||
{ 1, 2, 0, 3, 4, -1, -1, -1, -1 },
|
||||
{ 2, 3, 0, 1, 4, 5, -1, -1, -1 },
|
||||
{ 1, 2, 0, 3, 4, 5, -1, -1, -1 },
|
||||
{ 0, 4, 5, 2, 3, 1, -1, -1, -1 },
|
||||
{ 3, 4, 1, 0, 2, 5, 6, -1, -1 },
|
||||
{ 2, 3, 5, 7, 0, 1, 4, 6, -1 },
|
||||
{ 3, 4, 1, 0, 2, 5, 7, 6, -1 },
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
PutBitContext pb;
|
||||
int32_t history[MAX_CHANNELS][512]; /* This is a circular buffer */
|
||||
int start[MAX_CHANNELS];
|
||||
int frame_size;
|
||||
int prim_channels;
|
||||
int lfe_channel;
|
||||
int sample_rate_code;
|
||||
int scale_factor[MAX_CHANNELS][DCA_SUBBANDS_32];
|
||||
int lfe_scale_factor;
|
||||
int lfe_data[SUBFRAMES*SUBSUBFRAMES*4];
|
||||
|
||||
int a_mode; ///< audio channels arrangement
|
||||
int num_channel;
|
||||
int lfe_state;
|
||||
int lfe_offset;
|
||||
const int8_t *channel_order_tab; ///< channel reordering table, lfe and non lfe
|
||||
|
||||
int32_t pcm[FFMAX(LFE_INTERPOLATION, DCA_SUBBANDS_32)];
|
||||
int32_t subband[PCM_SAMPLES][MAX_CHANNELS][DCA_SUBBANDS_32]; /* [sample][channel][subband] */
|
||||
} DCAContext;
|
||||
|
||||
static int32_t cos_table[128];
|
||||
|
||||
static inline int32_t mul32(int32_t a, int32_t b)
|
||||
{
|
||||
int64_t r = (int64_t) a * b;
|
||||
/* round the result before truncating - improves accuracy */
|
||||
return (r + 0x80000000) >> 32;
|
||||
}
|
||||
|
||||
/* Integer version of the cosine modulated Pseudo QMF */
|
||||
|
||||
static void qmf_init(void)
|
||||
{
|
||||
int i;
|
||||
int32_t c[17], s[17];
|
||||
s[0] = 0; /* sin(index * PI / 64) * 0x7fffffff */
|
||||
c[0] = 0x7fffffff; /* cos(index * PI / 64) * 0x7fffffff */
|
||||
|
||||
for (i = 1; i <= 16; i++) {
|
||||
s[i] = 2 * (mul32(c[i - 1], 105372028) + mul32(s[i - 1], 2144896908));
|
||||
c[i] = 2 * (mul32(c[i - 1], 2144896908) - mul32(s[i - 1], 105372028));
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
cos_table[i ] = c[i] >> 3; /* avoid output overflow */
|
||||
cos_table[i + 16] = s[16 - i] >> 3;
|
||||
cos_table[i + 32] = -s[i] >> 3;
|
||||
cos_table[i + 48] = -c[16 - i] >> 3;
|
||||
cos_table[i + 64] = -c[i] >> 3;
|
||||
cos_table[i + 80] = -s[16 - i] >> 3;
|
||||
cos_table[i + 96] = s[i] >> 3;
|
||||
cos_table[i + 112] = c[16 - i] >> 3;
|
||||
}
|
||||
}
|
||||
|
||||
static int32_t band_delta_factor(int band, int sample_num)
|
||||
{
|
||||
int index = band * (2 * sample_num + 1);
|
||||
if (band == 0)
|
||||
return 0x07ffffff;
|
||||
else
|
||||
return cos_table[index & 127];
|
||||
}
|
||||
|
||||
static void add_new_samples(DCAContext *c, const int32_t *in,
|
||||
int count, int channel)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Place new samples into the history buffer */
|
||||
for (i = 0; i < count; i++) {
|
||||
c->history[channel][c->start[channel] + i] = in[i];
|
||||
av_assert0(c->start[channel] + i < 512);
|
||||
}
|
||||
c->start[channel] += count;
|
||||
if (c->start[channel] == 512)
|
||||
c->start[channel] = 0;
|
||||
av_assert0(c->start[channel] < 512);
|
||||
}
|
||||
|
||||
static void qmf_decompose(DCAContext *c, int32_t in[32], int32_t out[32],
|
||||
int channel)
|
||||
{
|
||||
int band, i, j, k;
|
||||
int32_t resp;
|
||||
int32_t accum[DCA_SUBBANDS_32] = {0};
|
||||
|
||||
add_new_samples(c, in, DCA_SUBBANDS_32, channel);
|
||||
|
||||
/* Calculate the dot product of the signal with the (possibly inverted)
|
||||
reference decoder's response to this vector:
|
||||
(0.0, 0.0, ..., 0.0, -1.0, 1.0, 0.0, ..., 0.0)
|
||||
so that -1.0 cancels 1.0 from the previous step */
|
||||
|
||||
for (k = 48, j = 0, i = c->start[channel]; i < 512; k++, j++, i++)
|
||||
accum[(k & 32) ? (31 - (k & 31)) : (k & 31)] += mul32(c->history[channel][i], UnQMF[j]);
|
||||
for (i = 0; i < c->start[channel]; k++, j++, i++)
|
||||
accum[(k & 32) ? (31 - (k & 31)) : (k & 31)] += mul32(c->history[channel][i], UnQMF[j]);
|
||||
|
||||
resp = 0;
|
||||
/* TODO: implement FFT instead of this naive calculation */
|
||||
for (band = 0; band < DCA_SUBBANDS_32; band++) {
|
||||
for (j = 0; j < 32; j++)
|
||||
resp += mul32(accum[j], band_delta_factor(band, j));
|
||||
|
||||
out[band] = (band & 2) ? (-resp) : resp;
|
||||
}
|
||||
}
|
||||
|
||||
static int32_t lfe_fir_64i[512];
|
||||
static int lfe_downsample(DCAContext *c, int32_t in[LFE_INTERPOLATION])
|
||||
{
|
||||
int i, j;
|
||||
int channel = c->prim_channels;
|
||||
int32_t accum = 0;
|
||||
|
||||
add_new_samples(c, in, LFE_INTERPOLATION, channel);
|
||||
for (i = c->start[channel], j = 0; i < 512; i++, j++)
|
||||
accum += mul32(c->history[channel][i], lfe_fir_64i[j]);
|
||||
for (i = 0; i < c->start[channel]; i++, j++)
|
||||
accum += mul32(c->history[channel][i], lfe_fir_64i[j]);
|
||||
return accum;
|
||||
}
|
||||
|
||||
static void init_lfe_fir(void)
|
||||
{
|
||||
static int initialized = 0;
|
||||
int i;
|
||||
if (initialized)
|
||||
return;
|
||||
|
||||
for (i = 0; i < 512; i++)
|
||||
lfe_fir_64i[i] = lfe_fir_64[i] * (1 << 25); //float -> int32_t
|
||||
initialized = 1;
|
||||
}
|
||||
|
||||
static void put_frame_header(DCAContext *c)
|
||||
{
|
||||
/* SYNC */
|
||||
put_bits(&c->pb, 16, 0x7ffe);
|
||||
put_bits(&c->pb, 16, 0x8001);
|
||||
|
||||
/* Frame type: normal */
|
||||
put_bits(&c->pb, 1, 1);
|
||||
|
||||
/* Deficit sample count: none */
|
||||
put_bits(&c->pb, 5, 31);
|
||||
|
||||
/* CRC is not present */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Number of PCM sample blocks */
|
||||
put_bits(&c->pb, 7, PCM_SAMPLES-1);
|
||||
|
||||
/* Primary frame byte size */
|
||||
put_bits(&c->pb, 14, c->frame_size-1);
|
||||
|
||||
/* Audio channel arrangement: L + R (stereo) */
|
||||
put_bits(&c->pb, 6, c->num_channel);
|
||||
|
||||
/* Core audio sampling frequency */
|
||||
put_bits(&c->pb, 4, c->sample_rate_code);
|
||||
|
||||
/* Transmission bit rate: 1411.2 kbps */
|
||||
put_bits(&c->pb, 5, 0x16); /* FIXME: magic number */
|
||||
|
||||
/* Embedded down mix: disabled */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Embedded dynamic range flag: not present */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Embedded time stamp flag: not present */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Auxiliary data flag: not present */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* HDCD source: no */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Extension audio ID: N/A */
|
||||
put_bits(&c->pb, 3, 0);
|
||||
|
||||
/* Extended audio data: not present */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Audio sync word insertion flag: after each sub-frame */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Low frequency effects flag: not present or interpolation factor=64 */
|
||||
put_bits(&c->pb, 2, c->lfe_state);
|
||||
|
||||
/* Predictor history switch flag: on */
|
||||
put_bits(&c->pb, 1, 1);
|
||||
|
||||
/* No CRC */
|
||||
/* Multirate interpolator switch: non-perfect reconstruction */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Encoder software revision: 7 */
|
||||
put_bits(&c->pb, 4, 7);
|
||||
|
||||
/* Copy history: 0 */
|
||||
put_bits(&c->pb, 2, 0);
|
||||
|
||||
/* Source PCM resolution: 16 bits, not DTS ES */
|
||||
put_bits(&c->pb, 3, 0);
|
||||
|
||||
/* Front sum/difference coding: no */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Surrounds sum/difference coding: no */
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Dialog normalization: 0 dB */
|
||||
put_bits(&c->pb, 4, 0);
|
||||
}
|
||||
|
||||
static void put_primary_audio_header(DCAContext *c)
|
||||
{
|
||||
static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 };
|
||||
static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 };
|
||||
|
||||
int ch, i;
|
||||
/* Number of subframes */
|
||||
put_bits(&c->pb, 4, SUBFRAMES - 1);
|
||||
|
||||
/* Number of primary audio channels */
|
||||
put_bits(&c->pb, 3, c->prim_channels - 1);
|
||||
|
||||
/* Subband activity count */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
put_bits(&c->pb, 5, DCA_SUBBANDS - 2);
|
||||
|
||||
/* High frequency VQ start subband */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
put_bits(&c->pb, 5, DCA_SUBBANDS - 1);
|
||||
|
||||
/* Joint intensity coding index: 0, 0 */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
put_bits(&c->pb, 3, 0);
|
||||
|
||||
/* Transient mode codebook: A4, A4 (arbitrary) */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
put_bits(&c->pb, 2, 0);
|
||||
|
||||
/* Scale factor code book: 7 bit linear, 7-bit sqrt table (for each channel) */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
put_bits(&c->pb, 3, 6);
|
||||
|
||||
/* Bit allocation quantizer select: linear 5-bit */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
put_bits(&c->pb, 3, 6);
|
||||
|
||||
/* Quantization index codebook select: dummy data
|
||||
to avoid transmission of scale factor adjustment */
|
||||
|
||||
for (i = 1; i < 11; i++)
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
put_bits(&c->pb, bitlen[i], thr[i]);
|
||||
|
||||
/* Scale factor adjustment index: not transmitted */
|
||||
}
|
||||
|
||||
/**
|
||||
* 8-23 bits quantization
|
||||
* @param sample
|
||||
* @param bits
|
||||
*/
|
||||
static inline uint32_t quantize(int32_t sample, int bits)
|
||||
{
|
||||
av_assert0(sample < 1 << (bits - 1));
|
||||
av_assert0(sample >= -(1 << (bits - 1)));
|
||||
sample &= sample & ((1 << bits) - 1);
|
||||
return sample;
|
||||
}
|
||||
|
||||
static inline int find_scale_factor7(int64_t max_value, int bits)
|
||||
{
|
||||
int i = 0, j = 128, q;
|
||||
max_value = ((max_value << 15) / lossy_quant[bits + 3]) >> (bits - 1);
|
||||
while (i < j) {
|
||||
q = (i + j) >> 1;
|
||||
if (max_value < scale_factor_quant7[q])
|
||||
j = q;
|
||||
else
|
||||
i = q + 1;
|
||||
}
|
||||
av_assert1(i < 128);
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline void put_sample7(DCAContext *c, int64_t sample, int bits,
|
||||
int scale_factor)
|
||||
{
|
||||
sample = (sample << 15) / ((int64_t) lossy_quant[bits + 3] * scale_factor_quant7[scale_factor]);
|
||||
put_bits(&c->pb, bits, quantize((int) sample, bits));
|
||||
}
|
||||
|
||||
static void put_subframe(DCAContext *c,
|
||||
int32_t subband_data[8 * SUBSUBFRAMES][MAX_CHANNELS][32],
|
||||
int subframe)
|
||||
{
|
||||
int i, sub, ss, ch, max_value;
|
||||
int32_t *lfe_data = c->lfe_data + 4 * SUBSUBFRAMES * subframe;
|
||||
|
||||
/* Subsubframes count */
|
||||
put_bits(&c->pb, 2, SUBSUBFRAMES -1);
|
||||
|
||||
/* Partial subsubframe sample count: dummy */
|
||||
put_bits(&c->pb, 3, 0);
|
||||
|
||||
/* Prediction mode: no ADPCM, in each channel and subband */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
||||
put_bits(&c->pb, 1, 0);
|
||||
|
||||
/* Prediction VQ addres: not transmitted */
|
||||
/* Bit allocation index */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
||||
put_bits(&c->pb, 5, QUANTIZER_BITS+3);
|
||||
|
||||
if (SUBSUBFRAMES > 1) {
|
||||
/* Transition mode: none for each channel and subband */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
||||
put_bits(&c->pb, 1, 0); /* codebook A4 */
|
||||
}
|
||||
|
||||
/* Determine scale_factor */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
for (sub = 0; sub < DCA_SUBBANDS; sub++) {
|
||||
max_value = 0;
|
||||
for (i = 0; i < 8 * SUBSUBFRAMES; i++)
|
||||
max_value = FFMAX(max_value, FFABS(subband_data[i][ch][sub]));
|
||||
c->scale_factor[ch][sub] = find_scale_factor7(max_value, QUANTIZER_BITS);
|
||||
}
|
||||
|
||||
if (c->lfe_channel) {
|
||||
max_value = 0;
|
||||
for (i = 0; i < 4 * SUBSUBFRAMES; i++)
|
||||
max_value = FFMAX(max_value, FFABS(lfe_data[i]));
|
||||
c->lfe_scale_factor = find_scale_factor7(max_value, LFE_BITS);
|
||||
}
|
||||
|
||||
/* Scale factors: the same for each channel and subband,
|
||||
encoded according to Table D.1.2 */
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
||||
put_bits(&c->pb, 7, c->scale_factor[ch][sub]);
|
||||
|
||||
/* Joint subband scale factor codebook select: not transmitted */
|
||||
/* Scale factors for joint subband coding: not transmitted */
|
||||
/* Stereo down-mix coefficients: not transmitted */
|
||||
/* Dynamic range coefficient: not transmitted */
|
||||
/* Stde information CRC check word: not transmitted */
|
||||
/* VQ encoded high frequency subbands: not transmitted */
|
||||
|
||||
/* LFE data */
|
||||
if (c->lfe_channel) {
|
||||
for (i = 0; i < 4 * SUBSUBFRAMES; i++)
|
||||
put_sample7(c, lfe_data[i], LFE_BITS, c->lfe_scale_factor);
|
||||
put_bits(&c->pb, 8, c->lfe_scale_factor);
|
||||
}
|
||||
|
||||
/* Audio data (subsubframes) */
|
||||
|
||||
for (ss = 0; ss < SUBSUBFRAMES ; ss++)
|
||||
for (ch = 0; ch < c->prim_channels; ch++)
|
||||
for (sub = 0; sub < DCA_SUBBANDS; sub++)
|
||||
for (i = 0; i < 8; i++)
|
||||
put_sample7(c, subband_data[ss * 8 + i][ch][sub], QUANTIZER_BITS, c->scale_factor[ch][sub]);
|
||||
|
||||
/* DSYNC */
|
||||
put_bits(&c->pb, 16, 0xffff);
|
||||
}
|
||||
|
||||
static void put_frame(DCAContext *c,
|
||||
int32_t subband_data[PCM_SAMPLES][MAX_CHANNELS][32],
|
||||
uint8_t *frame)
|
||||
{
|
||||
int i;
|
||||
init_put_bits(&c->pb, frame + DCA_HEADER_SIZE, DCA_MAX_FRAME_SIZE-DCA_HEADER_SIZE);
|
||||
|
||||
put_primary_audio_header(c);
|
||||
for (i = 0; i < SUBFRAMES; i++)
|
||||
put_subframe(c, &subband_data[SUBSUBFRAMES * 8 * i], i);
|
||||
|
||||
flush_put_bits(&c->pb);
|
||||
c->frame_size = (put_bits_count(&c->pb) >> 3) + DCA_HEADER_SIZE;
|
||||
|
||||
init_put_bits(&c->pb, frame, DCA_HEADER_SIZE);
|
||||
put_frame_header(c);
|
||||
flush_put_bits(&c->pb);
|
||||
}
|
||||
|
||||
static int encode_frame(AVCodecContext *avctx, uint8_t *frame,
|
||||
int buf_size, void *data)
|
||||
{
|
||||
int i, k, channel;
|
||||
DCAContext *c = avctx->priv_data;
|
||||
int16_t *samples = data;
|
||||
int real_channel = 0;
|
||||
|
||||
for (i = 0; i < PCM_SAMPLES; i ++) { /* i is the decimated sample number */
|
||||
for (channel = 0; channel < c->prim_channels + 1; channel++) {
|
||||
/* Get 32 PCM samples */
|
||||
for (k = 0; k < 32; k++) { /* k is the sample number in a 32-sample block */
|
||||
c->pcm[k] = samples[avctx->channels * (32 * i + k) + channel] << 16;
|
||||
}
|
||||
/* Put subband samples into the proper place */
|
||||
real_channel = c->channel_order_tab[channel];
|
||||
if (real_channel >= 0) {
|
||||
qmf_decompose(c, c->pcm, &c->subband[i][real_channel][0], real_channel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (c->lfe_channel) {
|
||||
for (i = 0; i < PCM_SAMPLES / 2; i++) {
|
||||
for (k = 0; k < LFE_INTERPOLATION; k++) /* k is the sample number in a 32-sample block */
|
||||
c->pcm[k] = samples[avctx->channels * (LFE_INTERPOLATION*i+k) + c->lfe_offset] << 16;
|
||||
c->lfe_data[i] = lfe_downsample(c, c->pcm);
|
||||
}
|
||||
}
|
||||
|
||||
put_frame(c, c->subband, frame);
|
||||
|
||||
return c->frame_size;
|
||||
}
|
||||
|
||||
static int encode_init(AVCodecContext *avctx)
|
||||
{
|
||||
DCAContext *c = avctx->priv_data;
|
||||
int i;
|
||||
|
||||
c->prim_channels = avctx->channels;
|
||||
c->lfe_channel = (avctx->channels == 3 || avctx->channels == 6);
|
||||
|
||||
switch (avctx->channel_layout) {
|
||||
case AV_CH_LAYOUT_STEREO: c->a_mode = 2; c->num_channel = 2; break;
|
||||
case AV_CH_LAYOUT_5POINT0: c->a_mode = 9; c->num_channel = 9; break;
|
||||
case AV_CH_LAYOUT_5POINT1: c->a_mode = 9; c->num_channel = 9; break;
|
||||
case AV_CH_LAYOUT_5POINT0_BACK: c->a_mode = 9; c->num_channel = 9; break;
|
||||
case AV_CH_LAYOUT_5POINT1_BACK: c->a_mode = 9; c->num_channel = 9; break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Only stereo, 5.0, 5.1 channel layouts supported at the moment!\n");
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
|
||||
if (c->lfe_channel) {
|
||||
init_lfe_fir();
|
||||
c->prim_channels--;
|
||||
c->channel_order_tab = dca_channel_reorder_lfe[c->a_mode];
|
||||
c->lfe_state = LFE_PRESENT;
|
||||
c->lfe_offset = dca_lfe_index[c->a_mode];
|
||||
} else {
|
||||
c->channel_order_tab = dca_channel_reorder_nolfe[c->a_mode];
|
||||
c->lfe_state = LFE_MISSING;
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
if (dca_sample_rates[i] && (dca_sample_rates[i] == avctx->sample_rate))
|
||||
break;
|
||||
}
|
||||
if (i == 16) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Sample rate %iHz not supported, only ", avctx->sample_rate);
|
||||
for (i = 0; i < 16; i++)
|
||||
av_log(avctx, AV_LOG_ERROR, "%d, ", dca_sample_rates[i]);
|
||||
av_log(avctx, AV_LOG_ERROR, "supported.\n");
|
||||
return -1;
|
||||
}
|
||||
c->sample_rate_code = i;
|
||||
|
||||
avctx->frame_size = 32 * PCM_SAMPLES;
|
||||
|
||||
if (!cos_table[127])
|
||||
qmf_init();
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVCodec ff_dca_encoder = {
|
||||
.name = "dca",
|
||||
.type = AVMEDIA_TYPE_AUDIO,
|
||||
.id = CODEC_ID_DTS,
|
||||
.priv_data_size = sizeof(DCAContext),
|
||||
.init = encode_init,
|
||||
.encode = encode_frame,
|
||||
.capabilities = CODEC_CAP_EXPERIMENTAL,
|
||||
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
|
||||
};
|
544
libavcodec/dcaenc.h
Normal file
544
libavcodec/dcaenc.h
Normal file
@ -0,0 +1,544 @@
|
||||
/*
|
||||
* DCA encoder tables
|
||||
* Copyright (C) 2008 Alexander E. Patrakov
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_DCAENC_H
|
||||
#define AVCODEC_DCAENC_H
|
||||
|
||||
/* This is a scaled version of the response of the reference decoder to
|
||||
this vector of subband samples: ( 1.0 0.0 0.0 ... 0.0 )
|
||||
*/
|
||||
|
||||
static const int32_t UnQMF[512] = {
|
||||
7,
|
||||
4,
|
||||
-961,
|
||||
-2844,
|
||||
-8024,
|
||||
-18978,
|
||||
-32081,
|
||||
-15635,
|
||||
-16582,
|
||||
-18359,
|
||||
-17180,
|
||||
-14868,
|
||||
-11664,
|
||||
-8051,
|
||||
-4477,
|
||||
-1327,
|
||||
-1670,
|
||||
-6019,
|
||||
-11590,
|
||||
-18030,
|
||||
-24762,
|
||||
-30965,
|
||||
-35947,
|
||||
-36145,
|
||||
-37223,
|
||||
-86311,
|
||||
-57024,
|
||||
-27215,
|
||||
-11274,
|
||||
-4684,
|
||||
42,
|
||||
108,
|
||||
188,
|
||||
250,
|
||||
-1007,
|
||||
-596,
|
||||
-2289,
|
||||
-12218,
|
||||
-27191,
|
||||
-124367,
|
||||
-184256,
|
||||
-250538,
|
||||
-323499,
|
||||
-397784,
|
||||
-468855,
|
||||
-532072,
|
||||
-583000,
|
||||
-618041,
|
||||
-777916,
|
||||
-783868,
|
||||
-765968,
|
||||
-724740,
|
||||
-662468,
|
||||
-583058,
|
||||
-490548,
|
||||
-401623,
|
||||
-296090,
|
||||
-73154,
|
||||
-36711,
|
||||
-7766,
|
||||
-2363,
|
||||
-4905,
|
||||
2388,
|
||||
2681,
|
||||
5651,
|
||||
4086,
|
||||
71110,
|
||||
139742,
|
||||
188067,
|
||||
151237,
|
||||
101355,
|
||||
309917,
|
||||
343690,
|
||||
358839,
|
||||
357555,
|
||||
334606,
|
||||
289625,
|
||||
224152,
|
||||
142063,
|
||||
48725,
|
||||
74996,
|
||||
238425,
|
||||
411666,
|
||||
584160,
|
||||
744276,
|
||||
880730,
|
||||
983272,
|
||||
1041933,
|
||||
1054396,
|
||||
789531,
|
||||
851022,
|
||||
864032,
|
||||
675431,
|
||||
418134,
|
||||
35762,
|
||||
66911,
|
||||
103502,
|
||||
136403,
|
||||
-55147,
|
||||
-245269,
|
||||
-499595,
|
||||
-808470,
|
||||
-1136858,
|
||||
-2010912,
|
||||
-2581654,
|
||||
-3151901,
|
||||
-3696328,
|
||||
-4196599,
|
||||
-4633761,
|
||||
-4993229,
|
||||
-5262495,
|
||||
-5436311,
|
||||
-477650,
|
||||
-901314,
|
||||
-1308090,
|
||||
-1677468,
|
||||
-1985525,
|
||||
-2212848,
|
||||
-2341196,
|
||||
-2373915,
|
||||
-2269552,
|
||||
-2620489,
|
||||
-2173858,
|
||||
-1629954,
|
||||
-946595,
|
||||
-193499,
|
||||
1119459,
|
||||
1138657,
|
||||
1335311,
|
||||
1126544,
|
||||
2765033,
|
||||
3139603,
|
||||
3414913,
|
||||
3599213,
|
||||
3676363,
|
||||
3448981,
|
||||
3328726,
|
||||
3111551,
|
||||
2810887,
|
||||
2428657,
|
||||
1973684,
|
||||
1457278,
|
||||
893848,
|
||||
300995,
|
||||
-292521,
|
||||
-867621,
|
||||
-1404936,
|
||||
-1871278,
|
||||
-2229831,
|
||||
-2440932,
|
||||
-2462684,
|
||||
-2255006,
|
||||
-1768898,
|
||||
-1079574,
|
||||
82115,
|
||||
1660302,
|
||||
3660715,
|
||||
6123610,
|
||||
8329598,
|
||||
11888744,
|
||||
15722147,
|
||||
19737089,
|
||||
25647773,
|
||||
31039399,
|
||||
36868007,
|
||||
43124253,
|
||||
49737161,
|
||||
56495958,
|
||||
63668945,
|
||||
71039511,
|
||||
78540240,
|
||||
86089058,
|
||||
93600041,
|
||||
100981151,
|
||||
108136061,
|
||||
114970055,
|
||||
121718321,
|
||||
127566038,
|
||||
132774642,
|
||||
137247294,
|
||||
140894737,
|
||||
143635018,
|
||||
145395599,
|
||||
146114032,
|
||||
145742999,
|
||||
144211606,
|
||||
141594341,
|
||||
137808404,
|
||||
132914122,
|
||||
126912246,
|
||||
120243281,
|
||||
112155281,
|
||||
103338368,
|
||||
93904953,
|
||||
83439152,
|
||||
72921548,
|
||||
62192990,
|
||||
51434918,
|
||||
40894003,
|
||||
30786726,
|
||||
21384955,
|
||||
12939112,
|
||||
5718193,
|
||||
-5790,
|
||||
-3959261,
|
||||
-5870978,
|
||||
-5475538,
|
||||
-2517061,
|
||||
3247310,
|
||||
12042937,
|
||||
24076729,
|
||||
39531397,
|
||||
58562863,
|
||||
81297002,
|
||||
107826748,
|
||||
138209187,
|
||||
172464115,
|
||||
210569037,
|
||||
252468018,
|
||||
298045453,
|
||||
347168648,
|
||||
399634888,
|
||||
455137189,
|
||||
513586535,
|
||||
574537650,
|
||||
637645129,
|
||||
702597163,
|
||||
768856566,
|
||||
836022040,
|
||||
903618096,
|
||||
971159680,
|
||||
1038137214,
|
||||
1103987353,
|
||||
1168195035,
|
||||
1230223053,
|
||||
1289539180,
|
||||
1345620373,
|
||||
1397957958,
|
||||
1446063657,
|
||||
1489474689,
|
||||
1527740502,
|
||||
1560502307,
|
||||
1587383079,
|
||||
1608071145,
|
||||
1622301248,
|
||||
1629859340,
|
||||
1630584888,
|
||||
1624373875,
|
||||
1611178348,
|
||||
1591018893,
|
||||
1563948667,
|
||||
1530105004,
|
||||
1489673227,
|
||||
1442904075,
|
||||
1390107674,
|
||||
1331590427,
|
||||
1267779478,
|
||||
1199115126,
|
||||
1126053392,
|
||||
1049146257,
|
||||
968928307,
|
||||
885965976,
|
||||
800851610,
|
||||
714186243,
|
||||
626590147,
|
||||
538672486,
|
||||
451042824,
|
||||
364299927,
|
||||
279026812,
|
||||
195785029,
|
||||
115109565,
|
||||
37503924,
|
||||
-36564551,
|
||||
-106668063,
|
||||
-172421668,
|
||||
-233487283,
|
||||
-289575706,
|
||||
-340448569,
|
||||
-385919511,
|
||||
-425854915,
|
||||
-460174578,
|
||||
-488840702,
|
||||
-511893328,
|
||||
-529405118,
|
||||
-541489888,
|
||||
-548312207,
|
||||
-550036471,
|
||||
-547005316,
|
||||
-539436808,
|
||||
-527630488,
|
||||
-512084785,
|
||||
-492941605,
|
||||
-470665204,
|
||||
-445668379,
|
||||
-418328829,
|
||||
-389072810,
|
||||
-358293846,
|
||||
-326396227,
|
||||
-293769619,
|
||||
-260792276,
|
||||
-227825056,
|
||||
-195208961,
|
||||
-163262121,
|
||||
-132280748,
|
||||
-102533727,
|
||||
-74230062,
|
||||
-47600637,
|
||||
-22817785,
|
||||
-25786,
|
||||
20662895,
|
||||
39167253,
|
||||
55438413,
|
||||
69453741,
|
||||
81242430,
|
||||
90795329,
|
||||
98213465,
|
||||
103540643,
|
||||
106917392,
|
||||
108861938,
|
||||
108539682,
|
||||
106780704,
|
||||
103722568,
|
||||
99043289,
|
||||
93608686,
|
||||
87266209,
|
||||
80212203,
|
||||
72590022,
|
||||
64603428,
|
||||
56362402,
|
||||
48032218,
|
||||
39749162,
|
||||
31638971,
|
||||
23814664,
|
||||
16376190,
|
||||
9409836,
|
||||
2988017,
|
||||
-2822356,
|
||||
-7976595,
|
||||
-12454837,
|
||||
-16241147,
|
||||
-19331944,
|
||||
-21735011,
|
||||
-23468284,
|
||||
-24559822,
|
||||
-25042936,
|
||||
-25035583,
|
||||
-24429587,
|
||||
-23346408,
|
||||
-21860411,
|
||||
-20015718,
|
||||
-17025330,
|
||||
-14968728,
|
||||
-12487138,
|
||||
-9656319,
|
||||
-7846681,
|
||||
-5197816,
|
||||
-2621904,
|
||||
-144953,
|
||||
2144746,
|
||||
3990570,
|
||||
5845884,
|
||||
7454650,
|
||||
8820394,
|
||||
9929891,
|
||||
10784445,
|
||||
11390921,
|
||||
11762056,
|
||||
11916017,
|
||||
12261189,
|
||||
12117604,
|
||||
11815303,
|
||||
11374622,
|
||||
10815301,
|
||||
10157241,
|
||||
9418799,
|
||||
8629399,
|
||||
7780776,
|
||||
7303680,
|
||||
6353499,
|
||||
5392738,
|
||||
4457895,
|
||||
3543062,
|
||||
1305978,
|
||||
1402521,
|
||||
1084092,
|
||||
965652,
|
||||
-151008,
|
||||
-666667,
|
||||
-1032157,
|
||||
-1231475,
|
||||
-1319043,
|
||||
-1006023,
|
||||
-915720,
|
||||
-773426,
|
||||
-612377,
|
||||
-445864,
|
||||
-291068,
|
||||
-161337,
|
||||
-66484,
|
||||
-11725,
|
||||
133453,
|
||||
388184,
|
||||
615856,
|
||||
804033,
|
||||
942377,
|
||||
1022911,
|
||||
1041247,
|
||||
995854,
|
||||
891376,
|
||||
572246,
|
||||
457992,
|
||||
316365,
|
||||
172738,
|
||||
43037,
|
||||
-117662,
|
||||
-98542,
|
||||
-70279,
|
||||
-41458,
|
||||
-535790,
|
||||
-959038,
|
||||
-1364456,
|
||||
-1502265,
|
||||
-1568530,
|
||||
-2378681,
|
||||
-2701111,
|
||||
-2976407,
|
||||
-3182552,
|
||||
-3314415,
|
||||
-3366600,
|
||||
-3337701,
|
||||
-3232252,
|
||||
-3054999,
|
||||
1984841,
|
||||
1925903,
|
||||
1817377,
|
||||
1669153,
|
||||
1490069,
|
||||
1292040,
|
||||
1086223,
|
||||
890983,
|
||||
699163,
|
||||
201358,
|
||||
266971,
|
||||
296990,
|
||||
198419,
|
||||
91119,
|
||||
4737,
|
||||
5936,
|
||||
2553,
|
||||
2060,
|
||||
-3828,
|
||||
-1664,
|
||||
-4917,
|
||||
-20796,
|
||||
-36822,
|
||||
-131247,
|
||||
-154923,
|
||||
-162055,
|
||||
-161354,
|
||||
-148762,
|
||||
-125754,
|
||||
-94473,
|
||||
-57821,
|
||||
-19096,
|
||||
15172,
|
||||
43004,
|
||||
65624,
|
||||
81354,
|
||||
89325,
|
||||
89524,
|
||||
82766,
|
||||
71075,
|
||||
55128,
|
||||
13686,
|
||||
6921,
|
||||
1449,
|
||||
420,
|
||||
785,
|
||||
-215,
|
||||
-179,
|
||||
-113,
|
||||
-49,
|
||||
6002,
|
||||
16007,
|
||||
42978,
|
||||
100662,
|
||||
171472,
|
||||
83975,
|
||||
93702,
|
||||
108813,
|
||||
111893,
|
||||
110272,
|
||||
103914,
|
||||
93973,
|
||||
81606,
|
||||
68041,
|
||||
-54058,
|
||||
-60695,
|
||||
-65277,
|
||||
-67224,
|
||||
-66213,
|
||||
-62082,
|
||||
-55574,
|
||||
-42988,
|
||||
-35272,
|
||||
-63735,
|
||||
-33501,
|
||||
-12671,
|
||||
-4038,
|
||||
-1232,
|
||||
5,
|
||||
7
|
||||
};
|
||||
|
||||
#endif /* AVCODEC_DCAENC_H */
|
Loading…
x
Reference in New Issue
Block a user