📄 mp4decvopb.c
字号:
// decode mb_type
code = mp4_ShowBits9(pInfo, 4);
if (code != 0) {
mb_type = mp4_BVOPmb_type[code].code;
mp4_FlushBits(pInfo, mp4_BVOPmb_type[code].len);
} else {
mp4_Error("Error when decode mb_type of B-VOP macroblock");
goto Err_2;
}
if (modb == 0)
cbpb = mp4_GetBits9(pInfo, 6);
if (mb_type != IPPVC_MBTYPE_DIRECT && cbpb != 0)
mp4_UpdateQuant_B(pInfo, quant);
}
// coordinates of current MB for limitation
dx = colNum * 16;
dy = rowNum * 16;
if (mb_type == IPPVC_MBTYPE_FORWARD) {
mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nMB_FORWARD);
if (mp4_DecodeMV(pInfo, &mvForw, fcode_forward) != MP4_STATUS_OK)
goto Err_2;
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, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 16, pYc+8, stepYc, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 8, pYc+8*stepYc, stepYc, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 4, pYc+8*stepYc+8, stepYc, Err_2);
} 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, Err_2);
mp4_DecodeMCBlockInter_MPEG4(cbpb & 16, pYp+8, stepYp, pYc+8, stepYc, mvForwLim, 0, Err_2);
mp4_DecodeMCBlockInter_MPEG4(cbpb & 8, pYp+8*stepYp, stepYp, pYc+8*stepYc, stepYc, mvForwLim, 0, Err_2);
mp4_DecodeMCBlockInter_MPEG4(cbpb & 4, pYp+8*stepYp+8, stepYp, pYc+8*stepYc+8, stepYc, mvForwLim, 0, Err_2);
} 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, Err_2);
mp4_DecodeMCBlockInter_MPEG4(cbpb & 1, pCrp, stepCrp, pCrc, stepCrc, mvCbCrF, 0, Err_2);
} else if (mb_type == IPPVC_MBTYPE_BACKWARD) {
mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nMB_BACKWARD);
if (mp4_DecodeMV(pInfo, &mvBack, fcode_backward) != MP4_STATUS_OK)
goto Err_2;
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, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 16, pYc+8, stepYc, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 8, pYc+8*stepYc, stepYc, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 4, pYc+8*stepYc+8, stepYc, Err_2);
} 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, Err_2);
mp4_DecodeMCBlockInter_MPEG4(cbpb & 16, pYn+8, stepYn, pYc+8, stepYc, mvBackLim, 0, Err_2);
mp4_DecodeMCBlockInter_MPEG4(cbpb & 8, pYn+8*stepYn, stepYp, pYc+8*stepYc, stepYc, mvBackLim, 0, Err_2);
mp4_DecodeMCBlockInter_MPEG4(cbpb & 4, pYn+8*stepYn+8, stepYp, pYc+8*stepYc+8, stepYc, mvBackLim, 0, Err_2);
} 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, Err_2);
mp4_DecodeMCBlockInter_MPEG4(cbpb & 1, pCrn, stepCrn, pCrc, stepCrc, mvCbCrB, 0, Err_2);
} else if (mb_type == IPPVC_MBTYPE_INTERPOLATE) {
mp4_StatisticInc_(&pInfo->VisualObject.Statistic.nMB_INTERPOLATE);
if (mp4_DecodeMV(pInfo, &mvForw, fcode_forward) != MP4_STATUS_OK)
goto Err_2;
if (mp4_DecodeMV(pInfo, &mvBack, fcode_backward) != MP4_STATUS_OK)
goto Err_2;
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, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 16, pYc+8, stepYc, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 8, pYc+8*stepYc, stepYc, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 4, pYc+8*stepYc+8, stepYc, Err_2);
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, Err_2);
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, Err_2);
} 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)
goto Err_2;
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, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 16, pYc+8, stepYc, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 8, pYc+8*stepYc, stepYc, Err_2);
mp4_DecodeReconBlockInter_MPEG4(cbpb & 4, pYc+8*stepYc+8, stepYc, Err_2);
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, Err_2);
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, Err_2);
}
}
//mbCurr ++;
mbInVideoPacket ++;
colNum ++;
pMBinfo ++;
if (colNum == mbPerRow) {
colNum = 0;
rowNum ++;
if (rowNum == mbPerCol)
return sts;
pYc += (2 * MP4_NUM_EXT_MB + 1) * 16 + (stepYc << 4) - stepYc;
pCbc += (2 * MP4_NUM_EXT_MB + 1) * 8 + (stepCbc << 3) - stepCbc;
pCrc += (2 * MP4_NUM_EXT_MB + 1) * 8 + (stepCrc << 3) - stepCrc;
pYp += (2 * MP4_NUM_EXT_MB + 1) * 16 + (stepYp << 4) - stepYp;
pCbp += (2 * MP4_NUM_EXT_MB + 1) * 8 + (stepCbp << 3) - stepCbp;
pCrp += (2 * MP4_NUM_EXT_MB + 1) * 8 + (stepCrp << 3) - stepCrp;
pYn += (2 * MP4_NUM_EXT_MB + 1) * 16 + (stepYn << 4) - stepYn;
pCbn += (2 * MP4_NUM_EXT_MB + 1) * 8 + (stepCbn << 3) - stepCbn;
pCrn += (2 * MP4_NUM_EXT_MB + 1) * 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -