📄 mp4decvop.c
字号:
/* /////////////////////////////////////////////////////////////////////////// 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 + -