Merge pull request #513 from ruil2/encoder_interface

Encoder interface
This commit is contained in:
Licai Guo 2014-03-18 09:51:32 +08:00
commit 37fa5f554e
5 changed files with 32 additions and 23 deletions

View File

@ -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;
/*

View File

@ -75,6 +75,7 @@ typedef enum {
cmUnkonwReason,
cmMallocMemeError, /*Malloc a memory error*/
cmInitExpected, /*Initial action is expected*/
cmUnsupportedData,
} CM_RETURN;

View File

@ -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) {

View File

@ -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;
}

View File

@ -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);
}
}