📄 h263decfuncs.c
字号:
pCrc = frame->pCr + (stepCrc << 3)*i; pMBinfo = pInfo->VideoSequence.MBinfo + mbPerRow*i; if (pMBinfo[0].type != IPPVC_MB_STUFFING) { H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant); } for (j = 1; j < mbPerRow; j++) { pYc += 16; pCbc += 8; pCrc += 8; if (pMBinfo[j].type != IPPVC_MB_STUFFING) { quant = pMBinfo[j].quant; quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant; H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant); } else if (pMBinfo[j-1].type != IPPVC_MB_STUFFING) { quant = pMBinfo[j-1].quant; quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant; H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); } } }}void h263_DeblockingFilter_I(h263_Info *pInfo, h263_Frame *frame){ Ipp8u *pYc, *pCbc, *pCrc; int stepYc, stepCbc, stepCrc, mbPerRow, mbPerCol; h263_MacroBlock *pMBinfo; int quant, quant_c; int i, j; h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture; int modQ = VPic->oppmodes.modQuant; stepYc = frame->stepY; stepCbc = frame->stepCb; stepCrc = frame->stepCr; mbPerRow = frame->mbPerRow; mbPerCol = frame->mbPerCol; for (i = 1; i < mbPerCol; i++) { pYc = frame->pY + (stepYc << 4)*i; pCbc = frame->pCb + (stepCbc << 3)*i; pCrc = frame->pCr + (stepCrc << 3)*i; pMBinfo = pInfo->VideoSequence.MBinfo + mbPerRow*i; if (pInfo->VideoSequence.GOBboundary[i] > 0) { if (pInfo->VideoSequence.GOBboundary[i] > 1) { continue; /* the row belongs to a skipped GOB */ } else { /* no horizontal filtering across GOB boundary */ quant = pMBinfo[-mbPerRow].quant; H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc-16*stepYc, stepYc, quant); for (j = 1; j < mbPerRow; j++) { pYc += 16; pCbc += 8; pCrc += 8; quant = pMBinfo[j-mbPerRow].quant; quant_c = modQ ? h263_quant_c[quant] : quant; H263_MB_VER_DEBLOCKING(pYc-16*stepYc, stepYc, pCbc-8*stepCbc, stepCbc, pCrc-8*stepCrc, stepCrc, quant, quant_c); H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc - 16*stepYc, stepYc, quant); } } } else { quant = pMBinfo[0].quant; quant_c = modQ ? h263_quant_c[quant] : quant; H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc - 16*stepYc, stepYc, pMBinfo[-mbPerRow].quant); for (j = 1; j < mbPerRow; j++) { pYc += 16; pCbc += 8; pCrc += 8; quant = pMBinfo[j].quant; quant_c = modQ ? h263_quant_c[quant] : quant; H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); quant = pMBinfo[j-mbPerRow].quant; quant_c = modQ ? h263_quant_c[quant] : quant; H263_MB_VER_DEBLOCKING(pYc-16*stepYc, stepYc, pCbc-8*stepCbc, stepCbc, pCrc-8*stepCrc, stepCrc, quant, quant_c); H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc - 16*stepYc, stepYc, quant); } } } pYc = frame->pY + (stepYc << 4)*(mbPerCol - 1); pCbc = frame->pCb + (stepCbc << 3)*(mbPerCol - 1); pCrc = frame->pCr + (stepCrc << 3)*(mbPerCol - 1); pMBinfo = pInfo->VideoSequence.MBinfo + mbPerRow*(mbPerCol - 1); quant = pMBinfo[0].quant; quant_c = modQ ? h263_quant_c[quant] : quant; H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant); for (j = 1; j < mbPerRow; j++) { pYc += 16; pCbc += 8; pCrc += 8; quant = pMBinfo[j].quant; quant_c = modQ ? h263_quant_c[quant] : quant; H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant); }}#ifdef _OMP_KARABASint h263_GetNumOfThreads(void){ int maxThreads = 1;#ifdef _OPENMP#pragma omp parallel shared(maxThreads)#endif {#ifdef _OPENMP#pragma omp master#endif {#ifdef _OPENMP maxThreads = omp_get_num_threads();#endif } } return maxThreads;}h263_Status h263_DecodeDequantMacroBlockIntra(h263_Info *pInfo, int x, int pat, int quant, int quant_c, int scan, Ipp16s *coeffMB, Ipp8u lastNZ[]){ Ipp16s *coeff = coeffMB; int blockNum, pm = 32, lnz, dc, ac, k, nz; Ipp16s *predC, *predA; h263_IntraPredBlock *bCurr; int modQ = pInfo->VideoSequence.VideoPicture.oppmodes.modQuant; int advI = pInfo->VideoSequence.VideoPicture.oppmodes.advIntra; if (!advI) { for (blockNum = 0; blockNum < 6; blockNum++) { if (blockNum > 3) quant = quant_c; if (ippiReconstructCoeffsIntra_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeff, &lnz, pat & pm, quant, 0, IPPVC_SCAN_ZIGZAG, modQ) != ippStsNoErr) { return H263_STATUS_ERROR; } if (lnz > 0) { h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTRA_AC); } else { h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTRA_DC); } pm >>= 1; lastNZ[blockNum] = lnz; coeff += 64; } return H263_STATUS_OK; } /* Advance Intra Coding */ for (blockNum = 0; blockNum < 6; blockNum ++) { bCurr = &pInfo->VideoSequence.IntraPredBuff.block[6*x+blockNum]; if (blockNum > 3) quant = quant_c; if (pat & pm) { if (ippiReconstructCoeffsIntra_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeff, &lnz, pat & pm, quant, 1, scan, modQ) != ippStsNoErr) return H263_STATUS_ERROR; if (lnz) { h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTRA_AC); } else { h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTRA_DC); } } else { if (scan != IPPVC_SCAN_ZIGZAG) { h263_Zero64_16s(coeff); } else coeff[0] = 0; lnz = 0; } nz = 0; if (scan == IPPVC_SCAN_ZIGZAG) { if (bCurr->predA->dct_dc >= 0) { dc = bCurr->predA->dct_dc; dc = bCurr->predC->dct_dc >= 0 ? ((dc + bCurr->predC->dct_dc) >> 1) : dc; } else dc = bCurr->predC->dct_dc >= 0 ? bCurr->predC->dct_dc : 1024; if (lnz && ((quant > 8) || modQ)) { /* ??? */ for (k = 1; k < 64; k ++) { h263_CLIP(coeff[k], -2048, 2047); } } } else if (scan == IPPVC_SCAN_HORIZONTAL) { if (bCurr->predC->dct_dc >= 0) { dc = bCurr->predC->dct_dc; predC = bCurr->predC->dct_acC; for (k = 1; k < 8; k ++) { ac = coeff[k] + predC[k]; h263_CLIP(ac, -2048, 2047); /* ??? */ coeff[k] = (Ipp16s)ac; if (ac) nz = 1; } if ((lnz > 7) && ((quant > 8) || modQ)) { /* ??? */ for (k = 8; k < 64; k ++) { h263_CLIP(coeff[k], -2048, 2047); } } } else { dc = 1024; if (lnz && ((quant > 8) || modQ)) { /* ??? */ for (k = 1; k < 64; k ++) { h263_CLIP(coeff[k], -2048, 2047); } } } } else { /* scan == IPPVC_SCAN_VERTICAL */ if (bCurr->predA->dct_dc >= 0) { dc = bCurr->predA->dct_dc; predA = bCurr->predA->dct_acA; for (k = 1; k < 8; k ++) { ac = coeff[k*8] + predA[k]; h263_CLIP(ac, -2048, 2047); /* ??? */ coeff[k*8] = (Ipp16s)ac; if (ac) nz = 1; } } else dc = 1024; if (lnz && ((quant > 8) || modQ)) { /* ??? */ for (k = 1; k < 64; k ++) { h263_CLIP(coeff[k], -2048, 2047); } } } dc += coeff[0]; dc |= 1; /* oddify */ h263_CLIP(dc, 0, 2047); /* ??? h263_CLIPR(dc, 2047); */ coeff[0] = (Ipp16s)dc; if (nz) lnz = 63; if (lnz) { /* copy predicted coeffs for future Prediction */ for (k = 1; k < 8; k ++) { bCurr[6].dct_acC[k] = coeff[k]; bCurr[6].dct_acA[k] = coeff[k*8]; } } else { for (k = 1; k < 8; k ++) { bCurr[6].dct_acC[k] = bCurr[6].dct_acA[k] = 0; } } bCurr[6].dct_dc = coeff[0]; pm >>= 1; lastNZ[blockNum] = (Ipp8u)lnz; coeff += 64; } return H263_STATUS_OK;}h263_Status h263_DecodeDequantMacroBlockInter(h263_Info *pInfo, int pat, int quant, int quant_c, Ipp16s *coeffMB, Ipp8u lastNZ[]){ int i, lnz, pm = 32; Ipp16s *coeff = coeffMB; int modQ = pInfo->VideoSequence.VideoPicture.oppmodes.modQuant; int altInterVLC = pInfo->VideoSequence.VideoPicture.oppmodes.altInterVLC; for (i = 0; i < 6; i ++) { if (i > 3) quant = quant_c; if (pat & pm) { if (!altInterVLC) { if (ippiReconstructCoeffsInter_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeff, &lnz, quant, modQ) != ippStsNoErr) return H263_STATUS_ERROR; } else { __ALIGN16(Ipp16s, coeffZ, 64); if (ippiDecodeCoeffsInter_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeffZ, &lnz, modQ, IPPVC_SCAN_NONE) != ippStsNoErr) if (ippiDecodeCoeffsIntra_H263_1u16s(&pInfo->bufptr, &pInfo->bitoff, coeffZ, &lnz, 1, modQ, IPPVC_SCAN_NONE) != ippStsNoErr) return H263_STATUS_ERROR; ippiQuantInvInter_H263_16s_C1I(coeffZ, lnz, quant, modQ); ippiScanInv_16s_C1(coeffZ, coeff, lnz, IPPVC_SCAN_ZIGZAG); } h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_C); } else { h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC); } pm >>= 1; lastNZ[i] = (Ipp8u)lnz; coeff += 64; } return H263_STATUS_OK;}void h263_DCT_MacroBlockInter(Ipp16s *coeffMB, Ipp8u lastNZ[], int pat){ int i, lnz, pm = 32; Ipp16s *coeff = coeffMB; for (i = 0; i < 6; i ++) { if ((pat) & pm) { lnz = lastNZ[i]; if (lnz != 0) { if ((lnz <= 4) && (coeff[16] == 0)) ippiDCT8x8Inv_2x2_16s_C1I(coeff); else if ((lnz <= 13) && (coeff[32] == 0)) ippiDCT8x8Inv_4x4_16s_C1I(coeff); else ippiDCT8x8Inv_16s_C1I(coeff); } else h263_Set64_16s((Ipp16s)((coeff[0] + 4) >> 3), coeff); } pm >>= 1; coeff += 64; }}void h263_DeblockingFilterHor_P_MT(h263_Info *pInfo, int curRow){ Ipp8u *pYc, *pCbc, *pCrc; int stepYc, stepCbc, stepCrc, mbPerRow; h263_MacroBlock *pMBinfo; int quant, quant_c; int j; h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture; if (pInfo->VideoSequence.GOBboundary[curRow] > 0) return; /* no filtering across GOB boundaries */ mbPerRow = VPic->MacroBlockPerRow; stepYc = pInfo->VideoSequence.cFrame.stepY; stepCbc = pInfo->VideoSequence.cFrame.stepCb; stepCrc = pInfo->VideoSequence.cFrame.stepCr; pYc = pInfo->VideoSequence.cFrame.pY + curRow*16*stepYc; pCbc = pInfo->VideoSequence.cFrame.pCb + curRow*8*stepCbc; pCrc = pInfo->VideoSequence.cFrame.pCr + curRow*8*stepCrc; pMBinfo = pInfo->VideoSequence.MBinfo + curRow * mbPerRow; for (j = 0; j < mbPerRow; j++) { if (pMBinfo[j].type != IPPVC_MB_STUFFING) { quant = pMBinfo[j].quant; quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant; H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); } else if (pMBinfo[j-mbPerRow].type != IPPVC_MB_STUFFING) { quant = pMBinfo[j-mbPerRow].quant; quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant; H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); } pYc += 16; pCbc += 8; pCrc += 8; }}void h263_DeblockingFilterVer_P_MT(h263_Info *pInfo, int curRow){ Ipp8u *pYc, *pCbc, *pCrc; int stepYc, stepCbc, stepCrc, mbPerRow; h263_MacroBlock *pMBinfo; int quant, quant_c; int j; h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture; mbPerRow = VPic->MacroBlockPerRow; stepYc = pInfo->VideoSequence.cFrame.stepY; stepCbc = pInfo->VideoSequence.cFrame.stepCb; stepCrc = pInfo->VideoSequence.cFrame.stepCr; pYc = pInfo->VideoSequence.cFrame.pY + curRow*16*stepYc; pCbc = pInfo->VideoSequence.cFrame.pCb + curRow*8*stepCbc; pCrc = pInfo->VideoSequence.cFrame.pCr + curRow*8*stepCrc; pMBinfo = pInfo->VideoSequence.MBinfo + curRow * mbPerRow; if (pMBinfo[0].type != IPPVC_MB_STUFFING) { quant = pMBinfo[0].quant; H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant); } for (j = 1; j < mbPerRow; j++) { pYc += 16; pCbc += 8; pCrc += 8; if (pMBinfo[j].type != IPPVC_MB_STUFFING) { quant = pMBinfo[j].quant; quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant; H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant); } else if (pMBinfo[j-1].type != IPPVC_MB_STUFFING) { quant = pMBinfo[j-1].quant; quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant; H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); } }}void h263_DeblockingFilterHor_I_MT(h263_Info *pInfo, int curRow){ Ipp8u *pYc, *pCbc, *pCrc; int stepYc, stepCbc, stepCrc, mbPerRow; h263_MacroBlock *pMBinfo; int quant, quant_c; int j; h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture; if (pInfo->VideoSequence.GOBboundary[curRow] > 0) return; /* no filtering across GOB boundaries */ mbPerRow = VPic->MacroBlockPerRow; stepYc = pInfo->VideoSequence.cFrame.stepY; stepCbc = pInfo->VideoSequence.cFrame.stepCb; stepCrc = pInfo->VideoSequence.cFrame.stepCr; pYc = pInfo->VideoSequence.cFrame.pY + curRow*16*stepYc; pCbc = pInfo->VideoSequence.cFrame.pCb + curRow*8*stepCbc; pCrc = pInfo->VideoSequence.cFrame.pCr + curRow*8*stepCrc; pMBinfo = pInfo->VideoSequence.MBinfo + curRow * mbPerRow; for (j = 0; j < mbPerRow; j++) { quant = pMBinfo[j].quant; quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant; H263_MB_HOR_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); pYc += 16; pCbc += 8; pCrc += 8; }}void h263_DeblockingFilterVer_I_MT(h263_Info *pInfo, int curRow){ Ipp8u *pYc, *pCbc, *pCrc; int stepYc, stepCbc, stepCrc, mbPerRow; h263_MacroBlock *pMBinfo; int quant, quant_c; int j; h263_VideoPicture *VPic = &pInfo->VideoSequence.VideoPicture; mbPerRow = VPic->MacroBlockPerRow; stepYc = pInfo->VideoSequence.cFrame.stepY; stepCbc = pInfo->VideoSequence.cFrame.stepCb; stepCrc = pInfo->VideoSequence.cFrame.stepCr; pYc = pInfo->VideoSequence.cFrame.pY + curRow*16*stepYc; pCbc = pInfo->VideoSequence.cFrame.pCb + curRow*8*stepCbc; pCrc = pInfo->VideoSequence.cFrame.pCr + curRow*8*stepCrc; pMBinfo = pInfo->VideoSequence.MBinfo + curRow * mbPerRow; quant = pMBinfo[0].quant; H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant); for (j = 1; j < mbPerRow; j++) { pYc += 16; pCbc += 8; pCrc += 8; quant = pMBinfo[j].quant; quant_c = VPic->oppmodes.modQuant ? h263_quant_c[quant] : quant; H263_MB_VER_DEBLOCKING(pYc, stepYc, pCbc, stepCbc, pCrc, stepCrc, quant, quant_c); H263_MB_INTERNAL_VER_DEBLOCKING_LUM(pYc, stepYc, quant); }}#endif // _OMP_KARABAS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -