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

📄 h263_enc_frame.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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 + -