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

📄 mp4decvop.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 5 页
字号:
/* ///////////////////////////////////////////////////////////////////////////               INTEL CORPORATION PROPRIETARY INFORMATION//  This software is supplied under the terms of a license agreement or//  nondisclosure agreement with Intel Corporation and may not be copied//  or disclosed except in accordance with the terms of that agreement.//        Copyright (c) 2001-2005 Intel Corporation. All Rights Reserved.////  Description:    Decodes MPEG-4 bitstream.//*/#include "mp4.h"#include "mp4dec.h"#pragma warning(disable : 188)  // enumerated type mixed with another type ICL/*//  mp4_Info for decoding of Video Object Layer*/mp4_Status mp4_InitVOL(mp4_Info* pInfo){    int mbPerRow, mbPerCol, specSize;    pInfo->VisualObject.VideoObject.VOPindex = 0;    if (pInfo->VisualObject.VideoObject.shape == MP4_SHAPE_TYPE_RECTANGULAR) {        mbPerRow = (pInfo->VisualObject.VideoObject.width + 15) >> 4;        mbPerCol = (pInfo->VisualObject.VideoObject.height + 15) >> 4;        // current frame        pInfo->VisualObject.cFrame.stepY = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 4;        pInfo->VisualObject.cFrame.apY = ippsMalloc_8u(pInfo->VisualObject.cFrame.stepY * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 4));        if (!pInfo->VisualObject.cFrame.apY) return MP4_STATUS_NO_MEM;        pInfo->VisualObject.cFrame.pY = pInfo->VisualObject.cFrame.apY + pInfo->VisualObject.cFrame.stepY * 16 + 16;        pInfo->VisualObject.cFrame.stepCb = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 3;        pInfo->VisualObject.cFrame.apCb = ippsMalloc_8u(pInfo->VisualObject.cFrame.stepCb * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));        if (!pInfo->VisualObject.cFrame.apCb) return MP4_STATUS_NO_MEM;        pInfo->VisualObject.cFrame.pCb = pInfo->VisualObject.cFrame.apCb + pInfo->VisualObject.cFrame.stepCb * 8 + 8;        pInfo->VisualObject.cFrame.stepCr = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 3;        pInfo->VisualObject.cFrame.apCr = ippsMalloc_8u(pInfo->VisualObject.cFrame.stepCr * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));        if (!pInfo->VisualObject.cFrame.apCr) return MP4_STATUS_NO_MEM;        pInfo->VisualObject.cFrame.pCr = pInfo->VisualObject.cFrame.apCr + pInfo->VisualObject.cFrame.stepCr * 8 + 8;        if (pInfo->VisualObject.VideoObject.sprite_enable != MP4_SPRITE_STATIC) {            // ref in past frame            pInfo->VisualObject.rFrame.stepY = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 4;            pInfo->VisualObject.rFrame.apY = ippsMalloc_8u(pInfo->VisualObject.rFrame.stepY * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 4));            if (!pInfo->VisualObject.rFrame.apY) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.rFrame.pY = pInfo->VisualObject.rFrame.apY + pInfo->VisualObject.rFrame.stepY * 16 + 16;            pInfo->VisualObject.rFrame.stepCb = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 3;            pInfo->VisualObject.rFrame.apCb = ippsMalloc_8u(pInfo->VisualObject.rFrame.stepCb * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));            if (!pInfo->VisualObject.rFrame.apCb) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.rFrame.pCb = pInfo->VisualObject.rFrame.apCb + pInfo->VisualObject.rFrame.stepCb * 8 + 8;            pInfo->VisualObject.rFrame.stepCr = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 3;            pInfo->VisualObject.rFrame.apCr = ippsMalloc_8u(pInfo->VisualObject.rFrame.stepCr * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));            if (!pInfo->VisualObject.rFrame.apCr) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.rFrame.pCr = pInfo->VisualObject.rFrame.apCr + pInfo->VisualObject.rFrame.stepCr * 8 + 8;            // ref in future frame            pInfo->VisualObject.nFrame.stepY = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 4;            pInfo->VisualObject.nFrame.apY = ippsMalloc_8u(pInfo->VisualObject.nFrame.stepY * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 4));            if (!pInfo->VisualObject.nFrame.apY) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.nFrame.pY = pInfo->VisualObject.nFrame.apY + pInfo->VisualObject.nFrame.stepY * 16 + 16;            pInfo->VisualObject.nFrame.stepCb = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 3;            pInfo->VisualObject.nFrame.apCb = ippsMalloc_8u(pInfo->VisualObject.nFrame.stepCb * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));            if (!pInfo->VisualObject.nFrame.apCb) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.nFrame.pCb = pInfo->VisualObject.nFrame.apCb + pInfo->VisualObject.nFrame.stepCb * 8 + 8;            pInfo->VisualObject.nFrame.stepCr = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 3;            pInfo->VisualObject.nFrame.apCr = ippsMalloc_8u(pInfo->VisualObject.nFrame.stepCr * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));            if (!pInfo->VisualObject.nFrame.apCr) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.nFrame.pCr = pInfo->VisualObject.nFrame.apCr + pInfo->VisualObject.nFrame.stepCr * 8 + 8;            // motion info (not needed for Sprites)            pInfo->VisualObject.VideoObject.MBinfo = (mp4_MacroBlock*)ippsMalloc_8u(mbPerRow*mbPerCol*sizeof(mp4_MacroBlock));            if (!pInfo->VisualObject.VideoObject.MBinfo) return MP4_STATUS_NO_MEM;        } else { // data for static sprite            mbPerRow = pInfo->VisualObject.sFrame.mbPerRow = (pInfo->VisualObject.VideoObject.sprite_width + 15) >> 4;            mbPerCol = pInfo->VisualObject.sFrame.mbPerCol = (pInfo->VisualObject.VideoObject.sprite_height + 15) >> 4;            pInfo->VisualObject.sFrame.stepY = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 4;            pInfo->VisualObject.sFrame.apY = ippsMalloc_8u(pInfo->VisualObject.sFrame.stepY * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 4));            if (!pInfo->VisualObject.sFrame.apY) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.sFrame.pY = pInfo->VisualObject.sFrame.apY + pInfo->VisualObject.sFrame.stepY * 16 + 16;            pInfo->VisualObject.sFrame.stepCb = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 3;            pInfo->VisualObject.sFrame.apCb = ippsMalloc_8u(pInfo->VisualObject.sFrame.stepCb * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));            if (!pInfo->VisualObject.sFrame.apCb) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.sFrame.pCb = pInfo->VisualObject.sFrame.apCb + pInfo->VisualObject.sFrame.stepCb * 8 + 8;            pInfo->VisualObject.sFrame.stepCr = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 3;            pInfo->VisualObject.sFrame.apCr = ippsMalloc_8u(pInfo->VisualObject.sFrame.stepCr * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));            if (!pInfo->VisualObject.sFrame.apCr) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.sFrame.pCr = pInfo->VisualObject.sFrame.apCr + pInfo->VisualObject.sFrame.stepCr * 8 + 8;        }        pInfo->VisualObject.VideoObject.MacroBlockPerRow = mbPerRow;        pInfo->VisualObject.VideoObject.MacroBlockPerCol = mbPerCol;        pInfo->VisualObject.VideoObject.MacroBlockPerVOP = mbPerRow * mbPerCol;        pInfo->VisualObject.VideoObject.mbns = mp4_GetMacroBlockNumberSize(pInfo->VisualObject.VideoObject.MacroBlockPerVOP);#ifdef _OMP_KARABAS        pInfo->num_threads = mp4_GetNumOfThreads();        pInfo->pMBinfoMT = (mp4_MacroBlockMT*)ippsMalloc_8u(mbPerRow * pInfo->num_threads * sizeof(mp4_MacroBlockMT));        if(!pInfo->pMBinfoMT) return MP4_STATUS_NO_MEM;#endif // _OMP_KARABAS        if (!pInfo->VisualObject.VideoObject.short_video_header) {            // Intra Prediction info (not needed for SVH)            pInfo->VisualObject.VideoObject.IntraPredBuff.quant = ippsMalloc_8u(mbPerRow + 1);            if (!pInfo->VisualObject.VideoObject.IntraPredBuff.quant) return MP4_STATUS_NO_MEM;            pInfo->VisualObject.VideoObject.IntraPredBuff.block = (mp4_IntraPredBlock*)ippsMalloc_8u((mbPerRow + 1)*6*sizeof(mp4_IntraPredBlock));            if (!pInfo->VisualObject.VideoObject.IntraPredBuff.block) return MP4_STATUS_NO_MEM;            {                mp4_IntraPredBlock *mbCurr = pInfo->VisualObject.VideoObject.IntraPredBuff.block;                mp4_IntraPredBlock *mbA = mbCurr, *mbB = pInfo->VisualObject.VideoObject.IntraPredBuff.dcB, *mbC = mbCurr + 6;                int                 j;                for (j = 0; j < mbPerRow; j ++) {                    mbCurr[0].predA = &mbA[1];  mbCurr[0].predB = &mbB[3];  mbCurr[0].predC = &mbC[2];                    mbCurr[1].predA = &mbC[0];  mbCurr[1].predB = &mbC[2];  mbCurr[1].predC = &mbC[3];                    mbCurr[2].predA = &mbA[3];  mbCurr[2].predB = &mbA[1];  mbCurr[2].predC = &mbC[0];                    mbCurr[3].predA = &mbC[2];  mbCurr[3].predB = &mbC[0];  mbCurr[3].predC = &mbC[1];                    mbCurr[4].predA = &mbA[4];  mbCurr[4].predB = &mbB[4];  mbCurr[4].predC = &mbC[4];                    mbCurr[5].predA = &mbA[5];  mbCurr[5].predB = &mbB[5];  mbCurr[5].predC = &mbC[5];                    mbCurr += 6;  mbA += 6;  mbC += 6;                }            }            if (pInfo->VisualObject.VideoObject.data_partitioned) {                // DataPart info                pInfo->VisualObject.VideoObject.DataPartBuff = (mp4_DataPartMacroBlock*)ippsMalloc_8u(mbPerRow*mbPerCol*sizeof(mp4_DataPartMacroBlock));                if (!pInfo->VisualObject.VideoObject.DataPartBuff) return MP4_STATUS_NO_MEM;            }            if (pInfo->VisualObject.VideoObject.interlaced) {                // Field MV for B-VOP                pInfo->VisualObject.VideoObject.FieldMV = (IppMotionVector*)ippsMalloc_8u(mbPerRow*mbPerCol*sizeof(IppMotionVector)*2);                if (!pInfo->VisualObject.VideoObject.FieldMV) return MP4_STATUS_NO_MEM;            }            ippiQuantInvIntraGetSize_MPEG4(&specSize);            pInfo->VisualObject.VideoObject.QuantInvIntraSpec = (IppiQuantInvIntraSpec_MPEG4*)ippsMalloc_8u(specSize);            ippiQuantInvIntraInit_MPEG4(pInfo->VisualObject.VideoObject.quant_type ? pInfo->VisualObject.VideoObject.intra_quant_mat : NULL, pInfo->VisualObject.VideoObject.QuantInvIntraSpec, 8);            ippiQuantInvInterGetSize_MPEG4(&specSize);            pInfo->VisualObject.VideoObject.QuantInvInterSpec = (IppiQuantInvInterSpec_MPEG4*)ippsMalloc_8u(specSize);            ippiQuantInvInterInit_MPEG4(pInfo->VisualObject.VideoObject.quant_type ? pInfo->VisualObject.VideoObject.nonintra_quant_mat : NULL, pInfo->VisualObject.VideoObject.QuantInvInterSpec, 8);            ippiWarpGetSize_MPEG4(&specSize);            pInfo->VisualObject.VideoObject.WarpSpec = (IppiWarpSpec_MPEG4*)ippsMalloc_8u(specSize);        }    }    return MP4_STATUS_OK;}/*//  Free memory allocated for mp4_Info*/mp4_Status mp4_FreeVOL(mp4_Info* pInfo){    pInfo->VisualObject.VideoObject.VOPindex = 0;    if (pInfo->VisualObject.VideoObject.shape == MP4_SHAPE_TYPE_RECTANGULAR) {        ippsFree(pInfo->VisualObject.cFrame.apY);  pInfo->VisualObject.cFrame.apY  = pInfo->VisualObject.cFrame.pY  = NULL;        ippsFree(pInfo->VisualObject.cFrame.apCb); pInfo->VisualObject.cFrame.apCb = pInfo->VisualObject.cFrame.pCb = NULL;        ippsFree(pInfo->VisualObject.cFrame.apCr); pInfo->VisualObject.cFrame.apCr = pInfo->VisualObject.cFrame.pCr = NULL;        if (pInfo->VisualObject.VideoObject.sprite_enable != MP4_SPRITE_STATIC) {            ippsFree(pInfo->VisualObject.rFrame.apY);  pInfo->VisualObject.rFrame.apY  = pInfo->VisualObject.rFrame.pY  = NULL;            ippsFree(pInfo->VisualObject.rFrame.apCb); pInfo->VisualObject.rFrame.apCb = pInfo->VisualObject.rFrame.pCb = NULL;            ippsFree(pInfo->VisualObject.rFrame.apCr); pInfo->VisualObject.rFrame.apCr = pInfo->VisualObject.rFrame.pCr = NULL;            ippsFree(pInfo->VisualObject.nFrame.apY);  pInfo->VisualObject.nFrame.apY  = pInfo->VisualObject.nFrame.pY  = NULL;            ippsFree(pInfo->VisualObject.nFrame.apCb); pInfo->VisualObject.nFrame.apCb = pInfo->VisualObject.nFrame.pCb = NULL;            ippsFree(pInfo->VisualObject.nFrame.apCr); pInfo->VisualObject.nFrame.apCr = pInfo->VisualObject.nFrame.pCr = NULL;            ippsFree(pInfo->VisualObject.VideoObject.MBinfo); pInfo->VisualObject.VideoObject.MBinfo = NULL;        } else {            ippsFree(pInfo->VisualObject.sFrame.apY);  pInfo->VisualObject.sFrame.apY  = pInfo->VisualObject.sFrame.pY  = NULL;            ippsFree(pInfo->VisualObject.sFrame.apCb); pInfo->VisualObject.sFrame.apCb = pInfo->VisualObject.sFrame.pCb = NULL;            ippsFree(pInfo->VisualObject.sFrame.apCr); pInfo->VisualObject.sFrame.apCr = pInfo->VisualObject.sFrame.pCr = NULL;        }        if (!pInfo->VisualObject.VideoObject.short_video_header) {            ippsFree(pInfo->VisualObject.VideoObject.IntraPredBuff.quant); pInfo->VisualObject.VideoObject.IntraPredBuff.quant = NULL;            ippsFree(pInfo->VisualObject.VideoObject.IntraPredBuff.block); pInfo->VisualObject.VideoObject.IntraPredBuff.block = NULL;            if (pInfo->VisualObject.VideoObject.data_partitioned) {                ippsFree(pInfo->VisualObject.VideoObject.DataPartBuff); pInfo->VisualObject.VideoObject.DataPartBuff = NULL;            }            if (pInfo->VisualObject.VideoObject.interlaced) {                ippsFree(pInfo->VisualObject.VideoObject.FieldMV); pInfo->VisualObject.VideoObject.FieldMV = NULL;            }            ippsFree(pInfo->VisualObject.VideoObject.QuantInvIntraSpec); pInfo->VisualObject.VideoObject.QuantInvIntraSpec = NULL;            ippsFree(pInfo->VisualObject.VideoObject.QuantInvInterSpec); pInfo->VisualObject.VideoObject.QuantInvInterSpec = NULL;            ippsFree(pInfo->VisualObject.VideoObject.WarpSpec); pInfo->VisualObject.VideoObject.WarpSpec = NULL;        }#ifdef _OMP_KARABAS        ippsFree(pInfo->pMBinfoMT); pInfo->pMBinfoMT = NULL;#endif // _OMP_KARABAS    } else {        // free current        mp4_FreeVOPShape(pInfo);        mp4_SWAP(mp4_Frame, pInfo->VisualObject.rFrame, pInfo->VisualObject.cFrame);        // free ref        mp4_FreeVOPShape(pInfo);        mp4_SWAP(mp4_Frame, pInfo->VisualObject.nFrame, pInfo->VisualObject.cFrame);        // free future        mp4_FreeVOPShape(pInfo);        if (pInfo->VisualObject.VideoObject.sprite_enable == MP4_SPRITE_STATIC) {            // free sprite            mp4_SWAP(mp4_Frame, pInfo->VisualObject.sFrame, pInfo->VisualObject.cFrame);            mp4_FreeVOPShape(pInfo);        }    }// mp4 files relative    ippsFree(pInfo->fmp4sz); pInfo->fmp4sz = NULL;    ippsFree(pInfo->fmp4so); pInfo->fmp4so = NULL;    return MP4_STATUS_OK;}/*//  Allocate memory for decoding Shape VOP*/mp4_Status mp4_InitVOPShape(mp4_Info* pInfo){    int mbPerRow, mbPerCol, i, reAlloc;    if (pInfo->VisualObject.VideoObject.sprite_enable == MP4_SPRITE_STATIC) {        mbPerRow = (pInfo->VisualObject.VideoObject.sprite_width + 15) >> 4;        mbPerCol = (pInfo->VisualObject.VideoObject.sprite_height + 15) >> 4;    } else {        mbPerRow = (pInfo->VisualObject.VideoObject.VideoObjectPlane.vop_width + 15) >> 4;        mbPerCol = (pInfo->VisualObject.VideoObject.VideoObjectPlane.vop_height + 15) >> 4;    }    pInfo->VisualObject.VideoObject.MacroBlockPerRow = mbPerRow;    pInfo->VisualObject.VideoObject.MacroBlockPerCol = mbPerCol;    pInfo->VisualObject.VideoObject.MacroBlockPerVOP = mbPerRow * mbPerCol;    pInfo->VisualObject.VideoObject.mbns = mp4_GetMacroBlockNumberSize(pInfo->VisualObject.VideoObject.MacroBlockPerVOP);    reAlloc = (mbPerRow + 2 * MP4_NUM_EXT_MB) * (mbPerCol + 2 * MP4_NUM_EXT_MB) > (pInfo->VisualObject.cFrame.mbPerRow + 2 * MP4_NUM_EXT_MB) * (pInfo->VisualObject.cFrame.mbPerCol + 2 * MP4_NUM_EXT_MB);    if (reAlloc) {        mp4_FreeVOPShape(pInfo);        pInfo->VisualObject.cFrame.mbPerRow = mbPerRow;        pInfo->VisualObject.cFrame.mbPerCol = mbPerCol;        pInfo->VisualObject.cFrame.stepY = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 4;        pInfo->VisualObject.cFrame.apY = ippsMalloc_8u(pInfo->VisualObject.cFrame.stepY * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 4));        if (!pInfo->VisualObject.cFrame.apY) return MP4_STATUS_NO_MEM;        pInfo->VisualObject.cFrame.pY = pInfo->VisualObject.cFrame.apY + pInfo->VisualObject.cFrame.stepY * 16 + 16;        pInfo->VisualObject.cFrame.stepCb = pInfo->VisualObject.cFrame.stepCr = (mbPerRow + 2 * MP4_NUM_EXT_MB) << 3;        pInfo->VisualObject.cFrame.apCb = ippsMalloc_8u(pInfo->VisualObject.cFrame.stepCb * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));        if (!pInfo->VisualObject.cFrame.apCb) return MP4_STATUS_NO_MEM;        pInfo->VisualObject.cFrame.apCr = ippsMalloc_8u(pInfo->VisualObject.cFrame.stepCr * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 3));        if (!pInfo->VisualObject.cFrame.apCr) return MP4_STATUS_NO_MEM;        pInfo->VisualObject.cFrame.pCb = pInfo->VisualObject.cFrame.apCb + pInfo->VisualObject.cFrame.stepCb * 8 + 8;        pInfo->VisualObject.cFrame.pCr = pInfo->VisualObject.cFrame.apCr + pInfo->VisualObject.cFrame.stepCr * 8 + 8;        pInfo->VisualObject.VideoObject.MBinfo = (mp4_MacroBlock*)ippsMalloc_8u(mbPerRow*mbPerCol*sizeof(mp4_MacroBlock));        if (!pInfo->VisualObject.VideoObject.MBinfo) return MP4_STATUS_NO_MEM;//f account must be taken of Sprite !!!        pInfo->VisualObject.VideoObject.ShapeInfo = (mp4_ShapeInfo*)ippsMalloc_8u(mbPerRow*mbPerCol*sizeof(mp4_ShapeInfo));        if (!pInfo->VisualObject.VideoObject.ShapeInfo) return MP4_STATUS_NO_MEM;        pInfo->VisualObject.cFrame.apB = ippsMalloc_8u(pInfo->VisualObject.cFrame.stepY * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 4));        if (!pInfo->VisualObject.cFrame.apB) return MP4_STATUS_NO_MEM;        pInfo->VisualObject.cFrame.pB = pInfo->VisualObject.cFrame.apB + pInfo->VisualObject.cFrame.stepY * 16 + 16;ippsZero_8u(pInfo->VisualObject.cFrame.apB, pInfo->VisualObject.cFrame.stepY * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 4));        if (pInfo->VisualObject.VideoObject.shape == MP4_SHAPE_TYPE_GRAYSCALE) {            for (i = 0; i < mp4_aux_comp_count[pInfo->VisualObject.VideoObject.shape_extension]; i ++) {                pInfo->VisualObject.cFrame.apA[i] = ippsMalloc_8u(pInfo->VisualObject.cFrame.stepY * ((mbPerCol + 2 * MP4_NUM_EXT_MB) << 4));                if (!pInfo->VisualObject.cFrame.apA[i]) return MP4_STATUS_NO_MEM;                pInfo->VisualObject.cFrame.pA[i] = pInfo->VisualObject.cFrame.apA[i] + pInfo->VisualObject.cFrame.stepY * 16 + 16;            }        }    }    return MP4_STATUS_OK;}/*//  Free memory allocated for Shape VOP*/mp4_Status mp4_FreeVOPShape(mp4_Info* pInfo){    ippsFree(pInfo->VisualObject.cFrame.apY);  pInfo->VisualObject.cFrame.apY  = pInfo->VisualObject.cFrame.pY  = NULL;

⌨️ 快捷键说明

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