diff --git a/codec/api/svc/codec_api.h b/codec/api/svc/codec_api.h index 9c941c20..a91922f8 100644 --- a/codec/api/svc/codec_api.h +++ b/codec/api/svc/codec_api.h @@ -64,7 +64,7 @@ class ISVCEncoder { virtual int EXTAPI Uninitialize() = 0; /* - * return: EVideoFrameType [IDR: videoFrameTypeIDR; P: videoFrameTypeP; ERROR: videoFrameTypeInvalid] + * return: 0 - success; otherwise -failed; */ virtual int EXTAPI EncodeFrame (const SSourcePicture* kpSrcPic, SFrameBSInfo* pBsInfo) = 0; /* diff --git a/codec/api/svc/codec_def.h b/codec/api/svc/codec_def.h index 233129b6..699f6dfe 100644 --- a/codec/api/svc/codec_def.h +++ b/codec/api/svc/codec_def.h @@ -75,6 +75,7 @@ typedef enum { cmUnkonwReason, cmMallocMemeError, /*Malloc a memory error*/ cmInitExpected, /*Initial action is expected*/ + cmUnsupportedData, } CM_RETURN; diff --git a/codec/encoder/core/src/encoder_ext.cpp b/codec/encoder/core/src/encoder_ext.cpp index 6352cb26..7c8ff7ec 100644 --- a/codec/encoder/core/src/encoder_ext.cpp +++ b/codec/encoder/core/src/encoder_ext.cpp @@ -1730,8 +1730,8 @@ int32_t InitSliceSettings (SWelsSvcCodingParam* pCodingParam, const int32_t kiCp break; case SM_AUTO_SLICE: iMaxSliceCount = MAX_SLICES_NUM; - pDlp->sSliceCfg.sSliceArgument.uiSliceNum = kiCpuCores; - if (pDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceCount){ + pDlp->sSliceCfg.sSliceArgument.uiSliceNum = kiCpuCores; + if (pDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceCount){ pDlp->sSliceCfg.sSliceArgument.uiSliceNum = iMaxSliceCount; } if (pDlp->sSliceCfg.sSliceArgument.uiSliceNum == 1) { diff --git a/codec/encoder/plus/src/welsEncoderExt.cpp b/codec/encoder/plus/src/welsEncoderExt.cpp index 97d806d2..e7ea2ec5 100644 --- a/codec/encoder/plus/src/welsEncoderExt.cpp +++ b/codec/encoder/plus/src/welsEncoderExt.cpp @@ -508,11 +508,28 @@ int32_t CWelsH264SVCEncoder::RawData2SrcPic (const uint8_t* pSrc) { */ int CWelsH264SVCEncoder::EncodeFrame (const SSourcePicture* kpSrcPic, SFrameBSInfo* pBsInfo) { if (! (kpSrcPic && m_pEncContext && m_bInitialFlag)) { - return videoFrameTypeInvalid; + return cmInitParaError; + } + + const int32_t kiEncoderReturn = EncodeFrameInternal(kpSrcPic, pBsInfo); + + switch (kiEncoderReturn) { + case ENC_RETURN_MEMALLOCERR: + WelsUninitEncoderExt (&m_pEncContext); + return cmMallocMemeError; + case ENC_RETURN_SUCCESS: + case ENC_RETURN_CORRECTED: + break;//continue processing + case ENC_RETURN_UNSUPPORTED_PARA: + return cmUnsupportedData; + break; + case ENC_RETURN_UNEXPECTED: + return cmUnkonwReason; + default: + WelsLog (m_pEncContext, WELS_LOG_ERROR, "unexpected return(%d) from WelsEncoderEncodeExt()!\n", kiEncoderReturn); + return cmUnkonwReason; } - int32_t uiFrameType = videoFrameTypeInvalid; - uiFrameType = EncodeFrameInternal(kpSrcPic, pBsInfo); #ifdef REC_FRAME_COUNT ++ m_uiCountFrameNum; @@ -523,8 +540,7 @@ int CWelsH264SVCEncoder::EncodeFrame (const SSourcePicture* kpSrcPic, SFrameBSIn #ifdef DUMP_SRC_PICTURE DumpSrcPicture (pSrc); #endif // DUMP_SRC_PICTURE - - return uiFrameType; + return cmResultSuccess; } @@ -539,18 +555,12 @@ int CWelsH264SVCEncoder::EncodeFrameInternal(const SSourcePicture* pSrcPic, SFr const int32_t kiEncoderReturn = WelsEncoderEncodeExt (m_pEncContext, pBsInfo, pSrcPic); XMMREG_PROTECT_LOAD(CWelsH264SVCEncoder); - switch (kiEncoderReturn) { - case ENC_RETURN_MEMALLOCERR: + if(kiEncoderReturn == ENC_RETURN_MEMALLOCERR) { WelsUninitEncoderExt (&m_pEncContext); return videoFrameTypeInvalid; - case ENC_RETURN_SUCCESS: - case ENC_RETURN_CORRECTED: - break;//continue processing - case ENC_RETURN_UNSUPPORTED_PARA: - case ENC_RETURN_UNEXPECTED: - return videoFrameTypeInvalid; - default: - WelsLog (m_pEncContext, WELS_LOG_ERROR, "unexpected return(%d) from WelsEncoderEncodeExt()!\n", kiEncoderReturn); + } + else if((kiEncoderReturn != ENC_RETURN_SUCCESS)&&(kiEncoderReturn == ENC_RETURN_CORRECTED)){ + WelsLog (m_pEncContext, WELS_LOG_ERROR, "unexpected return(%d) from EncodeFrameInternal()!\n", kiEncoderReturn); return videoFrameTypeInvalid; } @@ -576,8 +586,6 @@ int CWelsH264SVCEncoder::EncodeFrameInternal(const SSourcePicture* pSrcPic, SFr break; } - - ///////////////////for test #ifdef OUTPUT_BIT_STREAM if (iFrameType != videoFrameTypeInvalid && iFrameType != videoFrameTypeSkip) { @@ -625,7 +633,7 @@ int CWelsH264SVCEncoder::EncodeFrameInternal(const SSourcePicture* pSrcPic, SFr DumpSrcPicture (pSrcPicList[0]->pData[0]); #endif // DUMP_SRC_PICTURE - return iFrameType; + return kiEncoderReturn; } diff --git a/test/BaseEncoderTest.cpp b/test/BaseEncoderTest.cpp index 575174ba..1eb7d8fd 100644 --- a/test/BaseEncoderTest.cpp +++ b/test/BaseEncoderTest.cpp @@ -83,8 +83,8 @@ void BaseEncoderTest::EncodeStream(InputStream* in, int width, int height, pic.pData[2] = pic.pData[1] + (width*height>>2); while (in->read(buf.data(), frameSize) == frameSize) { rv = encoder_->EncodeFrame(&pic, &info); - ASSERT_TRUE(rv != videoFrameTypeInvalid); - if (rv != videoFrameTypeSkip && cbk != NULL) { + ASSERT_TRUE(rv == cmResultSuccess); + if (info.eOutputFrameType != videoFrameTypeSkip && cbk != NULL) { cbk->onEncodeFrame(info); } }