📄 mpc_decoder.c
字号:
L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
L[1] = L[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
L[2] = L[1];
break;
case 2:
L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
L[1] = L[0];
L[2] = L[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
break;
case 0:
L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
L[1] = L[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
L[2] = L[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
break;
default:
return;
break;
}
}
/************ SCF ************/
else
{
switch (d->SCFI_L[n])
{
case 3:
L[0] = mpc_decoder_bitstream_read(d, 6);
L[1] = L[0];
L[2] = L[1];
break;
case 1:
L[0] = mpc_decoder_bitstream_read(d, 6);
L[1] = mpc_decoder_bitstream_read(d, 6);
L[2] = L[1];
break;
case 2:
L[0] = mpc_decoder_bitstream_read(d, 6);
L[1] = L[0];
L[2] = mpc_decoder_bitstream_read(d, 6);
break;
case 0:
L[0] = mpc_decoder_bitstream_read(d, 6);
L[1] = mpc_decoder_bitstream_read(d, 6);
L[2] = mpc_decoder_bitstream_read(d, 6);
break;
default:
return;
break;
}
}
// update Reference for DSCF
d->DSCF_Reference_L[n] = L[2];
}
if (*ResR)
{
R[2] = d->DSCF_Reference_R[n];
/*********** DSCF ************/
if (d->DSCF_Flag_R[n]==1)
{
switch (d->SCFI_R[n])
{
case 3:
R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
R[1] = R[0];
R[2] = R[1];
break;
case 1:
R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
R[1] = R[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
R[2] = R[1];
break;
case 2:
R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
R[1] = R[0];
R[2] = R[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
break;
case 0:
R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
R[1] = R[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
R[2] = R[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
break;
default:
return;
break;
}
}
/************ SCF ************/
else
{
switch (d->SCFI_R[n])
{
case 3:
R[0] = mpc_decoder_bitstream_read(d, 6);
R[1] = R[0];
R[2] = R[1];
break;
case 1:
R[0] = mpc_decoder_bitstream_read(d, 6);
R[1] = mpc_decoder_bitstream_read(d, 6);
R[2] = R[1];
break;
case 2:
R[0] = mpc_decoder_bitstream_read(d, 6);
R[1] = R[0];
R[2] = mpc_decoder_bitstream_read(d, 6);
break;
case 0:
R[0] = mpc_decoder_bitstream_read(d, 6);
R[1] = mpc_decoder_bitstream_read(d, 6);
R[2] = mpc_decoder_bitstream_read(d, 6);
break;
default:
return;
break;
}
}
// update Reference for DSCF
d->DSCF_Reference_R[n] = R[2];
}
}
/**************************** Samples ****************************/
ResL = d->Res_L;
ResR = d->Res_R;
for (n=0; n <= Max_used_Band; ++n, ++ResL, ++ResR)
{
// setting pointers
x1 = d->SampleHuff[*ResL];
x2 = d->SampleHuff[*ResR];
L = d->Q[n].L;
R = d->Q[n].R;
if (x1!=NULL || x2!=NULL)
for (k=0; k<36; ++k)
{
if (x1 != NULL) *L++ = mpc_decoder_huffman_decode_fast(d, x1);
if (x2 != NULL) *R++ = mpc_decoder_huffman_decode_fast(d, x2);
}
if (*ResL>7 || *ResR>7)
for (k=0; k<36; ++k)
{
if (*ResL>7) *L++ = (mpc_int32_t)mpc_decoder_bitstream_read(d, Res_bit[*ResL]) - Dc[*ResL];
if (*ResR>7) *R++ = (mpc_int32_t)mpc_decoder_bitstream_read(d, Res_bit[*ResR]) - Dc[*ResR];
}
}
}
/****************************************** SV 7 ******************************************/
void
mpc_decoder_read_bitstream_sv7(mpc_decoder *d)
{
// these arrays hold decoding results for bundled quantizers (3- and 5-step)
static const mpc_int32_t idx30[] = { -1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1};
static const mpc_int32_t idx31[] = { -1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1};
static const mpc_int32_t idx32[] = { -1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1};
static const mpc_int32_t idx50[] = { -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2};
static const mpc_int32_t idx51[] = { -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2};
mpc_int32_t n,k;
mpc_int32_t Max_used_Band=0;
const HuffmanTyp *Table;
mpc_int32_t idx;
mpc_int32_t *L ,*R;
mpc_int32_t *ResL,*ResR;
mpc_uint32_t tmp;
/***************************** Header *****************************/
ResL = d->Res_L;
ResR = d->Res_R;
// first subband
*ResL = mpc_decoder_bitstream_read(d, 4);
*ResR = mpc_decoder_bitstream_read(d, 4);
if (d->MS_used && !(*ResL==0 && *ResR==0)) {
d->MS_Flag[0] = mpc_decoder_bitstream_read(d, 1);
}
// consecutive subbands
++ResL; ++ResR; // increase pointers
for (n=1; n <= d->Max_Band; ++n, ++ResL, ++ResR)
{
idx = mpc_decoder_huffman_decode_fast(d, d->HuffHdr);
*ResL = (idx!=4) ? *(ResL-1) + idx : mpc_decoder_bitstream_read(d, 4);
idx = mpc_decoder_huffman_decode_fast(d, d->HuffHdr);
*ResR = (idx!=4) ? *(ResR-1) + idx : mpc_decoder_bitstream_read(d, 4);
if (d->MS_used && !(*ResL==0 && *ResR==0)) {
d->MS_Flag[n] = mpc_decoder_bitstream_read(d, 1);
}
// only perform following procedures up to the maximum non-zero subband
if (*ResL!=0 || *ResR!=0) {
Max_used_Band = n;
}
}
/****************************** SCFI ******************************/
L = d->SCFI_L;
R = d->SCFI_R;
ResL = d->Res_L;
ResR = d->Res_R;
for (n=0; n <= Max_used_Band; ++n, ++L, ++R, ++ResL, ++ResR) {
if (*ResL) *L = mpc_decoder_huffman_decode_faster(d, d->HuffSCFI);
if (*ResR) *R = mpc_decoder_huffman_decode_faster(d, d->HuffSCFI);
}
/**************************** SCF/DSCF ****************************/
ResL = d->Res_L;
ResR = d->Res_R;
L = d->SCF_Index_L[0];
R = d->SCF_Index_R[0];
for (n=0; n<=Max_used_Band; ++n, ++ResL, ++ResR, L+=3, R+=3) {
if (*ResL)
{
L[2] = d->DSCF_Reference_L[n];
switch (d->SCFI_L[n])
{
case 1:
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
L[0] = (idx!=8) ? L[2] + idx : mpc_decoder_bitstream_read(d, 6);
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
L[1] = (idx!=8) ? L[0] + idx : mpc_decoder_bitstream_read(d, 6);
L[2] = L[1];
break;
case 3:
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
L[0] = (idx!=8) ? L[2] + idx : mpc_decoder_bitstream_read(d, 6);
L[1] = L[0];
L[2] = L[1];
break;
case 2:
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
L[0] = (idx!=8) ? L[2] + idx : mpc_decoder_bitstream_read(d, 6);
L[1] = L[0];
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
L[2] = (idx!=8) ? L[1] + idx : mpc_decoder_bitstream_read(d, 6);
break;
case 0:
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
L[0] = (idx!=8) ? L[2] + idx : mpc_decoder_bitstream_read(d, 6);
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
L[1] = (idx!=8) ? L[0] + idx : mpc_decoder_bitstream_read(d, 6);
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
L[2] = (idx!=8) ? L[1] + idx : mpc_decoder_bitstream_read(d, 6);
break;
default:
return;
break;
}
// update Reference for DSCF
d->DSCF_Reference_L[n] = L[2];
}
if (*ResR)
{
R[2] = d->DSCF_Reference_R[n];
switch (d->SCFI_R[n])
{
case 1:
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
R[0] = (idx!=8) ? R[2] + idx : mpc_decoder_bitstream_read(d, 6);
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
R[1] = (idx!=8) ? R[0] + idx : mpc_decoder_bitstream_read(d, 6);
R[2] = R[1];
break;
case 3:
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
R[0] = (idx!=8) ? R[2] + idx : mpc_decoder_bitstream_read(d, 6);
R[1] = R[0];
R[2] = R[1];
break;
case 2:
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
R[0] = (idx!=8) ? R[2] + idx : mpc_decoder_bitstream_read(d, 6);
R[1] = R[0];
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
R[2] = (idx!=8) ? R[1] + idx : mpc_decoder_bitstream_read(d, 6);
break;
case 0:
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
R[0] = (idx!=8) ? R[2] + idx : mpc_decoder_bitstream_read(d, 6);
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
R[1] = (idx!=8) ? R[0] + idx : mpc_decoder_bitstream_read(d, 6);
idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
R[2] = (idx!=8) ? R[1] + idx : mpc_decoder_bitstream_read(d, 6);
break;
default:
return;
break;
}
// update Reference for DSCF
d->DSCF_Reference_R[n] = R[2];
}
}
/***************************** Samples ****************************/
ResL = d->Res_L;
ResR = d->Res_R;
L = d->Q[0].L;
R = d->Q[0].R;
for (n=0; n <= Max_used_Band; ++n, ++ResL, ++ResR, L+=36, R+=36)
{
/************** links **************/
switch (*ResL)
{
case -2: case -3: case -4: case -5: case -6: case -7: case -8: case -9:
case -10: case -11: case -12: case -13: case -14: case -15: case -16: case -17:
L += 36;
break;
case -1:
for (k=0; k<36; k++ ) {
tmp = random_int(d);
*L++ = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510;
}
break;
case 0:
L += 36;// increase pointer
break;
case 1:
Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][1];
for (k=0; k<12; ++k)
{
idx = mpc_decoder_huffman_decode_fast(d, Table);
*L++ = idx30[idx];
*L++ = idx31[idx];
*L++ = idx32[idx];
}
break;
case 2:
Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][2];
for (k=0; k<18; ++k)
{
idx = mpc_decoder_huffman_decode_fast(d, Table);
*L++ = idx50[idx];
*L++ = idx51[idx];
}
break;
case 3:
case 4:
Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL];
for (k=0; k<36; ++k)
*L++ = mpc_decoder_huffman_decode_faster(d, Table);
break;
case 5:
Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -