📄 h263decfuncs.c
字号:
{
#ifdef _OPENMP
maxThreads = omp_get_num_threads();
#endif
}
}
return maxThreads;
}
h263_Status h263_DecodeDequantMacroBlockIntra(h263_Info *pInfo, Ipp32s x, Ipp32s pat, Ipp32s quant, Ipp32s quant_c,
Ipp32s scan, Ipp16s *coeffMB, Ipp8u lastNZ[])
{
Ipp16s *coeff = coeffMB;
Ipp32s blockNum, pm = 32, lnz, dc, ac, k, nz;
Ipp16s *predC, *predA;
h263_IntraPredBlock *bCurr;
Ipp32s modQ = pInfo->VideoSequence.VideoPicture.oppmodes.modQuant;
Ipp32s 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, Ipp32s pat, Ipp32s quant, Ipp32s quant_c,
Ipp16s *coeffMB, Ipp8u lastNZ[])
{
Ipp32s i, lnz, pm = 32;
Ipp16s *coeff = coeffMB;
Ipp32s modQ = pInfo->VideoSequence.VideoPicture.oppmodes.modQuant;
Ipp32s 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[], Ipp32s pat)
{
Ipp32s 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, Ipp32s curRow)
{
Ipp8u *pYc, *pCbc, *pCrc;
Ipp32s stepYc, stepCbc, stepCrc, mbPerRow;
h263_MacroBlock *pMBinfo;
Ipp32s quant, quant_c;
Ipp32s 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, Ipp32s curRow)
{
Ipp8u *pYc, *pCbc, *pCrc;
Ipp32s stepYc, stepCbc, stepCrc, mbPerRow;
h263_MacroBlock *pMBinfo;
Ipp32s quant, quant_c;
Ipp32s 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, Ipp32s curRow)
{
Ipp8u *pYc, *pCbc, *pCrc;
Ipp32s stepYc, stepCbc, stepCrc, mbPerRow;
h263_MacroBlock *pMBinfo;
Ipp32s quant, quant_c;
Ipp32s 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, Ipp32s curRow)
{
Ipp8u *pYc, *pCbc, *pCrc;
Ipp32s stepYc, stepCbc, stepCrc, mbPerRow;
h263_MacroBlock *pMBinfo;
Ipp32s quant, quant_c;
Ipp32s 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 + -