📄 parse.c
字号:
/* Audio header CRC check */
bitstream_get (state, 16);
}
state->current_subframe = 0;
state->current_subsubframe = 0;
return 0;
}
static int dts_subframe_header (dts_state_t * state)
{
/* Primary audio coding side information */
int j, k;
/* Subsubframe count */
state->subsubframes = bitstream_get (state, 2) + 1;
#ifdef DEBUG
fprintf (stderr, "subsubframes: %i\n", state->subsubframes);
#endif
/* Partial subsubframe sample count */
state->partial_samples = bitstream_get (state, 3);
#ifdef DEBUG
fprintf (stderr, "partial samples: %i\n", state->partial_samples);
#endif
/* Get prediction mode for each subband */
for (j = 0; j < state->prim_channels; j++)
{
for (k = 0; k < state->subband_activity[j]; k++)
state->prediction_mode[j][k] = bitstream_get (state, 1);
#ifdef DEBUG
fprintf (stderr, "prediction mode:");
for (k = 0; k < state->subband_activity[j]; k++)
fprintf (stderr, " %i", state->prediction_mode[j][k]);
fprintf (stderr, "\n");
#endif
}
/* Get prediction codebook */
for (j = 0; j < state->prim_channels; j++)
{
for (k = 0; k < state->subband_activity[j]; k++)
{
if (state->prediction_mode[j][k] > 0)
{
/* (Prediction coefficient VQ address) */
state->prediction_vq[j][k] = bitstream_get (state, 12);
#ifdef DEBUG
fprintf (stderr, "prediction coefs: %f, %f, %f, %f\n",
(double)adpcm_vb[state->prediction_vq[j][k]][0]/8192,
(double)adpcm_vb[state->prediction_vq[j][k]][1]/8192,
(double)adpcm_vb[state->prediction_vq[j][k]][2]/8192,
(double)adpcm_vb[state->prediction_vq[j][k]][3]/8192);
#endif
}
}
}
/* Bit allocation index */
for (j = 0; j < state->prim_channels; j++)
{
for (k = 0; k < state->vq_start_subband[j]; k++)
{
if (state->bitalloc_huffman[j] == 6)
state->bitalloc[j][k] = bitstream_get (state, 5);
else if (state->bitalloc_huffman[j] == 5)
state->bitalloc[j][k] = bitstream_get (state, 4);
else
{
state->bitalloc[j][k] = InverseQ (state,
bitalloc_12[state->bitalloc_huffman[j]]);
}
if (state->bitalloc[j][k] > 26)
{
fprintf (stderr, "bitalloc index [%i][%i] too big (%i)\n",
j, k, state->bitalloc[j][k]);
return -1;
}
}
#ifdef DEBUG
fprintf (stderr, "bitalloc index: ");
for (k = 0; k < state->vq_start_subband[j]; k++)
fprintf (stderr, "%2.2i ", state->bitalloc[j][k]);
fprintf (stderr, "\n");
#endif
}
/* Transition mode */
for (j = 0; j < state->prim_channels; j++)
{
for (k = 0; k < state->subband_activity[j]; k++)
{
state->transition_mode[j][k] = 0;
if (state->subsubframes > 1 &&
k < state->vq_start_subband[j] &&
state->bitalloc[j][k] > 0)
{
state->transition_mode[j][k] = InverseQ (state,
tmode[state->transient_huffman[j]]);
}
}
#ifdef DEBUG
fprintf (stderr, "Transition mode:");
for (k = 0; k < state->subband_activity[j]; k++)
fprintf (stderr, " %i", state->transition_mode[j][k]);
fprintf (stderr, "\n");
#endif
}
/* Scale factors */
for (j = 0; j < state->prim_channels; j++)
{
int *scale_table;
int scale_sum;
for (k = 0; k < state->subband_activity[j]; k++)
{
state->scale_factor[j][k][0] = 0;
state->scale_factor[j][k][1] = 0;
}
if (state->scalefactor_huffman[j] == 6)
scale_table = scale_factor_quant7;
else
scale_table = scale_factor_quant6;
/* When huffman coded, only the difference is encoded */
scale_sum = 0;
for (k = 0; k < state->subband_activity[j]; k++)
{
if (k >= state->vq_start_subband[j] || state->bitalloc[j][k] > 0)
{
if (state->scalefactor_huffman[j] < 5)
{
/* huffman encoded */
scale_sum += InverseQ (state,
scales_129[state->scalefactor_huffman[j]]);
}
else if (state->scalefactor_huffman[j] == 5)
{
scale_sum = bitstream_get (state, 6);
}
else if (state->scalefactor_huffman[j] == 6)
{
scale_sum = bitstream_get (state, 7);
}
state->scale_factor[j][k][0] = scale_table[scale_sum];
}
if (k < state->vq_start_subband[j] && state->transition_mode[j][k])
{
/* Get second scale factor */
if (state->scalefactor_huffman[j] < 5)
{
/* huffman encoded */
scale_sum += InverseQ (state,
scales_129[state->scalefactor_huffman[j]]);
}
else if (state->scalefactor_huffman[j] == 5)
{
scale_sum = bitstream_get (state, 6);
}
else if (state->scalefactor_huffman[j] == 6)
{
scale_sum = bitstream_get (state, 7);
}
state->scale_factor[j][k][1] = scale_table[scale_sum];
}
}
#ifdef DEBUG
fprintf (stderr, "Scale factor:");
for (k = 0; k < state->subband_activity[j]; k++)
{
if (k >= state->vq_start_subband[j] || state->bitalloc[j][k] > 0)
fprintf (stderr, " %i", state->scale_factor[j][k][0]);
if (k < state->vq_start_subband[j] && state->transition_mode[j][k])
fprintf (stderr, " %i(t)", state->scale_factor[j][k][1]);
}
fprintf (stderr, "\n");
#endif
}
/* Joint subband scale factor codebook select */
for (j = 0; j < state->prim_channels; j++)
{
/* Transmitted only if joint subband coding enabled */
if (state->joint_intensity[j] > 0)
state->joint_huff[j] = bitstream_get (state, 3);
}
/* Scale factors for joint subband coding */
for (j = 0; j < state->prim_channels; j++)
{
int source_channel;
/* Transmitted only if joint subband coding enabled */
if (state->joint_intensity[j] > 0)
{
int scale = 0;
source_channel = state->joint_intensity[j] - 1;
/* When huffman coded, only the difference is encoded
* (is this valid as well for joint scales ???) */
for (k = state->subband_activity[j];
k < state->subband_activity[source_channel]; k++)
{
if (state->joint_huff[j] < 5)
{
/* huffman encoded */
scale = InverseQ (state,
scales_129[state->joint_huff[j]]);
}
else if (state->joint_huff[j] == 5)
{
scale = bitstream_get (state, 6);
}
else if (state->joint_huff[j] == 6)
{
scale = bitstream_get (state, 7);
}
scale += 64; /* bias */
state->joint_scale_factor[j][k] = scale;/*joint_scale_table[scale];*/
}
if (!state->debug_flag & 0x02)
{
fprintf (stderr, "Joint stereo coding not supported\n");
state->debug_flag |= 0x02;
}
#ifdef DEBUG
fprintf (stderr, "Joint scale factor index:\n");
for (k = state->subband_activity[j];
k < state->subband_activity[source_channel]; k++)
fprintf (stderr, " %i", state->joint_scale_factor[j][k]);
fprintf (stderr, "\n");
#endif
}
}
/* Stereo downmix coefficients */
if (state->prim_channels > 2 && state->downmix)
{
for (j = 0; j < state->prim_channels; j++)
{
state->downmix_coef[j][0] = bitstream_get (state, 7);
state->downmix_coef[j][1] = bitstream_get (state, 7);
}
}
/* Dynamic range coefficient */
if (state->dynrange) state->dynrange_coef = bitstream_get (state, 8);
/* Side information CRC check word */
if (state->crc_present)
{
bitstream_get (state, 16);
}
/*
* Primary audio data arrays
*/
/* VQ encoded high frequency subbands */
for (j = 0; j < state->prim_channels; j++)
{
for (k = state->vq_start_subband[j];
k < state->subband_activity[j]; k++)
{
/* 1 vector -> 32 samples */
state->high_freq_vq[j][k] = bitstream_get (state, 10);
#ifdef DEBUG
fprintf( stderr, "VQ index: %i\n", state->high_freq_vq[j][k] );
#endif
}
}
/* Low frequency effect data */
if (state->lfe)
{
/* LFE samples */
int lfe_samples = 2 * state->lfe * state->subsubframes;
double lfe_scale;
for (j = lfe_samples; j < lfe_samples * 2; j++)
{
/* Signed 8 bits int */
state->lfe_data[j] =
(signed int)(signed char)bitstream_get (state, 8);
}
/* Scale factor index */
state->lfe_scale_factor =
scale_factor_quant7[bitstream_get (state, 8)];
/* Quantization step size * scale factor */
lfe_scale = 0.035 * state->lfe_scale_factor;
for (j = lfe_samples; j < lfe_samples * 2; j++)
state->lfe_data[j] *= lfe_scale;
#ifdef DEBUG
fprintf (stderr, "LFE samples:\n");
for (j = lfe_samples; j < lfe_samples * 2; j++)
fprintf (stderr, " %f", state->lfe_data[j]);
fprintf (stderr, "\n");
#endif
}
return 0;
}
static int dts_subsubframe (dts_state_t * state)
{
int k, l;
int subsubframe = state->current_subsubframe;
double *quant_step_table;
/* FIXME */
double subband_samples[DTS_PRIM_CHANNELS_MAX][DTS_SUBBANDS][8];
/*
* Audio data
*/
/* Select quantization step size table */
if (state->bit_rate == 0x1f)
quant_step_table = lossless_quant_d;
else
quant_step_table = lossy_quant_d;
for (k = 0; k < state->prim_channels; k++)
{
for (l = 0; l < state->vq_start_subband[k] ; l++)
{
int m;
/* Select the mid-tread linear quantizer */
int abits = state->bitalloc[k][l];
double quant_step_size = quant_step_table[abits];
double rscale;
/*
* Determine quantization index code book and its type
*/
/* Select quantization index code book */
int sel = state->quant_index_huffman[k][abits];
/* Determine its type */
int q_type = 1; /* (Assume Huffman type by default) */
if (abits >= 11 || !bitalloc_select[abits][sel])
{
/* Not Huffman type */
if (abits <= 7) q_type = 3; /* Block code */
else q_type = 2; /* No further encoding */
}
if (abits == 0) q_type = 0; /* No bits allocated */
/*
* Extract bits from the bit stream
*/
switch (q_type)
{
case 0: /* No bits allocated */
for (m=0; m<8; m++)
subband_samples[k][l][m] = 0;
break;
case 1: /* Huffman code */
for (m=0; m<8; m++)
subband_samples[k][l][m] =
InverseQ (state, bitalloc_select[abits][sel]);
break;
case 2: /* No further encoding */
for (m=0; m<8; m++)
{
/* Extract (signed) quantization index */
int q_index = bitstream_get (state, abits - 3);
if( q_index & (1 << (abits - 4)) )
{
q_index = (1 << (abits - 3)) - q_index;
q_index = -q_index;
}
subband_samples[k][l][m] = q_index;
}
break;
case 3: /* Block code */
{
int block_code1, block_code2, size, levels;
int block[8];
switch (abits)
{
case 1:
size = 7;
levels = 3;
break;
case 2:
size = 10;
levels = 5;
break;
case 3:
size = 12;
levels = 7;
break;
case 4:
size = 13;
levels = 9;
break;
case 5:
size = 15;
levels = 13;
break;
case 6:
size = 17;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -