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

📄 mp4_enc_misc.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            t2 = pDst2[-1] + (pDst2[-1] << 8);
            t1 = (t1 << 16) + t1;
            t2 = (t2 << 16) + t2;
            ((Ipp32u*)pDst1)[0] = t1;
            ((Ipp32u*)pDst1)[1] = t1;
            ((Ipp32u*)pDst2)[0] = t2;
            ((Ipp32u*)pDst2)[1] = t2;
            pDst1 += step;
            pDst2 += step;
        }
    } else if (expandPels == 16) {
        for (i = 0; i < frameHeight; i ++) {
            t1 = pDst1[16] + (pDst1[16] << 8);
            t2 = pDst2[-1] + (pDst2[-1] << 8);
            t1 = (t1 << 16) + t1;
            t2 = (t2 << 16) + t2;
            ((Ipp32u*)pDst1)[0] = t1;
            ((Ipp32u*)pDst1)[1] = t1;
            ((Ipp32u*)pDst1)[2] = t1;
            ((Ipp32u*)pDst1)[3] = t1;
            ((Ipp32u*)pDst2)[0] = t2;
            ((Ipp32u*)pDst2)[1] = t2;
            ((Ipp32u*)pDst2)[2] = t2;
            ((Ipp32u*)pDst2)[3] = t2;
            pDst1 += step;
            pDst2 += step;
        }
    } else {
        for (i = 0; i < frameHeight; i ++) {
            ippsSet_8u(pDst1[expandPels], pDst1, expandPels);
            ippsSet_8u(pDst2[-1], pDst2, expandPels);
            pDst1 += step;
            pDst2 += step;
        }
    }
    pDst1 = pSrcDstPlane;
    pSrc1 = pSrcDstPlane + expandPels * step;
    pDst2 = pSrc1 + frameHeight * step;
    pSrc2 = pDst2 - step;
    j = frameWidth + 2 * expandPels;
    for (i = 0; i < expandPels; i ++) {
        ippsCopy_8u(pSrc1, pDst1, j);
        ippsCopy_8u(pSrc2, pDst2, j);
        pDst1 += step;
        pDst2 += step;
    }
}

void ippVideoEncoderMPEG4::ExpandFrame(Ipp8u *pY, Ipp8u *pU, Ipp8u *pV)
{
    if (mExpandSize) {
        Ipp32s  wL = mNumMacroBlockPerRow << 4;
        Ipp32s  hL = mNumMacroBlockPerCol << 4;
        Ipp32s  wC = mNumMacroBlockPerRow << 3;
        Ipp32s  hC = mNumMacroBlockPerCol << 3;
        Ipp32s  es = (mExpandSize + 1) >> 1;
        mp4_ExpandFrameReplicate(pY-mExpandSize*mStepLuma-mExpandSize, wL, hL, mExpandSize, mStepLuma);
        mp4_ExpandFrameReplicate(pU-es*mStepChroma-es, wC, hC, es, mStepChroma);
        mp4_ExpandFrameReplicate(pV-es*mStepChroma-es, wC, hC, es, mStepChroma);
/*
        if (VOL.interlaced) {
            Ipp8u *psb, *pdb, *pst, *pdt;
            // pad fields
            psb = pY + mStepLuma - mExpandSize;
            pdb = psb - mStepLuma - mStepLuma;
            pst = pY + mStepLuma * (mSourceHeight - 2) - mExpandSize;
            pdt = pst + mStepLuma + mStepLuma;
            for (i = 0; i < 8; i ++) {
                ippsCopy_8u(psb, pdb, mStepLuma);
                pdb -= mStepLuma + mStepLuma;
                ippsCopy_8u(pst, pdt, mStepLuma);
                pdt += mStepLuma + mStepLuma;
            }
        }
*/
    }
}

/*
//  padding the VOPs with size not multiple 16
//  for not complete blocks padd by
//      0 for DivX(tm) 5.1xx-5.3xx AVI streams
//      128 for QuickTime(tm) MP4 streams
//      replication for other
*/
void ippVideoEncoderMPEG4::PadFrame(Ipp8u *pY, Ipp8u *pU, Ipp8u *pV)
{
    Ipp32s i, j;
    Ipp8u  *py, *pu, *pv;
    Ipp8u  pad = (Ipp8u)(mPadType == 1 ? 128 : 0);

    if (mSourceWidth & 15) {
        py = pY + mSourceWidth;
        for (i = 0; i < mSourceHeight; i ++) {
            if (mPadType)
                for (j = 0; j < (mNumMacroBlockPerRow << 4) - mSourceWidth; j ++)
                    py[j] = pad;
            else
                for (j = 0; j < (mNumMacroBlockPerRow << 4) - mSourceWidth; j ++)
                    py[j] = py[-1];
            py += mStepLuma;
        }
        pu = pU + (mSourceWidth >> 1);
        pv = pV + (mSourceWidth >> 1);
        for (i = 0; i < (mSourceHeight >> 1); i ++) {
            if (mPadType)
                for (j = 0; j < (mNumMacroBlockPerRow << 3) - (mSourceWidth >> 1); j ++) {
                    pu[j] = pad;
                    pv[j] = pad;
                }
            else
                for (j = 0; j < (mNumMacroBlockPerRow << 3) - (mSourceWidth >> 1); j ++) {
                    pu[j] = pu[-1];
                    pv[j] = pv[-1];
                }
            pu += mStepChroma;
            pv += mStepChroma;
        }
    }
    if (mSourceHeight & 15) {
        py = pY + mSourceHeight * mStepLuma;
        pY = py - mStepLuma;
        for (j = mSourceHeight; j < (mNumMacroBlockPerCol << 4); j ++) {
            if (mPadType)
                ippsSet_8u(pad, py, mNumMacroBlockPerRow << 4);
            else
                ippsCopy_8u(pY, py, mNumMacroBlockPerRow << 4);
            py += mStepLuma;
        }
        pu = pU + (mSourceHeight >> 1) * mStepChroma;
        pv = pV + (mSourceHeight >> 1) * mStepChroma;
        pU = pu - mStepChroma;
        pV = pv - mStepChroma;
        for (j = (mSourceHeight >> 1); j < (mNumMacroBlockPerCol << 3); j ++) {
            if (mPadType) {
                ippsSet_8u(pad, pu, mNumMacroBlockPerRow << 3);
                ippsSet_8u(pad, pv, mNumMacroBlockPerRow << 3);
            } else {
                ippsCopy_8u(pU, pu, mNumMacroBlockPerRow << 3);
                ippsCopy_8u(pV, pv, mNumMacroBlockPerRow << 3);
            }
            pu += mStepChroma;
            pv += mStepChroma;
        }
    }
}

Ipp32s ippVideoEncoderMPEG4::GetCurrentFrameInfo(Ipp8u **pY, Ipp8u **pU, Ipp8u **pV, Ipp32s *stepLuma, Ipp32s *stepChroma)
{
    if (!mIsInit)
        return MP4_STS_ERR_NOTINIT;
    *pY = mFrameC->pY;
    *pU = mFrameC->pU;
    *pV = mFrameC->pV;
    *stepLuma = mStepLuma;
    *stepChroma = mStepChroma;
    return MP4_STS_NOERR;
}

Ipp32s ippVideoEncoderMPEG4::GetDecodedFrameInfo(Ipp8u **pY, Ipp8u **pU, Ipp8u **pV, Ipp32s *stepLuma, Ipp32s *stepChroma)
{
    if (!mIsInit)
        return MP4_STS_ERR_NOTINIT;
    *pY = mFrameD->pY;
    *pU = mFrameD->pU;
    *pV = mFrameD->pV;
    *stepLuma = mStepLuma;
    *stepChroma = mStepChroma;
    return MP4_STS_NOERR;
}


int mp4_WeightMV(int xv, int yv, IppMotionVector mvPred, int fcode, int quant, int qpel)
{
    int  b, a, dx, dy;

    if (qpel) {
        xv += xv;
        yv += yv;
    }
    dx = xv - mvPred.dx;
    dy = yv - mvPred.dy;
    if (fcode == 1) {
        if (dx < -32) dx += 64;
        if (dx >  31) dx -= 64;
        if (dy < -32) dy += 64;
        if (dy >  31) dy -= 64;
        b = mp4_VLC_MVD_TB12[dx+32].len + mp4_VLC_MVD_TB12[dy+32].len;
    } else {
        Ipp32s  fRangeMin = -(16 << fcode), fRangeMax = (16 << fcode) - 1, fRange = fRangeMax - fRangeMin + 1;
        if (dx < fRangeMin) dx += fRange;
        if (dx > fRangeMax) dx -= fRange;
        if (dy < fRangeMin) dy += fRange;
        if (dy > fRangeMax) dy -= fRange;
        fcode --;
        if (dx == 0) {
            b = 1;
        } else {
            if (dx < 0)
                dx = -dx;
            a = ((dx - 1) >> fcode) + 1;
            b = mp4_VLC_MVD_TB12[a+32].len + fcode;
        }
        if (dy == 0) {
            b ++;
        } else {
            if (dy < 0)
                dy = -dy;
            a = ((dy - 1) >> fcode) + 1;
            b += mp4_VLC_MVD_TB12[a+32].len + fcode;
        }
    }
    return b * mp4_MV_Weigth[quant];
}

void mp4_ComputeChroma4MV(const IppMotionVector mvLuma[4], IppMotionVector *mvChroma)
{
    Ipp32s  dx, dy, cdx, cdy, adx, ady;

    dx = mvLuma[0].dx + mvLuma[1].dx + mvLuma[2].dx + mvLuma[3].dx;
    dy = mvLuma[0].dy + mvLuma[1].dy + mvLuma[2].dy + mvLuma[3].dy;
    adx = mp4_Abs(dx);
    ady = mp4_Abs(dy);
    cdx = mp4_cCbCrMvRound16[adx & 15] + (adx >> 4) * 2;
    cdy = mp4_cCbCrMvRound16[ady & 15] + (ady >> 4) * 2;
    mvChroma->dx = (Ipp16s)((dx >= 0) ? cdx : -cdx);
    mvChroma->dy = (Ipp16s)((dy >= 0) ? cdy : -cdy);
}

void mp4_ComputeChroma4MVQ(const IppMotionVector mvLuma[4], IppMotionVector *mvChroma)
{
    Ipp32s  dx, dy, cdx, cdy, adx, ady;

    dx = mp4_Div2(mvLuma[0].dx) + mp4_Div2(mvLuma[1].dx) + mp4_Div2(mvLuma[2].dx) + mp4_Div2(mvLuma[3].dx);
    dy = mp4_Div2(mvLuma[0].dy) + mp4_Div2(mvLuma[1].dy) + mp4_Div2(mvLuma[2].dy) + mp4_Div2(mvLuma[3].dy);
    adx = mp4_Abs(dx);
    ady = mp4_Abs(dy);
    cdx = mp4_cCbCrMvRound16[adx & 15] + (adx >> 4) * 2;
    cdy = mp4_cCbCrMvRound16[ady & 15] + (ady >> 4) * 2;
    mvChroma->dx = (Ipp16s)((dx >= 0) ? cdx : -cdx);
    mvChroma->dy = (Ipp16s)((dy >= 0) ? cdy : -cdy);
}

void ippVideoEncoderMPEG4::LimitMV(IppMotionVector *pMV, Ipp32s x, Ipp32s y)
{
    mp4_Clip(pMV->dx, (Ipp16s)((-16 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x) << 1));
    mp4_Clip(pMV->dy, (Ipp16s)((-16 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y) << 1));
}

void ippVideoEncoderMPEG4::LimitMVQ(IppMotionVector *pMV, Ipp32s x, Ipp32s y)
{
    mp4_Clip(pMV->dx, (Ipp16s)((-16 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x) << 2));
    mp4_Clip(pMV->dy, (Ipp16s)((-16 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y) << 2));
}

void ippVideoEncoderMPEG4::Limit4MV(IppMotionVector *pMV, Ipp32s x, Ipp32s y)
{
    mp4_Clip(pMV[0].dx, (Ipp16s)((-8 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x) << 1));
    mp4_Clip(pMV[0].dy, (Ipp16s)((-8 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y) << 1));
    mp4_Clip(pMV[1].dx, (Ipp16s)((-8 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x - 8) << 1));
    mp4_Clip(pMV[1].dy, (Ipp16s)((-8 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y) << 1));
    mp4_Clip(pMV[2].dx, (Ipp16s)((-8 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x) << 1));
    mp4_Clip(pMV[2].dy, (Ipp16s)((-8 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y - 8) << 1));
    mp4_Clip(pMV[3].dx, (Ipp16s)((-8 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x - 8) << 1));
    mp4_Clip(pMV[3].dy, (Ipp16s)((-8 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y - 8) << 1));
}

void ippVideoEncoderMPEG4::Limit4MVQ(IppMotionVector *pMV, Ipp32s x, Ipp32s y)
{
    mp4_Clip(pMV[0].dx, (Ipp16s)((-8 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x) << 2));
    mp4_Clip(pMV[0].dy, (Ipp16s)((-8 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y) << 2));
    mp4_Clip(pMV[1].dx, (Ipp16s)((-8 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x - 8) << 2));
    mp4_Clip(pMV[1].dy, (Ipp16s)((-8 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y) << 2));
    mp4_Clip(pMV[2].dx, (Ipp16s)((-8 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x) << 2));
    mp4_Clip(pMV[2].dy, (Ipp16s)((-8 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y - 8) << 2));
    mp4_Clip(pMV[3].dx, (Ipp16s)((-8 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x - 8) << 2));
    mp4_Clip(pMV[3].dy, (Ipp16s)((-8 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y - 8) << 2));
}

void ippVideoEncoderMPEG4::LimitFMV(IppMotionVector *pMV, Ipp32s x, Ipp32s y)
{
    mp4_Clip(pMV->dx, (Ipp16s)((-16 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x) << 1));
    mp4_Clip(pMV->dy, (Ipp16s)((-16 - y)), (Ipp16s)((VOL.video_object_layer_height - y)));
}

void ippVideoEncoderMPEG4::LimitFMVQ(IppMotionVector *pMV, Ipp32s x, Ipp32s y)
{
    mp4_Clip(pMV->dx, (Ipp16s)((-16 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x) << 1));
    mp4_Clip(pMV->dy, (Ipp16s)((-16 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y) << 1));
}

void ippVideoEncoderMPEG4::LimitCMV(IppMotionVector *pMV, Ipp32s x, Ipp32s y)
{
    mp4_Clip(pMV->dx, (Ipp16s)((-8 - x) << 1), (Ipp16s)(((VOL.video_object_layer_width >> 1) - x) << 1));
    mp4_Clip(pMV->dy, (Ipp16s)((-8 - y) << 1), (Ipp16s)(((VOL.video_object_layer_height >> 1) - y) << 1));
}

void ippVideoEncoderMPEG4::AdjustSearchRange()
{
    if (mMEflags & ME_AUTO_RANGE) {
        Ipp32s  fcRangeMin, fcRangeMax, flRangeMin, flRangeMax, co, ci, cnz, r, i;
        const Ipp32s p = 1;

        fcRangeMin = -(16 << mPVOPfcodeForw);
        fcRangeMax =  (16 << mPVOPfcodeForw) - 1;
        flRangeMin = -(16 << (mPVOPfcodeForw - 1));
        flRangeMax =  (16 << (mPVOPfcodeForw - 1)) - 1;
        co = ci = cnz = 0;
        r = 2;
        if (mMEflags & ME_HP)

⌨️ 快捷键说明

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