📄 mp4_enc_misc.cpp
字号:
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 + -