📄 h263decfuncs.c
字号:
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);
}
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_C);
} else {
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
}
pm >>= 1;
coeff += 64;
}
return H263_STATUS_OK;
}
h263_Status h263_BidirPredMacroblock(Ipp8u *pYr, Ipp32s stepYr, Ipp8u *pCbr, Ipp8u* pCrr, Ipp32s stepCr,
Ipp8u *pYc, Ipp32s stepYc, Ipp8u *pCbc, Ipp8u* pCrc, Ipp32s stepCc,
Ipp8u *predMB, IppMotionVector *mvForw, IppMotionVector *mvFCbCr,
IppMotionVector *mvBack, IppMotionVector *mvBCbCr, Ipp32s fourMVmode)
{
Ipp32s mvx0, mvx1, mvy0, mvy1, xL0, w0, xL, xR, yT, yB;
IppiSize roiSize;
Ipp8u *pCur;
if (!fourMVmode)
h263_Copy16x16HP_8u(pYr, stepYr, predMB, 16, &mvForw[0], 0);
else {
h263_Copy8x8HP_8u(pYr, stepYr, predMB, 16, &mvForw[0], 0);
h263_Copy8x8HP_8u(pYr + 8, stepYr, predMB + 8, 16, &mvForw[1], 0);
h263_Copy8x8HP_8u(pYr + 8*stepYr, stepYr, predMB + 8*16, 16, &mvForw[2], 0);
h263_Copy8x8HP_8u(pYr + 8 + 8*stepYr, stepYr, predMB + 8 + 8*16, 16, &mvForw[3], 0);
}
h263_Copy8x8HP_8u(pCbr, stepCr, predMB + 4*64, 8, mvFCbCr, 0);
h263_Copy8x8HP_8u(pCrr, stepCr, predMB + 5*64, 8, mvFCbCr, 0);
pCur = pYc + H263_MV_OFF_HP(mvBack[0].dx, mvBack[0].dy, stepYc);
pCbc += H263_MV_OFF_HP(mvBCbCr->dx, mvBCbCr->dy, stepCc);
pCrc += H263_MV_OFF_HP(mvBCbCr->dx, mvBCbCr->dy, stepCc);
mvx0 = (-mvBack[0].dx + 1) >> 1;
mvx1 = 16 - ((mvBack[0].dx + 1) >> 1);
mvy0 = (-mvBack[0].dy + 1) >> 1;
mvy1 = 16 - ((mvBack[0].dy + 1) >> 1);
xL = IPP_MAX(mvx0, 0);
xR = IPP_MIN(mvx1, 8);
roiSize.width = xR - xL;
yT = IPP_MAX(mvy0, 0);
yB = IPP_MIN(mvy1, 8);
roiSize.height = yB - yT;
h263_AddBackPredPB_8u(pCur + xL + yT*stepYc, stepYc, roiSize, predMB + xL + yT*16, 16, &mvBack[0]);
if (!fourMVmode) {
xL0 = xL;
w0 = roiSize.width;
xL = IPP_MAX(mvx0 - 8, 0);
xR = IPP_MIN(mvx1 - 8, 8);
roiSize.width = xR - xL;
h263_AddBackPredPB_8u(pCur + 8 + xL + yT*stepYc, stepYc, roiSize, predMB + 8 + xL + yT*16, 16, &mvBack[0]);
roiSize.width = w0;
yT = IPP_MAX(mvy0 - 8, 0);
yB = IPP_MIN(mvy1 - 8, 8);
roiSize.height = yB - yT;
h263_AddBackPredPB_8u(pCur + 8*stepYc + xL0 + yT*stepYc, stepYc, roiSize, predMB + 8*16 + xL0 + yT*16, 16, &mvBack[0]);
roiSize.width = xR - xL;
h263_AddBackPredPB_8u(pCur + 8*stepYc + 8 + xL + yT*stepYc, stepYc, roiSize, predMB + 8 + 8*16 + xL + yT*16, 16, &mvBack[0]);
} else {
Ipp32s i;
for (i = 1; i < 4; i++) {
mvx0 = ((-mvBack[i].dx + 1) >> 1) - (i & 1)*8;
mvx1 = 16 - ((mvBack[i].dx + 1) >> 1) - (i & 1)*8;
mvy0 = ((-mvBack[i].dy + 1) >> 1) - (i & 2)*4;
mvy1 = 16 - ((mvBack[i].dy + 1) >> 1) - (i & 2)*4;
xL = IPP_MAX(mvx0, 0);
xR = IPP_MIN(mvx1, 8);
roiSize.width = xR - xL;
yT = IPP_MAX(mvy0, 0);
yB = IPP_MIN(mvy1, 8);
roiSize.height = yB - yT;
pCur = pYc + H263_MV_OFF_HP(mvBack[i].dx, mvBack[i].dy, stepYc) + (i & 1)*8 + (i & 2)*4*stepYc + xL + yT*stepYc;
h263_AddBackPredPB_8u(pCur, stepYc, roiSize, predMB + (i & 1)*8 + (i & 2)*4*16 + xL + yT*16, 16, &mvBack[i]);
}
}
mvx0 = (-mvBCbCr->dx + 1) >> 1;
mvx1 = 8 - ((mvBCbCr->dx + 1) >> 1);
mvy0 = (-mvBCbCr->dy + 1) >> 1;
mvy1 = 8 - ((mvBCbCr->dy + 1) >> 1);
xL = IPP_MAX(mvx0, 0);
xR = IPP_MIN(mvx1, 8);
yT = IPP_MAX(mvy0, 0);
yB = IPP_MIN(mvy1, 8);
roiSize.width = xR - xL;
roiSize.height = yB - yT;
h263_AddBackPredPB_8u(pCbc + xL + yT*stepCc, stepCc, roiSize, predMB + 4*64 + xL + yT*8, 8, mvBCbCr);
h263_AddBackPredPB_8u(pCrc + xL + yT*stepCc, stepCc, roiSize, predMB + 5*64 + xL + yT*8, 8, mvBCbCr);
return H263_STATUS_OK;
}
/*
// decode mcbpc and set MBtype and ChromaPattern
*/
h263_Status h263_DecodeMCBPC_P(h263_Info* pInfo, Ipp32s *mbType, Ipp32s *mbPattern, Ipp32s stat)
{
Ipp32u code;
Ipp32s type, pattern;
code = h263_ShowBits9(pInfo, 9);
if (code >= 256) {
type = IPPVC_MBTYPE_INTER;
pattern = 0;
h263_FlushBits(pInfo, 1);
} else if (code) {
type = h263_Pmb_type[code];
pattern = h263_Pmb_cbpc[code];
h263_FlushBits(pInfo, h263_Pmb_bits[code]);
} else {
h263_FlushBits(pInfo, 9);
code = h263_ShowBits9(pInfo, 4);
if (code < 8) {
h263_Error("Error when decoding mcbpc of P-Frame macroblock");
return H263_STATUS_ERROR;
} else if (code < 12) {
pattern = 0;
h263_FlushBits(pInfo, 2);
} else {
pattern = (code & 3) ? (code & 3) : 1;
h263_FlushBits(pInfo, 4);
}
type = IPPVC_MBTYPE_INTER4V_Q;
}
*mbType = type;
*mbPattern = pattern;
if (stat) {
if (type == IPPVC_MBTYPE_INTER)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTER);
else if (type == IPPVC_MBTYPE_INTER_Q)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTER_Q);
else if (type == IPPVC_MBTYPE_INTRA)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA);
else if (type == IPPVC_MBTYPE_INTRA_Q)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_Q);
else if (type == IPPVC_MBTYPE_INTER4V)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTER4V);
else if (type == IPPVC_MBTYPE_INTER4V_Q)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTER4V_Q);
}
return H263_STATUS_OK;
}
void h263_DecodeMODB_iPB(h263_Info* pInfo, Ipp32s *bmb_type, Ipp32s *cbpb, Ipp32s *mvdb)
{
Ipp32u code;
Ipp32s fbits;
code = h263_ShowBits9(pInfo, 5);
if (code < 24) {
*bmb_type = IPPVC_MBTYPE_INTERPOLATE;
*cbpb = code >> 4;
fbits = 1 + *cbpb;
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTERPOLATE_iPB);
} else if (code < 30) {
*bmb_type = IPPVC_MBTYPE_FORWARD;
*mvdb = 1;
*cbpb = (code >> 2) & 1;
fbits = 3 + *cbpb;
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_FORWARD_iPB);
} else {
*bmb_type = IPPVC_MBTYPE_BACKWARD;
*cbpb = code & 1;
fbits = 5;
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_BACKWARD_iPB);
}
h263_FlushBits(pInfo, fbits);
}
/*
// decode mcbpc and set MBtype and ChromaPattern for EI-frames
*/
h263_Status h263_DecodeMCBPC_EI(h263_Info* pInfo, Ipp32s *mbType, Ipp32s *mbPattern)
{
Ipp32u code;
Ipp32s len;
h263_VLC1 vlc;
code = h263_ShowBits9(pInfo, 8);
if (code >= 32) {
code >>= 5;
*mbType = IPPVC_MBTYPE_INTER; /* IPPVC_MBTYPE_INTER(_Q) is used for UPWARD prediction */
*mbPattern = (code > 3) ? 0 : (code & 3);
len = (code > 3) ? 1 : 3;
} else if (code >= 16) {
*mbType = IPPVC_MBTYPE_INTER_Q;
*mbPattern = 0;
len = 4;
} else if (code != 0) {
vlc = h263_EImb_type[code - 1];
*mbType = vlc.code;
len = vlc.len & 15;
*mbPattern = vlc.len >> 4;
} else {
h263_FlushBits(pInfo, 8);
if (h263_GetBit(pInfo) == 1) {
*mbType = IPPVC_MB_STUFFING;
return H263_STATUS_OK;
} else {
h263_Error("Error when decoding mcbpc of EI-Frame macroblock");
return H263_STATUS_ERROR;
}
}
h263_FlushBits(pInfo, len);
#ifdef H263_FULL_STAT
if (*mbType == IPPVC_MBTYPE_INTER)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_UPWARD_EI);
else if (*mbType == IPPVC_MBTYPE_INTER_Q)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_UPWARD_Q_EI);
else if (*mbType == IPPVC_MBTYPE_INTRA)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_EI);
else if (*mbType == IPPVC_MBTYPE_INTRA_Q)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_Q_EI);
#endif
return H263_STATUS_OK;
}
/*
// decode MBTYPE for B-frames
*/
h263_Status h263_DecodeMBTYPE_B(h263_Info* pInfo, Ipp32s *mbType, Ipp32s *cbp, Ipp32s *dquant)
{
Ipp32u code;
Ipp32s len;
h263_VLC1 vlc;
code = h263_ShowBits9(pInfo, 7);
if (code == 0) {
h263_FlushBits(pInfo, 7);
if (h263_GetBits9(pInfo, 2) == 1) {
*mbType = IPPVC_MB_STUFFING;
return H263_STATUS_OK;
} else {
h263_Error("Error when decoding mcbpc of B-Frame macroblock");
return H263_STATUS_ERROR;
}
} else if (code <= 3) {
*dquant = (2 &~ code);
*cbp = 1;
*mbType = (code & 2) ? IPPVC_MBTYPE_INTRA : IPPVC_MBTYPE_INTRA_Q;
h263_FlushBits(pInfo, 7 - (code >> 1));
#ifdef H263_FULL_STAT
if (*mbType == IPPVC_MBTYPE_INTRA)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA);
else
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_Q);
#endif
return H263_STATUS_OK;
}
vlc = h263_Bmb_type[(code >> 2) - 1];
*mbType = vlc.code;
len = vlc.len & 15;
*cbp = vlc.len & 0x10;
*dquant = vlc.len & 0x20;
h263_FlushBits(pInfo, len);
#ifdef H263_FULL_STAT
if (*mbType == IPPVC_MBTYPE_DIRECT)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_DIRECT_B);
else if (*mbType == IPPVC_MBTYPE_INTERPOLATE)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTERPOLATE_B);
else if (*mbType == IPPVC_MBTYPE_BACKWARD)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_BACKWARD_B);
else if (*mbType == IPPVC_MBTYPE_FORWARD)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_BACKWARD_B);
#endif
return H263_STATUS_OK;
}
/*
// decode MBTYPE for EP-frames
*/
h263_Status h263_DecodeMBTYPE_EP(h263_Info* pInfo, Ipp32s *mbType, Ipp32s *cbp, Ipp32s *dquant)
{
Ipp32u code;
Ipp32s len;
h263_VLC1 vlc;
code = h263_ShowBits9(pInfo, 8);
if (code == 0) {
h263_FlushBits(pInfo, 8);
if (h263_GetBit(pInfo) == 1) {
*mbType = IPPVC_MB_STUFFING;
return H263_STATUS_OK;
} else {
h263_Error("Error when decoding mcbpc of EP-Frame macroblock");
return H263_STATUS_ERROR;
}
} else if (code <= 3) {
*mbType = (code & 2) ? IPPVC_MBTYPE_INTRA : IPPVC_MBTYPE_INTRA_Q;
h263_FlushBits(pInfo, 8 - (code >> 1));
#ifdef H263_FULL_STAT
if (*mbType == IPPVC_MBTYPE_INTRA)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA);
else
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTRA_Q);
#endif
return H263_STATUS_OK;
}
code >>= 2;
if (code < 8)
vlc = h263_EPmb_type_0[code - 1];
else
vlc = h263_EPmb_type_1[(code >> 3) - 1];
*mbType = vlc.code;
len = vlc.len & 15;
*cbp = vlc.len & 0x10;
*dquant = vlc.len & 0x20;
h263_FlushBits(pInfo, len);
#ifdef H263_FULL_STAT
if (*mbType == IPPVC_MBTYPE_INTERPOLATE)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_INTERPOLATE_EP);
else if (*mbType == IPPVC_MBTYPE_BACKWARD)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_UPWARD_EP);
else if (*mbType == IPPVC_MBTYPE_FORWARD)
h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nMB_FORWARD_EP);
#endif
return H263_STATUS_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -