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

📄 mp4_enc_misc.cpp

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