📄 blkdec.no-opt
字号:
g_pIQOutput [i ^ 1] = rgiCoefQ [i]; } } //save Qcoef in memory for (i = 1, j = 8; i < BLOCK_SIZE; i++, j += BLOCK_SIZE) { pmbmCurr->rgblkm [iBlk - 1] [i] = rgiCoefQ [i]; pmbmCurr->rgblkm [iBlk - 1] [i + BLOCK_SIZE - 1] = rgiCoefQ [j]; }// ~HV - Perf Changes}inline Void decodeTextureInterBlock (Int iQP){// HV - Perf Changes Int* rgiCoefQ = g_pVO->m_rgpiCoefQ [0]; Int* scan = grgiStandardZigzag; int i; int iCoef; scan = (g_pVOP->bAlternateScan) ? grgiVerticalZigzag : grgiStandardZigzag; decodeInterTCOEF (rgiCoefQ, 0, scan);//else don't add error signal // Get the pointer to the block that we need to fill in. Also, custom memset this to 0 ClearBlockDataPointer(nCodedBlocks); // Copy the INTER Weighting Matrices only when we are processing the first block if (!nCodedBlocks) { // Update IQMUL2 g_pHeader0->iqmul2 = iQP; // Update IQDIV3 if (g_pVOL->fQuantizer == Q_MPEG) g_pHeader1->iqdiv3 = 4; // 2 ** 4 = 16 } // Update IQUANT params for MAE // **************************** // Setting up block data here to avoid the function call overhead // inverseQuantizeDCTcoefH263 (rgiCoefQ, 0, iQP); // inverseQuantizeInterDCTcoefMPEG (rgiCoefQ, 0, iQP, bAlphaBlock, iAuxComp ); for (i = 0; i < BLOCK_SQUARE_SIZE; i++) { iCoef = rgiCoefQ [i]; if (iCoef) g_pIQOutput [i ^ 1] = iCoef + iCoef + sign(iCoef); }// ~HV - Perf Changes}inline BlockMemory decideIntraPred (CMBMode* pmbmdCurr, Int *iQPpred, Int blkn, MacroBlockMemory* pmbmLeft, MacroBlockMemory* pmbmTop, MacroBlockMemory* pmbmLeftTop, MacroBlockMemory* pmbmCurr, CMBMode* pmbmdLeft, CMBMode* pmbmdTop,CMBMode* pmbmdLeftTop){ UInt nBits = g_pVOL->nBits; // NBIT Int iQPpredTop, iQPpredLeftTop, iQPpredLeft; BlockMemory blkmRet = NULL; BlockMemory blkmTop; BlockMemory blkmLeftTop; BlockMemory blkmLeft; Int iDefVal = 1<<(nBits+2); // NBIT Int iPredLeftTop, iHorizontalGrad, iVerticalGrad; blkmTop = findPredictorBlock (blkn, VERTICAL, pmbmLeft, pmbmTop, pmbmLeftTop, pmbmCurr, pmbmdLeft, pmbmdTop, pmbmdLeftTop, pmbmdCurr, &iQPpredTop); blkmLeftTop = findPredictorBlock (blkn, DIAGONAL, pmbmLeft, pmbmTop, pmbmLeftTop, pmbmCurr, pmbmdLeft, pmbmdTop, pmbmdLeftTop, pmbmdCurr, &iQPpredLeftTop); blkmLeft = findPredictorBlock (blkn, HORIZONTAL, pmbmLeft, pmbmTop, pmbmLeftTop, pmbmCurr, pmbmdLeft, pmbmdTop, pmbmdLeftTop, pmbmdCurr, &iQPpredLeft); iPredLeftTop = (blkmLeftTop == NULL) ? iDefVal : blkmLeftTop [0]; iHorizontalGrad = ((blkmTop == NULL) ? iDefVal : blkmTop [0]) - iPredLeftTop; iVerticalGrad = ((blkmLeft == NULL) ? iDefVal : blkmLeft [0]) - iPredLeftTop; if (abs(iVerticalGrad) < abs (iHorizontalGrad)) { pmbmdCurr->m_preddir [blkn - 1] = VERTICAL; if (blkmTop != NULL) { blkmRet = (BlockMemory)blkmTop; *iQPpred = iQPpredTop; } } else { pmbmdCurr->m_preddir [blkn - 1] = HORIZONTAL; if (blkmLeft != NULL) { blkmRet = (BlockMemory)blkmLeft; *iQPpred = iQPpredLeft; } } return blkmRet;}#ifdef MP4V_NEW_VLDVoid decodeEscape_Test (Int *iLevel, Int *iRun, Int *bIsLastRun, Int* rgiLMAX, Int* rgiRMAX, Bool bIntra){ Int iIndex, iLevelPlusAbs, iLevelAbs, iLevelBits, iMarker, iLevelIndex; if (!main_short_video_header) // Added bij KPN [FDS] { MP4V_GETSINGLEBIT (); //vlc; Level+ if (!nSingBitRet) { if (bIntra) { iIndex = decodeSymbol_Test(TABLE_ID_DCTINTRA, MAX_SYMBOLS_FOR_DCTINTRA, MAX_SYMBOL_LENGTH_IN_DCTINTRA); decodeIntraVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun); } else { iIndex = decodeSymbol_Test(TABLE_ID_DCT, MAX_SYMBOLS_FOR_DCT, MAX_SYMBOL_LENGTH_IN_DCT); decodeInterVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun); } //get level back iLevelPlusAbs = abs (*iLevel); iLevelAbs = iLevelPlusAbs + rgiLMAX [(*iRun & 0x0000003F) + (*bIsLastRun << 6)]; //hashing the table *iLevel = sign(*iLevel) * iLevelAbs; } else // vlc; Run+ { MP4V_GETSINGLEBIT (); if (!nSingBitRet) { if (bIntra) { iIndex = decodeSymbol_Test(TABLE_ID_DCTINTRA, MAX_SYMBOLS_FOR_DCTINTRA, MAX_SYMBOL_LENGTH_IN_DCTINTRA); decodeIntraVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun); } else { iIndex = decodeSymbol_Test(TABLE_ID_DCT, MAX_SYMBOLS_FOR_DCT, MAX_SYMBOL_LENGTH_IN_DCT); decodeInterVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun); } *iRun = *iRun + rgiRMAX [(abs(*iLevel) & 0x0000001F) + (*bIsLastRun << 5)]; //get run back; RMAX tabl incl. + 1 already } else // flc { MP4V_GETSINGLEBIT (); *bIsLastRun = (Bool) nSingBitRet; *iRun = (Int) getBits (NUMBITS_ESC_RUN); assert (*iRun < BLOCK_SQUARE_SIZE); iLevelBits = 12; // = m_volmd.nBits; MP4V_GETSINGLEBIT (); iMarker = nSingBitRet; assert(iMarker == 1); *iLevel = (Int) getBits (iLevelBits); MP4V_GETSINGLEBIT (); iMarker = nSingBitRet; assert(iMarker == 1); Int iMaxAC = (1<<(iLevelBits-1)) - 1; assert(*iLevel!=iMaxAC+1); if (*iLevel > iMaxAC) *iLevel -= (1<<iLevelBits); assert(*iLevel != 0); } } } // Escape coding short headers. Added by KPN else { MP4V_GETSINGLEBIT (); *bIsLastRun = nSingBitRet; *iRun = (Int) getBits (6); iLevelIndex = (Int) getBits(8); if (iLevelIndex == 0 || iLevelIndex == 128) { fprintf(stderr,"Short header mode. Levels 0 and 128 are not allowed\n"); exit(2); } if (iLevelIndex >= 0 && iLevelIndex < 128) *iLevel = iLevelIndex; else *iLevel = iLevelIndex-256; }}#elseVoid decodeEscape (Int *iLevel, Int *iRun, Int *bIsLastRun, Int* rgiLMAX, Int* rgiRMAX, PPHUFFMAN_DEC_STRUCT pHD, Bool bIntra){ Int iIndex, iLevelPlusAbs, iLevelAbs, iLevelBits, iMarker, iLevelIndex; if (!main_short_video_header) // Added bij KPN [FDS] { MP4V_GETSINGLEBIT (); //vlc; Level+ if (!nSingBitRet) {#ifdef MPV4_VLD_WITH_PEEK iIndex = decodeSymbol_WithPeek(pHD, MAX_SYMBOL_LENGTH_IN_DCT);#else iIndex = decodeSymbol(pHD);#endif MP4V_GETSINGLEBIT (); // sign bit if (bIntra) decodeIntraVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun, nSingBitRet); else decodeInterVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun, nSingBitRet); //get level back iLevelPlusAbs = abs (*iLevel); iLevelAbs = iLevelPlusAbs + rgiLMAX [(*iRun & 0x0000003F) + (*bIsLastRun << 6)]; //hashing the table *iLevel = sign(*iLevel) * iLevelAbs; } else // vlc; Run+ { MP4V_GETSINGLEBIT (); if (!nSingBitRet) {#ifdef MPV4_VLD_WITH_PEEK iIndex = decodeSymbol_WithPeek(pHD, MAX_SYMBOL_LENGTH_IN_DCT);#else iIndex = decodeSymbol(pHD);#endif MP4V_GETSINGLEBIT (); // sign bit if (bIntra) decodeIntraVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun, nSingBitRet); else decodeInterVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun, nSingBitRet); *iRun = *iRun + rgiRMAX [(abs(*iLevel) & 0x0000001F) + (*bIsLastRun << 5)]; //get run back; RMAX tabl incl. + 1 already } else // flc { MP4V_GETSINGLEBIT (); *bIsLastRun = (Bool) nSingBitRet; *iRun = (Int) getBits (NUMBITS_ESC_RUN); assert (*iRun < BLOCK_SQUARE_SIZE); iLevelBits = 12; // = m_volmd.nBits; MP4V_GETSINGLEBIT (); iMarker = nSingBitRet; assert(iMarker == 1); *iLevel = (Int) getBits (iLevelBits); MP4V_GETSINGLEBIT (); iMarker = nSingBitRet; assert(iMarker == 1); Int iMaxAC = (1<<(iLevelBits-1)) - 1; assert(*iLevel!=iMaxAC+1); if (*iLevel > iMaxAC) *iLevel -= (1<<iLevelBits); assert(*iLevel != 0); } } } // Escape coding short headers. Added by KPN else { MP4V_GETSINGLEBIT (); *bIsLastRun = nSingBitRet; *iRun = (Int) getBits (6); iLevelIndex = (Int) getBits(8); if (iLevelIndex == 0 || iLevelIndex == 128) { fprintf(stderr,"Short header mode. Levels 0 and 128 are not allowed\n"); exit(2); } if (iLevelIndex >= 0 && iLevelIndex < 128) *iLevel = iLevelIndex; else *iLevel = iLevelIndex-256; }}#endifVoid decodeEscape_WithFastBS (Int *iLevel, Int *iRun, Int *bIsLastRun, Int* rgiLMAX, Int* rgiRMAX, PPHUFFMAN_DEC_STRUCT pHD, Bool bIntra, UInt cbits, UInt *pBitsUsed){ Int iIndex, iLevelPlusAbs, iLevelAbs, iLevelBits, iMarker, iLevelIndex; UInt uNextBit; UInt iBitsUsed=0; *pBitsUsed=0; if (!main_short_video_header) // Added bij KPN [FDS] { _BSFastGetBits2(cbits,1,*pBitsUsed, uNextBit); if (!uNextBit) // vlc; Level+ { iIndex = decodeSymbol_WithFastBS(pHD,cbits,&iBitsUsed); (*pBitsUsed)+=iBitsUsed; cbits<<=iBitsUsed; _BSFastGetBits2(cbits,1,*pBitsUsed,uNextBit); // sign bit if (bIntra) decodeIntraVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun, uNextBit); else decodeInterVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun, uNextBit); //printf("1, bits used is %d\n", *pBitsUsed); //get level back iLevelPlusAbs = abs (*iLevel); iLevelAbs = iLevelPlusAbs + rgiLMAX [(*iRun & 0x0000003F) + (*bIsLastRun << 6)]; //hashing the table *iLevel = sign(*iLevel) * iLevelAbs; } else // vlc; Run+ { _BSFastGetBits2(cbits,1,*pBitsUsed, uNextBit ); if (!uNextBit) { iIndex = decodeSymbol_WithFastBS(pHD,cbits,&iBitsUsed); (*pBitsUsed)+=iBitsUsed; cbits<<=iBitsUsed; _BSFastGetBits2(cbits,1,*pBitsUsed, uNextBit ); // sign bit if (bIntra) decodeIntraVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun, uNextBit); else decodeInterVLCtableIndex (iIndex, iLevel, iRun, bIsLastRun, uNextBit); //printf("2, bits used is %d\n", *pBitsUsed); *iRun = *iRun + rgiRMAX [(abs(*iLevel) & 0x0000001F) + (*bIsLastRun << 5)]; //get run back; RMAX tabl incl. + 1 already } else // flc { _BSFastGetBits2(cbits,1,*pBitsUsed, *bIsLastRun); _BSFastGetBits2(cbits,NUMBITS_ESC_RUN,*pBitsUsed, *iRun); assert (*iRun < BLOCK_SQUARE_SIZE); iLevelBits = 12; // = m_volmd.nBits; _BSFastGetBits2(cbits,1,*pBitsUsed, iMarker); assert(iMarker == 1); _BSFastGetBits2(cbits,iLevelBits,*pBitsUsed, *iLevel); _BSFastGetBits2(cbits,1,*pBitsUsed, iMarker); assert(iMarker == 1); //printf("3, bits used is %d\n", *pBitsUsed); Int iMaxAC = (1<<(iLevelBits-1)) - 1; assert(*iLevel!=iMaxAC+1); if (*iLevel > iMaxAC) *iLevel -= (1<<iLevelBits); assert(*iLevel != 0); } } } // Escape coding short headers. Added by KPN else { _BSFastGetBits2(cbits,1,*pBitsUsed, *bIsLastRun); _BSFastGetBits2(cbits,6,*pBitsUsed, *iRun); _BSFastGetBits2(cbits,8,*pBitsUsed, iLevelIndex); // printf("4, bits used is %d\n", *pBitsUsed); if (iLevelIndex == 0 || iLevelIndex == 128) { fprintf(stderr,"Short header mode. Levels 0 and 128 are not allowed\n"); exit(2); } if (iLevelIndex >= 0 && iLevelIndex < 128) *iLevel = iLevelIndex; else *iLevel = iLevelIndex-256; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -