shithub: openh264

Download patch

ref: 560a16afc20710cfd91a714b08402c9a64e07a12
parent: c816fa663f83eabc0dae393a545e15f17f12770c
parent: d1c0a935c726baef86044ec1e1b697eb9eb70788
author: ruil2 <[email protected]>
date: Fri Mar 10 05:28:51 EST 2017

Merge pull request #2679 from huili2/low_mem_crash_fix

fix low memory crash issue

--- a/codec/common/inc/WelsThreadPool.h
+++ b/codec/common/inc/WelsThreadPool.h
@@ -58,7 +58,7 @@
 
   static WELS_THREAD_ERROR_CODE SetThreadNum (int32_t iMaxThreadNum);
 
-  static CWelsThreadPool& AddReference();
+  static CWelsThreadPool* AddReference();
   void RemoveInstance();
 
   static bool IsReferenced();
@@ -102,6 +102,7 @@
   static int32_t   m_iRefCount;
   static CWelsLock m_cInitLock;
   static int32_t   m_iMaxThreadNum;
+  static CWelsThreadPool* m_pThreadPoolSelf;
 
   CWelsNonDuplicatedList<IWelsTask>* m_cWaitedTasks;
   CWelsNonDuplicatedList<CWelsTaskThread>* m_cIdleThreads;
--- a/codec/common/src/WelsThreadPool.cpp
+++ b/codec/common/src/WelsThreadPool.cpp
@@ -46,6 +46,7 @@
 int32_t CWelsThreadPool::m_iRefCount = 0;
 CWelsLock CWelsThreadPool::m_cInitLock;
 int32_t CWelsThreadPool::m_iMaxThreadNum = DEFAULT_THREAD_NUM;
+CWelsThreadPool* CWelsThreadPool::m_pThreadPoolSelf = NULL;
 
 CWelsThreadPool::CWelsThreadPool() :
   m_cWaitedTasks (NULL), m_cIdleThreads (NULL), m_cBusyThreads (NULL) {
@@ -75,13 +76,21 @@
 }
 
 
-CWelsThreadPool& CWelsThreadPool::AddReference () {
+CWelsThreadPool* CWelsThreadPool::AddReference() {
   CWelsAutoLock  cLock (m_cInitLock);
-  static CWelsThreadPool m_cThreadPoolSelf;
+  if (m_pThreadPoolSelf == NULL) {
+    m_pThreadPoolSelf = new CWelsThreadPool();
+    if (!m_pThreadPoolSelf) {
+      return NULL;
+    }
+  }
+
   if (m_iRefCount == 0) {
-    //TODO: will remove this afterwards
-    if (WELS_THREAD_ERROR_OK != m_cThreadPoolSelf.Init()) {
-      m_cThreadPoolSelf.Uninit();
+    if (WELS_THREAD_ERROR_OK != m_pThreadPoolSelf->Init()) {
+      m_pThreadPoolSelf->Uninit();
+      delete m_pThreadPoolSelf;
+      m_pThreadPoolSelf = NULL;
+      return NULL;
     }
   }
 
@@ -89,7 +98,7 @@
 
   ++ m_iRefCount;
   //fprintf(stdout, "m_iRefCount2=%d\n", m_iRefCount);
-  return m_cThreadPoolSelf;
+  return m_pThreadPoolSelf;
 }
 
 void CWelsThreadPool::RemoveInstance() {
@@ -99,6 +108,10 @@
   if (0 == m_iRefCount) {
     StopAllRunning();
     Uninit();
+    if (m_pThreadPoolSelf) {
+      delete m_pThreadPoolSelf;
+      m_pThreadPoolSelf = NULL;
+    }
     //fprintf(stdout, "m_iRefCount=%d, IdleThreadNum=%d, BusyThreadNum=%d, WaitedTask=%d\n", m_iRefCount, GetIdleThreadNum(), GetBusyThreadNum(), GetWaitedTaskNum());
   }
 }
@@ -106,7 +119,7 @@
 
 bool CWelsThreadPool::IsReferenced() {
   CWelsAutoLock  cLock (m_cInitLock);
-  return (m_iRefCount>0);
+  return (m_iRefCount > 0);
 }
 
 
@@ -137,7 +150,7 @@
   return WELS_THREAD_ERROR_OK;
 }
 
-WELS_THREAD_ERROR_CODE CWelsThreadPool::Init () {
+WELS_THREAD_ERROR_CODE CWelsThreadPool::Init() {
   //fprintf(stdout, "Enter WelsThreadPool Init\n");
 
   CWelsAutoLock  cLock (m_cLockPool);
@@ -197,9 +210,9 @@
 
   Kill();
 
-  WELS_DELETE_OP(m_cWaitedTasks);
-  WELS_DELETE_OP(m_cIdleThreads);
-  WELS_DELETE_OP(m_cBusyThreads);
+  WELS_DELETE_OP (m_cWaitedTasks);
+  WELS_DELETE_OP (m_cIdleThreads);
+  WELS_DELETE_OP (m_cBusyThreads);
 
   return iReturn;
 }
@@ -234,8 +247,8 @@
     }
   }
   //fprintf(stdout, "ThreadPool:  AddTaskToWaitedList: %x\n", pTask);
-  if (false == AddTaskToWaitedList (pTask)){
-      return WELS_THREAD_ERROR_GENERAL;
+  if (false == AddTaskToWaitedList (pTask)) {
+    return WELS_THREAD_ERROR_GENERAL;
   }
 
   //fprintf(stdout, "ThreadPool:  SignalThread: %x\n", pTask);
@@ -261,7 +274,7 @@
 
 void  CWelsThreadPool::DestroyThread (CWelsTaskThread* pThread) {
   pThread->Kill();
-  WELS_DELETE_OP(pThread);
+  WELS_DELETE_OP (pThread);
 
   return;
 }
@@ -292,7 +305,7 @@
 
   int32_t nRet = m_cWaitedTasks->push_back (pTask);
   //fprintf(stdout, "CWelsThreadPool::AddTaskToWaitedList=%d, pTask=%x\n", m_cWaitedTasks->size(), pTask);
-  return (0==nRet ? true : false);
+  return (0 == nRet ? true : false);
 }
 
 CWelsTaskThread*   CWelsThreadPool::GetIdleThread() {
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -907,10 +907,10 @@
 
   (*ppCtx)->ppMbListD = static_cast<SMB**> ((*ppCtx)->pMemAlign->WelsMallocz (iNumDlayer * sizeof (SMB*), "ppMbListD"));
   (*ppCtx)->ppMbListD[0] = NULL;
-  WELS_VERIFY_RETURN_PROC_IF (1, (*ppCtx)->ppMbListD == NULL, FreeMemorySvc (ppCtx));
+  WELS_VERIFY_RETURN_IF (1, (*ppCtx)->ppMbListD == NULL)
   (*ppCtx)->ppMbListD[0] = static_cast<SMB*> ((*ppCtx)->pMemAlign->WelsMallocz (iOverallMbNum * sizeof (SMB),
                            "ppMbListD[0]"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (*ppCtx)->ppMbListD[0] == NULL, FreeMemorySvc (ppCtx));
+  WELS_VERIFY_RETURN_IF (1, (*ppCtx)->ppMbListD[0] == NULL)
   (*ppCtx)->ppDqLayerList[0]->sMbDataP = (*ppCtx)->ppMbListD[0];
   InitMbInfo (*ppCtx, (*ppCtx)->ppMbListD[0], (*ppCtx)->ppDqLayerList[0], 0, iMbSize[iNumDlayer - 1]);
   for (i = 1; i < iNumDlayer; i++) {
@@ -1166,7 +1166,7 @@
 
     // pRef list
     pRefList = (SRefList*)pMa->WelsMallocz (sizeof (SRefList), "pRefList");
-    WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pRefList), FreeMemorySvc (ppCtx))
+    WELS_VERIFY_RETURN_IF (1, (NULL == pRefList))
     do {
       pRefList->pRef[i] = AllocPicture (pMa, kiWidth, kiHeight, true,
                                         (iDlayerIndex == iDlayerCount - 1) ? kiNeedFeatureStorage : 0); // to use actual size of current layer
@@ -1255,11 +1255,11 @@
     if (kiNeedFeatureStorage && iDlayerIndex == iDlayerCount - 1) {
       pDqLayer->pFeatureSearchPreparation = static_cast<SFeatureSearchPreparation*> (pMa->WelsMallocz (sizeof (
                                               SFeatureSearchPreparation), "pFeatureSearchPreparation"));
-      WELS_VERIFY_RETURN_PROC_IF (1, NULL == pDqLayer->pFeatureSearchPreparation, FreeMemorySvc (ppCtx));
+      WELS_VERIFY_RETURN_IF (1, NULL == pDqLayer->pFeatureSearchPreparation)
       int32_t iReturn = RequestFeatureSearchPreparation (pMa, pDlayer->iVideoWidth, pDlayer->iVideoHeight,
                         kiNeedFeatureStorage,
                         pDqLayer->pFeatureSearchPreparation);
-      WELS_VERIFY_RETURN_PROC_IF (1, ENC_RETURN_SUCCESS != iReturn, FreeMemorySvc (ppCtx));
+      WELS_VERIFY_RETURN_IF (1, ENC_RETURN_SUCCESS != iReturn)
     } else {
       pDqLayer->pFeatureSearchPreparation = NULL;
     }
@@ -1270,15 +1270,15 @@
   }
 
   // for dynamically malloc for parameter sets memory instead of maximal items for standard to reduce size, 3/18/2010
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pFuncList), FreeMemorySvc (ppCtx))
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pFuncList->pParametersetStrategy), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pFuncList))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pFuncList->pParametersetStrategy))
   const int32_t kiNeededSpsNum = (*ppCtx)->pFuncList->pParametersetStrategy->GetNeededSpsNum();
   const int32_t kiNeededSubsetSpsNum = (*ppCtx)->pFuncList->pParametersetStrategy->GetNeededSubsetSpsNum();
   (*ppCtx)->pSpsArray = (SWelsSPS*)pMa->WelsMallocz (kiNeededSpsNum * sizeof (SWelsSPS), "pSpsArray");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pSpsArray), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pSpsArray))
   if (kiNeededSubsetSpsNum > 0) {
     (*ppCtx)->pSubsetArray = (SSubsetSps*)pMa->WelsMallocz (kiNeededSubsetSpsNum * sizeof (SSubsetSps), "pSubsetArray");
-    WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pSubsetArray), FreeMemorySvc (ppCtx))
+    WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pSubsetArray))
   } else {
     (*ppCtx)->pSubsetArray = NULL;
   }
@@ -1286,7 +1286,7 @@
   // PPS
   const int32_t kiNeededPpsNum = (*ppCtx)->pFuncList->pParametersetStrategy->GetNeededPpsNum();
   (*ppCtx)->pPPSArray = (SWelsPPS*)pMa->WelsMallocz (kiNeededPpsNum * sizeof (SWelsPPS), "pPPSArray");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pPPSArray), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pPPSArray))
 
   (*ppCtx)->pFuncList->pParametersetStrategy->LoadPrevious (pExistingParasetList, (*ppCtx)->pSpsArray,
       (*ppCtx)->pSubsetArray, (*ppCtx)->pPPSArray);
@@ -1293,7 +1293,7 @@
 
 
   (*ppCtx)->pDqIdcMap = (SDqIdc*)pMa->WelsMallocz (iDlayerCount * sizeof (SDqIdc), "pDqIdcMap");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pDqIdcMap), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pDqIdcMap))
 
   iDlayerIndex = 0;
   while (iDlayerIndex < iDlayerCount) {
@@ -1328,7 +1328,6 @@
                                   pPps);
       if (iResult) {
         WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "InitDqLayers(), InitSlicePEncCtx failed(%d)!", iResult);
-        FreeMemorySvc (ppCtx);
         return iResult;
       }
     }
@@ -1682,7 +1681,6 @@
   if (kiNumDependencyLayers < 1 || kiNumDependencyLayers > MAX_DEPENDENCY_LAYER) {
     WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "RequestMemorySvc() failed due to invalid iNumDependencyLayers(%d)!",
              kiNumDependencyLayers);
-    FreeMemorySvc (ppCtx);
     return 1;
   }
 
@@ -1690,7 +1688,6 @@
     WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING,
              "RequestMemorySvc() failed due to invalid uiIntraPeriod(%d) (=multipler of uiGopSize(%d)!",
              pParam->uiIntraPeriod, pParam->uiGopSize);
-    FreeMemorySvc (ppCtx);
     return 1;
   }
 
@@ -1702,7 +1699,6 @@
   iResult = AcquireLayersNals (ppCtx, pParam, &iCountLayers, &iCountNals);
   if (iResult) {
     WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "RequestMemorySvc(), AcquireLayersNals failed(%d)!", iResult);
-    FreeMemorySvc (ppCtx);
     return 1;
   }
 
@@ -1755,21 +1751,20 @@
 
   // Output
   (*ppCtx)->pOut = (SWelsEncoderOutput*)pMa->WelsMallocz (sizeof (SWelsEncoderOutput), "SWelsEncoderOutput");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pOut), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pOut))
   (*ppCtx)->pOut->pBsBuffer = (uint8_t*)pMa->WelsMallocz (iCountBsLen, "pOut->pBsBuffer");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pOut->pBsBuffer), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pOut->pBsBuffer))
   (*ppCtx)->pOut->uiSize = iCountBsLen;
   (*ppCtx)->pOut->sNalList = (SWelsNalRaw*)pMa->WelsMallocz (iCountNals * sizeof (SWelsNalRaw), "pOut->sNalList");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pOut->sNalList), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pOut->sNalList))
   (*ppCtx)->pOut->pNalLen = (int32_t*)pMa->WelsMallocz (iCountNals * sizeof (int32_t), "pOut->pNalLen");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pOut->pNalLen), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pOut->pNalLen))
   (*ppCtx)->pOut->iCountNals    = iCountNals;
   (*ppCtx)->pOut->iNalIndex     = 0;
   (*ppCtx)->pOut->iLayerBsIndex = 0;
 
-
   (*ppCtx)->pFrameBs = (uint8_t*)pMa->WelsMalloc (iTotalLength, "pFrameBs");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pFrameBs), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pFrameBs))
   (*ppCtx)->iFrameBsSize = iTotalLength;
   (*ppCtx)->iPosBsBuffer = 0;
 
@@ -1777,7 +1772,7 @@
   if (bDynamicSlice && pParam->iEntropyCodingModeFlag) {
     for (int32_t iIdx = 0; iIdx < MAX_THREADS_NUM; iIdx++) {
       (*ppCtx)->pDynamicBsBuffer[iIdx] = (uint8_t*)pMa->WelsMalloc (iMaxSliceBufferSize, "DynamicSliceBs");
-      WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pDynamicBsBuffer[iIdx]), FreeMemorySvc (ppCtx))
+      WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pDynamicBsBuffer[iIdx]))
     }
   }
   // for pSlice bs buffers
@@ -1784,38 +1779,37 @@
   if (pParam->iMultipleThreadIdc > 1
       && RequestMtResource (ppCtx, pParam, iCountBsLen, iMaxSliceBufferSize, bDynamicSlice)) {
     WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "RequestMemorySvc(), RequestMtResource failed!");
-    FreeMemorySvc (ppCtx);
     return 1;
   }
 
   (*ppCtx)->pReferenceStrategy = IWelsReferenceStrategy::CreateReferenceStrategy ((*ppCtx), pParam->iUsageType,
                                  pParam->bEnableLongTermReference);
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pReferenceStrategy), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pReferenceStrategy))
 
   (*ppCtx)->pIntra4x4PredModeBlocks = static_cast<int8_t*>
                                       (pMa->WelsMallocz (iCountMaxMbNum * INTRA_4x4_MODE_NUM, "pIntra4x4PredModeBlocks"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pIntra4x4PredModeBlocks), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pIntra4x4PredModeBlocks))
 
   (*ppCtx)->pNonZeroCountBlocks = static_cast<int8_t*>
                                   (pMa->WelsMallocz (iCountMaxMbNum * MB_LUMA_CHROMA_BLOCK4x4_NUM, "pNonZeroCountBlocks"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pNonZeroCountBlocks), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pNonZeroCountBlocks))
 
   (*ppCtx)->pMvUnitBlock4x4 = static_cast<SMVUnitXY*>
                               (pMa->WelsMallocz (iCountMaxMbNum * 2 * MB_BLOCK4x4_NUM * sizeof (SMVUnitXY), "pMvUnitBlock4x4"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pMvUnitBlock4x4), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pMvUnitBlock4x4))
 
   (*ppCtx)->pRefIndexBlock4x4 = static_cast<int8_t*>
                                 (pMa->WelsMallocz (iCountMaxMbNum * 2 * MB_BLOCK8x8_NUM * sizeof (int8_t), "pRefIndexBlock4x4"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pRefIndexBlock4x4), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pRefIndexBlock4x4))
 
   (*ppCtx)->pSadCostMb = static_cast<int32_t*>
                          (pMa->WelsMallocz (iCountMaxMbNum * sizeof (int32_t), "pSadCostMb"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pSadCostMb), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pSadCostMb))
 
   (*ppCtx)->iGlobalQp = 26;   // global qp in default
 
   (*ppCtx)->pLtr = (SLTRState*)pMa->WelsMallocz (kiNumDependencyLayers * sizeof (SLTRState), "SLTRState");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pLtr), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pLtr))
   int32_t i = 0;
   for (i = 0; i < kiNumDependencyLayers; i++) {
     ResetLtrState (& (*ppCtx)->pLtr[i]);
@@ -1824,7 +1818,6 @@
   // stride tables
   if (AllocStrideTables (ppCtx, kiNumDependencyLayers)) {
     WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "RequestMemorySvc(), AllocStrideTables failed!");
-    FreeMemorySvc (ppCtx);
     return 1;
   }
 
@@ -1831,57 +1824,55 @@
   //Rate control module memory allocation
   // only malloc once for RC pData, 12/14/2009
   (*ppCtx)->pWelsSvcRc = (SWelsSvcRc*)pMa->WelsMallocz (kiNumDependencyLayers * sizeof (SWelsSvcRc), "pWelsSvcRc");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pWelsSvcRc), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pWelsSvcRc))
   //End of Rate control module memory allocation
 
   //pVaa memory allocation
   if (pParam->iUsageType == SCREEN_CONTENT_REAL_TIME) {
     (*ppCtx)->pVaa = (SVAAFrameInfoExt*)pMa->WelsMallocz (sizeof (SVAAFrameInfoExt), "pVaa");
-    WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa), FreeMemorySvc (ppCtx))
+    WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa))
     if (RequestMemoryVaaScreen ((*ppCtx)->pVaa, pMa, (*ppCtx)->pSvcParam->iMaxNumRefFrame, iCountMaxMbNum << 2)) {
       WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "RequestMemorySvc(), RequestMemoryVaaScreen failed!");
-      FreeMemorySvc (ppCtx);
       return 1;
     }
   } else {
     (*ppCtx)->pVaa = (SVAAFrameInfo*)pMa->WelsMallocz (sizeof (SVAAFrameInfo), "pVaa");
-    WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa), FreeMemorySvc (ppCtx))
+    WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa))
   }
 
   if ((*ppCtx)->pSvcParam->bEnableAdaptiveQuant) { //malloc mem
     (*ppCtx)->pVaa->sAdaptiveQuantParam.pMotionTextureUnit   = static_cast<SMotionTextureUnit*>
         (pMa->WelsMallocz (iCountMaxMbNum * sizeof (SMotionTextureUnit), "pVaa->sAdaptiveQuantParam.pMotionTextureUnit"));
-    WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa->sAdaptiveQuantParam.pMotionTextureUnit), FreeMemorySvc (ppCtx))
+    WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa->sAdaptiveQuantParam.pMotionTextureUnit))
     (*ppCtx)->pVaa->sAdaptiveQuantParam.pMotionTextureIndexToDeltaQp   = static_cast<int8_t*>
         (pMa->WelsMallocz (iCountMaxMbNum * sizeof (int8_t), "pVaa->sAdaptiveQuantParam.pMotionTextureIndexToDeltaQp"));
-    WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa->sAdaptiveQuantParam.pMotionTextureIndexToDeltaQp),
-                                FreeMemorySvc (ppCtx))
+    WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa->sAdaptiveQuantParam.pMotionTextureIndexToDeltaQp))
   }
 
   (*ppCtx)->pVaa->pVaaBackgroundMbFlag = (int8_t*)pMa->WelsMallocz (iCountMaxMbNum * sizeof (int8_t),
                                          "pVaa->pVaaBackgroundMbFlag");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa->pVaaBackgroundMbFlag), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa->pVaaBackgroundMbFlag))
 
   (*ppCtx)->pVaa->sVaaCalcInfo.pSad8x8 = static_cast<int32_t (*)[4]>
                                          (pMa->WelsMallocz (iCountMaxMbNum * 4 * sizeof (int32_t), "pVaa->sVaaCalcInfo.sad8x8"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSad8x8), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSad8x8))
   (*ppCtx)->pVaa->sVaaCalcInfo.pSsd16x16 = static_cast<int32_t*>
       (pMa->WelsMallocz (iCountMaxMbNum * sizeof (int32_t), "pVaa->sVaaCalcInfo.pSsd16x16"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSsd16x16), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSsd16x16))
   (*ppCtx)->pVaa->sVaaCalcInfo.pSum16x16 = static_cast<int32_t*>
       (pMa->WelsMallocz (iCountMaxMbNum * sizeof (int32_t), "pVaa->sVaaCalcInfo.pSum16x16"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSum16x16), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSum16x16))
   (*ppCtx)->pVaa->sVaaCalcInfo.pSumOfSquare16x16 = static_cast<int32_t*>
       (pMa->WelsMallocz (iCountMaxMbNum * sizeof (int32_t), "pVaa->sVaaCalcInfo.pSumOfSquare16x16"));
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSumOfSquare16x16), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSumOfSquare16x16))
 
   if ((*ppCtx)->pSvcParam->bEnableBackgroundDetection) { //BGD control
     (*ppCtx)->pVaa->sVaaCalcInfo.pSumOfDiff8x8 = static_cast<int32_t (*)[4]>
         (pMa->WelsMallocz (iCountMaxMbNum * 4 * sizeof (int32_t), "pVaa->sVaaCalcInfo.pSumOfDiff8x8"));
-    WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSumOfDiff8x8), FreeMemorySvc (ppCtx))
+    WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pSumOfDiff8x8))
     (*ppCtx)->pVaa->sVaaCalcInfo.pMad8x8 = static_cast<uint8_t (*)[4]>
                                            (pMa->WelsMallocz (iCountMaxMbNum * 4 * sizeof (uint8_t), "pVaa->sVaaCalcInfo.pMad8x8"));
-    WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pMad8x8), FreeMemorySvc (ppCtx))
+    WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pVaa->sVaaCalcInfo.pMad8x8))
   }
 
   //End of pVaa memory allocation
@@ -1888,21 +1879,19 @@
 
   (*ppCtx)->ppRefPicListExt = (SRefList**)pMa->WelsMallocz (kiNumDependencyLayers * sizeof (SRefList*),
                               "ppRefPicListExt");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->ppRefPicListExt), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->ppRefPicListExt))
 
   (*ppCtx)->ppDqLayerList = (SDqLayer**)pMa->WelsMallocz (kiNumDependencyLayers * sizeof (SDqLayer*), "ppDqLayerList");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->ppDqLayerList), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->ppDqLayerList))
 
   iResult = InitDqLayers (ppCtx, pExistingParasetList);
   if (iResult) {
     WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "RequestMemorySvc(), InitDqLayers failed(%d)!", iResult);
-    FreeMemorySvc (ppCtx);
     return iResult;
   }
 
   if (InitMbListD (ppCtx)) {
     WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_WARNING, "RequestMemorySvc(), InitMbListD failed!");
-    FreeMemorySvc (ppCtx);
     return 1;
   }
 
@@ -1915,7 +1904,7 @@
   (*ppCtx)->iMvdCostTableSize = kuiMvdInterTableSize;
   (*ppCtx)->iMvdCostTableStride = kuiMvdInterTableStride;
   (*ppCtx)->pMvdCostTable = (uint16_t*)pMa->WelsMallocz (52 * kuiMvdCacheAlignedSize, "pMvdCostTable");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == (*ppCtx)->pMvdCostTable), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pMvdCostTable))
   MvdCostInit ((*ppCtx)->pMvdCostTable, kuiMvdInterTableStride);  //should put to a better place?
 
   if ((*ppCtx)->ppRefPicListExt[0] != NULL && (*ppCtx)->ppRefPicListExt[0]->pRef[0] != NULL)
--- a/codec/encoder/core/src/slice_multi_threading.cpp
+++ b/codec/encoder/core/src/slice_multi_threading.cpp
@@ -87,7 +87,7 @@
   const int32_t kiEndMbInSlice   = iIdx + pUpdateSlice->iCountMbNumInSlice - 1;
 
   do {
-    UpdateMbNeighbor(pCurDq, &pMbList[iIdx], kiMbWidth, uiSliceIdc);
+    UpdateMbNeighbor (pCurDq, &pMbList[iIdx], kiMbWidth, uiSliceIdc);
     ++ iIdx;
   } while (iIdx <= kiEndMbInSlice);
 }
@@ -118,7 +118,7 @@
 }
 
 int32_t NeedDynamicAdjust (SSlice* pSliceInLayer, const int32_t iSliceNum) {
-  if ( NULL == pSliceInLayer )
+  if (NULL == pSliceInLayer)
     return false;
 
   uint32_t uiTotalConsume       = 0;
@@ -207,7 +207,8 @@
 
   WelsEmms();
 
-  MT_TRACE_LOG (&(pCtx->sLogCtx), WELS_LOG_DEBUG, "[MT] DynamicAdjustSlicing(), iDid= %d, iCountNumMb= %d", iCurDid, kiCountNumMb);
+  MT_TRACE_LOG (& (pCtx->sLogCtx), WELS_LOG_DEBUG, "[MT] DynamicAdjustSlicing(), iDid= %d, iCountNumMb= %d", iCurDid,
+                kiCountNumMb);
 
   iSliceIdx = 0;
   while (iSliceIdx + 1 < kiCountSliceNum) {
@@ -232,7 +233,7 @@
       return;
     }
     iRunLen[iSliceIdx] = iNumMbAssigning;
-    MT_TRACE_LOG (&(pCtx->sLogCtx), WELS_LOG_DEBUG,
+    MT_TRACE_LOG (& (pCtx->sLogCtx), WELS_LOG_DEBUG,
                   "[MT] DynamicAdjustSlicing(), uiSliceIdx= %d, iSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d",
                   iSliceIdx, pSliceInLayer[iSliceIdx].iSliceComplexRatio * 1.0f / INT_MULTIPLY,
                   pSliceInLayer[iSliceIdx].iCountMbNumInSlice,
@@ -241,9 +242,10 @@
     iMaximalMbNum = iMbNumLeft - (kiCountSliceNum - iSliceIdx - 1) * iMinimalMbNum; // get maximal num_mb in left parts
   }
   iRunLen[iSliceIdx] = iMbNumLeft;
-  MT_TRACE_LOG (&(pCtx->sLogCtx), WELS_LOG_DEBUG,
+  MT_TRACE_LOG (& (pCtx->sLogCtx), WELS_LOG_DEBUG,
                 "[MT] DynamicAdjustSlicing(), iSliceIdx= %d, pSliceComplexRatio= %.2f, slice_run_org= %d, slice_run_adj= %d",
-                iSliceIdx, pSliceInLayer[iSliceIdx].iSliceComplexRatio * 1.0f / INT_MULTIPLY, pSliceInLayer[iSliceIdx].iCountMbNumInSlice, iMbNumLeft);
+                iSliceIdx, pSliceInLayer[iSliceIdx].iSliceComplexRatio * 1.0f / INT_MULTIPLY,
+                pSliceInLayer[iSliceIdx].iCountMbNumInSlice, iMbNumLeft);
 
   pCurDqLayer->bNeedAdjustingSlicing = !DynamicAdjustSlicePEncCtxAll (pCurDqLayer, iRunLen);
 }
@@ -274,11 +276,12 @@
   iMaxSliceNumInThread =  WELS_MIN ((*ppCtx)->iMaxSliceCount, (int) iMaxSliceNumInThread);
 
   pSmt = (SSliceThreading*)pMa->WelsMalloc (sizeof (SSliceThreading), "SSliceThreading");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == pSmt))
+  memset (pSmt, 0, sizeof (SSliceThreading));
   (*ppCtx)->pSliceThreading = pSmt;
   pSmt->pThreadPEncCtx = (SSliceThreadPrivateData*)pMa->WelsMalloc (sizeof (SSliceThreadPrivateData) * iThreadNum,
                          "pThreadPEncCtx");
-  WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt->pThreadPEncCtx), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == pSmt->pThreadPEncCtx))
 
 #ifdef _WIN32
   // Dummy event namespace, the windows events don't actually use this
@@ -333,9 +336,6 @@
                   (void*)pSmt->pReadySliceCodingEvent[iIdx], name, err, errno);
     ++ iIdx;
   }
-  for (; iIdx < MAX_THREADS_NUM; iIdx++) {
-    pSmt->pThreadBsBuffer[iIdx]      = NULL;
-  }
 
   WelsSnprintf (name, SEM_NAME_MAX, "scm%s", pSmt->eventNamespace);
   err = WelsEventOpen (&pSmt->pSliceCodedMasterEvent, name);
@@ -342,29 +342,23 @@
   MT_TRACE_LOG (pLogCtx, WELS_LOG_INFO, "[MT] Open pSliceCodedMasterEvent named(%s) ret%d err%d", name, err, errno);
 
   iReturn = WelsMutexInit (&pSmt->mutexSliceNumUpdate);
-  WELS_VERIFY_RETURN_PROC_IF (1, (WELS_THREAD_ERROR_OK != iReturn), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (WELS_THREAD_ERROR_OK != iReturn))
 
   (*ppCtx)->pTaskManage = IWelsTaskManage::CreateTaskManage (*ppCtx, iNumSpatialLayers, bDynamicSlice);
-  WELS_VERIFY_RETURN_PROC_IF (iReturn, (NULL == (*ppCtx)->pTaskManage), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (NULL == (*ppCtx)->pTaskManage))
 
-  int32_t iThreadBufferNum = WELS_MIN((*ppCtx)->pTaskManage->GetThreadPoolThreadNum(), MAX_THREADS_NUM);
-  for (iIdx = 0;iIdx < iThreadBufferNum; iIdx++) {
+  int32_t iThreadBufferNum = WELS_MIN ((*ppCtx)->pTaskManage->GetThreadPoolThreadNum(), MAX_THREADS_NUM);
+
+  for (iIdx = 0; iIdx < iThreadBufferNum; iIdx++) {
     pSmt->pThreadBsBuffer[iIdx] = (uint8_t*)pMa->WelsMalloc (iCountBsLen, "pSmt->pThreadBsBuffer");
-    WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pSmt->pThreadBsBuffer[iIdx]), FreeMemorySvc (ppCtx))
+    WELS_VERIFY_RETURN_IF (1, (NULL == pSmt->pThreadBsBuffer[iIdx]))
   }
-  if (iThreadBufferNum < MAX_THREADS_NUM) {
-    for (iIdx = iThreadBufferNum; iIdx < MAX_THREADS_NUM; iIdx++) {
-      pSmt->pThreadBsBuffer[iIdx] = NULL;
-    }
-  }
-
-  memset (&pSmt->bThreadBsBufferUsage, 0, MAX_THREADS_NUM * sizeof (bool));
   iReturn = WelsMutexInit (&pSmt->mutexThreadBsBufferUsage);
-  WELS_VERIFY_RETURN_PROC_IF (1, (WELS_THREAD_ERROR_OK != iReturn), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (WELS_THREAD_ERROR_OK != iReturn))
   iReturn = WelsMutexInit (&pSmt->mutexEvent);
-  WELS_VERIFY_RETURN_PROC_IF (1, (WELS_THREAD_ERROR_OK != iReturn), FreeMemorySvc (ppCtx));
+  WELS_VERIFY_RETURN_IF (1, (WELS_THREAD_ERROR_OK != iReturn))
   iReturn = WelsMutexInit (& (*ppCtx)->mutexEncoderError);
-  WELS_VERIFY_RETURN_PROC_IF (1, (WELS_THREAD_ERROR_OK != iReturn), FreeMemorySvc (ppCtx))
+  WELS_VERIFY_RETURN_IF (1, (WELS_THREAD_ERROR_OK != iReturn))
 
   MT_TRACE_LOG (pLogCtx, WELS_LOG_INFO, "RequestMtResource(), iThreadNum=%d, iMultipleThreadIdc= %d",
                 pPara->iMultipleThreadIdc,
@@ -427,7 +421,7 @@
   memset (&pSmt->bThreadBsBufferUsage, 0, MAX_THREADS_NUM * sizeof (bool));
 
   if ((*ppCtx)->pTaskManage != NULL) {
-    WELS_DELETE_OP((*ppCtx)->pTaskManage);
+    WELS_DELETE_OP ((*ppCtx)->pTaskManage);
   }
 
 #ifdef MT_DEBUG
@@ -516,7 +510,7 @@
   return iLayerSize;
 }
 
-int32_t WriteSliceBs (sWelsEncCtx* pCtx,SWelsSliceBs* pSliceBs,const int32_t iSliceIdx,int32_t& iSliceSize) {
+int32_t WriteSliceBs (sWelsEncCtx* pCtx, SWelsSliceBs* pSliceBs, const int32_t iSliceIdx, int32_t& iSliceSize) {
   const int32_t kiNalCnt        = pSliceBs->iNalIndex;
   int32_t iNalIdx               = 0;
   int32_t iNalSize              = 0;
@@ -581,12 +575,13 @@
   WelsThreadSetName ("OpenH264Enc_CodingSliceThreadProc");
 
   do {
-    MT_TRACE_LOG (&(pEncPEncCtx->sLogCtx), WELS_LOG_INFO,
+    MT_TRACE_LOG (& (pEncPEncCtx->sLogCtx), WELS_LOG_INFO,
                   "[MT] CodingSliceThreadProc(), try to call WelsMultipleEventsWaitSingleBlocking(pEventsList= %p %p %p), pEncPEncCtx= %p!",
                   pEventsList[0], pEventsList[1], pEventsList[1], (void*)pEncPEncCtx);
     iWaitRet = WelsMultipleEventsWaitSingleBlocking (iEventCount,
                &pEventsList[0],
-               &pEncPEncCtx->pSliceThreading->pThreadMasterEvent[iEventIdx],&pEncPEncCtx->pSliceThreading->mutexEvent); // blocking until at least one event is signalled
+               &pEncPEncCtx->pSliceThreading->pThreadMasterEvent[iEventIdx],
+               &pEncPEncCtx->pSliceThreading->mutexEvent); // blocking until at least one event is signalled
     if (WELS_THREAD_ERROR_WAIT_OBJECT_0 == iWaitRet) { // start pSlice coding signal waited
       //int             iLayerIndex  = pEncPEncCtx->pOut->iLayerBsIndex;
       //SFrameBSInfo*   pFrameBsInfo = pPrivateData->pFrameBsInfo;
@@ -658,7 +653,7 @@
         pEncPEncCtx->pFuncList->pfDeblocking.pfDeblockingFilterSlice (pCurDq, pEncPEncCtx->pFuncList, iSliceIdx);
 
         if (bDsaFlag) {
-            pEncPEncCtx->pCurDqLayer->sLayerInfo.pSliceInLayer[iSliceIdx].uiSliceConsumeTime = (uint32_t) (
+          pEncPEncCtx->pCurDqLayer->sLayerInfo.pSliceInLayer[iSliceIdx].uiSliceConsumeTime = (uint32_t) (
                 WelsTime() - iSliceStart);
           MT_TRACE_LOG (& (pEncPEncCtx->sLogCtx), WELS_LOG_INFO,
                         "[MT] CodingSliceThreadProc(), coding_idx %d, uiSliceIdx %d, uiSliceConsumeTime %d, iSliceSize %d, iFirstMbInSlice %d, count_num_mb_in_slice %d",
@@ -693,7 +688,7 @@
         const int32_t kiFirstMbInPartition      = pPrivateData->iStartMbIndex;  // inclusive
         const int32_t kiEndMbInPartition        = pPrivateData->iEndMbIndex;            // exclusive
         int32_t iAnyMbLeftInPartition           = kiEndMbInPartition - kiFirstMbInPartition;
-        SSpatialLayerInternal *pParamInternal = &pCodingParam->sDependencyLayers[kiCurDid];
+        SSpatialLayerInternal* pParamInternal = &pCodingParam->sDependencyLayers[kiCurDid];
         iSliceIdx = pPrivateData->iSliceIndex;
         SSliceHeaderExt* pStartSliceHeaderExt                   = &pCurDq->sLayerInfo.pSliceInLayer[iSliceIdx].sSliceHeaderExt;
         pStartSliceHeaderExt->sSliceHeader.iFirstMbInSlice      = kiFirstMbInPartition;
@@ -774,7 +769,7 @@
                   );
 #endif//SLICE_INFO_OUTPUT
 
-          MT_TRACE_LOG (&(pEncPEncCtx->sLogCtx), WELS_LOG_INFO,
+          MT_TRACE_LOG (& (pEncPEncCtx->sLogCtx), WELS_LOG_INFO,
                         "[MT] CodingSliceThreadProc(), coding_idx %d, iPartitionId %d, uiSliceIdx %d, iSliceSize %d, count_mb_slice %d, iEndMbInPartition %d, pCurDq->pLastCodedMbIdxOfPartition[%d] %d\n",
                         pEncPEncCtx->iCodingIndex, kiPartitionId, iSliceIdx, iSliceSize,
                         pCurDq->sLayerInfo.pSliceInLayer[iSliceIdx].iCountMbNumInSlice,
@@ -833,7 +828,7 @@
 
     ++ iIdx;
   }
-  MT_TRACE_LOG (&(pCtx->sLogCtx), WELS_LOG_INFO, "CreateSliceThreads() exit..");
+  MT_TRACE_LOG (& (pCtx->sLogCtx), WELS_LOG_INFO, "CreateSliceThreads() exit..");
   return 0;
 }
 
@@ -1007,7 +1002,7 @@
         int32_t iMaxI = 0;
         while (i < kuiCountSliceNum) {
           fprintf (pCtx->pSliceThreading->pFSliceDiff, "%6d us consume_time coding_idx %d iDid %d pSlice %d\n",
-                     pSliceInLayer[i].uiSliceConsumeTime, pCtx->iCodingIndex, kiDid, i /*/ 1000*/);
+                   pSliceInLayer[i].uiSliceConsumeTime, pCtx->iCodingIndex, kiDid, i /*/ 1000*/);
           if (pSliceInLayer[i].uiSliceConsumeTime > uiMaxT) {
             uiMaxT = pSliceInLayer[i].uiSliceConsumeTime;
             iMaxI = i;
--- a/codec/encoder/core/src/wels_task_management.cpp
+++ b/codec/encoder/core/src/wels_task_management.cpp
@@ -65,9 +65,9 @@
   pTaskManage = WELS_NEW_OP (CWelsTaskManageBase(), CWelsTaskManageBase);
   WELS_VERIFY_RETURN_IF (NULL, NULL == pTaskManage)
 
-  if ( ENC_RETURN_SUCCESS != pTaskManage->Init (pCtx) ) {
+  if (ENC_RETURN_SUCCESS != pTaskManage->Init (pCtx)) {
     pTaskManage->Uninit();
-    WELS_DELETE_OP(pTaskManage);
+    WELS_DELETE_OP (pTaskManage);
   }
   return pTaskManage;
 }
@@ -85,7 +85,7 @@
   }
 
   WelsEventOpen (&m_hTaskEvent);
-  WelsMutexInit(&m_hEventMutex);
+  WelsMutexInit (&m_hEventMutex);
 }
 
 CWelsTaskManageBase::~CWelsTaskManageBase() {
@@ -100,8 +100,8 @@
   int32_t iReturn = ENC_RETURN_SUCCESS;
   //fprintf(stdout, "m_pThreadPool = &(CWelsThreadPool::GetInstance, this=%x\n", this);
   iReturn = CWelsThreadPool::SetThreadNum (m_iThreadNum);
-  m_pThreadPool = & (CWelsThreadPool::AddReference ());
-  if ( (iReturn != ENC_RETURN_SUCCESS) && pEncCtx ) {
+  m_pThreadPool = (CWelsThreadPool::AddReference());
+  if ((iReturn != ENC_RETURN_SUCCESS) && pEncCtx) {
     WelsLog (& (pEncCtx->sLogCtx), WELS_LOG_WARNING, "Set Thread Num to %d did not succeed, current thread num in use: %d",
              m_iThreadNum, m_pThreadPool->GetThreadNum());
   }
@@ -122,17 +122,18 @@
 void   CWelsTaskManageBase::Uninit() {
   DestroyTasks();
   //fprintf(stdout, "m_pThreadPool = m_pThreadPool->RemoveInstance\n");
-  m_pThreadPool->RemoveInstance();
+  if (m_pThreadPool)
+    m_pThreadPool->RemoveInstance();
   //WELS_DELETE_OP (m_pThreadPool);
 
   //fprintf(stdout, "m_pThreadPool = m_pThreadPool->RemoveInstance2\n");
 
   for (int32_t iDid = 0; iDid < MAX_DEPENDENCY_LAYER; iDid++) {
-    WELS_DELETE_OP(m_cEncodingTaskList[iDid]);
-    WELS_DELETE_OP(m_cPreEncodingTaskList[iDid]);
+    WELS_DELETE_OP (m_cEncodingTaskList[iDid]);
+    WELS_DELETE_OP (m_cPreEncodingTaskList[iDid]);
   }
   WelsEventClose (&m_hTaskEvent);
-  WelsMutexDestroy(&m_hEventMutex);
+  WelsMutexDestroy (&m_hEventMutex);
 }
 
 WelsErrorType CWelsTaskManageBase::CreateTasks (sWelsEncCtx* pEncCtx, const int32_t kiCurDid) {
@@ -164,7 +165,7 @@
       }
     }
     WELS_VERIFY_RETURN_IF (ENC_RETURN_MEMALLOCERR, NULL == pTask)
-    WELS_VERIFY_RETURN_IF (ENC_RETURN_MEMALLOCERR, true != m_cEncodingTaskList[kiCurDid]->push_back (pTask) );
+    WELS_VERIFY_RETURN_IF (ENC_RETURN_MEMALLOCERR, true != m_cEncodingTaskList[kiCurDid]->push_back (pTask));
   }
 
   //fprintf(stdout, "CWelsTaskManageBase CreateTasks m_iThreadNum %d kiTaskCount=%d\n", m_iThreadNum, kiTaskCount);
@@ -227,7 +228,7 @@
     m_pThreadPool->QueueTask (pTargetTaskList->getNode (iIdx));
     iIdx ++;
   }
-  WelsEventWait (&m_hTaskEvent,&m_hEventMutex);
+  WelsEventWait (&m_hTaskEvent, &m_hEventMutex);
 
   return ENC_RETURN_SUCCESS;
 }
--- a/codec/encoder/plus/src/welsEncoderExt.cpp
+++ b/codec/encoder/plus/src/welsEncoderExt.cpp
@@ -382,8 +382,6 @@
   const int32_t kiEncoderReturn = EncodeFrameInternal (kpSrcPic, pBsInfo);
 
   if (kiEncoderReturn != cmResultSuccess) {
-    WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_DEBUG,
-             "CWelsH264SVCEncoder::EncodeFrame() not succeed, err=%d", kiEncoderReturn);
     return kiEncoderReturn;
   }
 
@@ -404,6 +402,8 @@
 
   if ((kiEncoderReturn == ENC_RETURN_MEMALLOCERR) || (kiEncoderReturn == ENC_RETURN_MEMOVERFLOWFOUND)
       || (kiEncoderReturn == ENC_RETURN_VLCOVERFLOWFOUND)) {
+    WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_DEBUG, "CWelsH264SVCEncoder::EncodeFrame() not succeed, err=%d",
+             kiEncoderReturn);
     WelsUninitEncoderExt (&m_pEncContext);
     return cmMallocMemeError;
   } else if ((kiEncoderReturn != ENC_RETURN_SUCCESS) && (kiEncoderReturn == ENC_RETURN_CORRECTED)) {
--- a/test/api/decode_api_test.cpp
+++ b/test/api/decode_api_test.cpp
@@ -27,7 +27,7 @@
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
 
   int iIdx = 0;
   while (iIdx <= p.numframes) {
@@ -63,7 +63,7 @@
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
 
   int32_t iEncFrameNum = -1;
   int32_t iDecFrameNum;
@@ -102,7 +102,7 @@
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
 
   int32_t iEncCurIdrPicId = 0;
   int32_t iDecCurIdrPicId;
@@ -146,7 +146,7 @@
   int rv = encoder_->InitializeExt (&param_);
   ASSERT_TRUE (rv == cmResultSuccess);
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
@@ -200,7 +200,7 @@
   int rv = encoder_->InitializeExt (&param_);
   ASSERT_TRUE (rv == cmResultSuccess);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
@@ -273,7 +273,7 @@
   ASSERT_TRUE (rv == cmResultSuccess);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
@@ -329,7 +329,7 @@
   ASSERT_TRUE (rv == cmResultSuccess);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
@@ -386,7 +386,7 @@
   ASSERT_TRUE (rv == cmResultSuccess);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   pFunc = TestOutPutTrace;
   pTraceInfo = &sTrace;
@@ -451,7 +451,7 @@
   ASSERT_TRUE (rv == cmResultSuccess);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
 
   int32_t iTraceLevel = WELS_LOG_QUIET;
   pFunc = NULL;
@@ -529,7 +529,6 @@
     EncodeDecodeTestBase::prepareParam (iLayerNum, iSliceNum,  width, height, framerate, pParam);
   }
 
-  void prepareEncDecParam (const EncodeDecodeFileParamBase EncDecFileParam);
   void EncodeOneFrame() {
     int frameSize = EncPic.iPicWidth * EncPic.iPicHeight * 3 / 2;
     memset (buf_.data(), iRandValue, (frameSize >> 2));
@@ -541,31 +540,6 @@
   unsigned char* ucBuf_;
 };
 
-void DecodeCrashTestAPI::prepareEncDecParam (const EncodeDecodeFileParamBase EncDecFileParam) {
-  // for encoder
-  // I420: 1(Y) + 1/4(U) + 1/4(V)
-  int frameSize = EncDecFileParam.width * EncDecFileParam.height * 3 / 2;
-
-  buf_.SetLength (frameSize);
-  ASSERT_TRUE (buf_.Length() == (size_t)frameSize);
-
-  memset (&EncPic, 0, sizeof (SSourcePicture));
-  EncPic.iPicWidth = EncDecFileParam.width;
-  EncPic.iPicHeight = EncDecFileParam.height;
-  EncPic.iColorFormat = videoFormatI420;
-  EncPic.iStride[0] = EncPic.iPicWidth;
-  EncPic.iStride[1] = EncPic.iStride[2] = EncPic.iPicWidth >> 1;
-  EncPic.pData[0] = buf_.data();
-  EncPic.pData[1] = EncPic.pData[0] + EncDecFileParam.width * EncDecFileParam.height;
-  EncPic.pData[2] = EncPic.pData[1] + (EncDecFileParam.width * EncDecFileParam.height >> 2);
-
-  //for decoder
-  memset (&info, 0, sizeof (SFrameBSInfo));
-
-  //set a fixed random value
-  iRandValue = rand() % 256;
-}
-
 struct EncodeDecodeParamBase {
   int width;
   int height;
@@ -668,7 +642,7 @@
     pInput.width =  p.width;
     pInput.height = p.height;
     pInput.frameRate = p.frameRate;
-    prepareEncDecParam (pInput);
+    ASSERT_TRUE (prepareEncDecParam (pInput));
     while (iIdx++ < iTotalFrameNum) { // loop in frame
       EncodeOneFrame();
 #ifdef DEBUG_FILE_SAVE_CRA
@@ -819,11 +793,13 @@
     }
   }
 
-  void prepareEncDecParam (const EncodeDecodeFileParamBase p) {
-    EncodeDecodeTestBase::prepareEncDecParam (p);
+  bool prepareEncDecParam (const EncodeDecodeFileParamBase p) {
+    if (!EncodeDecodeTestBase::prepareEncDecParam (p))
+      return false;
     unsigned char* pTmpPtr = BsInfo_.pDstBuff; //store for restore
     memset (&BsInfo_, 0, sizeof (SParserBsInfo));
     BsInfo_.pDstBuff = pTmpPtr;
+    return true;
   }
 
   void MockInputData (uint8_t* pData, int32_t iSize) {
@@ -886,7 +862,7 @@
   if (uiTargetLayerId < kiTotalLayer) { //should always be true
     //Start for enc
     int iLen = 0;
-    prepareEncDecParam (p);
+    ASSERT_TRUE (prepareEncDecParam (p));
     int iFrame = 0;
 
     while (iFrame < p.numframes) {
@@ -959,7 +935,7 @@
   //Start for enc
   int iLen = 0;
   uint32_t uiGet;
-  prepareEncDecParam (p);
+  ASSERT_TRUE (prepareEncDecParam (p));
   int iFrame = 0;
 
   while (iFrame < p.numframes) {
--- a/test/api/decoder_ec_test.cpp
+++ b/test/api/decoder_ec_test.cpp
@@ -35,7 +35,7 @@
   ASSERT_EQ (0, rv);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
@@ -91,7 +91,7 @@
   ASSERT_TRUE (rv == cmResultSuccess);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
@@ -162,7 +162,7 @@
 
   //Start for enc/dec
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
@@ -249,7 +249,7 @@
   int iIdx = 0;
   int len = 0;
   unsigned char* pData[3] = { NULL };
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   //Frame 0: IDR, EC_IDC=DISABLE, loss = 0
   EncodeOneFrame (1);
   encToDecData (info, len);
@@ -383,7 +383,7 @@
   unsigned char* pData[3] = { NULL };
   int iTotalSliceSize = 0;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
 
   //Frame 0: IDR, EC_IDC=2, loss = 2
   EncodeOneFrame (1);
@@ -515,7 +515,7 @@
   unsigned char* pData[3] = { NULL };
   int iTotalSliceSize = 0;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
 
   //set EC=DISABLE
   uiEcIdc = (uint32_t) (ERROR_CON_DISABLE);
@@ -677,7 +677,7 @@
   ASSERT_TRUE (rv == cmResultSuccess);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
@@ -744,7 +744,7 @@
   ASSERT_TRUE (rv == cmResultSuccess);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
   decoder_->SetOption (DECODER_OPTION_TRACE_LEVEL, &iTraceLevel);
--- a/test/api/encode_decode_api_test.cpp
+++ b/test/api/encode_decode_api_test.cpp
@@ -11,168 +11,183 @@
 using namespace WelsCommon;
 
 
-void EncodeDecodeTestBase::prepareParam (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam) {
-    pParam->iUsageType = CAMERA_VIDEO_REAL_TIME;
-    pParam->iPicWidth = width;
-    pParam->iPicHeight = height;
-    pParam->fMaxFrameRate = framerate;
-    pParam->iRCMode = RC_OFF_MODE; //rc off
-    pParam->iMultipleThreadIdc = 1; //single thread
-    pParam->iSpatialLayerNum = iLayers;
-    pParam->iNumRefFrame = AUTO_REF_PIC_COUNT;
-    for (int i = 0; i < iLayers; i++) {
-      pParam->sSpatialLayers[i].iVideoWidth = width >> (iLayers - i - 1);
-      pParam->sSpatialLayers[i].iVideoHeight = height >> (iLayers - i - 1);
-      pParam->sSpatialLayers[i].fFrameRate = framerate;
-      pParam->sSpatialLayers[i].sSliceArgument.uiSliceMode = SM_FIXEDSLCNUM_SLICE;
-      pParam->sSpatialLayers[i].sSliceArgument.uiSliceNum = iSlices;
-    }
+void EncodeDecodeTestBase::prepareParam (int iLayers, int iSlices, int width, int height, float framerate,
+    SEncParamExt* pParam) {
+  pParam->iUsageType = CAMERA_VIDEO_REAL_TIME;
+  pParam->iPicWidth = width;
+  pParam->iPicHeight = height;
+  pParam->fMaxFrameRate = framerate;
+  pParam->iRCMode = RC_OFF_MODE; //rc off
+  pParam->iMultipleThreadIdc = 1; //single thread
+  pParam->iSpatialLayerNum = iLayers;
+  pParam->iNumRefFrame = AUTO_REF_PIC_COUNT;
+  for (int i = 0; i < iLayers; i++) {
+    pParam->sSpatialLayers[i].iVideoWidth = width >> (iLayers - i - 1);
+    pParam->sSpatialLayers[i].iVideoHeight = height >> (iLayers - i - 1);
+    pParam->sSpatialLayers[i].fFrameRate = framerate;
+    pParam->sSpatialLayers[i].sSliceArgument.uiSliceMode = SM_FIXEDSLCNUM_SLICE;
+    pParam->sSpatialLayers[i].sSliceArgument.uiSliceNum = iSlices;
+  }
 }
 
-void EncodeDecodeTestBase::prepareEncDecParam (const EncodeDecodeFileParamBase EncDecFileParam) {
-    //for encoder
-    //I420: 1(Y) + 1/4(U) + 1/4(V)
-    int frameSize = EncDecFileParam.width * EncDecFileParam.height * 3 / 2;
-    buf_.SetLength (frameSize);
-    ASSERT_TRUE (buf_.Length() == (size_t)frameSize);
-    memset (&EncPic, 0, sizeof (SSourcePicture));
-    EncPic.iPicWidth = EncDecFileParam.width;
-    EncPic.iPicHeight = EncDecFileParam.height;
-    EncPic.iColorFormat = videoFormatI420;
-    EncPic.iStride[0] = EncPic.iPicWidth;
-    EncPic.iStride[1] = EncPic.iStride[2] = EncPic.iPicWidth >> 1;
-    EncPic.pData[0] = buf_.data();
-    EncPic.pData[1] = EncPic.pData[0] + EncDecFileParam.width * EncDecFileParam.height;
-    EncPic.pData[2] = EncPic.pData[1] + (EncDecFileParam.width * EncDecFileParam.height >> 2);
-    //for decoder
-    memset (&info, 0, sizeof (SFrameBSInfo));
-    //set a fixed random value
-    iRandValue = rand() % 256;
+bool EncodeDecodeTestBase::prepareEncDecParam (const EncodeDecodeFileParamBase EncDecFileParam) {
+  //for encoder
+  //I420: 1(Y) + 1/4(U) + 1/4(V)
+  int frameSize = EncDecFileParam.width * EncDecFileParam.height * 3 / 2;
+  buf_.SetLength (frameSize);
+  if (buf_.Length() != (size_t)frameSize) {
+    printf ("buf_.Length() failed! frameSize = %d\n", frameSize);
+    return false;
+  }
+  memset (&EncPic, 0, sizeof (SSourcePicture));
+  EncPic.iPicWidth = EncDecFileParam.width;
+  EncPic.iPicHeight = EncDecFileParam.height;
+  EncPic.iColorFormat = videoFormatI420;
+  EncPic.iStride[0] = EncPic.iPicWidth;
+  EncPic.iStride[1] = EncPic.iStride[2] = EncPic.iPicWidth >> 1;
+  EncPic.pData[0] = buf_.data();
+  EncPic.pData[1] = EncPic.pData[0] + EncDecFileParam.width * EncDecFileParam.height;
+  EncPic.pData[2] = EncPic.pData[1] + (EncDecFileParam.width * EncDecFileParam.height >> 2);
+  //for decoder
+  memset (&info, 0, sizeof (SFrameBSInfo));
+  //set a fixed random value
+  iRandValue = rand() % 256;
+  return true;
 }
 
 void EncodeDecodeTestBase::encToDecData (const SFrameBSInfo& info, int& len) {
-    len = 0;
-    for (int i = 0; i < info.iLayerNum; ++i) {
-      const SLayerBSInfo& layerInfo = info.sLayerInfo[i];
-      for (int j = 0; j < layerInfo.iNalCount; ++j) {
-        len += layerInfo.pNalLengthInByte[j];
-      }
+  len = 0;
+  for (int i = 0; i < info.iLayerNum; ++i) {
+    const SLayerBSInfo& layerInfo = info.sLayerInfo[i];
+    for (int j = 0; j < layerInfo.iNalCount; ++j) {
+      len += layerInfo.pNalLengthInByte[j];
     }
+  }
 }
 
-void EncodeDecodeTestBase::encToDecSliceData (const int iLayerNum, const int iSliceNum, const SFrameBSInfo& info, int& len) {
-    ASSERT_TRUE (iLayerNum < MAX_LAYER_NUM_OF_FRAME);
-    len = 0;
-    const SLayerBSInfo& layerInfo = info.sLayerInfo[iLayerNum];
-    if (iSliceNum < layerInfo.iNalCount)
-      len = layerInfo.pNalLengthInByte[iSliceNum];
+void EncodeDecodeTestBase::encToDecSliceData (const int iLayerNum, const int iSliceNum, const SFrameBSInfo& info,
+    int& len) {
+  ASSERT_TRUE (iLayerNum < MAX_LAYER_NUM_OF_FRAME);
+  len = 0;
+  const SLayerBSInfo& layerInfo = info.sLayerInfo[iLayerNum];
+  if (iSliceNum < layerInfo.iNalCount)
+    len = layerInfo.pNalLengthInByte[iSliceNum];
 }
 
-void EncodeDecodeTestAPIBase::prepareParam0 (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam) {
-    memset (pParam, 0, sizeof (SEncParamExt));
-    EncodeDecodeTestBase::prepareParam (iLayers, iSlices, width, height, framerate, pParam);
+void EncodeDecodeTestAPIBase::prepareParam0 (int iLayers, int iSlices, int width, int height, float framerate,
+    SEncParamExt* pParam) {
+  memset (pParam, 0, sizeof (SEncParamExt));
+  EncodeDecodeTestBase::prepareParam (iLayers, iSlices, width, height, framerate, pParam);
 }
 
-void EncodeDecodeTestAPIBase::prepareParamDefault (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam) {
-    memset (pParam, 0, sizeof (SEncParamExt));
-    encoder_->GetDefaultParams (pParam);
-    EncodeDecodeTestBase::prepareParam (iLayers, iSlices, width, height, framerate, pParam);
+void EncodeDecodeTestAPIBase::prepareParamDefault (int iLayers, int iSlices, int width, int height, float framerate,
+    SEncParamExt* pParam) {
+  memset (pParam, 0, sizeof (SEncParamExt));
+  encoder_->GetDefaultParams (pParam);
+  EncodeDecodeTestBase::prepareParam (iLayers, iSlices, width, height, framerate, pParam);
 }
 
 
 void EncodeDecodeTestAPIBase::EncodeOneFrame (int iCheckTypeIndex) {
-    int frameSize = EncPic.iPicWidth * EncPic.iPicHeight * 3 / 2;
-    int lumaSize = EncPic.iPicWidth * EncPic.iPicHeight;
-    memset (buf_.data(), iRandValue, lumaSize);
-    memset (buf_.data() + lumaSize, rand() % 256, (frameSize - lumaSize));
-    int rv = encoder_->EncodeFrame (&EncPic, &info);
-    if (0 == iCheckTypeIndex)
-      ASSERT_TRUE (rv == cmResultSuccess);
-    else if (1 == iCheckTypeIndex)
-      ASSERT_TRUE (rv == cmResultSuccess || rv == cmUnknownReason);
+  int frameSize = EncPic.iPicWidth * EncPic.iPicHeight * 3 / 2;
+  int lumaSize = EncPic.iPicWidth * EncPic.iPicHeight;
+  memset (buf_.data(), iRandValue, lumaSize);
+  memset (buf_.data() + lumaSize, rand() % 256, (frameSize - lumaSize));
+  int rv = encoder_->EncodeFrame (&EncPic, &info);
+  if (0 == iCheckTypeIndex)
+    ASSERT_TRUE (rv == cmResultSuccess);
+  else if (1 == iCheckTypeIndex)
+    ASSERT_TRUE (rv == cmResultSuccess || rv == cmUnknownReason);
 }
 
-void EncodeDecodeTestAPIBase::EncDecOneFrame (const int iWidth, const int iHeight, const int iFrame, FILE* pfEnc) {
-    int iLen = 0, rv;
-    InitialEncDec (iWidth, iHeight);
-    EncodeOneFrame (iFrame);
+bool EncodeDecodeTestAPIBase::EncDecOneFrame (const int iWidth, const int iHeight, const int iFrame, FILE* pfEnc) {
+  int iLen = 0, rv;
+  if (!InitialEncDec (iWidth, iHeight))
+    return false;
+  EncodeOneFrame (iFrame);
 
-    //extract target layer data
-    encToDecData (info, iLen);
-    //call decoder
-    unsigned char* pData[3] = { NULL };
-    memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
-    rv = decoder_->DecodeFrameNoDelay (info.sLayerInfo[0].pBsBuf, iLen, pData, &dstBufInfo_);
-    EXPECT_TRUE (rv == cmResultSuccess) << " rv = " << rv << " iFrameIdx = " << iFrame;
-    if (NULL != pfEnc) {
-      fwrite (info.sLayerInfo[0].pBsBuf, iLen, 1, pfEnc);
-    }
+  //extract target layer data
+  encToDecData (info, iLen);
+  //call decoder
+  unsigned char* pData[3] = { NULL };
+  memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
+  rv = decoder_->DecodeFrameNoDelay (info.sLayerInfo[0].pBsBuf, iLen, pData, &dstBufInfo_);
+  EXPECT_TRUE (rv == cmResultSuccess) << " rv = " << rv << " iFrameIdx = " << iFrame;
+  if (NULL != pfEnc) {
+    fwrite (info.sLayerInfo[0].pBsBuf, iLen, 1, pfEnc);
+  }
+  return true;
 }
 
-void EncodeDecodeTestAPIBase::TestOneSimulcastAVC (SEncParamExt* pParam, ISVCDecoder** decoder, unsigned char** pBsBuf, int iSpatialLayerNum,
-                            int iEncFrameNum,
-                            int iSaveFileIdx) {
-    int aLen[MAX_SPATIAL_LAYER_NUM] = {0, 0, 0, 0};
+bool EncodeDecodeTestAPIBase::TestOneSimulcastAVC (SEncParamExt* pParam, ISVCDecoder** decoder, unsigned char** pBsBuf,
+    int iSpatialLayerNum,
+    int iEncFrameNum,
+    int iSaveFileIdx) {
+  int aLen[MAX_SPATIAL_LAYER_NUM] = {0, 0, 0, 0};
 
-    FILE* fEnc[MAX_SPATIAL_LAYER_NUM];
-    if (iSaveFileIdx == 1) {
-      fEnc[0] = fopen ("enc00.264", "wb");
-      fEnc[1] = fopen ("enc01.264", "wb");
-      fEnc[2] = fopen ("enc02.264", "wb");
-      fEnc[3] = fopen ("enc03.264", "wb");
-    } else if (iSaveFileIdx > 1) {
-      fEnc[0] = fopen ("enc10.264", "wb");
-      fEnc[1] = fopen ("enc11.264", "wb");
-      fEnc[2] = fopen ("enc12.264", "wb");
-      fEnc[3] = fopen ("enc13.264", "wb");
-    }
+  FILE* fEnc[MAX_SPATIAL_LAYER_NUM];
+  if (iSaveFileIdx == 1) {
+    fEnc[0] = fopen ("enc00.264", "wb");
+    fEnc[1] = fopen ("enc01.264", "wb");
+    fEnc[2] = fopen ("enc02.264", "wb");
+    fEnc[3] = fopen ("enc03.264", "wb");
+  } else if (iSaveFileIdx > 1) {
+    fEnc[0] = fopen ("enc10.264", "wb");
+    fEnc[1] = fopen ("enc11.264", "wb");
+    fEnc[2] = fopen ("enc12.264", "wb");
+    fEnc[3] = fopen ("enc13.264", "wb");
+  }
 
-    int rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParam);
-    ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed pParam: rv = " << rv;
+  int rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, pParam);
+  if (rv != cmResultSuccess) {
+    printf ("SetOption Failed, rv = %d\n", rv);
+    return false;
+  }
 
-    int iIdx;
-    //begin testing
-    for (int iFrame = 0; iFrame < iEncFrameNum; iFrame++) {
-      int iResult;
-      int iLayerLen = 0;
-      unsigned char* pData[3] = { NULL };
+  int iIdx;
+  //begin testing
+  for (int iFrame = 0; iFrame < iEncFrameNum; iFrame++) {
+    int iResult;
+    int iLayerLen = 0;
+    unsigned char* pData[3] = { NULL };
 
-      InitialEncDec (pParam->iPicWidth, pParam->iPicHeight);
-      EncodeOneFrame (0);
+    if (!InitialEncDec (pParam->iPicWidth, pParam->iPicHeight))
+      return false;
+    EncodeOneFrame (0);
 
-      // init
-      for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
-        aLen[iIdx] = 0;
+    // init
+    for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
+      aLen[iIdx] = 0;
+    }
+    for (int iLayer = 0; iLayer < info.iLayerNum; ++iLayer) {
+      iLayerLen = 0;
+      const SLayerBSInfo& layerInfo = info.sLayerInfo[iLayer];
+      for (int iNal = 0; iNal < layerInfo.iNalCount; ++iNal) {
+        iLayerLen += layerInfo.pNalLengthInByte[iNal];
       }
-      for (int iLayer = 0; iLayer < info.iLayerNum; ++iLayer) {
-        iLayerLen = 0;
-        const SLayerBSInfo& layerInfo = info.sLayerInfo[iLayer];
-        for (int iNal = 0; iNal < layerInfo.iNalCount; ++iNal) {
-          iLayerLen += layerInfo.pNalLengthInByte[iNal];
-        }
 
-        iIdx = layerInfo.uiSpatialId;
-        EXPECT_TRUE (iIdx < iSpatialLayerNum) << "iIdx = " << iIdx << ", iSpatialLayerNum = " << iSpatialLayerNum;
-        memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char));
-        aLen[iIdx] += iLayerLen;
-      }
+      iIdx = layerInfo.uiSpatialId;
+      EXPECT_TRUE (iIdx < iSpatialLayerNum) << "iIdx = " << iIdx << ", iSpatialLayerNum = " << iSpatialLayerNum;
+      memcpy ((pBsBuf[iIdx] + aLen[iIdx]), layerInfo.pBsBuf, iLayerLen * sizeof (unsigned char));
+      aLen[iIdx] += iLayerLen;
+    }
 
-      for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
-        pData[0] = pData[1] = pData[2] = 0;
-        memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
+    for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
+      pData[0] = pData[1] = pData[2] = 0;
+      memset (&dstBufInfo_, 0, sizeof (SBufferInfo));
 
-        if (iSaveFileIdx > 0) {
-          fwrite (pBsBuf[iIdx], aLen[iIdx], 1, fEnc[iIdx]);
-        }
+      if (iSaveFileIdx > 0) {
+        fwrite (pBsBuf[iIdx], aLen[iIdx], 1, fEnc[iIdx]);
+      }
 
-        iResult = decoder[iIdx]->DecodeFrame2 (pBsBuf[iIdx], aLen[iIdx], pData, &dstBufInfo_);
-        EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << ", LayerIdx=" << iIdx;
+      iResult = decoder[iIdx]->DecodeFrame2 (pBsBuf[iIdx], aLen[iIdx], pData, &dstBufInfo_);
+      EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << ", LayerIdx=" << iIdx;
 
-        iResult = decoder[iIdx]->DecodeFrame2 (NULL, 0, pData, &dstBufInfo_);
-        EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << ", LayerIdx=" << iIdx;
-        EXPECT_EQ (dstBufInfo_.iBufferStatus, 1) << "LayerIdx=" << iIdx;
-      }
+      iResult = decoder[iIdx]->DecodeFrame2 (NULL, 0, pData, &dstBufInfo_);
+      EXPECT_TRUE (iResult == cmResultSuccess) << "iResult=" << iResult << ", LayerIdx=" << iIdx;
+      EXPECT_EQ (dstBufInfo_.iBufferStatus, 1) << "LayerIdx=" << iIdx;
     }
+  }
 
   if (iSaveFileIdx > 0) {
     fclose (fEnc[0]);
@@ -180,6 +195,7 @@
     fclose (fEnc[2]);
     fclose (fEnc[3]);
   }
+  return true;
 }
 
 long IsKeyFrameLost (ISVCDecoder* pDecoder, SLTRRecoverRequest* p_LTR_Recover_Request, long hr) {
--- a/test/api/encode_decode_api_test.h
+++ b/test/api/encode_decode_api_test.h
@@ -87,7 +87,7 @@
 
   virtual void prepareParam (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam);
 
-  virtual void prepareEncDecParam (const EncodeDecodeFileParamBase EncDecFileParam);
+  virtual bool prepareEncDecParam (const EncodeDecodeFileParamBase EncDecFileParam);
 
   virtual void encToDecData (const SFrameBSInfo& info, int& len);
 
@@ -129,7 +129,7 @@
 
   void prepareParamDefault (int iLayers, int iSlices, int width, int height, float framerate, SEncParamExt* pParam);
 
-  void InitialEncDec (int iWidth, int iHeight);
+  bool InitialEncDec (int iWidth, int iHeight);
   void RandomParamExtCombination();
   void ValidateParamExtCombination();
   void SliceParamValidationForMode2 (int iSpatialIdx);
@@ -137,8 +137,8 @@
   void SliceParamValidationForMode4();
 
   void EncodeOneFrame (int iCheckTypeIndex);
-  void EncDecOneFrame (const int iWidth, const int iHeight, const int iFrame, FILE* pfEnc);
-  void TestOneSimulcastAVC (SEncParamExt* pParam, ISVCDecoder** decoder, unsigned char** pBsBuf, int iSpatialLayerNum,
+  bool EncDecOneFrame (const int iWidth, const int iHeight, const int iFrame, FILE* pfEnc);
+  bool TestOneSimulcastAVC (SEncParamExt* pParam, ISVCDecoder** decoder, unsigned char** pBsBuf, int iSpatialLayerNum,
                             int iEncFrameNum,
                             int iCallTimes);
 };
--- a/test/api/encode_decode_api_test.template
+++ b/test/api/encode_decode_api_test.template
@@ -72,7 +72,7 @@
 
     //FillParam
 
-    InitialEncDec (param_.iPicWidth, param_.iPicHeight);
+    ASSERT_TRUE (InitialEncDec (param_.iPicWidth, param_.iPicHeight));
     rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &param_);
     ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed pParam: rv = " << rv;
     EncodeOneFrame (0);
--- a/test/api/encode_options_test.cpp
+++ b/test/api/encode_options_test.cpp
@@ -10,13 +10,16 @@
 #include "encode_decode_api_test.h"
 using namespace WelsCommon;
 
-void EncodeDecodeTestAPIBase::InitialEncDec (int iWidth, int iHeight) {
+bool EncodeDecodeTestAPIBase::InitialEncDec (int iWidth, int iHeight) {
   // for encoder
   // I420: 1(Y) + 1/4(U) + 1/4(V)
   int frameSize = iWidth * iHeight * 3 / 2;
 
   buf_.SetLength (frameSize);
-  ASSERT_TRUE (buf_.Length() == (size_t)frameSize);
+  if (buf_.Length() != (size_t)frameSize) {
+    printf ("buf_.Length() failed! frameSize = %d\n", frameSize);
+    return false;
+  }
 
   memset (&EncPic, 0, sizeof (SSourcePicture));
   EncPic.iPicWidth    = iWidth;
@@ -33,7 +36,9 @@
 
   //set a fixed random value
   iRandValue = rand() % 256;
+  return true;
 }
+
 void EncodeDecodeTestAPIBase::RandomParamExtCombination() {
 
   param_.iPicWidth  = WelsClip3 ((((rand() % MAX_WIDTH) >> 1)  + 1) << 1, 2, MAX_WIDTH);
@@ -321,7 +326,7 @@
     // so need to enhance the validation check for any random value of each variable in ParamExt
 
     if (cmResultSuccess == iResult) {
-      InitialEncDec (param_.iPicWidth, param_.iPicHeight);
+      ASSERT_TRUE (InitialEncDec (param_.iPicWidth, param_.iPicHeight));
       EncodeOneFrame (0);
       encToDecData (info, len);
       pData[0] = pData[1] = pData[2] = 0;
@@ -366,7 +371,7 @@
     iResult = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_BASE, &param_);
 
     if (cmResultSuccess == iResult) {
-      InitialEncDec (param_.iPicWidth, param_.iPicHeight);
+      ASSERT_TRUE (InitialEncDec (param_.iPicWidth, param_.iPicHeight));
       EncodeOneFrame (0);
       encToDecData (info, len);
       pData[0] = pData[1] = pData[2] = 0;
@@ -439,34 +444,34 @@
   int rv = encoder_->InitializeExt (&sParam1);
   ASSERT_TRUE (rv == cmResultSuccess) << "InitializeExt: rv = " << rv << " at " << sParam1.iPicWidth << "x" <<
                                       sParam1.iPicHeight;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   // new IDR
   rv = encoder_->ForceIntraFrame (true);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   // step#2: pParam2
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam2);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption: rv = " << rv << " at " << sParam2.iPicWidth << "x" <<
                                       sParam2.iPicHeight;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
   // new IDR
   rv = encoder_->ForceIntraFrame (true);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
   // step#3: back to pParam1
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam1);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption: rv = " << rv << " at " << sParam1.iPicWidth << "x" <<
                                       sParam1.iPicHeight;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   // step#4: back to pParam2
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam2);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv << sParam2.iPicWidth << sParam2.iPicHeight;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
 #ifdef DEBUG_FILE_SAVE_INCREASING_ID
   fclose (fEnc);
@@ -487,15 +492,15 @@
   fEnc = fopen ("enc_INCREASING_ID2.264", "wb");
 #endif
   iEncFrameNum = 0;
-  EncDecOneFrame (sParam3.iPicWidth, sParam3.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam3.iPicWidth, sParam3.iPicHeight, iEncFrameNum++, fEnc));
 
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam2);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed sParam2: rv = " << rv;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam1);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed sParam2: rv = " << rv;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
 #ifdef DEBUG_FILE_SAVE_INCREASING_ID
   fclose (fEnc);
@@ -547,36 +552,37 @@
   //int TraceLevel = WELS_LOG_INFO;
   //encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &TraceLevel);
   int rv = encoder_->InitializeExt (&sParam1);
+  printf ("Start EncDecOneFrame()\n");
   ASSERT_TRUE (rv == cmResultSuccess) << "InitializeExt: rv = " << rv << " at " << sParam1.iPicWidth << "x" <<
                                       sParam1.iPicHeight;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   // new IDR
   rv = encoder_->ForceIntraFrame (true);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   // step#2: pParam2
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam2);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption: rv = " << rv << " at " << sParam2.iPicWidth << "x" <<
                                       sParam2.iPicHeight;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
   // new IDR
   rv = encoder_->ForceIntraFrame (true);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
   // step#3: back to pParam1
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam1);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption: rv = " << rv << " at " << sParam1.iPicWidth << "x" <<
                                       sParam1.iPicHeight;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   // step#4: back to pParam2
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam2);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv << sParam2.iPicWidth << sParam2.iPicHeight;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
 #ifdef DEBUG_FILE_SAVE2
   fclose (fEnc);
@@ -597,15 +603,15 @@
   fEnc = fopen ("enc_SPS_LISTING_AND_PPS_INCREASING11.264", "wb");
 #endif
   iEncFrameNum = 0;
-  EncDecOneFrame (sParam3.iPicWidth, sParam3.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam3.iPicWidth, sParam3.iPicHeight, iEncFrameNum++, fEnc));
 
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam2);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed sParam2: rv = " << rv;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam1);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed sParam2: rv = " << rv;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
 #ifdef DEBUG_FILE_SAVE2
   fclose (fEnc);
@@ -657,12 +663,12 @@
   // step#3: set back to pParam1, with a smaller num_ref, it still uses the previous SPS
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam1);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed sParam1: rv = " << rv;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   // new IDR, PPS increases
   rv = encoder_->ForceIntraFrame (true);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   rv = encoder_->Uninitialize();
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
@@ -719,7 +725,7 @@
                                         sParam2.iPicWidth;
   } // end of setting loop
 
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
 #ifdef DEBUG_FILE_SAVE2
   fclose (fEnc);
@@ -765,13 +771,13 @@
   int rv = encoder_->InitializeExt (&sParam1);
   ASSERT_TRUE (rv == cmResultSuccess) << "InitializeExt: rv = " << rv << " at " << sParam1.iPicWidth << "x" <<
                                       sParam1.iPicHeight;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   // new IDR
   rv = encoder_->ForceIntraFrame (true);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   rv = encoder_->Uninitialize();
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
@@ -841,18 +847,18 @@
   // step#2: pParam2
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam2);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed sParam2: rv = " << rv;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
   // step#3: back to pParam1, SHOULD NOT encounter ERROR
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam1);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption: rv = " << rv << " at " << sParam1.iPicWidth << "x" <<
                                       sParam1.iPicHeight;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   // new IDR
   rv = encoder_->ForceIntraFrame (true);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
-  EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam1.iPicWidth, sParam1.iPicHeight, iEncFrameNum++, fEnc));
 
   rv = encoder_->Uninitialize();
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
@@ -906,7 +912,7 @@
                                       sParam1.iPicHeight;
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam2);
   ASSERT_TRUE (rv == cmResultSuccess) << "SetOption Failed sParam2: rv = " << rv;
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
   // step#2: set strategy for success
   int32_t iNewStra = SPS_PPS_LISTING;
@@ -921,7 +927,7 @@
   rv = encoder_->SetOption (ENCODER_OPTION_SPS_PPS_ID_STRATEGY, &iNewStra);
   ASSERT_TRUE (rv != cmResultSuccess);
 
-  EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc);
+  ASSERT_TRUE (EncDecOneFrame (sParam2.iPicWidth, sParam2.iPicHeight, iEncFrameNum++, fEnc));
 
   // step#4: pParam3, SHOULD encounter ERROR
   rv = encoder_->SetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &sParam3);
@@ -966,12 +972,12 @@
   int iIdx = 0;
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
-    EXPECT_TRUE (pBsBuf[iIdx] != NULL);
+    ASSERT_TRUE (pBsBuf[iIdx] != NULL);
     aLen[iIdx] = 0;
 
     long rv = WelsCreateDecoder (&decoder[iIdx]);
     ASSERT_EQ (0, rv);
-    EXPECT_TRUE (decoder[iIdx] != NULL);
+    ASSERT_TRUE (decoder[iIdx] != NULL);
 
     SDecodingParam decParam;
     memset (&decParam, 0, sizeof (SDecodingParam));
@@ -988,7 +994,7 @@
     int iLayerLen = 0;
     unsigned char* pData[3] = { NULL };
 
-    InitialEncDec (param_.iPicWidth, param_.iPicHeight);
+    ASSERT_TRUE (InitialEncDec (param_.iPicWidth, param_.iPicHeight));
     EncodeOneFrame (0);
 
     iLayerLen = 0;
@@ -1083,12 +1089,12 @@
   //create decoder
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
-    EXPECT_TRUE (pBsBuf[iIdx] != NULL);
+    ASSERT_TRUE (pBsBuf[iIdx] != NULL);
     aLen[iIdx] = 0;
 
     long rv = WelsCreateDecoder (&decoder[iIdx]);
     ASSERT_EQ (0, rv);
-    EXPECT_TRUE (decoder[iIdx] != NULL);
+    ASSERT_TRUE (decoder[iIdx] != NULL);
 
     SDecodingParam decParam;
     memset (&decParam, 0, sizeof (SDecodingParam));
@@ -1106,7 +1112,7 @@
     int iLayerLen = 0;
     unsigned char* pData[3] = { NULL };
 
-    InitialEncDec (param_.iPicWidth, param_.iPicHeight);
+    ASSERT_TRUE (InitialEncDec (param_.iPicWidth, param_.iPicHeight));
     EncodeOneFrame (0);
 
     // init
@@ -1197,11 +1203,11 @@
   //create decoder
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
-    EXPECT_TRUE (pBsBuf[iIdx] != NULL);
+    ASSERT_TRUE (pBsBuf[iIdx] != NULL);
 
     long rv = WelsCreateDecoder (&decoder[iIdx]);
     ASSERT_EQ (0, rv);
-    EXPECT_TRUE (decoder[iIdx] != NULL);
+    ASSERT_TRUE (decoder[iIdx] != NULL);
 
     SDecodingParam decParam;
     memset (&decParam, 0, sizeof (SDecodingParam));
@@ -1213,8 +1219,8 @@
     ASSERT_EQ (0, rv);
   }
 
-  TestOneSimulcastAVC (&sParam1, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0);
-  TestOneSimulcastAVC (&sParam2, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0);
+  ASSERT_TRUE (TestOneSimulcastAVC (&sParam1, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0));
+  ASSERT_TRUE (TestOneSimulcastAVC (&sParam2, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0));
 
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     free (pBsBuf[iIdx]);
@@ -1367,9 +1373,8 @@
     encoder_->Uninitialize();
     int rv = encoder_->InitializeExt (&param_);
     ASSERT_TRUE (rv == cmResultSuccess);
-    InitialEncDec (p.iWidth, p.iHeight);
+    ASSERT_TRUE (InitialEncDec (p.iWidth, p.iHeight));
 
-
     int32_t iSpsPpsIdAddition = 1;
     encoder_->SetOption (ENCODER_OPTION_SPS_PPS_ID_STRATEGY, &iSpsPpsIdAddition);
     int32_t iIDRPeriod = (int32_t) pow (2.0f, (param_.iTemporalLayerNum - 1)) * ((rand() % 5) + 1);
@@ -1456,12 +1461,12 @@
   //create decoder
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
-    EXPECT_TRUE (pBsBuf[iIdx] != NULL);
+    ASSERT_TRUE (pBsBuf[iIdx] != NULL);
     aLen[iIdx] = 0;
 
     long rv = WelsCreateDecoder (&decoder[iIdx]);
     ASSERT_EQ (0, rv);
-    EXPECT_TRUE (decoder[iIdx] != NULL);
+    ASSERT_TRUE (decoder[iIdx] != NULL);
 
     SDecodingParam decParam;
     memset (&decParam, 0, sizeof (SDecodingParam));
@@ -1494,7 +1499,7 @@
       int iLayerLen = 0;
       unsigned char* pData[3] = { NULL };
 
-      InitialEncDec (param_.iPicWidth, param_.iPicHeight);
+      ASSERT_TRUE (InitialEncDec (param_.iPicWidth, param_.iPicHeight));
       EncodeOneFrame (0);
 
       if (iInsertIdr == iFrame) {
@@ -1597,11 +1602,11 @@
   //create decoder
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
-    EXPECT_TRUE (pBsBuf[iIdx] != NULL);
+    ASSERT_TRUE (pBsBuf[iIdx] != NULL);
 
     long rv = WelsCreateDecoder (&decoder[iIdx]);
     ASSERT_EQ (0, rv);
-    EXPECT_TRUE (decoder[iIdx] != NULL);
+    ASSERT_TRUE (decoder[iIdx] != NULL);
 
     SDecodingParam decParam;
     memset (&decParam, 0, sizeof (SDecodingParam));
@@ -1613,10 +1618,13 @@
     ASSERT_EQ (0, rv);
   }
 
-  TestOneSimulcastAVC (&sParam, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0);
+  ASSERT_TRUE (TestOneSimulcastAVC (&sParam, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0));
 
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
-    free (pBsBuf[iIdx]);
+    if (pBsBuf[iIdx]) {
+      free (pBsBuf[iIdx]);
+      pBsBuf[iIdx] = NULL;
+    }
 
     if (decoder[iIdx] != NULL) {
       decoder[iIdx]->Uninitialize();
@@ -1665,11 +1673,11 @@
   //create decoder
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
-    EXPECT_TRUE (pBsBuf[iIdx] != NULL);
+    ASSERT_TRUE (pBsBuf[iIdx] != NULL);
 
     long rv = WelsCreateDecoder (&decoder[iIdx]);
     ASSERT_EQ (0, rv);
-    EXPECT_TRUE (decoder[iIdx] != NULL);
+    ASSERT_TRUE (decoder[iIdx] != NULL);
 
     SDecodingParam decParam;
     memset (&decParam, 0, sizeof (SDecodingParam));
@@ -1681,10 +1689,11 @@
     ASSERT_EQ (0, rv);
   }
 
-  TestOneSimulcastAVC (&sParam, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0);
+  ASSERT_TRUE (TestOneSimulcastAVC (&sParam, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0));
 
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
-    free (pBsBuf[iIdx]);
+    if (pBsBuf[iIdx])
+      free (pBsBuf[iIdx]);
 
     if (decoder[iIdx] != NULL) {
       decoder[iIdx]->Uninitialize();
@@ -1725,11 +1734,11 @@
   //create decoder
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
-    EXPECT_TRUE (pBsBuf[iIdx] != NULL);
+    ASSERT_TRUE (pBsBuf[iIdx] != NULL);
 
     long rv = WelsCreateDecoder (&decoder[iIdx]);
     ASSERT_EQ (0, rv);
-    EXPECT_TRUE (decoder[iIdx] != NULL);
+    ASSERT_TRUE (decoder[iIdx] != NULL);
 
     SDecodingParam decParam;
     memset (&decParam, 0, sizeof (SDecodingParam));
@@ -1741,7 +1750,7 @@
     ASSERT_EQ (0, rv);
   }
 
-  TestOneSimulcastAVC (&sParam, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0);
+  ASSERT_TRUE (TestOneSimulcastAVC (&sParam, decoder, pBsBuf, iSpatialLayerNum, iEncFrameNum, 0));
 
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     free (pBsBuf[iIdx]);
@@ -1790,11 +1799,11 @@
   //create decoder
   for (iIdx = 0; iIdx < iSpatialLayerNum; iIdx++) {
     pBsBuf[iIdx] = static_cast<unsigned char*> (malloc (iWidth * iHeight * 3 * sizeof (unsigned char) / 2));
-    EXPECT_TRUE (pBsBuf[iIdx] != NULL);
+    ASSERT_TRUE (pBsBuf[iIdx] != NULL);
 
     long rv = WelsCreateDecoder (&decoder[iIdx]);
     ASSERT_EQ (0, rv);
-    EXPECT_TRUE (decoder[iIdx] != NULL);
+    ASSERT_TRUE (decoder[iIdx] != NULL);
 
     SDecodingParam decParam;
     memset (&decParam, 0, sizeof (SDecodingParam));
@@ -1815,7 +1824,7 @@
     int iLayerLen = 0;
     unsigned char* pData[3] = { NULL };
 
-    InitialEncDec (sParam.iPicWidth, sParam.iPicHeight);
+    ASSERT_TRUE (InitialEncDec (sParam.iPicWidth, sParam.iPicHeight));
     int frameSize = EncPic.iPicWidth * EncPic.iPicHeight * 3 / 2;
     memset (buf_.data(), rand() % 256, (frameSize >> 2));
     memset (buf_.data() + (frameSize >> 2), rand() % 256, (frameSize - (frameSize >> 2)));
@@ -1920,16 +1929,16 @@
   int iSliceNum        = 1;
 
   EProfileIdc profileList[11] = {PRO_UNKNOWN, PRO_BASELINE, PRO_MAIN,
-                               PRO_EXTENDED , PRO_HIGH , PRO_HIGH10,
-                               PRO_HIGH422, PRO_HIGH444, PRO_CAVLC444,
-                               PRO_SCALABLE_BASELINE,
-                               PRO_SCALABLE_HIGH
-                              };
+                                 PRO_EXTENDED , PRO_HIGH , PRO_HIGH10,
+                                 PRO_HIGH422, PRO_HIGH444, PRO_CAVLC444,
+                                 PRO_SCALABLE_BASELINE,
+                                 PRO_SCALABLE_HIGH
+                                };
   ELevelIdc levelList[18] = {  LEVEL_UNKNOWN, LEVEL_1_0, LEVEL_1_B, LEVEL_1_1, LEVEL_1_2,
-                             LEVEL_1_3, LEVEL_2_0, LEVEL_2_1, LEVEL_2_2, LEVEL_3_0,
-                             LEVEL_3_1, LEVEL_3_2, LEVEL_4_0, LEVEL_4_1,
-                             LEVEL_4_2, LEVEL_5_0, LEVEL_5_1, LEVEL_5_2
-                          };
+                               LEVEL_1_3, LEVEL_2_0, LEVEL_2_1, LEVEL_2_2, LEVEL_3_0,
+                               LEVEL_3_1, LEVEL_3_2, LEVEL_4_0, LEVEL_4_1,
+                               LEVEL_4_2, LEVEL_5_0, LEVEL_5_1, LEVEL_5_2
+                            };
 
   EProfileIdc iEncProfileIdc = PRO_UNKNOWN;
   ELevelIdc iEncLevelIdc =  LEVEL_UNKNOWN;
@@ -1958,7 +1967,7 @@
   int rv = encoder_->InitializeExt (&sParam);
   ASSERT_TRUE (rv == cmResultSuccess) << "InitializeExt: rv = " << rv << " at " << sParam.iPicWidth << "x" <<
                                       sParam.iPicHeight;
-  EncDecOneFrame (sParam.iPicWidth, sParam.iPicHeight, iEncFrameNum++, NULL);
+  ASSERT_TRUE (EncDecOneFrame (sParam.iPicWidth, sParam.iPicHeight, iEncFrameNum++, NULL));
 
   decoder_->GetOption (DECODER_OPTION_PROFILE, &iDecProfileIdc);
 
@@ -2021,7 +2030,7 @@
   rv = encoder_->ForceIntraFrame (true);
   ASSERT_TRUE (rv == cmResultSuccess) << "rv = " << rv;
 
-  EncDecOneFrame (sParam.iPicWidth, sParam.iPicHeight, iEncFrameNum++, NULL);
+  ASSERT_TRUE (EncDecOneFrame (sParam.iPicWidth, sParam.iPicHeight, iEncFrameNum++, NULL));
 
   decoder_->GetOption (DECODER_OPTION_PROFILE, &iDecProfileIdc);
 
--- a/test/api/ltr_test.cpp
+++ b/test/api/ltr_test.cpp
@@ -18,7 +18,7 @@
   int rv = encoder_->InitializeExt (&param_);
   ASSERT_TRUE (rv == cmResultSuccess);
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
 
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
@@ -116,7 +116,7 @@
   ASSERT_TRUE (rv == cmResultSuccess);
   m_LTR_Recover_Request.uiFeedbackType = NO_RECOVERY_REQUSET;
 
-  InitialEncDec (p.width, p.height);
+  ASSERT_TRUE (InitialEncDec (p.width, p.height));
 
   int32_t iTraceLevel = WELS_LOG_QUIET;
   encoder_->SetOption (ENCODER_OPTION_TRACE_LEVEL, &iTraceLevel);
--- a/test/common/ExpandPicture.cpp
+++ b/test/common/ExpandPicture.cpp
@@ -127,9 +127,11 @@
       int32_t iBuffHeight = iPicHeight + H264_PADDING_LENGTH_LUMA * 2;
       int32_t iBuffSize =  iBuffHeight * iStride * sizeof (uint8_t);
       uint8_t* pAnchorDstBuff = static_cast<uint8_t*> (WelsMallocz (iBuffSize, "pAnchorDstBuff"));
+      ASSERT_TRUE (pAnchorDstBuff != NULL) << "pAnchorDstBuff alloc failed for size:" << iBuffSize;
       uint8_t* pAnchorDst = pAnchorDstBuff + H264_PADDING_LENGTH_LUMA * iStride + H264_PADDING_LENGTH_LUMA;
 
       uint8_t* pTestDstBuff = static_cast<uint8_t*> (WelsMallocz (iBuffSize, "pTestDstBuff"));
+      ASSERT_TRUE (pTestDstBuff != NULL) << "pTestDstBuff alloc failed for size:" << iBuffSize;
       uint8_t* pTestDst = pTestDstBuff + H264_PADDING_LENGTH_LUMA * iStride + H264_PADDING_LENGTH_LUMA;
 
       // Generate Src
@@ -173,9 +175,11 @@
       int32_t iBuffHeight = iPicHeight + H264_PADDING_LENGTH_CHROMA * 2;
       int32_t iBuffSize =  iBuffHeight * iStride * sizeof (uint8_t);
       uint8_t* pAnchorDstBuff = static_cast<uint8_t*> (WelsMallocz (iBuffSize, "pAnchorDstBuff"));
+      ASSERT_TRUE (pAnchorDstBuff != NULL) << "pAnchorDstBuff alloc failed for size:" << iBuffSize;
       uint8_t* pAnchorDst = pAnchorDstBuff + H264_PADDING_LENGTH_CHROMA * iStride + H264_PADDING_LENGTH_CHROMA;
 
       uint8_t* pTestDstBuff = static_cast<uint8_t*> (WelsMallocz (iBuffSize, "pTestDstBuff"));
+      ASSERT_TRUE (pTestDstBuff != NULL) << "pTestDstBuff alloc failed for size:" << iBuffSize;
       uint8_t* pTestDst = pTestDstBuff + H264_PADDING_LENGTH_CHROMA * iStride + H264_PADDING_LENGTH_CHROMA;
 
       // Generate Src
@@ -218,8 +222,10 @@
       if (uiCpuFlag & WELS_CPU_SSE2) {
         iPicWidth = WELS_ALIGN (iPicWidth, 32);
       }
-      iStride[0]                  = WELS_ALIGN (iPicWidth, MB_WIDTH_LUMA)   + (PADDING_LENGTH << 1);      // with width of horizon
-      int32_t iPicHeightExt       = WELS_ALIGN (iPicHeight, MB_HEIGHT_LUMA) + (PADDING_LENGTH << 1);      // with height of vertical
+      iStride[0]                  = WELS_ALIGN (iPicWidth,
+                                    MB_WIDTH_LUMA)   + (PADDING_LENGTH << 1);      // with width of horizon
+      int32_t iPicHeightExt       = WELS_ALIGN (iPicHeight,
+                                    MB_HEIGHT_LUMA) + (PADDING_LENGTH << 1);      // with height of vertical
       iStride[1]                  = iStride[0] >> 1;
       int32_t iPicChromaHeightExt = iPicHeightExt >> 1;
       iStride[2]                  = iStride[1];
@@ -227,11 +233,13 @@
       int32_t iChromaSize         = iStride[1] * iPicChromaHeightExt;
 
       pPicAnchorBuffer = static_cast<uint8_t*> (WelsMallocz (iLumaSize + (iChromaSize << 1), "pPicAnchor"));
+      ASSERT_TRUE (pPicAnchorBuffer != NULL) << "pPicAnchorBuffer alloc failed for size:" << (iLumaSize + (iChromaSize << 1));
       pPicAnchor[0]     = pPicAnchorBuffer + (1 + iStride[0]) * PADDING_LENGTH;
       pPicAnchor[1]     = pPicAnchorBuffer + iLumaSize + (((1 + iStride[1]) * PADDING_LENGTH) >> 1);
       pPicAnchor[2]     = pPicAnchorBuffer + iLumaSize + iChromaSize + (((1 + iStride[2]) * PADDING_LENGTH) >> 1);
 
       pPicTestBuffer = static_cast<uint8_t*> (WelsMallocz (iLumaSize + (iChromaSize << 1), "pPicTest"));
+      ASSERT_TRUE (pPicTestBuffer != NULL) << "pPicTestBuffer alloc failed for size:" << (iLumaSize + (iChromaSize << 1));
       pPicTest[0]       = pPicTestBuffer + (1 + iStride[0]) * PADDING_LENGTH;
       pPicTest[1]       = pPicTestBuffer + iLumaSize + (((1 + iStride[1]) * PADDING_LENGTH) >> 1);
       pPicTest[2]       = pPicTestBuffer + iLumaSize + iChromaSize + (((1 + iStride[2]) * PADDING_LENGTH) >> 1);
--- a/test/common/WelsThreadPoolTest.cpp
+++ b/test/common/WelsThreadPoolTest.cpp
@@ -39,7 +39,9 @@
 void* OneCallingFunc() {
   CThreadPoolTest cThreadPoolTest;
   CSimpleTask* aTasks[TEST_TASK_NUM];
-  CWelsThreadPool* pThreadPool = & (CWelsThreadPool::AddReference());
+  CWelsThreadPool* pThreadPool = (CWelsThreadPool::AddReference());
+  if (pThreadPool == NULL)
+    return 0;
 
   int32_t  i;
   for (i = 0; i < TEST_TASK_NUM; i++) {
@@ -70,9 +72,11 @@
   EXPECT_EQ (0, iRet);
   EXPECT_FALSE (CWelsThreadPool::IsReferenced());
 
-  CWelsThreadPool* pThreadPool = & (CWelsThreadPool::AddReference ());
-  EXPECT_TRUE(pThreadPool->IsReferenced());
+  CWelsThreadPool* pThreadPool = (CWelsThreadPool::AddReference());
+  ASSERT_TRUE (pThreadPool != NULL);
 
+  EXPECT_TRUE (pThreadPool->IsReferenced());
+
   EXPECT_EQ (8, pThreadPool->GetThreadNum());
 
   iRet = CWelsThreadPool::SetThreadNum (4);
@@ -84,7 +88,7 @@
   iRet = CWelsThreadPool::SetThreadNum (4);
   EXPECT_EQ (0, iRet);
 
-  pThreadPool = & (CWelsThreadPool::AddReference ());
+  pThreadPool = (CWelsThreadPool::AddReference());
   EXPECT_TRUE (pThreadPool->IsReferenced());
   EXPECT_EQ (4, pThreadPool->GetThreadNum());
   pThreadPool->RemoveInstance();
@@ -97,24 +101,24 @@
   int iCallingNum = 10;
   WELS_THREAD_HANDLE mThreadID[30];
   int i = 0;
-
+  WELS_THREAD_ERROR_CODE rc;
   for (i = 0; i < iCallingNum; i++) {
-    WelsThreadCreate (& (mThreadID[i]), (LPWELS_THREAD_ROUTINE)OneCallingFunc, NULL, 0);
+    rc = WelsThreadCreate (& (mThreadID[i]), (LPWELS_THREAD_ROUTINE)OneCallingFunc, NULL, 0);
+    ASSERT_TRUE (rc == WELS_THREAD_ERROR_OK);
     WelsSleep (1);
   }
-
   for (i = iCallingNum; i < iCallingNum * 2; i++) {
-    WelsThreadCreate (& (mThreadID[i]), (LPWELS_THREAD_ROUTINE)OneCallingFunc, NULL, 0);
+    rc = WelsThreadCreate (& (mThreadID[i]), (LPWELS_THREAD_ROUTINE)OneCallingFunc, NULL, 0);
+    ASSERT_TRUE (rc == WELS_THREAD_ERROR_OK);
     WelsSleep (1);
     WelsThreadJoin (mThreadID[i]);
   }
-
   for (i = 0; i < iCallingNum; i++) {
     WelsThreadJoin (mThreadID[i]);
   }
-
   for (i = iCallingNum * 2; i < iCallingNum * 3; i++) {
-    WelsThreadCreate (& (mThreadID[i]), (LPWELS_THREAD_ROUTINE)OneCallingFunc, NULL, 0);
+    rc = WelsThreadCreate (& (mThreadID[i]), (LPWELS_THREAD_ROUTINE)OneCallingFunc, NULL, 0);
+    ASSERT_TRUE (rc == WELS_THREAD_ERROR_OK);
     WelsSleep (1);
     WelsThreadJoin (mThreadID[i]);
   }
--- a/test/utils/BufferedData.h
+++ b/test/utils/BufferedData.h
@@ -1,6 +1,7 @@
 #ifndef __BUFFEREDDATA_H__
 #define __BUFFEREDDATA_H__
 
+#include <gtest/gtest.h>
 #include <stddef.h>
 #include <stdlib.h>
 #include "../test_stdint.h"
@@ -46,6 +47,8 @@
   void SetLength (size_t newLen) {
     if (EnsureCapacity (newLen)) {
       length_ = newLen;
+    } else {
+      FAIL () << "unable to alloc memory in SetLength()";
     }
   }