use the same frame type EVideoFrameType in encoder internal
This commit is contained in:
parent
fc4cd8b597
commit
e74f01ad47
@ -81,9 +81,9 @@ int32_t InitFunctionPointers (SWelsFuncPtrList* pFuncList, SWelsSvcCodingParam*
|
|||||||
/*!
|
/*!
|
||||||
* \brief initialize frame coding
|
* \brief initialize frame coding
|
||||||
*/
|
*/
|
||||||
void InitFrameCoding (sWelsEncCtx* pEncCtx, const EFrameType keFrameType);
|
void InitFrameCoding (sWelsEncCtx* pEncCtx, const EVideoFrameType keFrameType);
|
||||||
|
|
||||||
EFrameType DecideFrameType (sWelsEncCtx* pEncCtx, const int8_t kiSpatialNum);
|
EVideoFrameType DecideFrameType (sWelsEncCtx* pEncCtx, const int8_t kiSpatialNum);
|
||||||
/*!
|
/*!
|
||||||
* \brief Dump reconstruction for dependency layer
|
* \brief Dump reconstruction for dependency layer
|
||||||
*/
|
*/
|
||||||
|
@ -90,7 +90,7 @@ void WelsUninitEncoderExt (sWelsEncCtx** ppCtx);
|
|||||||
* \param h sWelsEncCtx*, encoder context
|
* \param h sWelsEncCtx*, encoder context
|
||||||
* \param pFbi FrameBSInfo*
|
* \param pFbi FrameBSInfo*
|
||||||
* \param kpSrcPic Source picture
|
* \param kpSrcPic Source picture
|
||||||
* \return EFrameType (WELS_FRAME_TYPE_IDR/WELS_FRAME_TYPE_I/WELS_FRAME_TYPE_P)
|
* \return EFrameType (videoFrameTypeIDR/videoFrameTypeI/videoFrameTypeP)
|
||||||
*/
|
*/
|
||||||
int32_t WelsEncoderEncodeExt (sWelsEncCtx*, SFrameBSInfo * pFbi, const SSourcePicture* kpSrcPic);
|
int32_t WelsEncoderEncodeExt (sWelsEncCtx*, SFrameBSInfo * pFbi, const SSourcePicture* kpSrcPic);
|
||||||
|
|
||||||
|
@ -137,17 +137,6 @@ extern const EVclType g_keTypeMap[32][2];
|
|||||||
#define IS_VCL_NAL_AVC_BASE(t) ( (t) == NAL_UNIT_CODED_SLICE || (t) == NAL_UNIT_CODED_SLICE_IDR )
|
#define IS_VCL_NAL_AVC_BASE(t) ( (t) == NAL_UNIT_CODED_SLICE || (t) == NAL_UNIT_CODED_SLICE_IDR )
|
||||||
#define IS_NEW_INTRODUCED_SVC_NAL(t) ( (t) == NAL_UNIT_PREFIX || (t) == NAL_UNIT_CODED_SLICE_EXT )
|
#define IS_NEW_INTRODUCED_SVC_NAL(t) ( (t) == NAL_UNIT_PREFIX || (t) == NAL_UNIT_CODED_SLICE_EXT )
|
||||||
|
|
||||||
/*
|
|
||||||
* Frame types used in internal encoder (logic level based)
|
|
||||||
*/
|
|
||||||
enum EFrameType {
|
|
||||||
WELS_FRAME_TYPE_AUTO = 0x0000, /* Let encoder engine choose the proper type, RDO or scene change based */
|
|
||||||
WELS_FRAME_TYPE_IDR = 0x0001, /* IDR, I frame with parameter sets */
|
|
||||||
WELS_FRAME_TYPE_I = 0x0002, /* I Frame */
|
|
||||||
WELS_FRAME_TYPE_P = 0x0003, /* P Frame */
|
|
||||||
WELS_FRAME_TYPE_B = 0x0004, /* B Frame */
|
|
||||||
WELS_FRAME_TYPE_SKIP = 0x0008
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Base SSlice Types
|
/* Base SSlice Types
|
||||||
* Invalid in case of eSliceType exceeds 9,
|
* Invalid in case of eSliceType exceeds 9,
|
||||||
|
@ -213,14 +213,14 @@ int32_t InitFunctionPointers (SWelsFuncPtrList* pFuncList, SWelsSvcCodingParam*
|
|||||||
/*!
|
/*!
|
||||||
* \brief initialize frame coding
|
* \brief initialize frame coding
|
||||||
*/
|
*/
|
||||||
void InitFrameCoding (sWelsEncCtx* pEncCtx, const EFrameType keFrameType) {
|
void InitFrameCoding (sWelsEncCtx* pEncCtx, const EVideoFrameType keFrameType) {
|
||||||
// for bitstream writing
|
// for bitstream writing
|
||||||
pEncCtx->iPosBsBuffer = 0; // reset bs pBuffer position
|
pEncCtx->iPosBsBuffer = 0; // reset bs pBuffer position
|
||||||
pEncCtx->pOut->iNalIndex = 0; // reset NAL index
|
pEncCtx->pOut->iNalIndex = 0; // reset NAL index
|
||||||
|
|
||||||
InitBits (&pEncCtx->pOut->sBsWrite, pEncCtx->pOut->pBsBuffer, pEncCtx->pOut->uiSize);
|
InitBits (&pEncCtx->pOut->sBsWrite, pEncCtx->pOut->pBsBuffer, pEncCtx->pOut->uiSize);
|
||||||
|
|
||||||
if (keFrameType == WELS_FRAME_TYPE_P) {
|
if (keFrameType == videoFrameTypeP) {
|
||||||
++pEncCtx->iFrameIndex;
|
++pEncCtx->iFrameIndex;
|
||||||
|
|
||||||
if (pEncCtx->iPOC < (1 << pEncCtx->pSps->iLog2MaxPocLsb) - 2) // if iPOC type is no 0, this need be modification
|
if (pEncCtx->iPOC < (1 << pEncCtx->pSps->iLog2MaxPocLsb) - 2) // if iPOC type is no 0, this need be modification
|
||||||
@ -237,7 +237,7 @@ void InitFrameCoding (sWelsEncCtx* pEncCtx, const EFrameType keFrameType) {
|
|||||||
pEncCtx->eNalType = NAL_UNIT_CODED_SLICE;
|
pEncCtx->eNalType = NAL_UNIT_CODED_SLICE;
|
||||||
pEncCtx->eSliceType = P_SLICE;
|
pEncCtx->eSliceType = P_SLICE;
|
||||||
pEncCtx->eNalPriority = NRI_PRI_HIGH;
|
pEncCtx->eNalPriority = NRI_PRI_HIGH;
|
||||||
} else if (keFrameType == WELS_FRAME_TYPE_IDR) {
|
} else if (keFrameType == videoFrameTypeIDR) {
|
||||||
pEncCtx->iFrameNum = 0;
|
pEncCtx->iFrameNum = 0;
|
||||||
pEncCtx->iPOC = 0;
|
pEncCtx->iPOC = 0;
|
||||||
pEncCtx->bEncCurFrmAsIdrFlag = false;
|
pEncCtx->bEncCurFrmAsIdrFlag = false;
|
||||||
@ -252,7 +252,7 @@ void InitFrameCoding (sWelsEncCtx* pEncCtx, const EFrameType keFrameType) {
|
|||||||
// reset_ref_list
|
// reset_ref_list
|
||||||
|
|
||||||
// rc_init_gop
|
// rc_init_gop
|
||||||
} else if (keFrameType == WELS_FRAME_TYPE_I) {
|
} else if (keFrameType == videoFrameTypeI) {
|
||||||
if (pEncCtx->iPOC < (1 << pEncCtx->pSps->iLog2MaxPocLsb) - 2) // if iPOC type is no 0, this need be modification
|
if (pEncCtx->iPOC < (1 << pEncCtx->pSps->iLog2MaxPocLsb) - 2) // if iPOC type is no 0, this need be modification
|
||||||
pEncCtx->iPOC += 2; // for POC type 0
|
pEncCtx->iPOC += 2; // for POC type 0
|
||||||
else
|
else
|
||||||
@ -279,9 +279,9 @@ void InitFrameCoding (sWelsEncCtx* pEncCtx, const EFrameType keFrameType) {
|
|||||||
#endif//FRAME_INFO_OUTPUT
|
#endif//FRAME_INFO_OUTPUT
|
||||||
}
|
}
|
||||||
|
|
||||||
EFrameType DecideFrameType (sWelsEncCtx* pEncCtx, const int8_t kiSpatialNum) {
|
EVideoFrameType DecideFrameType (sWelsEncCtx* pEncCtx, const int8_t kiSpatialNum) {
|
||||||
SWelsSvcCodingParam* pSvcParam = pEncCtx->pSvcParam;
|
SWelsSvcCodingParam* pSvcParam = pEncCtx->pSvcParam;
|
||||||
EFrameType iFrameType = WELS_FRAME_TYPE_AUTO;
|
EVideoFrameType iFrameType = videoFrameTypeInvalid;
|
||||||
bool bSceneChangeFlag = false;
|
bool bSceneChangeFlag = false;
|
||||||
|
|
||||||
// perform scene change detection
|
// perform scene change detection
|
||||||
@ -297,12 +297,12 @@ EFrameType DecideFrameType (sWelsEncCtx* pEncCtx, const int8_t kiSpatialNum) {
|
|||||||
//bIdrPeriodFlag: RC disable || iSpatialNum != pSvcParam->iSpatialLayerNum
|
//bIdrPeriodFlag: RC disable || iSpatialNum != pSvcParam->iSpatialLayerNum
|
||||||
//pEncCtx->bEncCurFrmAsIdrFlag: 1. first frame should be IDR; 2. idr pause; 3. idr request
|
//pEncCtx->bEncCurFrmAsIdrFlag: 1. first frame should be IDR; 2. idr pause; 3. idr request
|
||||||
iFrameType = (pEncCtx->pVaa->bIdrPeriodFlag || bSceneChangeFlag
|
iFrameType = (pEncCtx->pVaa->bIdrPeriodFlag || bSceneChangeFlag
|
||||||
|| pEncCtx->bEncCurFrmAsIdrFlag) ? WELS_FRAME_TYPE_IDR : WELS_FRAME_TYPE_P;
|
|| pEncCtx->bEncCurFrmAsIdrFlag) ? videoFrameTypeIDR : videoFrameTypeP;
|
||||||
|
|
||||||
if (WELS_FRAME_TYPE_P == iFrameType && pEncCtx->iSkipFrameFlag > 0) { // for frame skip, 1/5/2010
|
if (videoFrameTypeP == iFrameType && pEncCtx->iSkipFrameFlag > 0) { // for frame skip, 1/5/2010
|
||||||
-- pEncCtx->iSkipFrameFlag;
|
-- pEncCtx->iSkipFrameFlag;
|
||||||
iFrameType = WELS_FRAME_TYPE_SKIP;
|
iFrameType = videoFrameTypeSkip;
|
||||||
} else if (WELS_FRAME_TYPE_IDR == iFrameType) {
|
} else if (videoFrameTypeIDR == iFrameType) {
|
||||||
pEncCtx->iCodingIndex = 0;
|
pEncCtx->iCodingIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2538,14 +2538,14 @@ static inline void WelsSwapDqLayers (sWelsEncCtx* pCtx) {
|
|||||||
/*!
|
/*!
|
||||||
* \brief prefetch reference picture after WelsBuildRefList
|
* \brief prefetch reference picture after WelsBuildRefList
|
||||||
*/
|
*/
|
||||||
static inline void PrefetchReferencePicture (sWelsEncCtx* pCtx, const EFrameType keFrameType) {
|
static inline void PrefetchReferencePicture (sWelsEncCtx* pCtx, const EVideoFrameType keFrameType) {
|
||||||
SSlice* pSliceBase = &pCtx->pCurDqLayer->sLayerInfo.pSliceInLayer[0];
|
SSlice* pSliceBase = &pCtx->pCurDqLayer->sLayerInfo.pSliceInLayer[0];
|
||||||
const int32_t kiSliceCount = GetCurrentSliceNum (pCtx->pCurDqLayer->pSliceEncCtx);
|
const int32_t kiSliceCount = GetCurrentSliceNum (pCtx->pCurDqLayer->pSliceEncCtx);
|
||||||
int32_t iIdx = 0;
|
int32_t iIdx = 0;
|
||||||
uint8_t uiRefIdx = -1;
|
uint8_t uiRefIdx = -1;
|
||||||
|
|
||||||
assert (kiSliceCount > 0);
|
assert (kiSliceCount > 0);
|
||||||
if (keFrameType != WELS_FRAME_TYPE_IDR) {
|
if (keFrameType != videoFrameTypeIDR) {
|
||||||
assert (pCtx->iNumRef0 > 0);
|
assert (pCtx->iNumRef0 > 0);
|
||||||
pCtx->pRefPic = pCtx->pRefList0[0]; // always get item 0 due to reordering done
|
pCtx->pRefPic = pCtx->pRefList0[0]; // always get item 0 due to reordering done
|
||||||
pCtx->pCurDqLayer->pRefPic = pCtx->pRefPic;
|
pCtx->pCurDqLayer->pRefPic = pCtx->pRefPic;
|
||||||
@ -2859,7 +2859,7 @@ int32_t WelsEncoderEncodeParameterSets (sWelsEncCtx* pCtx, void* pDst) {
|
|||||||
* \pParam pCtx sWelsEncCtx*, encoder context
|
* \pParam pCtx sWelsEncCtx*, encoder context
|
||||||
* \pParam pFbi FrameBSInfo*
|
* \pParam pFbi FrameBSInfo*
|
||||||
* \pParam pSrcPic Source Picture
|
* \pParam pSrcPic Source Picture
|
||||||
* \return EFrameType (WELS_FRAME_TYPE_IDR/WELS_FRAME_TYPE_I/WELS_FRAME_TYPE_P)
|
* \return EFrameType (videoFrameTypeIDR/videoFrameTypeI/videoFrameTypeP)
|
||||||
*/
|
*/
|
||||||
int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo * pFbi, const SSourcePicture* pSrcPic) {
|
int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo * pFbi, const SSourcePicture* pSrcPic) {
|
||||||
SLayerBSInfo* pLayerBsInfo = &pFbi->sLayerInfo[0];
|
SLayerBSInfo* pLayerBsInfo = &pFbi->sLayerInfo[0];
|
||||||
@ -2880,7 +2880,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo * pFbi, const SSou
|
|||||||
int32_t iNalLen[128] = {0};
|
int32_t iNalLen[128] = {0};
|
||||||
int32_t iNalIdxInLayer = 0;
|
int32_t iNalIdxInLayer = 0;
|
||||||
int32_t iCountNal = 0;
|
int32_t iCountNal = 0;
|
||||||
EFrameType eFrameType = WELS_FRAME_TYPE_AUTO;
|
EVideoFrameType eFrameType = videoFrameTypeInvalid;
|
||||||
int32_t iCurWidth = 0;
|
int32_t iCurWidth = 0;
|
||||||
int32_t iCurHeight = 0;
|
int32_t iCurHeight = 0;
|
||||||
EWelsNalUnitType eNalType = NAL_UNIT_UNSPEC_0;
|
EWelsNalUnitType eNalType = NAL_UNIT_UNSPEC_0;
|
||||||
@ -2903,12 +2903,12 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo * pFbi, const SSou
|
|||||||
iSpatialNum = pCtx->pVpp->BuildSpatialPicList (pCtx, pSrcPic);
|
iSpatialNum = pCtx->pVpp->BuildSpatialPicList (pCtx, pSrcPic);
|
||||||
if (iSpatialNum < 1) { // skip due to temporal layer settings (different frame rate)
|
if (iSpatialNum < 1) { // skip due to temporal layer settings (different frame rate)
|
||||||
++ pCtx->iCodingIndex;
|
++ pCtx->iCodingIndex;
|
||||||
pFbi->eOutputFrameType = WELS_FRAME_TYPE_SKIP;
|
pFbi->eOutputFrameType = videoFrameTypeSkip;
|
||||||
return ENC_RETURN_SUCCESS;
|
return ENC_RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
eFrameType = DecideFrameType (pCtx, iSpatialNum);
|
eFrameType = DecideFrameType (pCtx, iSpatialNum);
|
||||||
if (eFrameType == WELS_FRAME_TYPE_SKIP) {
|
if (eFrameType == videoFrameTypeSkip) {
|
||||||
pFbi->eOutputFrameType = eFrameType;
|
pFbi->eOutputFrameType = eFrameType;
|
||||||
return ENC_RETURN_SUCCESS;
|
return ENC_RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2921,7 +2921,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo * pFbi, const SSou
|
|||||||
|
|
||||||
pLayerBsInfo->pBsBuf = pCtx->pFrameBs ;
|
pLayerBsInfo->pBsBuf = pCtx->pFrameBs ;
|
||||||
|
|
||||||
if (eFrameType == WELS_FRAME_TYPE_IDR) {
|
if (eFrameType == videoFrameTypeIDR) {
|
||||||
++ pCtx->sPSOVector.uiIdrPicId;
|
++ pCtx->sPSOVector.uiIdrPicId;
|
||||||
//if ( pSvcParam->bEnableSSEI )
|
//if ( pSvcParam->bEnableSSEI )
|
||||||
|
|
||||||
@ -3006,9 +3006,9 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo * pFbi, const SSou
|
|||||||
(pSvcParam->bPrefixNalAddingCtrl ||
|
(pSvcParam->bPrefixNalAddingCtrl ||
|
||||||
(pSvcParam->iSpatialLayerNum > 1)));
|
(pSvcParam->iSpatialLayerNum > 1)));
|
||||||
|
|
||||||
if (eFrameType == WELS_FRAME_TYPE_P) {
|
if (eFrameType == videoFrameTypeP) {
|
||||||
eNalType = bAvcBased ? NAL_UNIT_CODED_SLICE : NAL_UNIT_CODED_SLICE_EXT;
|
eNalType = bAvcBased ? NAL_UNIT_CODED_SLICE : NAL_UNIT_CODED_SLICE_EXT;
|
||||||
} else if (eFrameType == WELS_FRAME_TYPE_IDR) {
|
} else if (eFrameType == videoFrameTypeIDR) {
|
||||||
eNalType = bAvcBased ? NAL_UNIT_CODED_SLICE_IDR : NAL_UNIT_CODED_SLICE_EXT;
|
eNalType = bAvcBased ? NAL_UNIT_CODED_SLICE_IDR : NAL_UNIT_CODED_SLICE_EXT;
|
||||||
}
|
}
|
||||||
if (iCurTid == 0 || pCtx->eSliceType == I_SLICE)
|
if (iCurTid == 0 || pCtx->eSliceType == I_SLICE)
|
||||||
@ -3037,7 +3037,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo * pFbi, const SSou
|
|||||||
ForceCodingIDR (pCtx);
|
ForceCodingIDR (pCtx);
|
||||||
WelsLog (pCtx, WELS_LOG_WARNING, "WelsEncoderEncodeExt(), WelsBuildRefList failed for P frames, pCtx->iNumRef0= %d. ForceCodingIDR!\n",
|
WelsLog (pCtx, WELS_LOG_WARNING, "WelsEncoderEncodeExt(), WelsBuildRefList failed for P frames, pCtx->iNumRef0= %d. ForceCodingIDR!\n",
|
||||||
pCtx->iNumRef0);
|
pCtx->iNumRef0);
|
||||||
pFbi->eOutputFrameType = WELS_FRAME_TYPE_IDR;
|
pFbi->eOutputFrameType = videoFrameTypeIDR;
|
||||||
pCtx->iEncoderError = ENC_RETURN_CORRECTED;
|
pCtx->iEncoderError = ENC_RETURN_CORRECTED;
|
||||||
return ENC_RETURN_CORRECTED;
|
return ENC_RETURN_CORRECTED;
|
||||||
}
|
}
|
||||||
@ -3338,7 +3338,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo * pFbi, const SSou
|
|||||||
(iSpatialIdx == 0) ? "#AU" : " ",
|
(iSpatialIdx == 0) ? "#AU" : " ",
|
||||||
pCtx->iPOC,
|
pCtx->iPOC,
|
||||||
pCtx->iFrameNum,
|
pCtx->iFrameNum,
|
||||||
(uiFrameType == WELS_FRAME_TYPE_I || uiFrameType == WELS_FRAME_TYPE_IDR) ? "I" : "P",
|
(uiFrameType == videoFrameTypeI || uiFrameType == videoFrameTypeIDR) ? "I" : "P",
|
||||||
iCurTid,
|
iCurTid,
|
||||||
iCurDid,
|
iCurDid,
|
||||||
0,
|
0,
|
||||||
@ -3452,7 +3452,7 @@ int32_t WelsEncoderEncodeExt (sWelsEncCtx* pCtx, SFrameBSInfo * pFbi, const SSou
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pSvcParam->bEnableLongTermReference && ((pCtx->pLtr[pCtx->uiDependencyId].bLTRMarkingFlag
|
if (pSvcParam->bEnableLongTermReference && ((pCtx->pLtr[pCtx->uiDependencyId].bLTRMarkingFlag
|
||||||
&& (pCtx->pLtr[pCtx->uiDependencyId].iLTRMarkMode == LTR_DIRECT_MARK)) || eFrameType == WELS_FRAME_TYPE_IDR)) {
|
&& (pCtx->pLtr[pCtx->uiDependencyId].iLTRMarkMode == LTR_DIRECT_MARK)) || eFrameType == videoFrameTypeIDR)) {
|
||||||
pCtx->bLongTermRefFlag[d_idx][iCurTid] = true;
|
pCtx->bLongTermRefFlag[d_idx][iCurTid] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -621,7 +621,7 @@ void WelsUpdateRefSyntax (sWelsEncCtx* pCtx, const int32_t iPOC, const int32_t u
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*syntax for dec_ref_pic_marking()*/
|
/*syntax for dec_ref_pic_marking()*/
|
||||||
if (WELS_FRAME_TYPE_IDR == uiFrameType) {
|
if (videoFrameTypeIDR == uiFrameType) {
|
||||||
pRefPicMark->bNoOutputOfPriorPicsFlag = false;
|
pRefPicMark->bNoOutputOfPriorPicsFlag = false;
|
||||||
pRefPicMark->bLongTermRefFlag = pCtx->pSvcParam->bEnableLongTermReference;
|
pRefPicMark->bLongTermRefFlag = pCtx->pSvcParam->bEnableLongTermReference;
|
||||||
} else {
|
} else {
|
||||||
|
@ -510,25 +510,8 @@ int CWelsH264SVCEncoder::EncodeFrame (const SSourcePicture* kpSrcPic, SFrameBSIn
|
|||||||
}
|
}
|
||||||
|
|
||||||
const int32_t kiEncoderReturn = EncodeFrameInternal(kpSrcPic, pBsInfo);
|
const int32_t kiEncoderReturn = EncodeFrameInternal(kpSrcPic, pBsInfo);
|
||||||
|
if(kiEncoderReturn != cmResultSuccess)
|
||||||
switch (kiEncoderReturn) {
|
return 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef REC_FRAME_COUNT
|
#ifdef REC_FRAME_COUNT
|
||||||
++ m_uiCountFrameNum;
|
++ m_uiCountFrameNum;
|
||||||
WelsLog (m_pEncContext, WELS_LOG_INFO,
|
WelsLog (m_pEncContext, WELS_LOG_INFO,
|
||||||
@ -544,47 +527,23 @@ int CWelsH264SVCEncoder::EncodeFrame (const SSourcePicture* kpSrcPic, SFrameBSIn
|
|||||||
|
|
||||||
int CWelsH264SVCEncoder::EncodeFrameInternal(const SSourcePicture* pSrcPic, SFrameBSInfo* pBsInfo) {
|
int CWelsH264SVCEncoder::EncodeFrameInternal(const SSourcePicture* pSrcPic, SFrameBSInfo* pBsInfo) {
|
||||||
if (!(pSrcPic && m_pEncContext && m_bInitialFlag) ){
|
if (!(pSrcPic && m_pEncContext && m_bInitialFlag) ){
|
||||||
return videoFrameTypeInvalid;
|
return cmInitParaError;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t iFrameTypeReturned = 0;
|
|
||||||
int32_t iFrameType = videoFrameTypeInvalid;
|
|
||||||
const int32_t kiEncoderReturn = WelsEncoderEncodeExt (m_pEncContext, pBsInfo, pSrcPic);
|
const int32_t kiEncoderReturn = WelsEncoderEncodeExt (m_pEncContext, pBsInfo, pSrcPic);
|
||||||
|
|
||||||
if(kiEncoderReturn == ENC_RETURN_MEMALLOCERR) {
|
if(kiEncoderReturn == ENC_RETURN_MEMALLOCERR) {
|
||||||
WelsUninitEncoderExt (&m_pEncContext);
|
WelsUninitEncoderExt (&m_pEncContext);
|
||||||
return videoFrameTypeInvalid;
|
return cmMallocMemeError;
|
||||||
}
|
}
|
||||||
else if((kiEncoderReturn != ENC_RETURN_SUCCESS)&&(kiEncoderReturn == ENC_RETURN_CORRECTED)){
|
else if((kiEncoderReturn != ENC_RETURN_SUCCESS)&&(kiEncoderReturn == ENC_RETURN_CORRECTED)){
|
||||||
WelsLog (m_pEncContext, WELS_LOG_ERROR, "unexpected return(%d) from EncodeFrameInternal()!\n", kiEncoderReturn);
|
WelsLog (m_pEncContext, WELS_LOG_ERROR, "unexpected return(%d) from EncodeFrameInternal()!\n", kiEncoderReturn);
|
||||||
return videoFrameTypeInvalid;
|
return cmUnkonwReason;
|
||||||
}
|
}
|
||||||
|
|
||||||
iFrameTypeReturned = pBsInfo->eOutputFrameType;
|
|
||||||
switch (iFrameTypeReturned) {
|
|
||||||
case WELS_FRAME_TYPE_P:
|
|
||||||
iFrameType = videoFrameTypeP;
|
|
||||||
break;
|
|
||||||
case WELS_FRAME_TYPE_IDR:
|
|
||||||
iFrameType = videoFrameTypeIDR;
|
|
||||||
break;
|
|
||||||
case WELS_FRAME_TYPE_SKIP:
|
|
||||||
iFrameType = videoFrameTypeSkip;
|
|
||||||
break;
|
|
||||||
case WELS_FRAME_TYPE_I:
|
|
||||||
iFrameType = videoFrameTypeI;
|
|
||||||
break;
|
|
||||||
case WELS_FRAME_TYPE_AUTO:
|
|
||||||
case WELS_FRAME_TYPE_B: // not support B pictures
|
|
||||||
iFrameType = videoFrameTypeInvalid;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pBsInfo->eOutputFrameType = iFrameType;
|
|
||||||
///////////////////for test
|
///////////////////for test
|
||||||
#ifdef OUTPUT_BIT_STREAM
|
#ifdef OUTPUT_BIT_STREAM
|
||||||
if (iFrameType != videoFrameTypeInvalid && iFrameType != videoFrameTypeSkip) {
|
if (pBsInfo->eOutputFrameType != videoFrameTypeInvalid && pBsInfo->eOutputFrameType != videoFrameTypeSkip) {
|
||||||
SLayerBSInfo* pLayer = NULL;
|
SLayerBSInfo* pLayer = NULL;
|
||||||
int32_t i = 0, j = 0, iCurLayerBits = 0, total_bits = 0;
|
int32_t i = 0, j = 0, iCurLayerBits = 0, total_bits = 0;
|
||||||
|
|
||||||
@ -629,7 +588,7 @@ int CWelsH264SVCEncoder::EncodeFrameInternal(const SSourcePicture* pSrcPic, SFr
|
|||||||
DumpSrcPicture (pSrcPicList[0]->pData[0]);
|
DumpSrcPicture (pSrcPicList[0]->pData[0]);
|
||||||
#endif // DUMP_SRC_PICTURE
|
#endif // DUMP_SRC_PICTURE
|
||||||
|
|
||||||
return kiEncoderReturn;
|
return cmResultSuccess;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user