📄 h263_enc_frame.cpp
字号:
#ifdef ME_USE_THRESHOLD
if (bSAD <= thrSAD_8x8) goto L_01;
#endif
}
}
if (yPos > yT) {
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+(yPos-1)*step+xPos, step, &cSAD, IPPVC_MC_APX_FH);
if (cSAD < bSAD) {
i = -1; j = 0; bSAD = cSAD;
#ifdef ME_USE_THRESHOLD
if (bSAD <= thrSAD_8x8) goto L_01;
#endif
}
}
if (xPos < xR && yPos > yT) {
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+(yPos-1)*step+xPos, step, &cSAD, IPPVC_MC_APX_HH);
if (cSAD < bSAD) {
i = -1; j = 1; bSAD = cSAD;
#ifdef ME_USE_THRESHOLD
if (bSAD <= thrSAD_8x8) goto L_01;
#endif
}
}
if (xPos > xL) {
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+yPos*step+xPos-1, step, &cSAD, IPPVC_MC_APX_HF);
if (cSAD < bSAD) {
i = 0; j = -1; bSAD = cSAD;
#ifdef ME_USE_THRESHOLD
if (bSAD <= thrSAD_8x8) goto L_01;
#endif
}
}
if (xPos < xR) {
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+yPos*step+xPos, step, &cSAD, IPPVC_MC_APX_HF);
if (cSAD < bSAD) {
i = 0; j = 1; bSAD = cSAD;
#ifdef ME_USE_THRESHOLD
if (bSAD <= thrSAD_8x8) goto L_01;
#endif
}
}
if (xPos > xL && yPos < yB) {
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+yPos*step+xPos-1, step, &cSAD, IPPVC_MC_APX_HH);
if (cSAD < bSAD) {
i = 1; j = -1; bSAD = cSAD;
#ifdef ME_USE_THRESHOLD
if (bSAD <= thrSAD_8x8) goto L_01;
#endif
}
}
if (yPos < yB) {
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+yPos*step+xPos, step, &cSAD, IPPVC_MC_APX_FH);
if (cSAD < bSAD) {
i = 1; j = 0; bSAD = cSAD;
#ifdef ME_USE_THRESHOLD
if (bSAD <= thrSAD_8x8) goto L_01;
#endif
}
}
if (xPos < xR && yPos < yB) {
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+yPos*step+xPos, step, &cSAD, IPPVC_MC_APX_HH);
if (cSAD < bSAD) {
i = 1; j = 1; bSAD = cSAD;
}
}
#ifdef ME_USE_THRESHOLD
L_01:
#endif
mv->dx = (Ipp16s)((xPos << 1) + j);
mv->dy = (Ipp16s)((yPos << 1) + i);
*bestSAD = bSAD;
}
static void h263e_ME_HalfPel_SAD_Fast_8x8(Ipp8u *pCur, Ipp8u *pRef, Ipp32s step, Ipp32s xL, Ipp32s xR,
Ipp32s yT, Ipp32s yB, Ipp32s xPos, Ipp32s yPos, Ipp32s *bSad,
IppMotionVector *mv, Ipp32s *sad, Ipp32s xP, Ipp32s yP)
{
Ipp32s i, j;
Ipp32s m0, m1, m2, m3, m4;
m0 = *bSad;
j = xPos;
i = yPos - 1;
if (j >= xL && j <= xR && i >= yT && i <= yB) {
if (j >= xP - rangeME_8x8 && j <= xP + rangeME_8x8 && i >= yP - rangeME_8x8 && i <= yP + rangeME_8x8)
m1 = sad[(i - yP + rangeME_8x8) * (rangeME_8x8*2+1) + j - xP + rangeME_8x8];
else
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+i*step+j, step, &m1, IPPVC_MC_APX_FF);
} else
m1 = 1000000;
j = xPos;
i = yPos + 1;
if (j >= xL && j <= xR && i >= yT && i <= yB) {
if (j >= xP - rangeME_8x8 && j <= xP + rangeME_8x8 && i >= yP - rangeME_8x8 && i <= yP + rangeME_8x8)
m2 = sad[(i - yP + rangeME_8x8) * (rangeME_8x8*2+1) + j - xP + rangeME_8x8];
else
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+i*step+j, step, &m2, IPPVC_MC_APX_FF);
} else
m2 = 1000000;
j = xPos - 1;
i = yPos;
if (j >= xL && j <= xR && i >= yT && i <= yB) {
if (j >= xP - rangeME_8x8 && j <= xP + rangeME_8x8 && i >= yP - rangeME_8x8 && i <= yP + rangeME_8x8)
m3 = sad[(i - yP + rangeME_8x8) * (rangeME_8x8*2+1) + j - xP + rangeME_8x8];
else
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+i*step+j, step, &m3, IPPVC_MC_APX_FF);
} else
m3 = 1000000;
j = xPos + 1;
i = yPos;
if (j >= xL && j <= xR && i >= yT && i <= yB) {
if (j >= xP - rangeME_8x8 && j <= xP + rangeME_8x8 && i >= yP - rangeME_8x8 && i <= yP + rangeME_8x8)
m4 = sad[(i - yP + rangeME_8x8) * (rangeME_8x8*2+1) + j - xP + rangeME_8x8];
else
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+i*step+j, step, &m4, IPPVC_MC_APX_FF);
} else
m4 = 1000000;
if (2*(m3-m0) < (m4-m0)) {
j = -1;
} else if ((m3-m0) > 2*(m4-m0)) {
j = +1;
} else
j = 0;
if (2*(m1-m0) < (m2-m0)) {
i = -1;
} else if ((m1-m0) > 2*(m2-m0)) {
i = +1;
} else
i = 0;
mv->dx = (Ipp16s)((xPos << 1) + j);
mv->dy = (Ipp16s)((yPos << 1) + i);
if (j != 0 || i != 0) {
ippiSAD8x8_8u32s_C1R(pCur, step, pRef+h263e_MC_offs(mv, step), step, bSad, h263e_MC_type(mv));
if (*bSad > m0) {
// false choosing
mv->dx = (Ipp16s)(xPos << 1);
mv->dy = (Ipp16s)(yPos << 1);
*bSad = m0;
}
}
}
#define FIND_MV_LIMITS_UMV1(mvPred, x, y) \
{ \
if (mvPred.dx <= -32) { \
xL = -IPP_MIN(x * 16 + 16, 31); \
xR = 0; \
} else if (mvPred.dx <= 32) { \
xL = -IPP_MIN(x * 16 + 16, (32 - mvPred.dx) >> 1); \
xR = IPP_MIN((mNumMacroBlockPerRow - x - 1) * 16 + 15, (mvPred.dx + 31) >> 1); \
} else { \
xL = 0; \
xR = IPP_MIN((mNumMacroBlockPerRow - x - 1) * 16 + 15, 31); \
} \
if (mvPred.dy <= -32) { \
yT = -IPP_MIN(y * 16 + 16, 31); \
yB = 0; \
} else if (mvPred.dy <= 32) { \
yT = -IPP_MIN(y * 16 + 16, (32 - mvPred.dy) >> 1); \
yB = IPP_MIN((mNumMacroBlockPerCol - y - 1) * 16 + 15, (mvPred.dy + 31) >> 1); \
} else { \
yT = 0; \
yB = IPP_MIN((mNumMacroBlockPerCol - y - 1) * 16 + 15, 31); \
} \
}
void ippVideoEncoderH263::ME_SAD_8x8(Ipp8u *pCur, Ipp8u *pRef, Ipp32s step, Ipp32s xL0, Ipp32s xR0,
Ipp32s yT0, Ipp32s yB0, Ipp32s *bestSAD, IppMotionVector *mv,
IppMotionVector *mv4, Ipp32s x, Ipp32s y, IppMotionVector *mvNeighb)
{
Ipp32s xPos[4], yPos[4], bSad[4], sad[4][(rangeME_8x8*2+1)*(rangeME_8x8*2+1)], pOff[4], xP[4], yP[4];
IppMotionVector mvPred;
Ipp32s i, j, k, n, iPos, jPos;
Ipp32s xL, xR, yT, yB;
#ifdef ME_USE_THRESHOLD
Ipp32s sadThresh[4] = {0, 0, 0, 0};
#endif
xP[0] = h263e_Div2(mv->dx);
yP[0] = h263e_Div2(mv->dy);
xL = xL0; xR = xR0; yT = yT0; yB = yB0;
bSad[0] = bSad[1] = bSad[2] = bSad[3] = MAX_SAD;
pOff[0] = 0;
pOff[1] = 8;
pOff[2] = step * 8;
pOff[3] = step * 8 + 8;
if (mMEfastHP)
memset(sad, -1, 4*(rangeME_8x8*2+1)*(rangeME_8x8*2+1)*sizeof(Ipp32s));
for (n = 0; n < 4; n ++) {
k = 0;
if (n) {
if (n == 1) {
mvPred.dx = h263e_Median(xPos[0] << 1, mvNeighb[1].dx, mvNeighb[2].dx);
mvPred.dy = h263e_Median(yPos[0] << 1, mvNeighb[1].dy, mvNeighb[2].dy);
} else if (n == 2) {
mvPred.dx = h263e_Median(xPos[0] << 1, xPos[1] << 1, mvNeighb[3].dx);
mvPred.dy = h263e_Median(yPos[0] << 1, yPos[1] << 1, mvNeighb[3].dy);
} else {
mvPred.dx = h263e_Median(xPos[0] << 1, xPos[1] << 1, xPos[2] << 1);
mvPred.dy = h263e_Median(yPos[0] << 1, yPos[1] << 1, yPos[2] << 1);
}
xP[n] = h263e_Div2(mvPred.dx);
yP[n] = h263e_Div2(mvPred.dy);
if (mVideoPicture.UMV == 1)
FIND_MV_LIMITS_UMV1(mvPred, x, y);
}
for (iPos = -rangeME_8x8; iPos <= rangeME_8x8; iPos ++) {
i = yP[n] + iPos;
if (i >= yT && i <= yB) {
for (jPos = -rangeME_8x8; jPos <= rangeME_8x8; jPos ++) {
j = xP[n] + jPos;
if (j >= xL && j <= xR) {
ippiSAD8x8_8u32s_C1R(pCur+pOff[n], step, pRef+pOff[n]+i*step+j, step, &sad[n][k], IPPVC_MC_APX_FF);
if (bSad[n] > sad[n][k]) {
bSad[n] = sad[n][k];
xPos[n] = j;
yPos[n] = i;
#ifdef ME_USE_THRESHOLD
if (sad[n][k] <= mMEthrSAD8x8) {
sadThresh[n] = 1;
goto L_1;
}
#endif
}
}
k ++;
}
} else
k += (rangeME_8x8*2+1);
}
#ifdef ME_USE_THRESHOLD
L_1:;
#endif
}
if (mMEaccuracy == 1) {
for (n = 0; n < 4; n ++) {
mv4[n].dx = (Ipp16s)(xPos[n] << 1);
mv4[n].dy = (Ipp16s)(yPos[n] << 1);
}
} else {
xL = xL0; xR = xR0; yT = yT0; yB = yB0;
if (mMEalgorithm == 1 && mMEfastHP) {
for (n = 0; n < 4; n ++) {
if (mVideoPicture.UMV == 1 && n) {
if (n == 1) {
mvPred.dx = h263e_Median(mv4[0].dx, mvNeighb[1].dx, mvNeighb[2].dx);
mvPred.dy = h263e_Median(mv4[0].dy, mvNeighb[1].dy, mvNeighb[2].dy);
} else if (n == 2) {
mvPred.dx = h263e_Median(mv4[0].dx, mv4[1].dx, mvNeighb[3].dx);
mvPred.dy = h263e_Median(mv4[0].dy, mv4[1].dy, mvNeighb[3].dy);
} else {
mvPred.dx = h263e_Median(mv4[0].dx, mv4[1].dx, mv4[2].dx);
mvPred.dy = h263e_Median(mv4[0].dy, mv4[1].dy, mv4[2].dy);
}
FIND_MV_LIMITS_UMV1(mvPred, x, y);
}
h263e_ME_HalfPel_SAD_Fast_8x8(pCur+pOff[n], pRef+pOff[n], step, xL, xR, yT, yB,
xPos[n], yPos[n], &bSad[n], &mv4[n], sad[n], xP[n], yP[n]);
}
} else
for (n = 0; n < 4; n ++) {
if (mVideoPicture.UMV == 1 && n) {
if (n == 1) {
mvPred.dx = h263e_Median(mv4[0].dx, mvNeighb[1].dx, mvNeighb[2].dx);
mvPred.dy = h263e_Median(mv4[0].dy, mvNeighb[1].dy, mvNeighb[2].dy);
} else if (n == 2) {
mvPred.dx = h263e_Median(mv4[0].dx, mv4[1].dx, mvNeighb[3].dx);
mvPred.dy = h263e_Median(mv4[0].dy, mv4[1].dy, mvNeighb[3].dy);
} else {
mvPred.dx = h263e_Median(mv4[0].dx, mv4[1].dx, mv4[2].dx);
mvPred.dy = h263e_Median(mv4[0].dy, mv4[1].dy, mv4[2].dy);
}
FIND_MV_LIMITS_UMV1(mvPred, x, y);
}
#ifdef ME_USE_THRESHOLD
if (!sadThresh[n])
h263e_ME_HalfPel_SAD_8x8(pCur+pOff[n], pRef+pOff[n], step, xL, xR, yT, yB, xPos[n], yPos[n], &bSad[n], &mv4[n], mMEthrSAD8x8);
else {
mv4[n].dx = (Ipp16s)(xPos[n] << 1);
mv4[n].dy = (Ipp16s)(yPos[n] << 1);
}
#else
h263e_ME_HalfPel_SAD_8x8(pCur+pOff[n], pRef+pOff[n], step, xL, xR, yT, yB, xPos[n], yPos[n], &bSad[n], &mv4[n], mMEthrSAD8x8);
#endif
}
}
*bestSAD = bSad[0] + bSad[1] + bSad[2] + bSad[3];
}
#ifdef ME_USE_THRESHOLD
#define SAD_ZERO mMEthrSAD16x16
#else
#define SAD_ZERO 0
#endif
/*
void ippVideoEncoderH263::Encode_RepeatedPPic()
{
for (gn = 0; gn < mVideoPicture.num_gobs_in_pic; gn++) {
mRTPdata.GOBstartPos[gn] = 8 * (cBS.mPtr - cBS.mBuffer) + cBS.mBitOff;
if (mGOBheaders && gn) {
EncodeGOB_Header(gn);
frGOB = gn*mVideoPicture.num_MBrows_in_gob;
}
for (gRow = 0; gRow < mVideoPicture.num_MBrows_in_gob; gRow++) {
Ipp32s boundOnTop;
i = gn*mVideoPicture.num_MBrows_in_gob + gRow;
boundOnTop = (i == frGOB && i);
pYc = mFrameC->pY + i * 16 * mStepLuma; pYf = mFrameF->pY + i * 16 * mStepLuma;
pUc = mFrameC->pU + i * 8 * mStepChroma; pUf = mFrameF->pU + i * 8 * mStepChroma;
pVc = mFrameC->pV + i * 8 * mStepChroma; pVf = mFrameF->pV + i * 8 * mStepChroma;
for (j = 0; j < mNumMacroBlockPerRow; j ++) {
}
*/
void ippVideoEncoderH263::EncodePPic()
{
__ALIGN16(Ipp16s, coeffMB, 64*10);
__ALIGN16(Ipp8u, mcPred, 64*6);
Ipp8u *pYc, *pUc, *pVc, *pYf, *pUf, *pVf, *pF[6];
Ipp32s i, j, quant, pattern, xL, xR, yT, yB;
Ipp32s nzCount[6], dev, bestSAD, sadU, sadV, sadL0, sadL1, sadL2, sadL3, ncThrL, ncThrC, sadFavorInter;
Ipp32s bestSAD16x16, bestSAD8x8 = MAX_SAD;
h263e_MacroBlock *MBcurr = mMBinfo;
Ipp32s scan;
Ipp32s maxMVx, maxMVy;
IppMotionVector mvLuma4[4], mvChroma, mvPred[4];
Ipp32s frGOB = 0;
Ipp32s rt = mVideoPicture.pic_rounding_type;
IppiRect limitRectL, limitRectC;
IppMotionVector mvLuma;
Ipp32s nmbf;
Ipp32s gn, gRow;
mME4mv = mVideoPicture.advPred | mVideoPicture.deblockFilt;
#ifdef ME_USE_THRESHOLD
// setup thresholds for ME
mMEthrSAD16x16 = mVideoPicture.pic_quant >= 6 ? 256 : (4 << mVideoPicture.pic_quant);
mMEthrSAD8x8 = mMEthrSAD16x16 >> 2;
mMEthrSAD16x8 = mMEthrSAD16x16 >> 1;
#endif
// encode short_video_header P-mVideoPicture
limitRectL.x = -16;
limitRectL.y = -16;
limitRectL.width = mNumMacroBlockPerRow * 16 + 32;
limitRectL.height = mNumMacroBlockPerCol * 16 + 32;
limitRectC.x = -8;
limitRectC.y = -8;
limitRectC.width = mNumMacroBlockPerRow * 8 + 16;
limitRectC.height = mNumMacroBlockPerCol * 8 + 16;
if (mVideoPicture.UMV == 2) {
if (mVideoPicture.pic_width <= 352)
maxMVx = 16;
else if (mVideoPicture.pic_width <= 704)
maxMVx = 32;
else if (mVideoPicture.pic_width <= 1408)
maxMVx = 64;
else
maxMVx = 128;
if (mVideoPicture
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -