📄 mpc_dec.cpp
字号:
*ResL = Q_res[n][Huffman_Decode(Table)]; if (MS_used) MS_Flag[n] = Bitstream_read(1); *ResR = Q_res[n][Huffman_Decode(Table)]; // only perform the following procedure up to the maximum non-zero subband if (*ResL || *ResR) Max_used_Band = n; } /************************* SCFI-Bundle *****************************/ ResL = Res_L; ResR = Res_R; for (n=0; n<=Max_used_Band; ++n, ++ResL, ++ResR) { if (*ResL) SCFI_Bundle_read(SCFI_Bundle, &SCFI_L[n], &DSCF_Flag_L[n]); if (*ResR) SCFI_Bundle_read(SCFI_Bundle, &SCFI_R[n], &DSCF_Flag_R[n]); } /***************************** SCFI ********************************/ ResL = Res_L; ResR = Res_R; L = SCF_Index_L[0]; R = SCF_Index_R[0]; for (n=0; n<=Max_used_Band; ++n, ++ResL, ++ResR, L+=3, R+=3) { if (*ResL) { /*********** DSCF ************/ if (DSCF_Flag_L[n]==1) { L[2] = DSCF_Reference_L[n]; switch (SCFI_L[n]) { case 3: L[0] = L[2] + Huffman_Decode_fast(DSCF_Entropie); L[1] = L[0]; L[2] = L[1]; break; case 1: L[0] = L[2] + Huffman_Decode_fast(DSCF_Entropie); L[1] = L[0] + Huffman_Decode_fast(DSCF_Entropie); L[2] = L[1]; break; case 2: L[0] = L[2] + Huffman_Decode_fast(DSCF_Entropie); L[1] = L[0]; L[2] = L[1] + Huffman_Decode_fast(DSCF_Entropie); break; case 0: L[0] = L[2] + Huffman_Decode_fast(DSCF_Entropie); L[1] = L[0] + Huffman_Decode_fast(DSCF_Entropie); L[2] = L[1] + Huffman_Decode_fast(DSCF_Entropie); break; default: return; break; } } /************ SCF ************/ else { switch (SCFI_L[n]) { case 3: L[0] = Bitstream_read(6); L[1] = L[0]; L[2] = L[1]; break; case 1: L[0] = Bitstream_read(6); L[1] = Bitstream_read(6); L[2] = L[1]; break; case 2: L[0] = Bitstream_read(6); L[1] = L[0]; L[2] = Bitstream_read(6); break; case 0: L[0] = Bitstream_read(6); L[1] = Bitstream_read(6); L[2] = Bitstream_read(6); break; default: return; break; } } // update Reference for DSCF DSCF_Reference_L[n] = L[2]; } if (*ResR) { R[2] = DSCF_Reference_R[n]; /*********** DSCF ************/ if (DSCF_Flag_R[n]==1) { switch (SCFI_R[n]) { case 3: R[0] = R[2] + Huffman_Decode_fast(DSCF_Entropie); R[1] = R[0]; R[2] = R[1]; break; case 1: R[0] = R[2] + Huffman_Decode_fast(DSCF_Entropie); R[1] = R[0] + Huffman_Decode_fast(DSCF_Entropie); R[2] = R[1]; break; case 2: R[0] = R[2] + Huffman_Decode_fast(DSCF_Entropie); R[1] = R[0]; R[2] = R[1] + Huffman_Decode_fast(DSCF_Entropie); break; case 0: R[0] = R[2] + Huffman_Decode_fast(DSCF_Entropie); R[1] = R[0] + Huffman_Decode_fast(DSCF_Entropie); R[2] = R[1] + Huffman_Decode_fast(DSCF_Entropie); break; default: return; break; } } /************ SCF ************/ else { switch (SCFI_R[n]) { case 3: R[0] = Bitstream_read(6); R[1] = R[0]; R[2] = R[1]; break; case 1: R[0] = Bitstream_read(6); R[1] = Bitstream_read(6); R[2] = R[1]; break; case 2: R[0] = Bitstream_read(6); R[1] = R[0]; R[2] = Bitstream_read(6); break; case 0: R[0] = Bitstream_read(6); R[1] = Bitstream_read(6); R[2] = Bitstream_read(6); break; default: return; break; } } // update Reference for DSCF DSCF_Reference_R[n] = R[2]; } } /**************************** Samples ****************************/ ResL = Res_L; ResR = Res_R; for (n=0; n<=Max_used_Band; ++n, ++ResL, ++ResR) { // setting pointers x1 = SampleHuff[*ResL]; x2 = SampleHuff[*ResR]; L = Q[n].L; R = Q[n].R; if (x1!=NULL || x2!=NULL) for (k=0; k<36; ++k) { if (x1 != NULL) *L++ = Huffman_Decode_fast (x1); if (x2 != NULL) *R++ = Huffman_Decode_fast (x2); } if (*ResL>7 || *ResR>7) for (k=0; k<36; ++k) { if (*ResL>7) *L++ = (mpc_int32_t)Bitstream_read(Res_bit[*ResL]) - Dc[*ResL]; if (*ResR>7) *R++ = (mpc_int32_t)Bitstream_read(Res_bit[*ResR]) - Dc[*ResR]; } }}/****************************************** SV 7 ******************************************/voidMPC_decoder::Lese_Bitstrom_SV7 ( void ){ // these arrays hold decoding results for bundled quantizers (3- and 5-step) /*static*/ 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*/ 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*/ 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*/ 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*/ 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 = Res_L; ResR = Res_R; // first subband *ResL = Bitstream_read(4); *ResR = Bitstream_read(4); if (MS_used && !(*ResL==0 && *ResR==0)) MS_Flag[0] = Bitstream_read(1); // consecutive subbands ++ResL; ++ResR; // increase pointers for (n=1; n<=Max_Band; ++n, ++ResL, ++ResR) { idx = Huffman_Decode_fast(HuffHdr); *ResL = (idx!=4) ? *(ResL-1) + idx : Bitstream_read(4); idx = Huffman_Decode_fast(HuffHdr); *ResR = (idx!=4) ? *(ResR-1) + idx : Bitstream_read(4); if (MS_used && !(*ResL==0 && *ResR==0)) MS_Flag[n] = Bitstream_read(1); // only perform following procedures up to the maximum non-zero subband if (*ResL!=0 || *ResR!=0) Max_used_Band = n; } /****************************** SCFI ******************************/ L = SCFI_L; R = SCFI_R; ResL = Res_L; ResR = Res_R; for (n=0; n<=Max_used_Band; ++n, ++L, ++R, ++ResL, ++ResR) { if (*ResL) *L = Huffman_Decode_faster(HuffSCFI); if (*ResR) *R = Huffman_Decode_faster(HuffSCFI); } /**************************** SCF/DSCF ****************************/ ResL = Res_L; ResR = Res_R; L = SCF_Index_L[0]; R = SCF_Index_R[0]; for (n=0; n<=Max_used_Band; ++n, ++ResL, ++ResR, L+=3, R+=3) { if (*ResL) { L[2] = DSCF_Reference_L[n]; switch (SCFI_L[n]) { case 1: idx = Huffman_Decode_fast(HuffDSCF); L[0] = (idx!=8) ? L[2] + idx : Bitstream_read(6); idx = Huffman_Decode_fast(HuffDSCF); L[1] = (idx!=8) ? L[0] + idx : Bitstream_read(6); L[2] = L[1]; break; case 3: idx = Huffman_Decode_fast(HuffDSCF); L[0] = (idx!=8) ? L[2] + idx : Bitstream_read(6); L[1] = L[0]; L[2] = L[1]; break; case 2: idx = Huffman_Decode_fast(HuffDSCF); L[0] = (idx!=8) ? L[2] + idx : Bitstream_read(6); L[1] = L[0]; idx = Huffman_Decode_fast(HuffDSCF); L[2] = (idx!=8) ? L[1] + idx : Bitstream_read(6); break; case 0: idx = Huffman_Decode_fast(HuffDSCF); L[0] = (idx!=8) ? L[2] + idx : Bitstream_read(6); idx = Huffman_Decode_fast(HuffDSCF); L[1] = (idx!=8) ? L[0] + idx : Bitstream_read(6); idx = Huffman_Decode_fast(HuffDSCF); L[2] = (idx!=8) ? L[1] + idx : Bitstream_read(6); break; default: return; break; } // update Reference for DSCF DSCF_Reference_L[n] = L[2]; } if (*ResR) { R[2] = DSCF_Reference_R[n]; switch (SCFI_R[n]) { case 1: idx = Huffman_Decode_fast(HuffDSCF); R[0] = (idx!=8) ? R[2] + idx : Bitstream_read(6); idx = Huffman_Decode_fast(HuffDSCF); R[1] = (idx!=8) ? R[0] + idx : Bitstream_read(6); R[2] = R[1]; break; case 3: idx = Huffman_Decode_fast(HuffDSCF); R[0] = (idx!=8) ? R[2] + idx : Bitstream_read(6); R[1] = R[0]; R[2] = R[1]; break; case 2: idx = Huffman_Decode_fast(HuffDSCF); R[0] = (idx!=8) ? R[2] + idx : Bitstream_read(6); R[1] = R[0]; idx = Huffman_Decode_fast(HuffDSCF); R[2] = (idx!=8) ? R[1] + idx : Bitstream_read(6); break; case 0: idx = Huffman_Decode_fast(HuffDSCF); R[0] = (idx!=8) ? R[2] + idx : Bitstream_read(6); idx = Huffman_Decode_fast(HuffDSCF); R[1] = (idx!=8) ? R[0] + idx : Bitstream_read(6); idx = Huffman_Decode_fast(HuffDSCF); R[2] = (idx!=8) ? R[1] + idx : Bitstream_read(6); break; default: return; break; } // update Reference for DSCF DSCF_Reference_R[n] = R[2]; } } /***************************** Samples ****************************/ ResL = Res_L; ResR = Res_R; L = Q[0].L; R = 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 (); *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 = HuffQ[Bitstream_read(1)][1]; for (k=0; k<12; ++k) { idx = Huffman_Decode_fast(Table); *L++ = idx30[idx]; *L++ = idx31[idx]; *L++ = idx32[idx]; } break; case 2: Table = HuffQ[Bitstream_read(1)][2]; for (k=0; k<18; ++k)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -