⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h263_enc_frame.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                if (cSAD <= thrSAD_16x16) goto L_01;#endif            }        }        pRef += step;    }#else   // involute search    int  nLoop, cLoop, lPos;    i = iPos;    j = jPos;    pRef += iPos * step + jPos;    nLoop = IPP_MAX(IPP_MAX(jPos - xL, xR - jPos), IPP_MAX(iPos - yT, yB - iPos));    for (cLoop = 1; cLoop <= nLoop; cLoop ++) {        i --;        j --;        pRef -= step + 1;        for (lPos = 0; lPos < (cLoop << 3); lPos ++) {            if (j >= xL && j <= xR && i >= yT && i <= yB) {                ippiSAD16x16_8u32s(pCur, step, pRef, step, &cSAD, IPPVC_MC_APX_FF);                if (cSAD < bSAD) {                    bSAD = cSAD;                    iPos = i;                    jPos = j;#ifdef ME_USE_THRESHOLD                    if (cSAD <= thrSAD_16x16) goto L_01;#endif                }            }            if (lPos < (cLoop * 2)) {                j ++;  pRef ++;            } else if (lPos < (cLoop * 4)) {                i ++;  pRef += step;            } else if (lPos < (cLoop * 6)) {                j --;  pRef --;            } else {                i --;  pRef -= step;            }        }    }#endif#ifdef ME_USE_THRESHOLDL_01:#endif    *bestSAD = bSAD;    *xPos = jPos;    *yPos = iPos;}static const Ipp32s bdJ[9] = {0, -2, -1, 0, 1, 2, 1, 0, -1}, bdI[9] = {0, 0, -1, -2, -1, 0, 1, 2, 1}, sdJ[5] = {0, -1, 0, 1, 0}, sdI[5] = {0, 0, -1, 0, 1};static void h263_ME_DiamondSearch_SAD_16x16(Ipp8u *pCur, Ipp8u *pRef, int step, int xL, int xR, int yT, int yB, int *xPos, int *yPos, int *bestSAD, Ipp32s *sadBuf, int thrSAD_16x16){    Ipp32s  cSAD, bSAD, i, j, k, l, iPos, jPos, swWidth, swHeight;    jPos = *xPos;    iPos = *yPos;    bSAD = *bestSAD;    swWidth = (xR - xL + 1);    swHeight = (yB - yT + 1);    ippsSet_8u((Ipp8u)-1, (Ipp8u*)sadBuf, swWidth * swHeight * 4);    sadBuf[(iPos-yT)*swWidth+jPos-xL] = bSAD;    for (;;) {        // find SAD at big diamond        l = 0;        for (k = 1; k < 9; k ++) {            j = jPos + bdJ[k];            i = iPos + bdI[k];            if (j >= xL && j <= xR && i >= yT && i <= yB) {                if (sadBuf[(i-yT)*swWidth+j-xL] == -1) {                    ippiSAD16x16_8u32s(pCur, step, pRef+i*step+j, step, &cSAD, IPPVC_MC_APX_FF);#ifdef ME_USE_THRESHOLD                    if (cSAD <= thrSAD_16x16) {                        *xPos = j;                        *yPos = i;                        *bestSAD = cSAD;                        return;                    }#endif                    sadBuf[(i-yT)*swWidth+j-xL] = cSAD;                    if (cSAD < bSAD) {                        l = k;                        bSAD = cSAD;                    }                }            }        }        if (l == 0) {            // find SAD at small diamond            for (k = 1; k <= 4; k ++) {                j = jPos + sdJ[k];                i = iPos + sdI[k];                if (j >= xL && j <= xR && i >= yT && i <= yB) {                    if (sadBuf[(i-yT)*swWidth+j-xL] == -1) {                        ippiSAD16x16_8u32s(pCur, step, pRef+i*step+j, step, &cSAD, IPPVC_MC_APX_FF);#ifdef ME_USE_THRESHOLD                        if (cSAD <= thrSAD_16x16) {                            *xPos = j;                            *yPos = i;                            *bestSAD = cSAD;                            return;                        }#endif                        sadBuf[(i-yT)*swWidth+j-xL]= cSAD;                        if (cSAD < bSAD) {                            l = k;                            bSAD = cSAD;                        }                    }                }            }            *xPos = jPos + sdJ[l];            *yPos = iPos + sdI[l];            *bestSAD = bSAD;            return;        }        iPos += bdI[l];        jPos += bdJ[l];    }}static void h263_ME_HalfPel_SAD_16x16(Ipp8u *pCur, Ipp8u *pRef, int step, int xL, int xR, int yT, int yB, int xPos, int yPos, int *bestSAD, IppMotionVector *mv, int thrSAD_16x16){    Ipp32s  cSAD, bSAD, i, j;    i = 0;  j = 0;  bSAD = *bestSAD;    if (xPos > xL && yPos > yT) {        ippiSAD16x16_8u32s(pCur, step, pRef+(yPos-1)*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_16x16) goto L_01;#endif        }    }    if (yPos > yT) {        ippiSAD16x16_8u32s(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_16x16) goto L_01;#endif        }    }    if (xPos < xR && yPos > yT) {        ippiSAD16x16_8u32s(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_16x16) goto L_01;#endif        }    }    if (xPos > xL) {        ippiSAD16x16_8u32s(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_16x16) goto L_01;#endif        }    }    if (xPos < xR) {        ippiSAD16x16_8u32s(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_16x16) goto L_01;#endif        }    }    if (xPos > xL && yPos < yB) {        ippiSAD16x16_8u32s(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_16x16) goto L_01;#endif        }    }    if (yPos < yB) {        ippiSAD16x16_8u32s(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_16x16) goto L_01;#endif        }    }    if (xPos < xR && yPos < yB) {        ippiSAD16x16_8u32s(pCur, step, pRef+yPos*step+xPos, step, &cSAD, IPPVC_MC_APX_HH);        if (cSAD < bSAD) {            i =  1;  j =  1;  bSAD = cSAD;        }    }#ifdef ME_USE_THRESHOLDL_01:#endif    mv->dx = (Ipp16s)((xPos << 1) + j);    mv->dy = (Ipp16s)((yPos << 1) + i);    *bestSAD = bSAD;}static void h263_ME_HalfPel_SAD_Fast_16x16(Ipp8u *pCur, Ipp8u *pRef, int step, int xL, int xR, int yT, int yB, int xPos, int yPos, int *bestSAD, IppMotionVector *mv, Ipp32s *sadBuff){    int     i, j, swWidth, swHeight;    Ipp32s  m0, m1, m2, m3, m4;    m0 = *bestSAD;    swWidth = (xR - xL + 1);    swHeight = (yB - yT + 1);    j = xPos;    i = yPos - 1;    if (j >= xL && j <= xR && i >= yT && i <= yB) {        m1 = sadBuff[(i-yT)*swWidth+j-xL];        if (m1 == -1)            ippiSAD16x16_8u32s(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) {        m2 = sadBuff[(i-yT)*swWidth+j-xL];        if (m2 == -1)            ippiSAD16x16_8u32s(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) {        m3 = sadBuff[(i-yT)*swWidth+j-xL];        if (m3 == -1)            ippiSAD16x16_8u32s(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) {        m4 = sadBuff[(i-yT)*swWidth+j-xL];        if (m4 == -1)            ippiSAD16x16_8u32s(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) {        ippiSAD16x16_8u32s(pCur, step, pRef+h263_MC_offs(mv, step), step, bestSAD, h263_MC_type(mv));        if (*bestSAD > m0) {            // false choosing            mv->dx = (Ipp16s)(xPos << 1);            mv->dy = (Ipp16s)(yPos << 1);            *bestSAD = m0;        }    }}void ippVideoEncoderH263::ME_SAD_16x16(Ipp8u *pCur, Ipp8u *pRef, int step, int xL, int xR, int yT, int yB, int *bestSAD, IppMotionVector *mv){    Ipp32s  xPos, yPos, sadL;    // mv - Predicted MV    // bestSAD is the SAD at (0,0)#ifdef ME_USE_THRESHOLD    if (*bestSAD <= mMEthrSAD16x16) {        mv->dx = mv->dy = 0;        return;    }#endif    xPos = h263_Div2(mv->dx);    yPos = h263_Div2(mv->dy);    // check init mv is in rect    if (xPos < xL || xPos > xR || yPos < yT || yPos > yB) {        // reset to (0,0)        xPos = yPos = 0;    } else {        // calc SAD at Predict (intpel acc)        if (xPos != 0 || yPos != 0) {            ippiSAD16x16_8u32s(pCur, mStepLuma, pRef+yPos*mStepLuma+xPos, mStepLuma, &sadL, IPPVC_MC_APX_FF);            if (sadL - SAD_FAVOR_PRED < *bestSAD) {                // choose Predict as origin for ME                *bestSAD = sadL;            } else {                // choose (0,0) as origin for ME                xPos = yPos = 0;            }        }    }    xL = IPP_MAX(xL, xPos - mPVOPsearchHor);    xR = IPP_MIN(xR, xPos + mPVOPsearchHor);    yT = IPP_MAX(yT, yPos - mPVOPsearchVer);    yB = IPP_MIN(yB, yPos + mPVOPsearchVer);    *bestSAD -= SAD_FAVOR_ZERO;    sadL = *bestSAD;#ifdef ME_USE_THRESHOLD    if (*bestSAD > mMEthrSAD16x16) {#endif        if (mMEalgorithm == 0)            h263_ME_FullSearch_SAD_16x16(pCur, pRef, step, xL, xR, yT, yB, &xPos, &yPos, bestSAD, mMEthrSAD16x16);        else            h263_ME_DiamondSearch_SAD_16x16(pCur, pRef, step, xL, xR, yT, yB, &xPos, &yPos, bestSAD, mMEfastSAD, mMEthrSAD16x16);#ifdef ME_USE_THRESHOLD    }    if (mMEaccuracy == 1 || *bestSAD <= mMEthrSAD16x16) {        mv->dx = (Ipp16s)(xPos << 1);        mv->dy = (Ipp16s)(yPos << 1);        if (mMEaccuracy > 2) {            // quarter pel            mv->dx = (Ipp16s)(mv->dx << 1);            mv->dy = (Ipp16s)(mv->dy << 1);        }#else    if (mMEaccuracy == 1) {        mv->dx = (Ipp16s)(xPos << 1);        mv->dy = (Ipp16s)(yPos << 1);#endif    } else {        if (mMEalgorithm == 1 && mMEfastHP)            h263_ME_HalfPel_SAD_Fast_16x16(pCur, pRef, step, xL, xR, yT, yB, xPos, yPos, bestSAD, mv, mMEfastSAD);        else            h263_ME_HalfPel_SAD_16x16(pCur, pRef, step, xL, xR, yT, yB, xPos, yPos, bestSAD, mv, mMEthrSAD16x16);    }    if (*bestSAD == sadL)        *bestSAD += SAD_FAVOR_ZERO;}static void h263_ME_HalfPel_SAD_8x8(Ipp8u *pCur, Ipp8u *pRef, int step, int xL, int xR, int yT, int yB, int xPos, int yPos, int *bestSAD, IppMotionVector *mv, int thrSAD_8x8){    Ipp32s  cSAD, bSAD, i, j;    i = 0;  j = 0;  bSAD = *bestSAD;    if (xPos > xL && yPos > yT) {        ippiSAD8x8_8u32s_C1R(pCur, step, pRef+(yPos-1)*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 > 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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -