📄 h263decframep.c
字号:
} else {
if (!fourMVmode)
pMBinfo->mv[0].dx = pMBinfo->mv[0].dy = 0;
else {
pMBinfo->type |= 0x80; /* to indicate to OBMC that no MV is present */
h263_Zero4MV(pMBinfo->mv);
}
}
if (pbFlag && bmb_type != IPPVC_MBTYPE_BACKWARD) {
if (h263_PredictDecode4MV_PB(pInfo, &pMBinfo->mv[0], &mvForw[0], &mvBack[0], &mvForwPred,
bmb_type, mvdb, trd, trb, 0) != H263_STATUS_OK) {
h263_Error("Error when decoding MVDB");
goto Err_1;
}
h263_LimitMV(mvForw, mvForw, &limitRectL, dx, dy, 16);
h263_ComputeChromaMV(&mvForw[0], &mvFCbCr);
if (bmb_type != IPPVC_MBTYPE_FORWARD) {
h263_LimitMV(mvBack, mvBack, &limitRectL, dx, dy, 16);
h263_ComputeChromaMV(&mvBack[0], &mvBCbCr);
}
}
if (!VPic->oppmodes.advIntra)
status = h263_DecodeMacroBlockIntra(pInfo, (cbpy << 2) + cbpc, quant, quant_c, pF, stepF);
else
status = h263_DecodeMacroBlockIntra_AdvI(pInfo, colNum, (cbpy << 2) + cbpc, quant, quant_c, predMode, pF, stepF);
if (status != H263_STATUS_OK) {
h263_Error("Error when decoding coefficients of Intra block");
goto Err_1;
}
if (pbFlag) {
Ipp8u *pRefY, *pRefCb, *pRefCr;
Ipp32s stepLum, stepChr;
if (bmb_type != IPPVC_MBTYPE_FORWARD) {
if (bmb_type != IPPVC_MBTYPE_BACKWARD) {
h263_BidirPredMacroblock(pYr, stepYr, pCbr, pCrr, stepCbr, pYc, stepYc, pCbc, pCrc, stepCbc,
predMB, &mvForw[0], &mvFCbCr, &mvBack[0], &mvBCbCr, 0);
pRefY = predMB; stepLum = 16;
pRefCb = predMB + 4*64; stepChr = 8;
pRefCr = predMB + 5*64;
} else {
pRefY = pYc; stepLum = stepYc;
pRefCb = pCbc; stepChr = stepCbc;
pRefCr = pCrc;
}
h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 32, pRefY, stepLum, pYn, stepYn, coeffMB_bI);
h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 16, pRefY+8, stepLum, pYn+8, stepYn, coeffMB_bI);
h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 8, pRefY+8*stepLum, stepLum, pYn+8*stepYn, stepYn, coeffMB_bI);
h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 4, pRefY+8+8*stepLum, stepLum, pYn+8+8*stepYn, stepYn, coeffMB_bI);
h263_DecodeMCBlockInter_B(pInfo, bquant_c, cbpb & 2, pRefCb, stepChr, pCbn, stepCbn, coeffMB_bI);
h263_DecodeMCBlockInter_B(pInfo, bquant_c, cbpb & 1, pRefCr, stepChr, pCrn, stepCrn, coeffMB_bI);
} else {
if (cbpb & 60) {
h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 32, pYr, pYn, stepYr, coeffMB_bI, &mvForw[0], 0);
h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 16, pYr+8, pYn+8, stepYr, coeffMB_bI, &mvForw[0], 0);
h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 8, pYr+stepYr*8, pYn+stepYn*8, stepYr, coeffMB_bI, &mvForw[0], 0);
h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 4, pYr+8+stepYr*8, pYn+8+stepYn*8, stepYr, coeffMB_bI, &mvForw[0], 0);
} else {
h263_Copy16x16HP_8u(pYr, stepYr, pYn, stepYn, &mvForw[0], 0);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
}
h263_DecodeMCBlockInter(pInfo, bquant_c, cbpb & 2, pCbr, pCbn, stepCbr, coeffMB_bI, &mvFCbCr, 0);
h263_DecodeMCBlockInter(pInfo, bquant_c, cbpb & 1, pCrr, pCrn, stepCrr, coeffMB_bI, &mvFCbCr, 0);
}
}
} else { /* INTER MB */
fourMVmb = (mb_type == IPPVC_MBTYPE_INTER4V || mb_type == IPPVC_MBTYPE_INTER4V_Q);
if (VPic->oppmodes.advIntra) {
for (k = 0; k < 6; k++)
b[(colNum + 1)*6 + k].dct_dc = -1;
}
if (!fourMVmb) {
if (h263_PredictDecodeMV(pInfo, pMBinfo, frGOB, rowNum, colNum, fourMVmode) != H263_STATUS_OK) {
h263_Error("Error when decoding motion vector");
goto Err_1;
}
h263_LimitMV(&pMBinfo->mv[0], &mvCur[0], &limitRectL, dx, dy, 16);
h263_ComputeChromaMV(&mvCur[0], &mvCbCr);
if (fourMVmode) {
mvCur[1] = mvCur[2] = mvCur[3] = mvCur[0];
pMBinfo->mv[1] = pMBinfo->mv[2] = pMBinfo->mv[3] = pMBinfo->mv[0];
}
if (pbFlag && bmb_type != IPPVC_MBTYPE_BACKWARD) {
if (h263_PredictDecode4MV_PB(pInfo, &pMBinfo->mv[0], &mvForw[0], &mvBack[0], &mvForwPred,
bmb_type, mvdb, trd, trb, 0) != H263_STATUS_OK) {
h263_Error("Error when decoding MVDB");
goto Err_1;
}
h263_LimitMV(mvForw, mvForw, &limitRectL, dx, dy, 16);
h263_ComputeChromaMV(&mvForw[0], &mvFCbCr);
if (bmb_type != IPPVC_MBTYPE_FORWARD) {
h263_LimitMV(mvBack, mvBack, &limitRectL, dx, dy, 16);
h263_ComputeChromaMV(&mvBack[0], &mvBCbCr);
}
}
} else {
if (h263_PredictDecode4MV(pInfo, pMBinfo, frGOB, rowNum, colNum) != H263_STATUS_OK) {
h263_Error("Error when decoding motion vectors");
goto Err_1;
}
h263_Limit4MV(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 8);
h263_ComputeChroma4MV(pMBinfo->mv, &mvCbCr);
h263_LimitMV(&mvCbCr, &mvCbCr, &limitRectC, dx >> 1, dy >> 1, 8);
if (pbFlag && bmb_type != IPPVC_MBTYPE_BACKWARD) {
if (h263_PredictDecode4MV_PB(pInfo, &pMBinfo->mv[0], &mvForw[0], &mvBack[0], &mvForwPred,
bmb_type, mvdb, trd, trb, 1) != H263_STATUS_OK) {
h263_Error("Error when decoding MVDB");
goto Err_1;
}
h263_Limit4MV(mvForw, mvForw, &limitRectL, dx, dy, 8);
if (bmb_type != IPPVC_MBTYPE_FORWARD) {
h263_Limit4MV(mvBack, mvBack, &limitRectL, dx, dy, 8);
h263_ComputeChroma4MV(&mvBack[0], &mvBCbCr);
h263_LimitMV(&mvBCbCr, &mvBCbCr, &limitRectC, dx >> 1, dy >> 1, 8);
h263_ComputeChroma4MV(&mvForw[0], &mvFCbCr);
} else
h263_ComputeChromaMV(&mvForw[0], &mvFCbCr);
h263_LimitMV(&mvFCbCr, &mvFCbCr, &limitRectC, dx >> 1, dy >> 1, 8);
}
}
/* decode and MC blocks */
if (!obmcFlag) {
if (fourMVmb) {
h263_DecodeMCBlockInter(pInfo, quant, cbpy & 8, pYr, pYc, stepYr, coeffMB, &mvCur[0], rt);
h263_DecodeMCBlockInter(pInfo, quant, cbpy & 4, pYr+8, pYc+8, stepYr, coeffMB, &mvCur[1], rt);
h263_DecodeMCBlockInter(pInfo, quant, cbpy & 2, pYr+stepYr*8, pYc+stepYc*8, stepYr, coeffMB, &mvCur[2], rt);
h263_DecodeMCBlockInter(pInfo, quant, cbpy & 1, pYr+8+stepYr*8, pYc+8+stepYc*8, stepYr, coeffMB, &mvCur[3], rt);
} else if (cbpy) {
h263_DecodeMCBlockInter(pInfo, quant, cbpy & 8, pYr, pYc, stepYr, coeffMB, &mvCur[0], rt);
h263_DecodeMCBlockInter(pInfo, quant, cbpy & 4, pYr+8, pYc+8, stepYr, coeffMB, &mvCur[0], rt);
h263_DecodeMCBlockInter(pInfo, quant, cbpy & 2, pYr+stepYr*8, pYc+stepYc*8, stepYr, coeffMB, &mvCur[0], rt);
h263_DecodeMCBlockInter(pInfo, quant, cbpy & 1, pYr+8+stepYr*8, pYc+8+stepYc*8, stepYr, coeffMB, &mvCur[0], rt);
} else {
h263_Copy16x16HP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
}
h263_DecodeMCBlockInter(pInfo, quant_c, cbpc & 2, pCbr, pCbc, stepCbr, coeffMB, &mvCbCr, rt);
h263_DecodeMCBlockInter(pInfo, quant_c, cbpc & 1, pCrr, pCrc, stepCrr, coeffMB, &mvCbCr, rt);
if (pbFlag) {
Ipp8u *pRefY, *pRefCb, *pRefCr;
Ipp32s stepLum, stepChr;
if (bmb_type != IPPVC_MBTYPE_FORWARD) {
if (bmb_type != IPPVC_MBTYPE_BACKWARD) {
h263_BidirPredMacroblock(pYr, stepYr, pCbr, pCrr, stepCbr, pYc, stepYc, pCbc, pCrc, stepCbc,
predMB, &mvForw[0], &mvFCbCr, &mvBack[0], &mvBCbCr, fourMVmb);
pRefY = predMB; stepLum = 16;
pRefCb = predMB + 4*64; stepChr = 8;
pRefCr = predMB + 5*64;
} else {
pRefY = pYc; stepLum = stepYc;
pRefCb = pCbc; stepChr = stepCbc;
pRefCr = pCrc;
}
h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 32, pRefY, stepLum, pYn, stepYn, coeffMB_b);
h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 16, pRefY+8, stepLum, pYn+8, stepYn, coeffMB_b);
h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 8, pRefY+8*stepLum, stepLum, pYn+8*stepYn, stepYn, coeffMB_b);
h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 4, pRefY+8+8*stepLum, stepLum, pYn+8+8*stepYn, stepYn, coeffMB_b);
h263_DecodeMCBlockInter_B(pInfo, bquant_c, cbpb & 2, pRefCb, stepChr, pCbn, stepCbn, coeffMB_b);
h263_DecodeMCBlockInter_B(pInfo, bquant_c, cbpb & 1, pRefCr, stepChr, pCrn, stepCrn, coeffMB_b);
} else {
if (cbpb >> 2) {
h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 32, pYr, pYn, stepYr, coeffMB_b, &mvForw[0], 0);
h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 16, pYr+8, pYn+8, stepYr, coeffMB_b, &mvForw[0], 0);
h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 8, pYr+stepYr*8, pYn+stepYn*8, stepYr, coeffMB_b, &mvForw[0], 0);
h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 4, pYr+8+stepYr*8, pYn+8+stepYn*8, stepYr, coeffMB_b, &mvForw[0], 0);
} else {
h263_Copy16x16HP_8u(pYr, stepYr, pYn, stepYn, &mvForw[0], 0);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
}
h263_DecodeMCBlockInter(pInfo, bquant_c, cbpb & 2, pCbr, pCbn, stepCbr, coeffMB_b, &mvFCbCr, 0);
h263_DecodeMCBlockInter(pInfo, bquant_c, cbpb & 1, pCrr, pCrn, stepCrr, coeffMB_b, &mvFCbCr, 0);
}
}
}
}
}
if (obmcFlag) {
/* OBMC for previous MB */
if (colNum > 0) {
if ((pMBinfo[-1].type & 0x7F) != IPPVC_MBTYPE_INTRA && (pMBinfo[-1].type & 0x7F) != IPPVC_MBTYPE_INTRA_Q) {
/* type may have been ORed with 0x80 */
h263_OBMC(pInfo, pMBinfo - 1, mvPrev, colNum - 1, rowNum, limitRectL, pYc - 16, stepYc, pYr - 16,
stepYr, cbpyPrev, coeffMB);
if (pbFlag) {
if (pMBinfo[-1].type == IPPVC_MB_STUFFING) {
IppiSize roi;
roi.height = roi.width = 16;
ippiCopy16x16_8u_C1R(pYc - 16, stepYc, pYn - 16, stepYn);
ippiAddBackPredPB_H263_8u_C1R(pYr - 16, stepYr, roi, pYn - 16, stepYn, 0);
roi.height = roi.width = 8;
ippiCopy8x8_8u_C1R(pCbc - 8, stepCbc, pCbn - 8, stepCbn);
ippiAddBackPredPB_H263_8u_C1R(pCbr - 8, stepCbr, roi, pCbn - 8, stepCbn, 0);
ippiCopy8x8_8u_C1R(pCrc - 8, stepCrc, pCrn - 8, stepCrn);
ippiAddBackPredPB_H263_8u_C1R(pCrr - 8, stepCrr, roi, pCrn - 8, stepCrn, 0);
} else {
Ipp8u *pRefY, *pRefCb, *pRefCr;
Ipp32s stepLum, stepChr;
Ipp32s prev4MVmb = (pMBinfo[-1].type == IPPVC_MBTYPE_INTER4V || pMBinfo[-1].type == IPPVC_MBTYPE_INTER4V_Q);
if (bmb_typePrev != IPPVC_MBTYPE_FORWARD) {
if (bmb_typePrev != IPPVC_MBTYPE_BACKWARD) {
h263_BidirPredMacroblock(pYr - 16, stepYr, pCbr - 8, pCrr - 8, stepCbr, pYc - 16, stepYc,
pCbc - 8, pCrc - 8, stepCbc,
predMB, &mvForwPrev[0], &mvFCbCrPrev, &mvBackPrev[0], &mvBCbCrPrev, prev4MVmb);
pRefY = predMB; stepLum = 16;
pRefCb = predMB + 4*64; stepChr = 8;
pRefCr = predMB + 5*64;
} else {
pRefY = pYc - 16; stepLum = stepYc;
pRefCb = pCbc - 8; stepChr = stepCbc;
pRefCr = pCrc - 8;
}
h263_MC(cbpbPrev & 32, pRefY, stepLum, pYn-16, stepYn, coeffMB_b);
h263_MC(cbpbPrev & 16, pRefY+8, stepLum, pYn-16+8, stepYn, coeffMB_b + 64);
h263_MC(cbpbPrev & 8, pRefY+8*stepLum, stepLum, pYn-16+8*stepYn, stepYn, coeffMB_b + 2*64);
h263_MC(cbpbPrev & 4, pRefY+8+8*stepLum, stepLum, pYn-16+8+8*stepYn, stepYn, coeffMB_b + 3*64);
h263_MC(cbpbPrev & 2, pRefCb, stepChr, pCbn-8, stepCbn, coeffMB_b + 4*64);
h263_MC(cbpbPrev & 1, pRefCr, stepChr, pCrn-8, stepCrn, coeffMB_b + 5*64);
} else {
h263_MC_HP(cbpbPrev & 32, pYr-16, stepYr, pYn-16, stepYn, coeffMB_b, &mvForwPrev[0], 0);
h263_MC_HP(cbpbPrev & 16, pYr-16+8, stepYr, pYn-16+8, stepYn, coeffMB_b + 64, &mvForwPrev[0], 0);
h263_MC_HP(cbpbPrev & 8, pYr-16+8*stepYr, stepYr, pYn-16+8*stepYn, stepYn, coeffMB_b + 2*64, &mvForwPrev[0], 0);
h263_MC_HP(cbpbPrev & 4, pYr-16+8+8*stepYr, stepYr, pYn-16+8+8*stepYn, stepYn, coeffMB_b + 3*64, &mvForwPrev[0], 0);
h263_MC_HP(cbpbPrev & 2, pCbr-8, stepCbr, pCbn-8, stepCbn, coeffMB_b + 4*64, &mvFCbCrPrev, 0);
h263_MC_HP(cbpbPrev & 1, pCrr-8, stepCrr, pCrn-8, stepCrn, coeffMB_b + 5*64, &mvFCbCrPrev, 0);
}
}
}
}
}
if (mb_type != IPPVC_MBTYPE_INTRA && mb_type != IPPVC_MBTYPE_INTRA_Q) {
if (mb_not_coded) {
cbpyPrev = 0;
h263_Zero4MV(mvPrev);
ippiCopy8x8_8u_C1R(pCbr, stepCbr, pCbc, stepCbc);
ippiCopy8x8_8u_C1R(pCrr, stepCrr, pCrc, stepCrc);
} else {
cbpyPrev = cbpy;
mvPrev[0] = mvCur[0]; mvPrev[1] = mvCur[1]; mvPrev[2] = mvCur[2]; mvPrev[3] = mvCur[3];
if (h263_DecodeMacroBlockInter(pInfo, coeffMB, quant, quant_c, (cbpy << 2) + cbpc) != H263_STATUS_OK) {
h263_Error("Error when decoding coefficients of Inter block");
goto Err_1;
}
h263_MC_HP(cbpc & 2, pCbr, stepCbr, pCbc, stepCbc, coeffMB+256, &mvCbCr, rt);
h263_MC_HP(cbpc & 1, pCrr, stepCrr, pCrc, stepCrc, coeffMB+320, &mvCbCr, rt);
if (pbFlag) {
cbpbPrev = cbpb;
bmb_typePrev = bmb_type;
if (bmb_type == -1 || bmb_type == IPPVC_MBTYPE_INTERPOLATE) {
mvBackPrev[0] = mvBack[0];
if (fourMVmb) {
mvBackPrev[1] = mvBack[1]; mvBackPrev[2] = mvBack[2]; mvBackPrev[3] = mvBack[3];
mvForwPrev[1] = mvForw[1]; mvForwPrev[2] = mvForw[2]; mvForwPrev[3] = mvForw[3];
}
mvBCbCrPrev = mvBCbCr;
}
mvForwPrev[0] = mvForw[0];
mvFCbCrPrev = mvFCbCr;
if (h263_DecodeMacroBlockInter(pInfo, coeffMB_b, bquant, bquant_c, cbpb) != H263_STATUS_OK) {
h263_Error("Error when decoding coefficients of Inter block");
goto Err_1;
}
}
}
if (colNum == mbPerRow - 1) {
h263_OBMC(pInfo, pMBinfo, mvPrev, colNum, rowNum, limitRectL, pYc, stepYc, pYr, stepYr, cbpyPrev, coeffMB);
if (pbFlag) {
Ipp8u *pRefY, *pRefCb, *pRefCr;
if (mb_not_coded) {
IppiSize roi;
roi.height = roi.width = 16;
ippiCopy16x16_8u_C1R(pYc, stepYc, pYn, stepYn);
ippiAddBackPredPB_H263_8u_C1R(pYr, stepYr, roi, pYn, stepYn, 0);
roi.height = roi.width = 8;
ippiCopy8x8_8u_C1R(pCbc, stepCbc, pCbn, stepCbn);
ippiAddBackPredPB_H263_8u_C1R(pCbr, stepCbr, roi, pCbn, stepCbn, 0);
ippiCopy8x8_8u_C1R(pCrc, stepCrc, pCrn, stepCrn);
ippiAddBackPredPB_H263_8u_C1R(pCrr, stepCrr, roi, pCrn, stepCrn, 0);
} else {
Ipp32s stepLum, stepChr;
if (bmb_typePrev != IPPVC_MBTYPE_FORWARD) {
if (bmb_typePrev != IPPVC_MBTYPE_BACKWARD) {
h263_BidirPredMacroblock(pYr, stepYr, pCbr, pCrr, stepCbr, pYc, stepYc, pCbc, pCrc, stepCbc,
predMB, &mvForwPrev[0], &mvFCbCrPrev, &mvBackPrev[0], &mvBCbCrPrev, fourMVmb);
pRefY = predMB; stepLum = 16;
pRefCb = predMB + 4*64; stepChr = 8;
pRefCr = predMB + 5*64;
} else {
pRefY = pYc; stepLum = stepYc;
pRefCb = pCbc; stepChr = stepCbc;
pRefCr = pCrc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -