📄 mp4_enc_misc.cpp
字号:
r <<= 1;
else if (mMEflags & ME_QP)
r <<= 2;
for (i = 0; i < mNumMacroBlockPerVOP; i ++) {
if (MBinfo[i].type < IPPVC_MBTYPE_INTRA && ((VOP.vop_coding_type != MP4_VOP_TYPE_S && !MBinfo[i].not_coded) || (VOP.vop_coding_type == MP4_VOP_TYPE_S && !MBinfo[i].mcsel))) {
if (MBinfo[i].mv[0].dx > (fcRangeMax - r) || MBinfo[i].mv[0].dx < (fcRangeMin + r) || MBinfo[i].mv[0].dy > (fcRangeMax - r) || MBinfo[i].mv[0].dy < (fcRangeMin + r))
co ++;
if (MBinfo[i].mv[0].dx > (flRangeMax - r) || MBinfo[i].mv[0].dx < (flRangeMin + r) || MBinfo[i].mv[0].dy > (flRangeMax - r) || MBinfo[i].mv[0].dy < (flRangeMin + r))
ci ++;
if (MBinfo[i].mv[0].dx != 0 || MBinfo[i].mv[0].dy != 0)
cnz ++;
}
}
if (cnz == 0) {
co = 0;
cnz = 1;
}
mBVOPsearchHorBack = mPVOPsearchHor;
mBVOPsearchVerBack = mPVOPsearchVer;
mBVOPfcodeBack = mPVOPfcodeForw;
if (co * 100 / cnz >= p) {
if (VOL.quarter_sample) {
if (mPVOPfcodeForw < 4) {
mPVOPsearchHor = mPVOPsearchVer = (16 << (mPVOPfcodeForw - 1)) - 1;
mPVOPfcodeForw ++;
}
} else {
if (mPVOPfcodeForw < 3) {
mPVOPsearchHor = mPVOPsearchVer = (16 << mPVOPfcodeForw) - 1;
mPVOPfcodeForw ++;
}
}
} else if (!ci/*ci * 400 / cnz < p*/) {
if (VOL.quarter_sample) {
if (mPVOPfcodeForw > 2) {
mPVOPsearchHor = mPVOPsearchVer = (16 << (mPVOPfcodeForw - 3)) - 1;
mPVOPfcodeForw --;
}
} else {
if (mPVOPfcodeForw > 1) {
mPVOPsearchHor = mPVOPsearchVer = (16 << (mPVOPfcodeForw - 2)) - 1;
mPVOPfcodeForw --;
}
}
}
mBVOPsearchHorForw = mPVOPsearchHor;
mBVOPsearchVerForw = mPVOPsearchVer;
mBVOPfcodeForw = mPVOPfcodeForw;
}
}
int mp4_CalcBitsMV(IppMotionVector *mv, int fcode)
{
int b, a, dx, dy;
dx = mv->dx;
dy = mv->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 {
int 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;
}
int mp4_CalcBitsCoeffsIntra(const Ipp16s* pCoeffs, int countNonZero, int rvlcFlag, int dc_vlc, const Ipp8u* pScanTable, int blockNum)
{
int dcSize, run, i, cnt, level, lev, last, offs, esc, f, sum;
if (dc_vlc) {
dcSize = 0;
i = pCoeffs[0] >= 0 ? pCoeffs[0] : -pCoeffs[0];
while (i) {
i >>= 1;
dcSize ++;
}
sum = (blockNum <= 3) ? mp4_VLC_DCSIZE_TB13_len[dcSize] : mp4_VLC_DCSIZE_TB14_len[dcSize];
if (dcSize)
sum += dcSize;
if (dcSize > 8)
sum ++;
if (pCoeffs[0] != 0)
countNonZero --;
f = 1;
} else {
sum = 0;
f = 0;
}
if (countNonZero == 0)
return sum;
cnt = 1;
run = 0;
if (!rvlcFlag) {
for (i = f; i < 64; i ++) {
level = pCoeffs[pScanTable[i]];
if (level) {
lev = (level < 0) ? (-level) : level;
last = (cnt == countNonZero);
cnt ++;
if (run <= mp4_VLC_TB16.runMax[last]) {
if (lev <= mp4_VLC_TB16.levMax[last][run]) {
offs = mp4_VLC_TB16.runOff[last][run] + lev - 1;
sum += mp4_VLC_TB16.vlc[offs].len;
esc = 0;
} else
esc = 1;
} else
esc = 1;
if (esc) {
if (run <= mp4_VLC_TB16.runMax[last]) {
if (lev <= 2 * mp4_VLC_TB16.levMax[last][run]) {
// ESC 1
lev -= mp4_VLC_TB16.levMax[last][run];
offs = mp4_VLC_TB16.runOff[last][run] + lev - 1;
sum += 8 + mp4_VLC_TB16.vlc[offs].len;
esc = 0;
}
}
if (esc) {
if (lev <= mp4_VLC_TB16.levMax[last][0]) {
offs = 0;
while (lev > mp4_VLC_RMAX_TB21[last][offs].code)
offs ++;
if (run - mp4_VLC_RMAX_TB21[last][offs].len - 1 <= mp4_VLC_RMAX_TB21[last][offs].len) {
// ESC 2
run -= mp4_VLC_RMAX_TB21[last][offs].len + 1;
offs = mp4_VLC_TB16.runOff[last][run] + lev - 1;
sum += 9 + mp4_VLC_TB16.vlc[offs].len;
esc = 0;
}
}
}
if (esc) {
// ESC 3
sum += 30;
}
}
if (last)
break;
run = 0;
} else
run ++;
}
} else {
for (i = f; i < 64; i ++) {
level = pCoeffs[pScanTable[i]];
if (level) {
lev = (level < 0) ? (-level) : level;
last = (cnt == countNonZero);
cnt ++;
if (run <= mp4_VLC_TB23a.runMax[last]) {
if (lev <= mp4_VLC_TB23a.levMax[last][run]) {
offs = mp4_VLC_TB23a.runOff[last][run] + lev - 1;
sum += mp4_VLC_TB23a.vlc[offs].len;
esc = 0;
} else
esc = 1;
} else
esc = 1;
if (esc) {
sum += 30;
}
if (last)
break;
run = 0;
} else
run ++;
}
}
return sum;
}
int mp4_CalcBitsCoeffsInter(const Ipp16s* pCoeffs, int countNonZero, int rvlcFlag, const Ipp8u* pScanTable)
{
int run, i, cnt, level, lev, last, offs, esc, sum;
if (countNonZero == 0)
return 0;
sum = 0;
cnt = 1;
run = 0;
if (!rvlcFlag) {
for (i = 0; i < 64; i ++) {
level = pCoeffs[pScanTable[i]];
if (level) {
lev = (level < 0) ? (-level) : level;
last = (cnt == countNonZero);
cnt ++;
if (run <= mp4_VLC_TB17.runMax[last]) {
if (lev <= mp4_VLC_TB17.levMax[last][run]) {
offs = mp4_VLC_TB17.runOff[last][run] + lev - 1;
sum += mp4_VLC_TB17.vlc[offs].len;
esc = 0;
} else
esc = 1;
} else
esc = 1;
if (esc) {
if (run <= mp4_VLC_TB17.runMax[last]) {
if (lev <= 2 * mp4_VLC_TB17.levMax[last][run]) {
// ESC 1
lev -= mp4_VLC_TB17.levMax[last][run];
offs = mp4_VLC_TB17.runOff[last][run] + lev - 1;
sum += 8 + mp4_VLC_TB17.vlc[offs].len;
esc = 0;
}
}
if (esc) {
if (lev <= mp4_VLC_TB17.levMax[last][0]) {
offs = 0;
while (lev > mp4_VLC_RMAX_TB22[last][offs].code)
offs ++;
if (run - mp4_VLC_RMAX_TB22[last][offs].len - 1 <= mp4_VLC_RMAX_TB22[last][offs].len) {
// ESC 2
run -= mp4_VLC_RMAX_TB22[last][offs].len + 1;
offs = mp4_VLC_TB17.runOff[last][run] + lev - 1;
sum += 9 + mp4_VLC_TB17.vlc[offs].len;
esc = 0;
}
}
}
if (esc) {
// ESC 3
sum += 30;
}
}
if (last)
break;
run = 0;
} else
run ++;
}
} else {
for (i = 0; i < 64; i ++) {
level = pCoeffs[pScanTable[i]];
if (level) {
lev = (level < 0) ? (-level) : level;
last = (cnt == countNonZero);
cnt ++;
if (run <= mp4_VLC_TB23b.runMax[last]) {
if (lev <= mp4_VLC_TB23b.levMax[last][run]) {
offs = mp4_VLC_TB23b.runOff[last][run] + lev - 1;
sum += mp4_VLC_TB23b.vlc[offs].len;
esc = 0;
} else
esc = 1;
} else
esc = 1;
if (esc) {
sum += 30;
}
if (last)
break;
run = 0;
} else
run ++;
}
}
return sum;
}
void ippVideoEncoderMPEG4::ResetRC(Ipp32s bitRate, Ipp64f frameRate)
{
if (mRateControl == 1) {
mRC.Init(0, 0, 0, bitRate, frameRate, mSourceWidth, mSourceHeight, VOL.short_video_header ? 3 : 1, 31);
mQuantIVOP = mRC.GetQP(MP4_VOP_TYPE_I);
mQuantPVOP = mRC.GetQP(MP4_VOP_TYPE_P);
mQuantBVOP = mRC.GetQP(MP4_VOP_TYPE_B);
} else if (mRateControl == 2) {
mRC_MB.Init(bitRate, frameRate, mSourceWidth, mSourceHeight, mNumMacroBlockPerRow, mNumMacroBlockPerCol, mIVOPdist, VOL.data_partitioned, VOL.short_video_header ? 3 : 1, 31);
mQuantIVOP = mQuantPVOP = mQuantBVOP = mRC_MB.GetQP();
mMEflags &= ~ME_4MV;
}
}
} // namespace MPEG4_ENC
#endif //defined (UMC_ENABLE_MPEG4_VIDEO_ENCODER)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -