d439ba15 |
#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))); |