void DestroyPicBuff (PPicBuff* ppPicBuf) { PPicBuff pPicBuf = NULL; if (NULL == ppPicBuf || NULL == *ppPicBuf) return; pPicBuf = *ppPicBuf; while (pPicBuf->ppPic != NULL) { int32_t iPicIdx = 0; while (iPicIdx < pPicBuf->iCapacity) { PPicture pPic = pPicBuf->ppPic[iPicIdx]; if (pPic != NULL) { FreePicture (pPic); } pPic = NULL; ++ iPicIdx; } WelsFree (pPicBuf->ppPic, "pPicBuf->queue"); pPicBuf->ppPic = NULL; } pPicBuf->iCapacity = 0; pPicBuf->iCurrentIdx = 0; WelsFree (pPicBuf, "pPicBuf"); pPicBuf = NULL; *ppPicBuf = NULL; }
void FreePicture (PPicture pPic) { if (NULL != pPic) { if (pPic->pBuffer[0]) { WelsFree (pPic->pBuffer[0], "pPic->pBuffer[0]"); } WelsFree (pPic, "pPic"); pPic = NULL; } }
/* * free memory blocks in avc */ void WelsFreeMem (PWelsDecoderContext pCtx) { int32_t iListIdx = 0; /* TODO: free memory blocks introduced in avc */ ResetFmoList (pCtx); WelsResetRefPic (pCtx); // for sPicBuff for (iListIdx = LIST_0; iListIdx < LIST_A; ++ iListIdx) { PPicBuff* pPicBuff = &pCtx->pPicBuff[iListIdx]; if (NULL != pPicBuff && NULL != *pPicBuff) { DestroyPicBuff (pPicBuff); } } // added for safe memory pCtx->iImgWidthInPixel = 0; pCtx->iImgHeightInPixel = 0; pCtx->iLastImgWidthInPixel = 0; pCtx->iLastImgHeightInPixel = 0; pCtx->bFreezeOutput = true; pCtx->bHaveGotMemory = false; WelsFree (pCtx->pCabacDecEngine, "pCtx->pCabacDecEngine"); }
EResult CBackgroundDetection::Process (int32_t iType, SPixMap* pSrcPixMap, SPixMap* pRefPixMap) { EResult eReturn = RET_INVALIDPARAM; if (pSrcPixMap == NULL || pRefPixMap == NULL) return eReturn; m_BgdParam.pCur[0] = (uint8_t*)pSrcPixMap->pPixel[0]; m_BgdParam.pCur[1] = (uint8_t*)pSrcPixMap->pPixel[1]; m_BgdParam.pCur[2] = (uint8_t*)pSrcPixMap->pPixel[2]; m_BgdParam.pRef[0] = (uint8_t*)pRefPixMap->pPixel[0]; m_BgdParam.pRef[1] = (uint8_t*)pRefPixMap->pPixel[1]; m_BgdParam.pRef[2] = (uint8_t*)pRefPixMap->pPixel[2]; m_BgdParam.iBgdWidth = pSrcPixMap->sRect.iRectWidth; m_BgdParam.iBgdHeight = pSrcPixMap->sRect.iRectHeight; m_BgdParam.iStride[0] = pSrcPixMap->iStride[0]; m_BgdParam.iStride[1] = pSrcPixMap->iStride[1]; m_BgdParam.iStride[2] = pSrcPixMap->iStride[2]; int32_t iCurFrameSize = m_BgdParam.iBgdWidth * m_BgdParam.iBgdHeight; if (m_BgdParam.pOU_array == NULL || iCurFrameSize > m_iLargestFrameSize) { WelsFree (m_BgdParam.pOU_array); m_BgdParam.pOU_array = AllocateOUArrayMemory (m_BgdParam.iBgdWidth, m_BgdParam.iBgdHeight); m_iLargestFrameSize = iCurFrameSize; } if (m_BgdParam.pOU_array == NULL) return eReturn; BackgroundDetection (&m_BgdParam); return RET_SUCCESS; }
int32_t MemFreeNalList (PAccessUnit* ppAu) { if (ppAu != NULL) { PAccessUnit pAu = *ppAu; if (pAu != NULL) { WelsFree (pAu, "Access Unit"); *ppAu = NULL; } } return 0; }
void CWelsDecoder::UninitDecoder (void) { if (NULL == m_pDecContext) return; IWelsTrace::WelsVTrace (m_pTrace, IWelsTrace::WELS_LOG_INFO, "into CWelsDecoder::uninit_decoder().."); WelsEndDecoder (m_pDecContext); if (NULL != m_pDecContext) { WelsFree (m_pDecContext, "m_pDecContext"); m_pDecContext = NULL; } IWelsTrace::WelsVTrace (m_pTrace, IWelsTrace::WELS_LOG_INFO, "left CWelsDecoder::uninit_decoder().."); }
void CWelsDecoder::UninitDecoder (void) { if (NULL == m_pDecContext) return; WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO, "into CWelsDecoder::uninit_decoder().."); WelsEndDecoder (m_pDecContext); if (NULL != m_pDecContext) { WelsFree (m_pDecContext, "m_pDecContext"); m_pDecContext = NULL; } WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO, "left CWelsDecoder::uninit_decoder().."); }
void CWelsDecoder::UninitDecoder (void) { if (NULL == m_pDecContext) return; WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO, "CWelsDecoder::uninit_decoder(), openh264 codec version = %s.", VERSION_NUMBER); WelsEndDecoder (m_pDecContext); if (NULL != m_pDecContext) { WelsFree (m_pDecContext, "m_pDecContext"); m_pDecContext = NULL; } }
void* InternalReallocate (void* pPointer, const uint32_t kuiSize, char* pTag) { uint32_t iOldSize = 0; uint8_t* pNew = NULL; if (pPointer != NULL) iOldSize = * ((int32_t*) ((uint8_t*) pPointer - sizeof (void**) - sizeof (int32_t))); else return WelsMalloc (kuiSize, pTag); pNew = (uint8_t*)WelsMalloc (kuiSize, pTag); if (0 == pNew) { if (iOldSize > 0 && kuiSize > 0 && iOldSize >= kuiSize) return (pPointer); return 0; } else if (iOldSize > 0 && kuiSize > 0) memcpy (pNew, pPointer, (iOldSize < kuiSize) ? iOldSize : kuiSize); else return 0; WelsFree (pPointer, pTag); return (pNew); }
void CWelsDecoder::UninitDecoder (void) { if (NULL == m_pDecContext) return; WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO, "CWelsDecoder::UninitDecoder(), openh264 codec version = %s.", VERSION_NUMBER); WelsEndDecoder (m_pDecContext); if (m_pDecContext->pMemAlign != NULL) { WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO, "CWelsDecoder::UninitDecoder(), verify memory usage (%d bytes) after free..", m_pDecContext->pMemAlign->WelsGetMemoryUsage()); delete m_pDecContext->pMemAlign; m_pDecContext->pMemAlign = NULL; } if (NULL != m_pDecContext) { WelsFree (m_pDecContext, "m_pDecContext"); m_pDecContext = NULL; } }
static int32_t DecreasePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, const int32_t kiOldSize, const int32_t kiPicWidth, const int32_t kiPicHeight, const int32_t kiNewSize) { PPicBuff pPicOldBuf = *ppPicBuf; PPicBuff pPicNewBuf = NULL; int32_t iPicIdx = 0; if (kiOldSize <= 0 || kiNewSize <= 0 || kiPicWidth <= 0 || kiPicHeight <= 0) { return 1; } pPicNewBuf = (PPicBuff)WelsMallocz (sizeof (SPicBuff), "PPicBuff"); if (NULL == pPicNewBuf) { return 1; } pPicNewBuf->ppPic = (PPicture*)WelsMallocz (kiNewSize * sizeof (PPicture), "PPicture*"); if (NULL == pPicNewBuf->ppPic) { pPicNewBuf->iCapacity = 0; DestroyPicBuff (&pPicNewBuf); return 1; } int32_t iPrevPicIdx = -1; for (iPrevPicIdx = 0; iPrevPicIdx < kiOldSize; ++iPrevPicIdx) { if (pCtx->pPreviousDecodedPictureInDpb == pPicOldBuf->ppPic[iPrevPicIdx]) { break; } } int32_t iDelIdx; if (iPrevPicIdx < kiOldSize && iPrevPicIdx >= kiNewSize) { // found pPreviousDecodedPictureInDpb, pPicNewBuf->ppPic[0] = pPicOldBuf->ppPic[iPrevPicIdx]; pPicNewBuf->iCurrentIdx = 0; memcpy (pPicNewBuf->ppPic + 1, pPicOldBuf->ppPic, (kiNewSize - 1) * sizeof (PPicture)); iDelIdx = kiNewSize - 1; } else { memcpy (pPicNewBuf->ppPic, pPicOldBuf->ppPic, kiNewSize * sizeof (PPicture)); pPicNewBuf->iCurrentIdx = iPrevPicIdx < kiNewSize ? iPrevPicIdx : 0; iDelIdx = kiNewSize; } for (iPicIdx = iDelIdx; iPicIdx < kiOldSize; iPicIdx++) { if (iPrevPicIdx != iPicIdx) { if (pPicOldBuf->ppPic[iPicIdx] != NULL) { FreePicture (pPicOldBuf->ppPic[iPicIdx]); pPicOldBuf->ppPic[iPicIdx] = NULL; } } } // initialize context in queue pPicNewBuf->iCapacity = kiNewSize; *ppPicBuf = pPicNewBuf; for (int32_t i = 0; i < pPicNewBuf->iCapacity; i++) { pPicNewBuf->ppPic[i]->bUsedAsRef = false; pPicNewBuf->ppPic[i]->bIsLongRef = false; pPicNewBuf->ppPic[i]->uiRefCount = 0; pPicNewBuf->ppPic[i]->bAvailableFlag = true; pPicNewBuf->ppPic[i]->bIsComplete = false; } // remove old PicBuf if (pPicOldBuf->ppPic != NULL) { WelsFree (pPicOldBuf->ppPic, "pPicOldBuf->queue"); pPicOldBuf->ppPic = NULL; } pPicOldBuf->iCapacity = 0; pPicOldBuf->iCurrentIdx = 0; WelsFree (pPicOldBuf, "pPicOldBuf"); pPicOldBuf = NULL; return 0; }
static int32_t IncreasePicBuff (PWelsDecoderContext pCtx, PPicBuff* ppPicBuf, const int32_t kiOldSize, const int32_t kiPicWidth, const int32_t kiPicHeight, const int32_t kiNewSize) { PPicBuff pPicOldBuf = *ppPicBuf; PPicBuff pPicNewBuf = NULL; int32_t iPicIdx = 0; if (kiOldSize <= 0 || kiNewSize <= 0 || kiPicWidth <= 0 || kiPicHeight <= 0) { return 1; } pPicNewBuf = (PPicBuff)WelsMallocz (sizeof (SPicBuff), "PPicBuff"); if (NULL == pPicNewBuf) { return 1; } pPicNewBuf->ppPic = (PPicture*)WelsMallocz (kiNewSize * sizeof (PPicture), "PPicture*"); if (NULL == pPicNewBuf->ppPic) { pPicNewBuf->iCapacity = 0; DestroyPicBuff (&pPicNewBuf); return 1; } // increase new PicBuf for (iPicIdx = kiOldSize; iPicIdx < kiNewSize; ++ iPicIdx) { PPicture pPic = AllocPicture (pCtx, kiPicWidth, kiPicHeight); if (NULL == pPic) { // Set maximum capacity as the new malloc memory at the tail pPicNewBuf->iCapacity = iPicIdx; DestroyPicBuff (&pPicNewBuf); return 1; } pPicNewBuf->ppPic[iPicIdx] = pPic; } // copy old PicBuf to new PicBuf memcpy (pPicNewBuf->ppPic, pPicOldBuf->ppPic, kiOldSize * sizeof (PPicture)); // initialize context in queue pPicNewBuf->iCapacity = kiNewSize; pPicNewBuf->iCurrentIdx = pPicOldBuf->iCurrentIdx; * ppPicBuf = pPicNewBuf; for (int32_t i = 0; i < pPicNewBuf->iCapacity; i++) { pPicNewBuf->ppPic[i]->bUsedAsRef = false; pPicNewBuf->ppPic[i]->bIsLongRef = false; pPicNewBuf->ppPic[i]->uiRefCount = 0; pPicNewBuf->ppPic[i]->bAvailableFlag = true; pPicNewBuf->ppPic[i]->bIsComplete = false; } // remove old PicBuf if (pPicOldBuf->ppPic != NULL) { WelsFree (pPicOldBuf->ppPic, "pPicOldBuf->queue"); pPicOldBuf->ppPic = NULL; } pPicOldBuf->iCapacity = 0; pPicOldBuf->iCurrentIdx = 0; WelsFree (pPicOldBuf, "pPicOldBuf"); pPicOldBuf = NULL; return 0; }
CBackgroundDetection::~CBackgroundDetection() { WelsFree (m_BgdParam.pOU_array); }