📄 mp4decvopb.c
字号:
mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nMB_FORWARD); if (mp4_DecodeMV(pInfo, &mvForw, fcode_forward) != MP4_STATUS_OK) { mp4_Error("Error when decode B-VOP motion vector"); return MP4_STATUS_ERROR; } if (quarter_sample) { mp4_LimitMVQ(&mvForw, &mvForwLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMVQ(&mvForwLim, &mvCbCrF); mp4_Copy16x16QP_8u(pYp, stepYp, pYc, stepYc, &mvForwLim, 0); mp4_DecodeReconBlockInter_MPEG4(cbpb & 32, pYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 16, pYc+8, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 8, pYc+8*stepYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 4, pYc+8*stepYc+8, stepYc); } else { mp4_LimitMV(&mvForw, &mvForwLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMV(&mvForwLim, &mvCbCrF); if (cbpb & 60) { mp4_DecodeMCBlockInter_MPEG4(cbpb & 32, pYp, stepYp, pYc, stepYc, mvForwLim, 0); mp4_DecodeMCBlockInter_MPEG4(cbpb & 16, pYp+8, stepYp, pYc+8, stepYc, mvForwLim, 0); mp4_DecodeMCBlockInter_MPEG4(cbpb & 8, pYp+8*stepYp, stepYp, pYc+8*stepYc, stepYc, mvForwLim, 0); mp4_DecodeMCBlockInter_MPEG4(cbpb & 4, pYp+8*stepYp+8, stepYp, pYc+8*stepYc+8, stepYc, mvForwLim, 0); } else { mp4_Copy16x16HP_8u(pYp, stepYp, pYc, stepYc, &mvForwLim, 0); mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nB_INTER_NC); mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nB_INTER_NC); mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nB_INTER_NC); mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nB_INTER_NC); } } mp4_DecodeMCBlockInter_MPEG4(cbpb & 2, pCbp, stepCbp, pCbc, stepCbc, mvCbCrF, 0); mp4_DecodeMCBlockInter_MPEG4(cbpb & 1, pCrp, stepCrp, pCrc, stepCrc, mvCbCrF, 0); } else if (mb_type == IPPVC_MBTYPE_BACKWARD) { mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nMB_BACKWARD); if (mp4_DecodeMV(pInfo, &mvBack, fcode_backward) != MP4_STATUS_OK) { mp4_Error("Error when decode B-VOP motion vector"); return MP4_STATUS_ERROR; } if (quarter_sample) { mp4_LimitMVQ(&mvBack, &mvBackLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMVQ(&mvBackLim, &mvCbCrB); mp4_Copy16x16QP_8u(pYn, stepYn, pYc, stepYc, &mvBackLim, 0); mp4_DecodeReconBlockInter_MPEG4(cbpb & 32, pYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 16, pYc+8, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 8, pYc+8*stepYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 4, pYc+8*stepYc+8, stepYc); } else { mp4_LimitMV(&mvBack, &mvBackLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMV(&mvBackLim, &mvCbCrB); if (cbpb & 60) { mp4_DecodeMCBlockInter_MPEG4(cbpb & 32, pYn, stepYn, pYc, stepYc, mvBackLim, 0); mp4_DecodeMCBlockInter_MPEG4(cbpb & 16, pYn+8, stepYn, pYc+8, stepYc, mvBackLim, 0); mp4_DecodeMCBlockInter_MPEG4(cbpb & 8, pYn+8*stepYn, stepYp, pYc+8*stepYc, stepYc, mvBackLim, 0); mp4_DecodeMCBlockInter_MPEG4(cbpb & 4, pYn+8*stepYn+8, stepYp, pYc+8*stepYc+8, stepYc, mvBackLim, 0); } else { mp4_Copy16x16HP_8u(pYn, stepYn, pYc, stepYc, &mvBackLim, 0); mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nB_INTER_NC); mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nB_INTER_NC); mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nB_INTER_NC); mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nB_INTER_NC); } } mp4_DecodeMCBlockInter_MPEG4(cbpb & 2, pCbn, stepCbn, pCbc, stepCbc, mvCbCrB, 0); mp4_DecodeMCBlockInter_MPEG4(cbpb & 1, pCrn, stepCrn, pCrc, stepCrc, mvCbCrB, 0); } else if (mb_type == IPPVC_MBTYPE_INTERPOLATE) { mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nMB_INTERPOLATE); if (mp4_DecodeMV(pInfo, &mvForw, fcode_forward) != MP4_STATUS_OK) { mp4_Error("Error when decode B-VOP motion vector"); return MP4_STATUS_ERROR; } if (mp4_DecodeMV(pInfo, &mvBack, fcode_backward) != MP4_STATUS_OK) { mp4_Error("Error when decode B-VOP motion vector"); return MP4_STATUS_ERROR; } if (quarter_sample) { mp4_LimitMVQ(&mvForw, &mvForwLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMVQ(&mvForwLim, &mvCbCrF); mp4_Copy16x16QP_8u(pYp, stepYp, pYc, stepYc, &mvForwLim, 0); mp4_LimitMVQ(&mvBack, &mvBackLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMVQ(&mvBackLim, &mvCbCrB); mp4_Copy16x16QP_8u(pYn, stepYn, tmpMB, 16, &mvBackLim, 0); } else { mp4_LimitMV(&mvForw, &mvForwLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMV(&mvForwLim, &mvCbCrF); mp4_Copy16x16HP_8u(pYp, stepYp, pYc, stepYc, &mvForwLim, 0); mp4_LimitMV(&mvBack, &mvBackLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMV(&mvBackLim, &mvCbCrB); mp4_Copy16x16HP_8u(pYn, stepYn, tmpMB, 16, &mvBackLim, 0); } ippiAverage16x16_8u_C1IR(tmpMB, 16, pYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 32, pYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 16, pYc+8, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 8, pYc+8*stepYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 4, pYc+8*stepYc+8, stepYc); mp4_Copy8x8HP_8u(pCbp, stepCbp, pCbc, stepCbc, &mvCbCrF, 0); mp4_Copy8x8HP_8u(pCbn, stepCbn, tmpMB, 8, &mvCbCrB, 0); ippiAverage8x8_8u_C1IR(tmpMB, 8, pCbc, stepCbc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 2, pCbc, stepCbc); mp4_Copy8x8HP_8u(pCrp, stepCrp, pCrc, stepCrc, &mvCbCrF, 0); mp4_Copy8x8HP_8u(pCrn, stepCrn, tmpMB, 8, &mvCbCrB, 0); ippiAverage8x8_8u_C1IR(tmpMB, 8, pCrc, stepCrc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 1, pCrc, stepCrc); } else { // IPPVC_MBTYPE_DIRECT IppMotionVector mvForw[4], mvBack[4], mvForwLim[4], mvBackLim[4]; mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nMB_DIRECT); //f MVs of collocated block of recently decoded I or P frame used in Direct mode if (mp4_DecodeMV_Direct(pInfo, pMBinfo->mv, mvForw, mvBack, TRB, TRD, modb, pMBinfo->type) != MP4_STATUS_OK) { mp4_Error("Error when decode B-VOP motion vector"); return MP4_STATUS_ERROR; } if (quarter_sample) { mp4_Limit4MVQ(mvForw, mvForwLim, &limitRectL, dx, dy, 8); mp4_ComputeChroma4MVQ(mvForw, &mvCbCrF); mp4_Limit4MVQ(mvBack, mvBackLim, &limitRectL, dx, dy, 8); mp4_ComputeChroma4MVQ(mvBack, &mvCbCrB); mp4_Copy8x8QP_8u(pYp, stepYp, pYc, stepYc, &mvForwLim[0], 0); mp4_Copy8x8QP_8u(pYn, stepYn, tmpMB, 16, &mvBackLim[0], 0); mp4_Copy8x8QP_8u(pYp+8, stepYp, pYc+8, stepYc, &mvForwLim[1], 0); mp4_Copy8x8QP_8u(pYn+8, stepYn, tmpMB+8, 16, &mvBackLim[1], 0); mp4_Copy8x8QP_8u(pYp+8*stepYp, stepYp, pYc+8*stepYc, stepYc, &mvForwLim[2], 0); mp4_Copy8x8QP_8u(pYn+8*stepYn, stepYn, tmpMB+8*16, 16, &mvBackLim[2], 0); mp4_Copy8x8QP_8u(pYp+8*stepYp+8, stepYp, pYc+8*stepYc+8, stepYc, &mvForwLim[3], 0); mp4_Copy8x8QP_8u(pYn+8*stepYn+8, stepYn, tmpMB+8*16+8, 16, &mvBackLim[3], 0); } else { if (pMBinfo->type == IPPVC_MBTYPE_INTER4V) { mp4_Limit4MV(mvForw, mvForwLim, &limitRectL, dx, dy, 8); mp4_ComputeChroma4MV(mvForw, &mvCbCrF); mp4_Limit4MV(mvBack, mvBackLim, &limitRectL, dx, dy, 8); mp4_ComputeChroma4MV(mvBack, &mvCbCrB); mp4_Copy8x8HP_8u(pYp, stepYp, pYc, stepYc, &mvForwLim[0], 0); mp4_Copy8x8HP_8u(pYn, stepYn, tmpMB, 16, &mvBackLim[0], 0); mp4_Copy8x8HP_8u(pYp+8, stepYp, pYc+8, stepYc, &mvForwLim[1], 0); mp4_Copy8x8HP_8u(pYn+8, stepYn, tmpMB+8, 16, &mvBackLim[1], 0); mp4_Copy8x8HP_8u(pYp+8*stepYp, stepYp, pYc+8*stepYc, stepYc, &mvForwLim[2], 0); mp4_Copy8x8HP_8u(pYn+8*stepYn, stepYn, tmpMB+8*16, 16, &mvBackLim[2], 0); mp4_Copy8x8HP_8u(pYp+8*stepYp+8, stepYp, pYc+8*stepYc+8, stepYc, &mvForwLim[3], 0); mp4_Copy8x8HP_8u(pYn+8*stepYn+8, stepYn, tmpMB+8*16+8, 16, &mvBackLim[3], 0); } else { mp4_LimitMV(mvForw, mvForwLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMV(mvForwLim, &mvCbCrF); mp4_LimitMV(mvBack, mvBackLim, &limitRectL, dx, dy, 16); mp4_ComputeChromaMV(mvBackLim, &mvCbCrB); mp4_Copy16x16HP_8u(pYp, stepYp, pYc, stepYc, &mvForwLim[0], 0); mp4_Copy16x16HP_8u(pYn, stepYn, tmpMB, 16, &mvBackLim[0], 0); } } ippiAverage16x16_8u_C1IR(tmpMB, 16, pYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 32, pYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 16, pYc+8, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 8, pYc+8*stepYc, stepYc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 4, pYc+8*stepYc+8, stepYc); mp4_LimitMV(&mvCbCrF, &mvCbCrF, &limitRectC, dx >> 1, dy >> 1, 8); mp4_LimitMV(&mvCbCrB, &mvCbCrB, &limitRectC, dx >> 1, dy >> 1, 8); mp4_Copy8x8HP_8u(pCbp, stepCbp, pCbc, stepCbc, &mvCbCrF, 0); mp4_Copy8x8HP_8u(pCbn, stepCbn, tmpMB, 8, &mvCbCrB, 0); ippiAverage8x8_8u_C1IR(tmpMB, 8, pCbc, stepCbc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 2, pCbc, stepCbc); mp4_Copy8x8HP_8u(pCrp, stepCrp, pCrc, stepCrc, &mvCbCrF, 0); mp4_Copy8x8HP_8u(pCrn, stepCrn, tmpMB, 8, &mvCbCrB, 0); ippiAverage8x8_8u_C1IR(tmpMB, 8, pCrc, stepCrc); mp4_DecodeReconBlockInter_MPEG4(cbpb & 1, pCrc, stepCrc); } } mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nMB); mbCurr ++; if (mbCurr == nmb) return MP4_STATUS_OK; mbInVideoPacket ++; colNum ++; pMBinfo ++; if (colNum == pInfo->VisualObject.VideoObject.MacroBlockPerRow) { colNum = 0; rowNum ++; pYc += 3 * MP4_NUM_EXT_MB * 16 + (stepYc << 4) - stepYc; pCbc += 3 * MP4_NUM_EXT_MB * 8 + (stepCbc << 3) - stepCbc; pCrc += 3 * MP4_NUM_EXT_MB * 8 + (stepCrc << 3) - stepCrc; pYp += 3 * MP4_NUM_EXT_MB * 16 + (stepYp << 4) - stepYp; pCbp += 3 * MP4_NUM_EXT_MB * 8 + (stepCbp << 3) - stepCbp; pCrp += 3 * MP4_NUM_EXT_MB * 8 + (stepCrp << 3) - stepCrp; pYn += 3 * MP4_NUM_EXT_MB * 16 + (stepYn << 4) - stepYn; pCbn += 3 * MP4_NUM_EXT_MB * 8 + (stepCbn << 3) - stepCbn; pCrn += 3 * MP4_NUM_EXT_MB * 8 + (stepCrn << 3) - stepCrn; // reset MV predictors at new row mvForw.dx = mvForw.dy = mvBack.dx = mvBack.dy = 0; } else { pYc += 16; pCrc += 8; pCbc += 8; pYp += 16; pCrp += 8; pCbp += 8; pYn += 16; pCrn += 8; pCbn += 8; } if (!pInfo->VisualObject.VideoObject.resync_marker_disable) { int found; if (mp4_DecodeVideoPacket(pInfo, &quant, &found) == MP4_STATUS_OK) { if (found) break; } else return MP4_STATUS_ERROR; } } }}#ifdef _OMP_KARABAS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -