Showing the changes to codec/encoder/core/src/encoder_ext.cpp (1 of 7 files). Show all
Unified · Split
| @@ -4004,6 +4004,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 4003 unmodified lines | ||
| 4004 | 4004 | int32_t iRet = 0; |
| 4005 | 4005 | // THREAD_FULLY_FIRE_MODE/THREAD_PICK_UP_MODE for any mode of non-SM_DYN_SLICE |
| 4006 | 4006 | if ((SM_DYN_SLICE != pParam->sSliceCfg.uiSliceMode) && (pSvcParam->iMultipleThreadIdc > 1)) { |
| 4007 | + | |
| 4007 | 4008 | iSliceCount = GetCurrentSliceNum (pCtx->pCurDqLayer->pSliceEncCtx); |
| 4008 | 4009 | if (iLayerNum + 1 >= MAX_LAYER_NUM_OF_FRAME) { // check available layer_bs_info for further writing as followed |
| 4009 | 4010 | WelsLog (pLogCtx, WELS_LOG_ERROR, |
| @@ -4017,108 +4018,17 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo* pFbi, const SSour · 7 unmodified lines | ||
| 4017 | 4018 | iSliceCount); |
| 4018 | 4019 | return ENC_RETURN_UNEXPECTED; |
| 4019 | 4020 | } |
| 4020 | − if (SM_AUTO_SLICE == pParam->sSliceCfg.uiSliceMode) { | |
| 4021 | − if (pSvcParam->iCountThreadsNum >= iSliceCount) { //THREAD_FULLY_FIRE_MODE | |
| 4022 | −#if defined(MT_DEBUG) | |
| 4023 | − int64_t t_bs_append = 0; | |
| 4024 | −#endif | |
| 4025 | − | |
| 4026 | − pCtx->iActiveThreadsNum = iSliceCount; | |
| 4027 | − // to fire slice coding threads | |
| 4028 | − iRet = FiredSliceThreads (pCtx, &pCtx->pSliceThreading->pThreadPEncCtx[0], | |
| 4029 | − &pCtx->pSliceThreading->pReadySliceCodingEvent[0], | |
| 4030 | − &pCtx->pSliceThreading->pThreadMasterEvent[0], | |
| 4031 | − pFbi, iSliceCount, pCtx->pCurDqLayer->pSliceEncCtx, false); | |
| 4032 | − if (iRet) { | |
| 4033 | − WelsLog (pLogCtx, WELS_LOG_ERROR, | |
| 4034 | − "[MT] WelsEncoderEncodeExt(), FiredSliceThreads return(%d) failed and exit encoding frame, iCountThreadsNum= %d, iSliceCount= %d, uiSliceMode= %d, iMultipleThreadIdc= %d!!", | |
| 4035 | − iRet, pSvcParam->iCountThreadsNum, iSliceCount, pParam->sSliceCfg.uiSliceMode, pSvcParam->iMultipleThreadIdc); | |
| 4036 | − return ENC_RETURN_UNEXPECTED; | |
| 4037 | − } | |
| 4038 | − | |
| 4039 | − WelsMultipleEventsWaitAllBlocking (iSliceCount, &pCtx->pSliceThreading->pSliceCodedEvent[0], | |
| 4040 | − &pCtx->pSliceThreading->pSliceCodedMasterEvent); | |
| 4041 | − | |
| 4042 | − | |
| 4043 | − // all slices are finished coding here | |
| 4044 | − WELS_VERIFY_RETURN_IFNEQ (pCtx->iEncoderError, ENC_RETURN_SUCCESS) | |
| 4045 | − | |
| 4046 | − // append exclusive slice 0 bs to pFrameBs | |
| 4047 | −#if defined(MT_DEBUG) | |
| 4048 | − t_bs_append = WelsTime(); | |
| 4049 | −#endif//MT_DEBUG | |
| 4050 | − iLayerSize = AppendSliceToFrameBs (pCtx, pLayerBsInfo, iSliceCount); | |
| 4051 | −#if defined(MT_DEBUG) | |
| 4052 | − t_bs_append = WelsTime() - t_bs_append; | |
| 4053 | − if (pCtx->pSliceThreading->pFSliceDiff) { | |
| 4054 | − fprintf (pCtx->pSliceThreading->pFSliceDiff, | |
| 4055 | − "%6" PRId64 " us consumed at AppendSliceToFrameBs() for coding_idx: %d iDid: %d qid: %d\n", | |
| 4056 | − t_bs_append, pCtx->iCodingIndex, iCurDid, 0); | |
| 4057 | − } | |
| 4058 | −#endif//MT_DEBUG | |
| 4059 | − } else { //THREAD_PICK_UP_MODE | |
| 4060 | − int32_t iNumThreadsRunning = 0; | |
| 4061 | − int32_t iNumThreadsScheduled = 0; | |
| 4062 | − int32_t iIndexOfSliceToBeCoded = 0; | |
| 4063 | − | |
| 4064 | − pCtx->iActiveThreadsNum = pSvcParam->iCountThreadsNum; | |
| 4065 | − iNumThreadsScheduled = pCtx->iActiveThreadsNum; | |
| 4066 | − iNumThreadsRunning = iNumThreadsScheduled; | |
| 4067 | − // to fire slice coding threads | |
| 4068 | − iRet = FiredSliceThreads (pCtx, &pCtx->pSliceThreading->pThreadPEncCtx[0], | |
| 4069 | − &pCtx->pSliceThreading->pReadySliceCodingEvent[0], | |
| 4070 | − &pCtx->pSliceThreading->pThreadMasterEvent[0], | |
| 4071 | − pFbi, iNumThreadsRunning, pCtx->pCurDqLayer->pSliceEncCtx, false); | |
| 4072 | − if (iRet) { | |
| 4073 | − WelsLog (pLogCtx, WELS_LOG_ERROR, | |
| 4074 | − "[MT] WelsEncoderEncodeExt(), FiredSliceThreads return(%d) failed and exit encoding frame, iCountThreadsNum= %d, iSliceCount= %d, uiSliceMode= %d, iMultipleThreadIdc= %d!!", | |
| 4075 | − iRet, pSvcParam->iCountThreadsNum, iSliceCount, pParam->sSliceCfg.uiSliceMode, pSvcParam->iMultipleThreadIdc); | |
| 4076 | − return ENC_RETURN_UNEXPECTED; | |
| 4077 | − } | |
| 4078 | − | |
| 4079 | − iIndexOfSliceToBeCoded = iNumThreadsRunning; | |
| 4080 | − while (1) { | |
| 4081 | − if (iIndexOfSliceToBeCoded >= iSliceCount && iNumThreadsRunning <= 0) | |
| 4082 | − break; | |
| 4083 | − WELS_THREAD_ERROR_CODE lwait = 0; | |
| 4084 | − int32_t iEventId = -1; | |
| 4085 | − | |
| 4086 | − lwait = WelsMultipleEventsWaitSingleBlocking (iNumThreadsScheduled, | |
| 4087 | − &pCtx->pSliceThreading->pSliceCodedEvent[0], | |
| 4088 | − &pCtx->pSliceThreading->pSliceCodedMasterEvent); | |
| 4089 | − iEventId = (int32_t) (lwait - WELS_THREAD_ERROR_WAIT_OBJECT_0); | |
| 4090 | − if (iEventId >= 0 && iEventId < iNumThreadsScheduled) { | |
| 4091 | − if (iIndexOfSliceToBeCoded < iSliceCount) { | |
| 4092 | − // pick up succeeding slice for threading | |
| 4093 | − // thread_id equal to iEventId per implementation here | |
| 4094 | − pCtx->pSliceThreading->pThreadPEncCtx[iEventId].iSliceIndex = iIndexOfSliceToBeCoded; | |
| 4095 | − SetOneSliceBsBufferUnderMultithread (pCtx, iEventId, iIndexOfSliceToBeCoded); | |
| 4096 | − WelsEventSignal (&pCtx->pSliceThreading->pReadySliceCodingEvent[iEventId]); | |
| 4097 | − WelsEventSignal (&pCtx->pSliceThreading->pThreadMasterEvent[iEventId]); | |
| 4098 | − ++ iIndexOfSliceToBeCoded; | |
| 4099 | − } else { // no other slices left for coding | |
| 4100 | − -- iNumThreadsRunning; | |
| 4101 | − } | |
| 4102 | − } | |
| 4103 | − }//while(1) | |
| 4104 | − | |
| 4105 | − // all slices are finished coding here | |
| 4106 | − // append exclusive slice 0 bs to pFrameBs | |
| 4107 | − iLayerSize = AppendSliceToFrameBs (pCtx, pLayerBsInfo, iSliceCount); | |
| 4108 | − } | |
| 4109 | − | |
| 4110 | − } else { | |
| 4111 | − pLayerBsInfo->pBsBuf = pCtx->pFrameBs + pCtx->iPosBsBuffer; | |
| 4112 | − pLayerBsInfo->uiLayerType = VIDEO_CODING_LAYER; | |
| 4113 | − pLayerBsInfo->uiSpatialId = pCtx->uiDependencyId; | |
| 4114 | − pLayerBsInfo->uiTemporalId = pCtx->uiTemporalId; | |
| 4115 | − pLayerBsInfo->uiQualityId = 0; | |
| 4116 | − pLayerBsInfo->iNalCount = 0; | |
| 4117 | − pCtx->pSliceBs[0].pBs = pLayerBsInfo->pBsBuf; | |
| 4118 | − | |
| 4119 | − pCtx->pTaskManage->ExecuteTasks(); | |
| 4120 | − iLayerSize = AppendSliceToFrameBs (pCtx, pLayerBsInfo, iSliceCount); | |
| 4121 | − } | |
| 4021 | + //note: the old codes are removed at commit: 8caeac1 | |
| 4022 | + pLayerBsInfo->pBsBuf = pCtx->pFrameBs + pCtx->iPosBsBuffer; | |
| 4023 | + pLayerBsInfo->uiLayerType = VIDEO_CODING_LAYER; | |
| 4024 | + pLayerBsInfo->uiSpatialId = pCtx->uiDependencyId; | |
| 4025 | + pLayerBsInfo->uiTemporalId = pCtx->uiTemporalId; | |
| 4026 | + pLayerBsInfo->uiQualityId = 0; | |
| 4027 | + pLayerBsInfo->iNalCount = 0; | |
| 4028 | + pCtx->pSliceBs[0].pBs = pLayerBsInfo->pBsBuf; | |
| 4029 | + | |
| 4030 | + pCtx->pTaskManage->ExecuteTasks(); | |
| 4031 | + iLayerSize = AppendSliceToFrameBs (pCtx, pLayerBsInfo, iSliceCount); | |
| 4122 | 4032 | } |
| 4123 | 4033 | // THREAD_FULLY_FIRE_MODE && SM_DYN_SLICE |
| 4124 | 4034 | else if ((SM_DYN_SLICE == pParam->sSliceCfg.uiSliceMode) && (pSvcParam->iMultipleThreadIdc > 1)) { |