📄 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 ******************************************/voidmpc_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 + -