📄 mp4decvops.c
字号:
if (!(interlaced && field_prediction)) {
if (mb_type != IPPVC_MBTYPE_INTER4V) {
if (quarter_sample) {
mp4_LimitMVQ(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 16);
mp4_ComputeChromaMVQ(mvCur, &mvCbCr);
} else {
mp4_LimitMV(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 16);
mp4_ComputeChromaMV(mvCur, &mvCbCr);
}
mvCur[1] = mvCur[2] = mvCur[3] = mvCur[0];
} else {
if (quarter_sample) {
mp4_Limit4MVQ(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 8);
mp4_ComputeChroma4MVQ(pMBinfo->mv, &mvCbCr);
} else {
mp4_Limit4MV(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 8);
mp4_ComputeChroma4MV(pMBinfo->mv, &mvCbCr);
}
mp4_LimitMV(&mvCbCr, &mvCbCr, &limitRectC, dx >> 1, dy >> 1, 8);
}
} else {
if (quarter_sample) {
mp4_LimitFMVQ(&pMVField[0], &mvCur[0], &limitRectL, dx, dy, 16);
mp4_LimitFMVQ(&pMVField[1], &mvCur[2], &limitRectL, dx, dy, 16);
mvTmpT.dx = (Ipp16s)mp4_Div2(mvCur[0].dx);
mvTmpT.dy = (Ipp16s)(mp4_Div2(mvCur[0].dy << 1) >> 1);
mvTmpB.dx = (Ipp16s)mp4_Div2(mvCur[2].dx);
mvTmpB.dy = (Ipp16s)(mp4_Div2(mvCur[2].dy << 1) >> 1);
mp4_ComputeChromaMV(&mvTmpT, &mvCbCrT);
mp4_ComputeChromaMV(&mvTmpB, &mvCbCrB);
} else {
mp4_LimitFMV(&pMVField[0], &mvCur[0], &limitRectL, dx, dy, 16);
mp4_LimitFMV(&pMVField[1], &mvCur[2], &limitRectL, dx, dy, 16);
mp4_ComputeChromaMV(&mvCur[0], &mvCbCrT);
mp4_ComputeChromaMV(&mvCur[2], &mvCbCrB);
}
}
if (pat)
mp4_DCTInvCoeffsInterMB(pInfo, coeffMB, pMBinfoMT->lnz, pat, scan);
if (obmc_disable || field_prediction) {
if (!field_prediction) {
if (quarter_sample) {
if (mb_type == IPPVC_MBTYPE_INTER4V) {
mp4_Copy8x8QP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
mp4_Copy8x8QP_8u(pYr+8, stepYr, pYc+8, stepYc, &mvCur[1], rt);
mp4_Copy8x8QP_8u(pYr+8*stepYr, stepYr, pYc+8*stepYc, stepYc, &mvCur[2], rt);
mp4_Copy8x8QP_8u(pYr+8*stepYr+8, stepYr, pYc+8*stepYc+8, stepYc, &mvCur[3], rt);
} else
mp4_Copy16x16QP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
} else {
if (mb_type == IPPVC_MBTYPE_INTER4V) {
mp4_Copy8x8HP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
mp4_Copy8x8HP_8u(pYr+8, stepYr, pYc+8, stepYc, &mvCur[1], rt);
mp4_Copy8x8HP_8u(pYr+8*stepYr, stepYr, pYc+8*stepYc, stepYc, &mvCur[2], rt);
mp4_Copy8x8HP_8u(pYr+8*stepYr+8, stepYr, pYc+8*stepYc+8, stepYc, &mvCur[3], rt);
} else
mp4_Copy16x16HP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
}
} else {
if (quarter_sample) {
mp4_Copy16x8QP_8u(pYr+stepYr*mb_ftfr, stepYr*2, pYc, stepYc*2, &mvCur[0], rt);
mp4_Copy16x8QP_8u(pYr+stepYr*mb_fbfr, stepYr*2, pYc+stepYc, stepYc*2, &mvCur[2], rt);
} else {
mp4_Copy16x8HP_8u(pYr+stepYr*mb_ftfr, stepYr*2, pYc, stepYc*2, &mvCur[0], rt);
mp4_Copy16x8HP_8u(pYr+stepYr*mb_fbfr, stepYr*2, pYc+stepYc, stepYc*2, &mvCur[2], rt);
}
}
if (!dct_type) {
mp4_AddResidual(pat & 32, pYc, stepYc, coeffMB);
mp4_AddResidual(pat & 16, pYc+8, stepYc, coeffMB+64);
mp4_AddResidual(pat & 8, pYc+stepYc*8, stepYc, coeffMB+128);
mp4_AddResidual(pat & 4, pYc+stepYc*8+8, stepYc, coeffMB+192);
} else {
mp4_AddResidual(pat & 32, pYc, stepYc*2, coeffMB);
mp4_AddResidual(pat & 16, pYc+8, stepYc*2, coeffMB+64);
mp4_AddResidual(pat & 8, pYc+stepYc, stepYc*2, coeffMB+128);
mp4_AddResidual(pat & 4, pYc+stepYc+8, stepYc*2, coeffMB+192);
}
if (!field_prediction) {
mp4_MC_HP(pat & 2, pCbr, stepCbr, pCbc, stepCbc, coeffMB+256, &mvCbCr, rt);
mp4_MC_HP(pat & 1, pCrr, stepCrr, pCrc, stepCrc, coeffMB+320, &mvCbCr, rt);
} else {
mp4_Copy8x4HP_8u(pCbr+(mb_ftfr ? stepCbr : 0), stepCbr*2, pCbc, stepCbc*2, &mvCbCrT, rt);
mp4_Copy8x4HP_8u(pCrr+(mb_ftfr ? stepCrr : 0), stepCrr*2, pCrc, stepCrc*2, &mvCbCrT, rt);
mp4_Copy8x4HP_8u(pCbr+(mb_fbfr ? stepCbr : 0), stepCbr*2, pCbc+stepCbc, stepCbc*2, &mvCbCrB, rt);
mp4_Copy8x4HP_8u(pCrr+(mb_fbfr ? stepCrr : 0), stepCrr*2, pCrc+stepCrc, stepCrc*2, &mvCbCrB, rt);
mp4_AddResidual(pat & 2, pCbc, stepCbc, coeffMB+256);
mp4_AddResidual(pat & 1, pCrc, stepCrc, coeffMB+320);
}
}
//}
if (!obmc_disable && !field_prediction) {
//if (mb_not_coded) {
// ippiCopy8x8_8u_C1R(pCbr, stepCbr, pCbc, stepCbc);
// ippiCopy8x8_8u_C1R(pCrr, stepCrr, pCrc, stepCrc);
// pat = 0;
// mp4_Zero4MV(mvCur);
//} else {
mp4_MC_HP(pat & 2, pCbr, stepCbr, pCbc, stepCbc, coeffMB+256, &mvCbCr, rt);
mp4_MC_HP(pat & 1, pCrr, stepCrr, pCrc, stepCrc, coeffMB+320, &mvCbCr, rt);
//}
mp4_OBMC(pInfo, pMBinfo, mvCur, j, curRow, limitRectL, pYc, stepYc, pYr, stepYr, pat >> 2, coeffMB, dct_type);
}
//}
}
pMBinfo ++;
pMBinfoMT ++;
pMVField += 2;
pYc += 16; pCrc += 8; pCbc += 8;
pYr += 16; pCrr += 8; pCbr += 8;
dx += 16;
}
}
mp4_Status mp4_DecodeVOP_S_MT(mp4_Info* pInfo)
{
Ipp32s i, mbPerCol, mbPerRow, fcode_forward, sBitOff;
IppiRect spriteRect, vopRect;
Ipp8u *sBufPtr;
mp4_Status sts = MP4_STATUS_OK;
sBufPtr = pInfo->bufptr;
sBitOff = pInfo->bitoff;
// init WarpSpec for Sprites or GMC
vopRect.x = 0;
vopRect.y = 0;
vopRect.width = pInfo->VisualObject.VideoObject.width;
vopRect.height = pInfo->VisualObject.VideoObject.height;
if (pInfo->VisualObject.VideoObject.sprite_enable == MP4_SPRITE_STATIC) {
spriteRect.x = pInfo->VisualObject.VideoObject.sprite_left_coordinate;
spriteRect.y = pInfo->VisualObject.VideoObject.sprite_top_coordinate;
spriteRect.width = pInfo->VisualObject.VideoObject.sprite_width;
spriteRect.height = pInfo->VisualObject.VideoObject.sprite_height;
fcode_forward = 1;
} else {
spriteRect = vopRect; // for shapes they may be different !!!!!!
fcode_forward = pInfo->VisualObject.VideoObject.VideoObjectPlane.fcode_forward;
}
ippiWarpInit_MPEG4(pInfo->VisualObject.VideoObject.WarpSpec,
pInfo->VisualObject.VideoObject.VideoObjectPlane.warping_mv_code_du,
pInfo->VisualObject.VideoObject.VideoObjectPlane.warping_mv_code_dv,
pInfo->VisualObject.VideoObject.sprite_warping_points,
pInfo->VisualObject.VideoObject.sprite_enable,
pInfo->VisualObject.VideoObject.sprite_warping_accuracy,
pInfo->VisualObject.VideoObject.VideoObjectPlane.rounding_type,
pInfo->VisualObject.VideoObject.quarter_sample, fcode_forward,
&spriteRect, &vopRect);
// decode basic sprites
if (pInfo->VisualObject.VideoObject.sprite_enable == MP4_SPRITE_STATIC) {
Ipp32s h;
//if (pInfo->VisualObject.VideoObject.shape != MP4_SHAPE_TYPE_RECTANGULAR) {
// if (mp4_InitVOPShape(pInfo) != MP4_STATUS_OK)
// return MP4_STATUS_ERROR;
//}
h = (vopRect.height / pInfo->num_threads) & (~1); // must be even
#ifdef _OPENMP
#pragma omp parallel shared(pInfo, h) num_threads(pInfo->num_threads)
#endif
{
IppiRect vopRect;
Ipp32s idThread = 0;
#ifdef _OPENMP
idThread = omp_get_thread_num();
vm_set_current_thread_priority(pInfo->mTreadPriority);
#endif
vopRect.x = 0;
vopRect.width = pInfo->VisualObject.VideoObject.width;
vopRect.y = idThread * h;
vopRect.height = h;
if (idThread == (pInfo->num_threads - 1))
vopRect.height = pInfo->VisualObject.VideoObject.height - vopRect.y;
ippiWarpLuma_MPEG4_8u_C1R(pInfo->VisualObject.sFrame.pY, pInfo->VisualObject.sFrame.stepY,
pInfo->VisualObject.cFrame.pY + vopRect.y * pInfo->VisualObject.cFrame.stepY,
pInfo->VisualObject.cFrame.stepY, &vopRect, pInfo->VisualObject.VideoObject.WarpSpec);
if (pInfo->VisualObject.VideoObject.sprite_brightness_change)
ippiChangeSpriteBrightness_MPEG4_8u_C1IR(pInfo->VisualObject.cFrame.pY, pInfo->VisualObject.cFrame.stepY, vopRect.width, vopRect.height, pInfo->VisualObject.VideoObject.VideoObjectPlane.brightness_change_factor);
vopRect.y >>= 1; vopRect.width >>= 1; vopRect.height >>= 1;
ippiWarpChroma_MPEG4_8u_P2R(pInfo->VisualObject.sFrame.pCb, pInfo->VisualObject.sFrame.stepCb,
pInfo->VisualObject.sFrame.pCr, pInfo->VisualObject.sFrame.stepCr,
pInfo->VisualObject.cFrame.pCb + vopRect.y * pInfo->VisualObject.cFrame.stepCb, pInfo->VisualObject.cFrame.stepCb,
pInfo->VisualObject.cFrame.pCr + vopRect.y * pInfo->VisualObject.cFrame.stepCr, pInfo->VisualObject.cFrame.stepCr,
&vopRect, pInfo->VisualObject.VideoObject.WarpSpec);
}
return MP4_STATUS_OK;
}
// decode S(GMC)-VOP
mbPerCol = pInfo->VisualObject.VideoObject.MacroBlockPerCol;
mbPerRow = pInfo->VisualObject.VideoObject.MacroBlockPerRow;
pInfo->mbInVideoPacket = 0;
mp4_ResetIntraPredBuffer(pInfo);
i = 0;
#ifdef _OPENMP
#pragma omp parallel shared(pInfo, i, mbPerCol, mbPerRow, sts) num_threads(pInfo->num_threads)
#endif
{
Ipp32s idThread = 0;
Ipp32s curRow;
mp4_MacroBlockMT* pMBinfoMT;
#ifdef _OPENMP
idThread = omp_get_thread_num();
vm_set_current_thread_priority(pInfo->mTreadPriority);
#endif
pMBinfoMT = pInfo->pMBinfoMT + mbPerRow * idThread;
for (;;) {
#ifdef _OPENMP
#pragma omp critical(HI_FOXY)
#endif
{
curRow = i;
i ++;
if (curRow < mbPerCol)
if (mp4_DecodeVOP_S_DecodeSlice(pInfo, curRow, pMBinfoMT) != MP4_STATUS_OK) {
sts = MP4_STATUS_ERROR;
i = curRow = mbPerCol;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -