shithub: openh264

Download patch

ref: 5a65385a444bd02ec5a87caae299ec50dae1dfd8
parent: d26ebeec2c8e98339f85bfb5e9823c90da1ffd53
parent: 1005d639536edd36273f5ff51ce40df313675a28
author: Edward Shi <huashi@cisco.com>
date: Sun Apr 9 10:08:22 EDT 2017

Merge pull request #2717 from sijchen/mtclean3

[Encoder] clean unused multi-thread old functions

--- a/codec/common/src/WelsThreadPool.cpp
+++ b/codec/common/src/WelsThreadPool.cpp
@@ -94,7 +94,7 @@
     }
   }
 
-  //fprintf(stdout, "m_iRefCount=%d, pSink=%x, iMaxThreadNum=%d\n", m_iRefCount, pSink, iMaxThreadNum);
+  //fprintf(stdout, "m_iRefCount=%d, iMaxThreadNum=%d\n", m_iRefCount, m_iMaxThreadNum);
 
   ++ m_iRefCount;
   //fprintf(stdout, "m_iRefCount2=%d\n", m_iRefCount);
@@ -134,10 +134,10 @@
 
   RemoveThreadFromBusyList (pThread);
   AddThreadToIdleQueue (pThread);
-  //fprintf(stdout, "CWelsThreadPool::OnTaskStop 1: Task %x at Thread %x Finished, m_pSink=%x\n", pTask, pThread, m_pSink);
 
   if (pTask->GetSink()) {
     pTask->GetSink()->OnTaskExecuted();
+    //fprintf(stdout, "CWelsThreadPool::OnTaskStop 1: Task %x at Thread %x Finished, m_pSink=%x\n", pTask, pThread, pTask->GetSink());
   }
   //if (m_pSink) {
   //  m_pSink->OnTaskExecuted (pTask);
@@ -328,7 +328,6 @@
 }
 
 int32_t  CWelsThreadPool::GetWaitedTaskNum() {
-  //fprintf(stdout, "CWelsThreadPool::m_cWaitedTasks=%d\n", m_cWaitedTasks->size());
   return m_cWaitedTasks->size();
 }
 
--- a/codec/encoder/core/inc/mt_defs.h
+++ b/codec/encoder/core/inc/mt_defs.h
@@ -74,8 +74,6 @@
 WELS_EVENT                      pReadySliceCodingEvent[MAX_THREADS_NUM];        // events for slice coding ready, [iThreadIdx]
 WELS_EVENT                      pUpdateMbListEvent[MAX_THREADS_NUM];            // signal to update mb list neighbor for various slices
 WELS_EVENT                      pFinUpdateMbListEvent[MAX_THREADS_NUM]; // signal to indicate finish updating mb list
-WELS_EVENT                      pExitEncodeEvent[MAX_THREADS_NUM];                      // event for exit encoding event
-WELS_EVENT                      pThreadMasterEvent[MAX_THREADS_NUM];    // event for indicating that some event has been signalled to the thread
 
 WELS_MUTEX                      mutexSliceNumUpdate;    // for dynamic slicing mode MT
 
--- a/codec/encoder/core/inc/slice_multi_threading.h
+++ b/codec/encoder/core/inc/slice_multi_threading.h
@@ -74,13 +74,6 @@
 WELS_THREAD_ROUTINE_TYPE UpdateMbListThreadProc (void* arg);
 #endif//!_WIN32
 
-WELS_THREAD_ROUTINE_TYPE CodingSliceThreadProc (void* arg);
-
-int32_t CreateSliceThreads (sWelsEncCtx* pCtx);
-
-int32_t FiredSliceThreads (sWelsEncCtx* pCtx, SSliceThreadPrivateData* pPriData, WELS_EVENT* pEventsList,
-                           WELS_EVENT* pMasterEventsList, SFrameBSInfo* pFrameBsInfo, const uint32_t kuiNumThreads);
-
 int32_t DynamicDetectCpuCores();
 
 
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -2238,8 +2238,7 @@
     while (iThreadIdx < iThreadCount) {
       int res = 0;
       if ((*ppCtx)->pSliceThreading->pThreadHandles[iThreadIdx]) {
-        WelsEventSignal (& (*ppCtx)->pSliceThreading->pExitEncodeEvent[iThreadIdx]);
-        WelsEventSignal (& (*ppCtx)->pSliceThreading->pThreadMasterEvent[iThreadIdx]);
+
         res = WelsThreadJoin ((*ppCtx)->pSliceThreading->pThreadHandles[iThreadIdx]); // waiting thread exit
         WelsLog (& (*ppCtx)->sLogCtx, WELS_LOG_INFO, "WelsUninitEncoderExt(), pthread_join(pThreadHandles%d) return %d..",
                  iThreadIdx,
@@ -3749,24 +3748,6 @@
       else if ((SM_SIZELIMITED_SLICE == pParam->sSliceArgument.uiSliceMode) && (pSvcParam->iMultipleThreadIdc > 1)) {
         const int32_t kiPartitionCnt = pCtx->iActiveThreadsNum;
 
-#if 0 //TODO: temporarily use this to keep old codes for a while, will remove old codes later
-        int32_t iRet = 0;
-        // to fire slice coding threads
-        iRet = FiredSliceThreads (pCtx, &pCtx->pSliceThreading->pThreadPEncCtx[0],
-                                  &pCtx->pSliceThreading->pReadySliceCodingEvent[0],
-                                  &pCtx->pSliceThreading->pThreadMasterEvent[0],
-                                  pFbi, kiPartitionCnt);
-        if (iRet) {
-          WelsLog (pLogCtx, WELS_LOG_ERROR,
-                   "[MT] WelsEncoderEncodeExt(), FiredSliceThreads return(%d) failed and exit encoding frame, iSliceCount= %d, uiSliceMode= %d, iMultipleThreadIdc= %d!!",
-                   iRet, iSliceCount, pParam->sSliceArgument.uiSliceMode, pSvcParam->iMultipleThreadIdc);
-          return ENC_RETURN_UNEXPECTED;
-        }
-
-        WelsMultipleEventsWaitAllBlocking (kiPartitionCnt, &pCtx->pSliceThreading->pSliceCodedEvent[0],
-                                           &pCtx->pSliceThreading->pSliceCodedMasterEvent);
-        WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS)
-#else
         //TODO: use a function to remove duplicate code here and ln3994
         int32_t iLayerBsIdx       = pCtx->pOut->iLayerBsIndex;
         SLayerBSInfo* pLbi        = &pFbi->sLayerInfo[iLayerBsIdx];
@@ -3800,7 +3781,7 @@
                    pParam->sSliceArgument.uiSliceMode, pCtx->iEncoderError);
           return pCtx->iEncoderError;
         }
-#endif
+
         iRet = SliceLayerInfoUpdate (pCtx, pFbi, pLayerBsInfo, pParam->sSliceArgument.uiSliceMode);
         if (iRet) {
           WelsLog (pLogCtx, WELS_LOG_ERROR,
--- a/codec/encoder/core/src/slice_multi_threading.cpp
+++ b/codec/encoder/core/src/slice_multi_threading.cpp
@@ -70,12 +70,6 @@
 #define MT_TRACE_LOG(x, ...)
 #endif
 
-#define WELS_THREAD_SIGNAL_AND_BREAK(CodedEventList, CodedMasterEvent, iEventIdx) {  \
-    WelsEventSignal(&CodedEventList[iEventIdx]);  \
-    WelsEventSignal (&CodedMasterEvent);  \
-    break;  \
-}
-
 namespace WelsEnc {
 void UpdateMbListNeighborParallel (SDqLayer* pCurDq,
                                    SMB* pMbList,
@@ -314,12 +308,6 @@
     pSmt->pThreadPEncCtx[iIdx].iThreadIndex   = iIdx;
     pSmt->pThreadHandles[iIdx]                = 0;
 
-    WelsSnprintf (name, SEM_NAME_MAX, "ee%d%s", iIdx, pSmt->eventNamespace);
-    err = WelsEventOpen (&pSmt->pExitEncodeEvent[iIdx], name);
-    MT_TRACE_LOG (pLogCtx, WELS_LOG_INFO, "[MT] Open pExitEncodeEvent%d named(%s) ret%d err%d", iIdx, name, err, errno);
-    WelsSnprintf (name, SEM_NAME_MAX, "tm%d%s", iIdx, pSmt->eventNamespace);
-    err = WelsEventOpen (&pSmt->pThreadMasterEvent[iIdx], name);
-    MT_TRACE_LOG (pLogCtx, WELS_LOG_INFO, "[MT] Open pThreadMasterEvent%d named(%s) ret%d err%d", iIdx, name, err, errno);
     // length of semaphore name should be system constrained at least on mac 10.7
     WelsSnprintf (name, SEM_NAME_MAX, "ud%d%s", iIdx, pSmt->eventNamespace);
     err = WelsEventOpen (&pSmt->pUpdateMbListEvent[iIdx], name);
@@ -391,10 +379,6 @@
   char ename[SEM_NAME_MAX] = {0};
   while (iIdx < iThreadNum) {
     // length of semaphore name should be system constrained at least on mac 10.7
-    WelsSnprintf (ename, SEM_NAME_MAX, "ee%d%s", iIdx, pSmt->eventNamespace);
-    WelsEventClose (&pSmt->pExitEncodeEvent[iIdx], ename);
-    WelsSnprintf (ename, SEM_NAME_MAX, "tm%d%s", iIdx, pSmt->eventNamespace);
-    WelsEventClose (&pSmt->pThreadMasterEvent[iIdx], ename);
     WelsSnprintf (ename, SEM_NAME_MAX, "sc%d%s", iIdx, pSmt->eventNamespace);
     WelsEventClose (&pSmt->pSliceCodedEvent[iIdx], ename);
     WelsSnprintf (ename, SEM_NAME_MAX, "rc%d%s", iIdx, pSmt->eventNamespace);
@@ -509,343 +493,6 @@
 }
 
 // thread process for coding one pSlice
-WELS_THREAD_ROUTINE_TYPE CodingSliceThreadProc (void* arg) {
-  SSliceThreadPrivateData* pPrivateData = (SSliceThreadPrivateData*)arg;
-  sWelsEncCtx* pEncPEncCtx      = NULL;
-  SDqLayer* pCurDq              = NULL;
-  SSlice* pSlice                = NULL;
-  SWelsSliceBs* pSliceBs        = NULL;
-  WELS_EVENT pEventsList[3];
-  int32_t iEventCount           = 0;
-  WELS_THREAD_ERROR_CODE iWaitRet = WELS_THREAD_ERROR_GENERAL;
-  uint32_t uiThrdRet            = 0;
-  int32_t iSliceSize            = 0;
-  int32_t iSliceIdx             = -1;
-  int32_t iThreadIdx            = -1;
-  int32_t iEventIdx             = -1;
-  bool bNeedPrefix              = false;
-  EWelsNalUnitType eNalType     = NAL_UNIT_UNSPEC_0;
-  EWelsNalRefIdc eNalRefIdc     = NRI_PRI_LOWEST;
-  int32_t iReturn = ENC_RETURN_SUCCESS;
-
-  if (NULL == pPrivateData)
-    WELS_THREAD_ROUTINE_RETURN (1);
-
-  pEncPEncCtx   = (sWelsEncCtx*)pPrivateData->pWelsPEncCtx;
-
-  iThreadIdx    = pPrivateData->iThreadIndex;
-  iEventIdx     = iThreadIdx;
-
-  pEventsList[iEventCount++] = pEncPEncCtx->pSliceThreading->pReadySliceCodingEvent[iEventIdx];
-  pEventsList[iEventCount++] = pEncPEncCtx->pSliceThreading->pExitEncodeEvent[iEventIdx];
-  pEventsList[iEventCount++] = pEncPEncCtx->pSliceThreading->pUpdateMbListEvent[iEventIdx];
-
-  WelsThreadSetName ("OpenH264Enc_CodingSliceThreadProc");
-
-  do {
-    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
-    if (WELS_THREAD_ERROR_WAIT_OBJECT_0 == iWaitRet) { // start pSlice coding signal waited
-      //int             iLayerIndex  = pEncPEncCtx->pOut->iLayerBsIndex;
-      //SFrameBSInfo*   pFrameBsInfo = pPrivateData->pFrameBsInfo;
-      //SLayerBSInfo*   pLbi = &pFrameBsInfo->sLayerInfo [iLayerIndex];
-
-      const int32_t kiCurDid            = pEncPEncCtx->uiDependencyId;
-      SWelsSvcCodingParam* pCodingParam = pEncPEncCtx->pSvcParam;
-      SSpatialLayerConfig* pParamD      = &pCodingParam->sSpatialLayers[kiCurDid];
-      SSlice* pCurSlice                 = NULL;
-
-      pCurDq            = pEncPEncCtx->pCurDqLayer;
-      eNalType          = pEncPEncCtx->eNalType;
-      eNalRefIdc        = pEncPEncCtx->eNalPriority;
-      bNeedPrefix       = pEncPEncCtx->bNeedPrefixNalFlag;
-
-      if (pParamD->sSliceArgument.uiSliceMode != SM_SIZELIMITED_SLICE) {
-        int64_t iSliceStart = 0;
-        bool bDsaFlag = false;
-        iSliceIdx     = pPrivateData->iSliceIndex;
-        pSlice        = &pCurDq->sSliceThreadInfo[iThreadIdx].pSliceInThread[iSliceIdx];
-        pSliceBs      = &pSlice->sSliceBs;
-
-        bDsaFlag = ((pParamD->sSliceArgument.uiSliceMode == SM_FIXEDSLCNUM_SLICE) &&
-                    pCodingParam->iMultipleThreadIdc > 1 &&
-                    pCodingParam->iMultipleThreadIdc >= pParamD->sSliceArgument.uiSliceNum);
-        if (bDsaFlag)
-          iSliceStart = WelsTime();
-
-        pSliceBs->uiBsPos       = 0;
-        pSliceBs->iNalIndex     = 0;
-        assert ((void*) (&pSliceBs->sBsWrite) == (void*)pSlice->pSliceBsa);
-        InitBits (&pSliceBs->sBsWrite, pSliceBs->pBsBuffer, pSliceBs->uiSize);
-
-#if MT_DEBUG_BS_WR
-        pSliceBs->bSliceCodedFlag = false;
-#endif//MT_DEBUG_BS_WR
-
-        if (bNeedPrefix) {
-          if (eNalRefIdc != NRI_PRI_LOWEST) {
-            WelsLoadNalForSlice (pSliceBs, NAL_UNIT_PREFIX, eNalRefIdc);
-            WelsWriteSVCPrefixNal (&pSliceBs->sBsWrite, eNalRefIdc, (NAL_UNIT_CODED_SLICE_IDR == eNalType));
-            WelsUnloadNalForSlice (pSliceBs);
-          } else { // No Prefix NAL Unit RBSP syntax here, but need add NAL Unit Header extension
-            WelsLoadNalForSlice (pSliceBs, NAL_UNIT_PREFIX, eNalRefIdc);
-            // No need write any syntax of prefix NAL Unit RBSP here
-            WelsUnloadNalForSlice (pSliceBs);
-          }
-        }
-
-        WelsLoadNalForSlice (pSliceBs, eNalType, eNalRefIdc);
-        pCurSlice = pEncPEncCtx->pCurDqLayer->ppSliceInLayer[iSliceIdx];
-        assert (iSliceIdx == (int) pCurSlice->iSliceIdx);
-        iReturn = SetSliceBoundaryInfo(pEncPEncCtx->pCurDqLayer, pCurSlice, iSliceIdx);
-        if (ENC_RETURN_SUCCESS != iReturn) {
-          uiThrdRet = iReturn;
-          WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
-                                        pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
-                                        iEventIdx);
-        }
-
-        iReturn = SetSliceBoundaryInfo(pEncPEncCtx->pCurDqLayer, pSlice, iSliceIdx);
-        if (ENC_RETURN_SUCCESS != iReturn) {
-          uiThrdRet = iReturn;
-          WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
-                                        pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
-                                        iEventIdx);
-        }
-
-        assert (iSliceIdx == pSlice->iSliceIdx);
-        iReturn = WelsCodeOneSlice (pEncPEncCtx, pSlice, eNalType);
-        if (ENC_RETURN_SUCCESS != iReturn) {
-          uiThrdRet = iReturn;
-          WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
-                                        pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
-                                        iEventIdx);
-        }
-
-        WelsUnloadNalForSlice (pSliceBs);
-
-        iReturn    = WriteSliceBs (pEncPEncCtx, pSliceBs, iSliceIdx, iSliceSize);
-        if (ENC_RETURN_SUCCESS != iReturn) {
-          uiThrdRet = iReturn;
-          WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
-                                        pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
-                                        iEventIdx);
-        }
-
-        pEncPEncCtx->pFuncList->pfDeblocking.pfDeblockingFilterSlice (pCurDq, pEncPEncCtx->pFuncList, pSlice);
-
-        if (bDsaFlag) {
-          pSlice->uiSliceConsumeTime = (uint32_t) (WelsTime() - iSliceStart);
-          MT_TRACE_LOG (& (pEncPEncCtx->sLogCtx), WELS_LOG_INFO,
-                        "[MT] CodingSliceThreadProc(), coding_idx %d, iSliceIdx %d, uiSliceConsumeTime %d, iSliceSize %d, iFirstMbInSlice %d, count_num_mb_in_slice %d",
-                        pEncPEncCtx->iCodingIndex, iSliceIdx,
-                        pSlice->uiSliceConsumeTime, iSliceSize,
-                        pSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice,
-                        pSlice->iCountMbNumInSlice);
-        }
-
-#if defined(SLICE_INFO_OUTPUT)
-        fprintf (stderr,
-                 "@pSlice=%-6d sliceType:%c idc:%d size:%-6d\n",
-                 iSliceIdx,
-                 (pEncPEncCtx->eSliceType == P_SLICE ? 'P' : 'I'),
-                 eNalRefIdc,
-                 iSliceSize
-                );
-#endif//SLICE_INFO_OUTPUT
-
-#if MT_DEBUG_BS_WR
-        pSliceBs->bSliceCodedFlag = true;
-#endif//MT_DEBUG_BS_WR
-
-        WelsEventSignal (
-          &pEncPEncCtx->pSliceThreading->pSliceCodedEvent[iEventIdx]); // mean finished coding current pSlice
-        WelsEventSignal (
-          &pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent);
-      } else { // for SM_SIZELIMITED_SLICE parallelization
-        const int32_t kiPartitionId             = iThreadIdx;
-        const int32_t kiSliceIdxStep            = pEncPEncCtx->iActiveThreadsNum;
-        const int32_t kiFirstMbInPartition      = pCurDq->FirstMbIdxOfPartition[kiPartitionId];
-        const int32_t kiEndMbIdxInPartition     = pCurDq->EndMbIdxOfPartition[kiPartitionId];
-        int32_t iAnyMbLeftInPartition           = kiEndMbIdxInPartition - kiFirstMbInPartition + 1;
-        SSpatialLayerInternal *pParamInternal   = &pCodingParam->sDependencyLayers[kiCurDid];
-        iSliceIdx                               = pPrivateData->iSliceIndex;
-        SSlice* pStartSlice                     = &pCurDq->sSliceThreadInfo[iThreadIdx].pSliceInThread[iSliceIdx];
-        pStartSlice->sSliceHeaderExt.sSliceHeader.iFirstMbInSlice = kiFirstMbInPartition;
-        while (iAnyMbLeftInPartition > 0) {
-          if (iSliceIdx >= pCurDq->iMaxSliceNum) {
-            // TODO: need exception handler for not large enough of MAX_SLICES_NUM related memory usage
-            // No idea about its solution due MAX_SLICES_NUM is fixed lenght in relevent pData structure
-            uiThrdRet = 1;
-            WelsLog (&pEncPEncCtx->sLogCtx, WELS_LOG_WARNING,
-                     "[MT] CodingSliceThreadProc Too many slices: coding_idx %d, iSliceIdx %d, pCurDq->iMaxSliceNum %d",
-                     pParamInternal->iCodingIndex,
-                     iSliceIdx, pCurDq->iMaxSliceNum);
-            WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
-                                          pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
-                                          iEventIdx);
-          }
-          pSlice                = &pCurDq->sSliceThreadInfo[iThreadIdx].pSliceInThread[iSliceIdx];
-          pSliceBs              = &pSlice->sSliceBs;
-          pSliceBs->uiBsPos     = 0;
-          pSliceBs->iNalIndex   = 0;
-
-          SetOneSliceBsBufferUnderMultithread (pEncPEncCtx, kiPartitionId, pSlice);
-          InitBits (&pSliceBs->sBsWrite, pSliceBs->pBsBuffer, pSliceBs->uiSize);
-
-          if (bNeedPrefix) {
-            if (eNalRefIdc != NRI_PRI_LOWEST) {
-              WelsLoadNalForSlice (pSliceBs, NAL_UNIT_PREFIX, eNalRefIdc);
-              WelsWriteSVCPrefixNal (&pSliceBs->sBsWrite, eNalRefIdc, (NAL_UNIT_CODED_SLICE_IDR == eNalType));
-              WelsUnloadNalForSlice (pSliceBs);
-            } else { // No Prefix NAL Unit RBSP syntax here, but need add NAL Unit Header extension
-              WelsLoadNalForSlice (pSliceBs, NAL_UNIT_PREFIX, eNalRefIdc);
-              // No need write any syntax of prefix NAL Unit RBSP here
-              WelsUnloadNalForSlice (pSliceBs);
-            }
-          }
-
-          WelsLoadNalForSlice (pSliceBs, eNalType, eNalRefIdc);
-          assert (iSliceIdx == pSlice->iSliceIdx);
-          iReturn = WelsCodeOneSlice (pEncPEncCtx, pSlice, eNalType);
-          if (ENC_RETURN_SUCCESS != iReturn) {
-            uiThrdRet = iReturn;
-            WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
-                                          pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
-                                          iEventIdx);
-          }
-
-          WelsUnloadNalForSlice (pSliceBs);
-
-          iReturn    = WriteSliceBs (pEncPEncCtx, pSliceBs, iSliceIdx, iSliceSize);
-          if (ENC_RETURN_SUCCESS != iReturn) {
-            uiThrdRet = iReturn;
-            WelsLog (&pEncPEncCtx->sLogCtx, WELS_LOG_WARNING,
-                     "[MT] CodingSliceThreadProc, WriteSliceBs not successful: coding_idx %d, iSliceIdx %d, BufferSize %d, m_iSliceSize %d, iPayloadSize %d",
-                     pParamInternal->iCodingIndex,
-                     iSliceIdx, pSliceBs->uiSize, iSliceSize, pSliceBs->sNalList[0].iPayloadSize);
-
-            WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
-                                          pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
-                                          iEventIdx);
-          }
-
-          pEncPEncCtx->pFuncList->pfDeblocking.pfDeblockingFilterSlice (pCurDq, pEncPEncCtx->pFuncList, pSlice);
-
-#if defined(SLICE_INFO_OUTPUT)
-          fprintf (stderr,
-                   "@pSlice=%-6d sliceType:%c idc:%d size:%-6d\n",
-                   iSliceIdx,
-                   (pEncPEncCtx->eSliceType == P_SLICE ? 'P' : 'I'),
-                   eNalRefIdc,
-                   iSliceSize
-                  );
-#endif//SLICE_INFO_OUTPUT
-
-          MT_TRACE_LOG (&(pEncPEncCtx->sLogCtx), WELS_LOG_INFO,
-                        "[MT] CodingSliceThreadProc(), coding_idx %d, iPartitionId %d, iSliceIdx %d, iSliceSize %d, count_mb_slice %d, iEndMbInPartition %d, pCurDq->LastCodedMbIdxOfPartition[%d] %d\n",
-                        pEncPEncCtx->iCodingIndex, kiPartitionId, iSliceIdx, iSliceSize,
-                        pSlice->iCountMbNumInSlice,
-                        kiEndMbIdxInPartition, kiPartitionId, pCurDq->LastCodedMbIdxOfPartition[kiPartitionId]);
-
-          iAnyMbLeftInPartition = kiEndMbIdxInPartition - pCurDq->LastCodedMbIdxOfPartition[kiPartitionId];
-          iSliceIdx += kiSliceIdxStep;
-        }
-
-        if (uiThrdRet) { // any exception??
-          WELS_THREAD_SIGNAL_AND_BREAK (pEncPEncCtx->pSliceThreading->pSliceCodedEvent,
-                                        pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent,
-                                        iEventIdx);
-        }
-
-        WelsEventSignal (&pEncPEncCtx->pSliceThreading->pSliceCodedEvent[iEventIdx]); // mean finished coding current pSlice
-        WelsEventSignal (&pEncPEncCtx->pSliceThreading->pSliceCodedMasterEvent);
-      }
-    } else if (WELS_THREAD_ERROR_WAIT_OBJECT_0 + 1 == iWaitRet) { // exit thread signal
-      uiThrdRet = 0;
-      break;
-    } else if (WELS_THREAD_ERROR_WAIT_OBJECT_0 + 2 == iWaitRet) { // update pMb list singal
-      iSliceIdx =
-        iEventIdx; // pPrivateData->iSliceIndex; old threads can not be terminated, pPrivateData is not correct for applicable
-      pCurDq = pEncPEncCtx->pCurDqLayer;
-      UpdateMbListNeighborParallel (pCurDq, pCurDq->sMbDataP, iSliceIdx);
-      WelsEventSignal (
-        &pEncPEncCtx->pSliceThreading->pFinUpdateMbListEvent[iEventIdx]); // mean finished update pMb list for this pSlice
-    } else { // WELS_THREAD_ERROR_WAIT_TIMEOUT, or WELS_THREAD_ERROR_WAIT_FAILED
-      WelsLog (& (pEncPEncCtx->sLogCtx), WELS_LOG_WARNING,
-               "[MT] CodingSliceThreadProc(), waiting pReadySliceCodingEvent[%d] failed(%d) and thread%d terminated!", iEventIdx,
-               iWaitRet, iThreadIdx);
-      uiThrdRet = 1;
-      break;
-    }
-  } while (1);
-
-  //sync multi-threading error
-  WelsMutexLock (&pEncPEncCtx->mutexEncoderError);
-  if (uiThrdRet) pEncPEncCtx->iEncoderError |= uiThrdRet;
-  WelsMutexUnlock (&pEncPEncCtx->mutexEncoderError);
-
-  WELS_THREAD_ROUTINE_RETURN (uiThrdRet);
-}
-
-int32_t CreateSliceThreads (sWelsEncCtx* pCtx) {
-  const int32_t kiThreadCount = pCtx->pSvcParam->iMultipleThreadIdc;
-  int32_t iIdx = 0;
-
-  while (iIdx < kiThreadCount) {
-    if (WelsThreadCreate (&pCtx->pSliceThreading->pThreadHandles[iIdx], CodingSliceThreadProc,
-                          &pCtx->pSliceThreading->pThreadPEncCtx[iIdx], 0)) {
-      return 1;
-    }
-
-
-    ++ iIdx;
-  }
-  MT_TRACE_LOG (& (pCtx->sLogCtx), WELS_LOG_INFO, "CreateSliceThreads() exit..");
-  return 0;
-}
-
-int32_t FiredSliceThreads (sWelsEncCtx* pCtx, SSliceThreadPrivateData* pPriData, WELS_EVENT* pEventsList,
-                           WELS_EVENT* pMasterEventsList, SFrameBSInfo* pFrameBsInfo,
-                           const uint32_t uiNumThreads) {
-  int32_t iIdx              = 0;
-  const int32_t kiEventCnt  = uiNumThreads;
-  int32_t iLayerBsIdx       = pCtx->pOut->iLayerBsIndex;
-  SLayerBSInfo* pLbi        = &pFrameBsInfo->sLayerInfo[iLayerBsIdx];
-
-  if (pPriData == NULL || pFrameBsInfo == NULL || pLbi == NULL || kiEventCnt <= 0 || pEventsList == NULL) {
-    WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR,
-             "FiredSliceThreads(), fail due pPriData == %p ||pFrameBsInfo == %p || pLbi == %p || iEventCnt(%d) <= 0 || pEventsList == %p!!",
-             (void*)pPriData, (void*)pFrameBsInfo, (void*)pLbi, uiNumThreads, (void*)pEventsList);
-    return 1;
-  }
-
-  pLbi->pBsBuf = pCtx->pFrameBs + pCtx->iPosBsBuffer;
-  pLbi->uiLayerType   = VIDEO_CODING_LAYER;
-  pLbi->uiSpatialId   = pCtx->uiDependencyId;
-  pLbi->uiTemporalId  = pCtx->uiTemporalId;
-  pLbi->uiQualityId   = 0;
-  pLbi->iNalCount     = 0;
-
-  iIdx = 0;
-  while (iIdx < kiEventCnt) {
-    pPriData[iIdx].pFrameBsInfo = pFrameBsInfo;
-    pPriData[iIdx].iSliceIndex  = iIdx;
-
-    WelsEventSignal (&pEventsList[iIdx]);
-    WelsEventSignal (&pMasterEventsList[iIdx]);
-
-    ++ iIdx;
-  }
-
-  return 0;
-}
-
 int32_t DynamicDetectCpuCores() {
   WelsLogicalProcessInfo  info;
   WelsQueryLogicalProcessInfo (&info);