remove parseonly in decoder ctx
This commit is contained in:
parent
60aaf48744
commit
926fc67451
@ -54,6 +54,11 @@ extern "C" {
|
||||
*/
|
||||
int32_t DecoderConfigParam (PWelsDecoderContext pCtx, const SDecodingParam* kpParam);
|
||||
|
||||
/*!
|
||||
* \brief fill in default values of decoder context
|
||||
*/
|
||||
void WelsDecoderDefaults (PWelsDecoderContext pCtx, SLogContext* pLogCtx);
|
||||
|
||||
/*!
|
||||
*************************************************************************************
|
||||
* \brief Initialize Wels decoder parameters and memory
|
||||
@ -68,7 +73,7 @@ int32_t DecoderConfigParam (PWelsDecoderContext pCtx, const SDecodingParam* kpPa
|
||||
* \note N/A
|
||||
*************************************************************************************
|
||||
*/
|
||||
int32_t WelsInitDecoder (PWelsDecoderContext pCtx, const bool bParseOnly, SLogContext* pLogCtx);
|
||||
int32_t WelsInitDecoder (PWelsDecoderContext pCtx, SLogContext* pLogCtx);
|
||||
|
||||
/*!
|
||||
*************************************************************************************
|
||||
@ -110,9 +115,9 @@ int32_t WelsRequestMem (PWelsDecoderContext pCtx, const int32_t kiMbWidth, const
|
||||
|
||||
|
||||
/*
|
||||
* free memory blocks in avc
|
||||
* free memory dynamically allocated during decoder
|
||||
*/
|
||||
void WelsFreeMem (PWelsDecoderContext pCtx);
|
||||
void WelsFreeDynamicMemory (PWelsDecoderContext pCtx);
|
||||
|
||||
/*!
|
||||
* \brief make sure synchonozization picture resolution (get from slice header) among different parts (i.e, memory related and so on)
|
||||
@ -125,7 +130,19 @@ void WelsFreeMem (PWelsDecoderContext pCtx);
|
||||
*/
|
||||
int32_t SyncPictureResolutionExt (PWelsDecoderContext pCtx, const int32_t kiMbWidth, const int32_t kiMbHeight);
|
||||
|
||||
void AssignFuncPointerForRec (PWelsDecoderContext pCtx);
|
||||
/*!
|
||||
* \brief init decoder predictive function pointers including ASM functions during MB reconstruction
|
||||
* \param pCtx Wels decoder context
|
||||
* \param uiCpuFlag cpu assembly indication
|
||||
*/
|
||||
void InitPredFunc (PWelsDecoderContext pCtx, uint32_t uiCpuFlag);
|
||||
|
||||
/*!
|
||||
* \brief init decoder internal function pointers including ASM functions
|
||||
* \param pCtx Wels decoder context
|
||||
* \param uiCpuFlag cpu assembly indication
|
||||
*/
|
||||
void InitDecFuncs (PWelsDecoderContext pCtx, uint32_t uiCpuFlag);
|
||||
|
||||
void GetVclNalTemporalId (PWelsDecoderContext pCtx); //get the info that whether or not have VCL NAL in current AU,
|
||||
//and if YES, get the temporal ID
|
||||
|
@ -375,7 +375,6 @@ typedef struct TagWelsDecoderContext {
|
||||
ERROR_CON_IDC eErrorConMethod; //
|
||||
|
||||
//for Parse only
|
||||
bool bParseOnly;
|
||||
bool bFramePending;
|
||||
bool bFrameFinish;
|
||||
int32_t iNalNum;
|
||||
|
@ -72,21 +72,21 @@ int32_t ExpandBsBuffer (PWelsDecoderContext pCtx, const int32_t kiSrcLen);
|
||||
int32_t CheckBsBuffer (PWelsDecoderContext pCtx, const int32_t kiSrcLen);
|
||||
|
||||
/*
|
||||
* WelsInitMemory
|
||||
* Memory request for introduced data
|
||||
* WelsInitStaticMemory
|
||||
* Memory request for introduced data at decoder start
|
||||
* Especially for:
|
||||
* rbsp_au_buffer, cur_dq_layer_ptr and ref_dq_layer_ptr in MB info cache.
|
||||
* return:
|
||||
* 0 - success; otherwise returned error_no defined in error_no.h.
|
||||
*/
|
||||
int32_t WelsInitMemory (PWelsDecoderContext pCtx);
|
||||
int32_t WelsInitStaticMemory (PWelsDecoderContext pCtx);
|
||||
|
||||
/*
|
||||
* WelsFreeMemory
|
||||
* Free memory introduced in WelsInitMemory at destruction of decoder.
|
||||
* WelsFreeStaticMemory
|
||||
* Free memory introduced in WelsInitStaticMemory at destruction of decoder.
|
||||
*
|
||||
*/
|
||||
void WelsFreeMemory (PWelsDecoderContext pCtx);
|
||||
void WelsFreeStaticMemory (PWelsDecoderContext pCtx);
|
||||
|
||||
/*!
|
||||
* \brief request memory when maximal picture width and height are available
|
||||
|
@ -317,7 +317,7 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade
|
||||
iNalSize -= NAL_UNIT_HEADER_EXT_SIZE;
|
||||
*pConsumedBytes += NAL_UNIT_HEADER_EXT_SIZE;
|
||||
|
||||
if (pCtx->bParseOnly) {
|
||||
if (pCtx->pParam->bParseOnly) {
|
||||
pCurNal->sNalData.sVclNal.pNalPos = pSavedData->pCurPos;
|
||||
int32_t iTrailingZeroByte = 0;
|
||||
while (pSrcNal[iSrcNalLen - iTrailingZeroByte - 1] == 0x0) //remove final trailing 0 bytes
|
||||
@ -346,7 +346,7 @@ uint8_t* ParseNalHeader (PWelsDecoderContext pCtx, SNalUnitHeader* pNalUnitHeade
|
||||
pSavedData->pCurPos += iActualLen - iOffset;
|
||||
}
|
||||
} else {
|
||||
if (pCtx->bParseOnly) {
|
||||
if (pCtx->pParam->bParseOnly) {
|
||||
pCurNal->sNalData.sVclNal.pNalPos = pSavedData->pCurPos;
|
||||
int32_t iTrailingZeroByte = 0;
|
||||
while (pSrcNal[iSrcNalLen - iTrailingZeroByte - 1] == 0x0) //remove final trailing 0 bytes
|
||||
@ -1119,7 +1119,7 @@ int32_t ParseSps (PWelsDecoderContext pCtx, PBitStringAux pBsAux, int32_t* pPicW
|
||||
WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //vui_parameters_present_flag
|
||||
pSps->bVuiParamPresentFlag = !!uiCode;
|
||||
|
||||
if (pCtx->bParseOnly) {
|
||||
if (pCtx->pParam->bParseOnly) {
|
||||
if (kSrcNalLen >= SPS_PPS_BS_SIZE - 4) { //sps bs exceeds!
|
||||
pCtx->iErrorCode |= dsOutOfMemory;
|
||||
return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_OUT_OF_MEMORY);
|
||||
@ -1422,7 +1422,7 @@ int32_t ParsePps (PWelsDecoderContext pCtx, PPps pPpsList, PBitStringAux pBsAux,
|
||||
memcpy (&pCtx->sPpsBuffer[uiPpsId], pPps, sizeof (SPps));
|
||||
pCtx->bPpsAvailFlags[uiPpsId] = true;
|
||||
}
|
||||
if (pCtx->bParseOnly) {
|
||||
if (pCtx->pParam->bParseOnly) {
|
||||
if (kSrcNalLen >= SPS_PPS_BS_SIZE - 4) { //pps bs exceeds
|
||||
pCtx->iErrorCode |= dsOutOfMemory;
|
||||
return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_OUT_OF_MEMORY);
|
||||
|
@ -90,7 +90,7 @@ int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!pCtx->bParseOnly) { //for parse only, actual recon MB unnecessary
|
||||
if (!pCtx->pParam->bParseOnly) { //for parse only, actual recon MB unnecessary
|
||||
if (WelsTargetMbConstruction (pCtx)) {
|
||||
WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING,
|
||||
"WelsTargetSliceConstruction():::MB(%d, %d) construction error. pCurSlice_type:%d",
|
||||
@ -134,7 +134,7 @@ int32_t WelsTargetSliceConstruction (PWelsDecoderContext pCtx) {
|
||||
if ((pCurSlice->eSliceType != I_SLICE) && (pCurSlice->eSliceType != P_SLICE))
|
||||
return 0;
|
||||
|
||||
if (pCtx->bParseOnly) //for parse only, deblocking should not go on
|
||||
if (pCtx->pParam->bParseOnly) //for parse only, deblocking should not go on
|
||||
return 0;
|
||||
|
||||
pDeblockMb = WelsDeblockingMb;
|
||||
|
@ -272,14 +272,13 @@ void DestroyPicBuff (PPicBuff* ppPicBuf, CMemoryAlign* pMa) {
|
||||
pPicBuf = NULL;
|
||||
*ppPicBuf = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* fill data fields in default for decoder context
|
||||
*/
|
||||
void WelsDecoderDefaults (PWelsDecoderContext pCtx, SLogContext* pLogCtx, CMemoryAlign* pMa) {
|
||||
void WelsDecoderDefaults (PWelsDecoderContext pCtx, SLogContext* pLogCtx) {
|
||||
int32_t iCpuCores = 1;
|
||||
memset (pCtx, 0, sizeof (SWelsDecoderContext)); // fill zero first
|
||||
pCtx->sLogCtx = *pLogCtx;
|
||||
pCtx->pMemAlign = pMa;
|
||||
|
||||
pCtx->pArgDec = NULL;
|
||||
|
||||
@ -441,18 +440,20 @@ int32_t WelsRequestMem (PWelsDecoderContext pCtx, const int32_t kiMbWidth, const
|
||||
}
|
||||
|
||||
/*
|
||||
* free memory blocks in avc
|
||||
* free memory dynamically allocated during decoder
|
||||
*/
|
||||
void WelsFreeMem (PWelsDecoderContext pCtx) {
|
||||
void WelsFreeDynamicMemory (PWelsDecoderContext pCtx) {
|
||||
int32_t iListIdx = 0;
|
||||
CMemoryAlign* pMa = pCtx->pMemAlign;
|
||||
|
||||
/* TODO: free memory blocks introduced in avc */
|
||||
//free dq layer memory
|
||||
UninitialDqLayersContext (pCtx);
|
||||
|
||||
//free FMO memory
|
||||
ResetFmoList (pCtx);
|
||||
|
||||
//free ref-pic list & picture memory
|
||||
WelsResetRefPic (pCtx);
|
||||
|
||||
// for sPicBuff
|
||||
for (iListIdx = LIST_0; iListIdx < LIST_A; ++ iListIdx) {
|
||||
PPicBuff* pPicBuff = &pCtx->pPicBuff[iListIdx];
|
||||
if (NULL != pPicBuff && NULL != *pPicBuff) {
|
||||
@ -467,6 +468,8 @@ void WelsFreeMem (PWelsDecoderContext pCtx) {
|
||||
pCtx->iLastImgHeightInPixel = 0;
|
||||
pCtx->bFreezeOutput = true;
|
||||
pCtx->bHaveGotMemory = false;
|
||||
|
||||
//free CABAC memory
|
||||
pMa->WelsFree (pCtx->pCabacDecEngine, "pCtx->pCabacDecEngine");
|
||||
}
|
||||
|
||||
@ -474,19 +477,15 @@ void WelsFreeMem (PWelsDecoderContext pCtx) {
|
||||
* \brief Open decoder
|
||||
*/
|
||||
int32_t WelsOpenDecoder (PWelsDecoderContext pCtx) {
|
||||
// function pointers
|
||||
//initial MC function pointer--
|
||||
int iRet = ERR_NONE;
|
||||
InitMcFunc (& (pCtx->sMcFunc), pCtx->uiCpuFlag);
|
||||
|
||||
InitExpandPictureFunc (& (pCtx->sExpandPicFunc), pCtx->uiCpuFlag);
|
||||
AssignFuncPointerForRec (pCtx);
|
||||
// function pointers
|
||||
InitDecFuncs (pCtx, pCtx->uiCpuFlag);
|
||||
|
||||
// vlc tables
|
||||
InitVlcTable (&pCtx->sVlcTable);
|
||||
|
||||
// startup memory
|
||||
iRet = WelsInitMemory (pCtx);
|
||||
// static memory
|
||||
iRet = WelsInitStaticMemory (pCtx);
|
||||
if (ERR_NONE != iRet)
|
||||
return iRet;
|
||||
|
||||
@ -506,11 +505,9 @@ int32_t WelsOpenDecoder (PWelsDecoderContext pCtx) {
|
||||
* \brief Close decoder
|
||||
*/
|
||||
void WelsCloseDecoder (PWelsDecoderContext pCtx) {
|
||||
WelsFreeMem (pCtx);
|
||||
WelsFreeDynamicMemory (pCtx);
|
||||
|
||||
WelsFreeMemory (pCtx);
|
||||
|
||||
UninitialDqLayersContext (pCtx);
|
||||
WelsFreeStaticMemory (pCtx);
|
||||
|
||||
#ifdef LONG_TERM_REF
|
||||
pCtx->bParamSetsLostFlag = false;
|
||||
@ -539,7 +536,7 @@ int32_t DecoderConfigParam (PWelsDecoderContext pCtx, const SDecodingParam* kpPa
|
||||
}
|
||||
pCtx->eErrorConMethod = pCtx->pParam->eEcActiveIdc;
|
||||
|
||||
if (pCtx->bParseOnly) //parse only, disable EC method
|
||||
if (pCtx->pParam->bParseOnly) //parse only, disable EC method
|
||||
pCtx->eErrorConMethod = ERROR_CON_DISABLE;
|
||||
InitErrorCon (pCtx);
|
||||
|
||||
@ -567,15 +564,11 @@ int32_t DecoderConfigParam (PWelsDecoderContext pCtx, const SDecodingParam* kpPa
|
||||
* \note N/A
|
||||
*************************************************************************************
|
||||
*/
|
||||
int32_t WelsInitDecoder (PWelsDecoderContext pCtx, const bool bParseOnly, SLogContext* pLogCtx) {
|
||||
int32_t WelsInitDecoder (PWelsDecoderContext pCtx, SLogContext* pLogCtx) {
|
||||
if (pCtx == NULL) {
|
||||
return ERR_INFO_INVALID_PTR;
|
||||
}
|
||||
|
||||
// default
|
||||
WelsDecoderDefaults (pCtx, pLogCtx, pCtx->pMemAlign);
|
||||
|
||||
pCtx->bParseOnly = bParseOnly;
|
||||
// open decoder
|
||||
return WelsOpenDecoder (pCtx);
|
||||
}
|
||||
@ -652,7 +645,7 @@ int32_t WelsDecodeBs (PWelsDecoderContext pCtx, const uint8_t* kpBsBuf, const in
|
||||
pRawData->pCurPos = pRawData->pHead;
|
||||
}
|
||||
|
||||
if (pCtx->bParseOnly) {
|
||||
if (pCtx->pParam->bParseOnly) {
|
||||
pSavedData = &pCtx->sSavedData;
|
||||
if ((kiBsLen + 4) > (pSavedData->pEnd - pSavedData->pCurPos)) {
|
||||
pSavedData->pCurPos = pSavedData->pHead;
|
||||
@ -847,7 +840,15 @@ int32_t SyncPictureResolutionExt (PWelsDecoderContext pCtx, const int32_t kiMbWi
|
||||
return iErr;
|
||||
}
|
||||
|
||||
void AssignFuncPointerForRec (PWelsDecoderContext pCtx) {
|
||||
void InitDecFuncs (PWelsDecoderContext pCtx, uint32_t uiCpuFlag) {
|
||||
WelsBlockFuncInit (&pCtx->sBlockFunc, uiCpuFlag);
|
||||
InitPredFunc (pCtx, uiCpuFlag);
|
||||
InitMcFunc (& (pCtx->sMcFunc), uiCpuFlag);
|
||||
InitExpandPictureFunc (& (pCtx->sExpandPicFunc), uiCpuFlag);
|
||||
DeblockingInit (&pCtx->sDeblockingFunc, uiCpuFlag);
|
||||
}
|
||||
|
||||
void InitPredFunc (PWelsDecoderContext pCtx, uint32_t uiCpuFlag) {
|
||||
pCtx->pGetI16x16LumaPredFunc[I16_PRED_V ] = WelsI16x16LumaPredV_c;
|
||||
pCtx->pGetI16x16LumaPredFunc[I16_PRED_H ] = WelsI16x16LumaPredH_c;
|
||||
pCtx->pGetI16x16LumaPredFunc[I16_PRED_DC ] = WelsI16x16LumaPredDc_c;
|
||||
@ -899,7 +900,7 @@ void AssignFuncPointerForRec (PWelsDecoderContext pCtx) {
|
||||
pCtx->pIdctResAddPredFunc8x8 = IdctResAddPred8x8_c;
|
||||
|
||||
#if defined(HAVE_NEON)
|
||||
if (pCtx->uiCpuFlag & WELS_CPU_NEON) {
|
||||
if (uiCpuFlag & WELS_CPU_NEON) {
|
||||
pCtx->pIdctResAddPredFunc = IdctResAddPred_neon;
|
||||
|
||||
pCtx->pGetI16x16LumaPredFunc[I16_PRED_DC] = WelsDecoderI16x16LumaPredDc_neon;
|
||||
@ -924,7 +925,7 @@ void AssignFuncPointerForRec (PWelsDecoderContext pCtx) {
|
||||
#endif//HAVE_NEON
|
||||
|
||||
#if defined(HAVE_NEON_AARCH64)
|
||||
if (pCtx->uiCpuFlag & WELS_CPU_NEON) {
|
||||
if (uiCpuFlag & WELS_CPU_NEON) {
|
||||
pCtx->pIdctResAddPredFunc = IdctResAddPred_AArch64_neon;
|
||||
|
||||
pCtx->pGetI16x16LumaPredFunc[I16_PRED_DC] = WelsDecoderI16x16LumaPredDc_AArch64_neon;
|
||||
@ -954,7 +955,7 @@ void AssignFuncPointerForRec (PWelsDecoderContext pCtx) {
|
||||
#endif//HAVE_NEON_AARCH64
|
||||
|
||||
#if defined(X86_ASM)
|
||||
if (pCtx->uiCpuFlag & WELS_CPU_MMXEXT) {
|
||||
if (uiCpuFlag & WELS_CPU_MMXEXT) {
|
||||
pCtx->pIdctResAddPredFunc = IdctResAddPred_mmx;
|
||||
|
||||
///////mmx code opt---
|
||||
@ -969,7 +970,7 @@ void AssignFuncPointerForRec (PWelsDecoderContext pCtx) {
|
||||
pCtx->pGetI4x4LumaPredFunc[I4_PRED_DDL] = WelsDecoderI4x4LumaPredDDL_mmx;
|
||||
pCtx->pGetI4x4LumaPredFunc[I4_PRED_VL ] = WelsDecoderI4x4LumaPredVL_mmx;
|
||||
}
|
||||
if (pCtx->uiCpuFlag & WELS_CPU_SSE2) {
|
||||
if (uiCpuFlag & WELS_CPU_SSE2) {
|
||||
/////////sse2 code opt---
|
||||
pCtx->pGetI16x16LumaPredFunc[I16_PRED_DC] = WelsDecoderI16x16LumaPredDc_sse2;
|
||||
pCtx->pGetI16x16LumaPredFunc[I16_PRED_P] = WelsDecoderI16x16LumaPredPlane_sse2;
|
||||
@ -983,9 +984,6 @@ void AssignFuncPointerForRec (PWelsDecoderContext pCtx) {
|
||||
pCtx->pGetI4x4LumaPredFunc[I4_PRED_H] = WelsDecoderI4x4LumaPredH_sse2;
|
||||
}
|
||||
#endif
|
||||
DeblockingInit (&pCtx->sDeblockingFunc, pCtx->uiCpuFlag);
|
||||
|
||||
WelsBlockFuncInit (&pCtx->sBlockFunc, pCtx->uiCpuFlag);
|
||||
}
|
||||
|
||||
//reset decoder number related statistics info
|
||||
|
@ -72,7 +72,7 @@ static inline int32_t DecodeFrameConstruction (PWelsDecoderContext pCtx, uint8_t
|
||||
}
|
||||
}
|
||||
|
||||
if (pCtx->bParseOnly) { //should exit for parse only to prevent access NULL pDstInfo
|
||||
if (pCtx->pParam->bParseOnly) { //should exit for parse only to prevent access NULL pDstInfo
|
||||
PAccessUnit pCurAu = pCtx->pAccessUnitList;
|
||||
if (dsErrorFree == pCtx->iErrorCode) { //correct decoding, add to data buffer
|
||||
SParserBsInfo* pParser = pCtx->pParserBsInfo;
|
||||
@ -467,7 +467,7 @@ int32_t InitBsBuffer (PWelsDecoderContext pCtx) {
|
||||
}
|
||||
pCtx->sRawData.pStartPos = pCtx->sRawData.pCurPos = pCtx->sRawData.pHead;
|
||||
pCtx->sRawData.pEnd = pCtx->sRawData.pHead + pCtx->iMaxBsBufferSizeInByte;
|
||||
if (pCtx->bParseOnly) {
|
||||
if (pCtx->pParam->bParseOnly) {
|
||||
pCtx->pParserBsInfo = static_cast<SParserBsInfo*> (pMa->WelsMallocz (sizeof (SParserBsInfo), "pCtx->pParserBsInfo"));
|
||||
if (pCtx->pParserBsInfo == NULL) {
|
||||
return ERR_INFO_OUT_OF_MEMORY;
|
||||
@ -538,14 +538,14 @@ int32_t CheckBsBuffer (PWelsDecoderContext pCtx, const int32_t kiSrcLen) {
|
||||
}
|
||||
|
||||
/*
|
||||
* WelsInitMemory
|
||||
* WelsInitStaticMemory
|
||||
* Memory request for new introduced data
|
||||
* Especially for:
|
||||
* rbsp_au_buffer, cur_dq_layer_ptr and ref_dq_layer_ptr in MB info cache.
|
||||
* return:
|
||||
* 0 - success; otherwise returned error_no defined in error_no.h.
|
||||
*/
|
||||
int32_t WelsInitMemory (PWelsDecoderContext pCtx) {
|
||||
int32_t WelsInitStaticMemory (PWelsDecoderContext pCtx) {
|
||||
if (pCtx == NULL) {
|
||||
return ERR_INFO_INVALID_PTR;
|
||||
}
|
||||
@ -563,22 +563,16 @@ int32_t WelsInitMemory (PWelsDecoderContext pCtx) {
|
||||
}
|
||||
|
||||
/*
|
||||
* WelsFreeMemory
|
||||
* Free memory introduced in WelsInitMemory at destruction of decoder.
|
||||
* WelsFreeStaticMemory
|
||||
* Free memory introduced in WelsInitStaticMemory at destruction of decoder.
|
||||
*
|
||||
*/
|
||||
void WelsFreeMemory (PWelsDecoderContext pCtx) {
|
||||
void WelsFreeStaticMemory (PWelsDecoderContext pCtx) {
|
||||
if (pCtx == NULL)
|
||||
return;
|
||||
|
||||
CMemoryAlign* pMa = pCtx->pMemAlign;
|
||||
|
||||
if (NULL != pCtx->pParam) {
|
||||
pMa->WelsFree (pCtx->pParam, "pCtx->pParam");
|
||||
|
||||
pCtx->pParam = NULL;
|
||||
}
|
||||
|
||||
MemFreeNalList (&pCtx->pAccessUnitList, pMa);
|
||||
|
||||
if (pCtx->sRawData.pHead) {
|
||||
@ -588,7 +582,7 @@ void WelsFreeMemory (PWelsDecoderContext pCtx) {
|
||||
pCtx->sRawData.pEnd = NULL;
|
||||
pCtx->sRawData.pStartPos = NULL;
|
||||
pCtx->sRawData.pCurPos = NULL;
|
||||
if (pCtx->bParseOnly) {
|
||||
if (pCtx->pParam->bParseOnly) {
|
||||
if (pCtx->sSavedData.pHead) {
|
||||
pMa->WelsFree (pCtx->sSavedData.pHead, "pCtx->sSavedData->pHead");
|
||||
}
|
||||
@ -605,6 +599,12 @@ void WelsFreeMemory (PWelsDecoderContext pCtx) {
|
||||
pCtx->pParserBsInfo = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (NULL != pCtx->pParam) {
|
||||
pMa->WelsFree (pCtx->pParam, "pCtx->pParam");
|
||||
|
||||
pCtx->pParam = NULL;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* DecodeNalHeaderExt
|
||||
@ -723,8 +723,9 @@ int32_t ParseSliceHeaderSyntaxs (PWelsDecoderContext pCtx, PBitStringAux pBs, co
|
||||
pSliceHead->eSliceType = static_cast <EWelsSliceType> (uiSliceType);
|
||||
|
||||
WELS_READ_VERIFY (BsGetUe (pBs, &uiCode)); //pic_parameter_set_id
|
||||
WELS_CHECK_SE_UPPER_ERROR (uiCode, (MAX_PPS_COUNT - 1), "iPpsId out of range", GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER,
|
||||
ERR_INFO_PPS_ID_OVERFLOW));
|
||||
WELS_CHECK_SE_UPPER_ERROR (uiCode, (MAX_PPS_COUNT - 1), "iPpsId out of range",
|
||||
GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER,
|
||||
ERR_INFO_PPS_ID_OVERFLOW));
|
||||
iPpsId = uiCode;
|
||||
|
||||
//add check PPS available here
|
||||
@ -1974,7 +1975,7 @@ int32_t ConstructAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, SBufferI
|
||||
|
||||
if (ERR_NONE != iErr) {
|
||||
ForceResetCurrentAccessUnit (pCtx->pAccessUnitList);
|
||||
if (!pCtx->bParseOnly)
|
||||
if (!pCtx->pParam->bParseOnly)
|
||||
pDstInfo->iBufferStatus = 0;
|
||||
pCtx->bNewSeqBegin = pCtx->bNewSeqBegin || pCtx->bNextNewSeqBegin;
|
||||
pCtx->bNextNewSeqBegin = false; // reset it
|
||||
@ -2339,7 +2340,7 @@ int32_t DecodeCurrentAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, SBuf
|
||||
|
||||
if (dq_cur->uiLayerDqId == kuiTargetLayerDqId) {
|
||||
if (!pCtx->bInstantDecFlag) {
|
||||
if (!pCtx->bParseOnly) {
|
||||
if (!pCtx->pParam->bParseOnly) {
|
||||
//Do error concealment here
|
||||
if ((NeedErrorCon (pCtx)) && (pCtx->eErrorConMethod != ERROR_CON_DISABLE)) {
|
||||
ImplementErrorCon (pCtx);
|
||||
@ -2365,7 +2366,7 @@ int32_t DecodeCurrentAccessUnit (PWelsDecoderContext pCtx, uint8_t** ppDst, SBuf
|
||||
return iRet;
|
||||
}
|
||||
}
|
||||
if (!pCtx->bParseOnly)
|
||||
if (!pCtx->pParam->bParseOnly)
|
||||
ExpandReferencingPicture (pCtx->pDec->pData, pCtx->pDec->iWidthInPixel, pCtx->pDec->iHeightInPixel,
|
||||
pCtx->pDec->iLinesize,
|
||||
pCtx->sExpandPicFunc.pfExpandLumaPicture, pCtx->sExpandPicFunc.pfExpandChromaPicture);
|
||||
@ -2421,7 +2422,7 @@ bool CheckAndFinishLastPic (PWelsDecoderContext pCtx, uint8_t** ppDst, SBufferIn
|
||||
if (pCtx->sLastNalHdrExt.sNalUnitHeader.uiNalRefIdc > 0) {
|
||||
MarkECFrameAsRef (pCtx);
|
||||
}
|
||||
} else if (pCtx->bParseOnly) { //clear parse only internal data status
|
||||
} else if (pCtx->pParam->bParseOnly) { //clear parse only internal data status
|
||||
pCtx->pParserBsInfo->iNalNum = 0;
|
||||
pCtx->bFrameFinish = true; //clear frame pending status here!
|
||||
} else {
|
||||
|
@ -83,7 +83,7 @@ PPicture AllocPicture (PWelsDecoderContext pCtx, const int32_t kiPicWidth, const
|
||||
iLumaSize = iPicWidth * iPicHeight;
|
||||
iChromaSize = iPicChromaWidth * iPicChromaHeight;
|
||||
|
||||
if (pCtx->bParseOnly) {
|
||||
if (pCtx->pParam->bParseOnly) {
|
||||
pPic->pBuffer[0] = pPic->pBuffer[1] = pPic->pBuffer[2] = NULL;
|
||||
pPic->pData[0] = pPic->pData[1] = pPic->pData[2] = NULL;
|
||||
pPic->iLinesize[0] = iPicWidth;
|
||||
|
@ -243,6 +243,7 @@ int32_t CWelsDecoder::InitDecoder (const SDecodingParam* pParam) {
|
||||
"CWelsDecoder::init_decoder(), openh264 codec version = %s, ParseOnly = %d",
|
||||
VERSION_NUMBER, (int32_t)pParam->bParseOnly);
|
||||
|
||||
//reset decoder context
|
||||
if (m_pDecContext) //free
|
||||
UninitDecoder();
|
||||
m_pDecContext = (PWelsDecoderContext)WelsMallocz (sizeof (SWelsDecoderContext), "m_pDecContext");
|
||||
@ -252,8 +253,8 @@ int32_t CWelsDecoder::InitDecoder (const SDecodingParam* pParam) {
|
||||
m_pDecContext->pMemAlign = new CMemoryAlign (iCacheLineSize);
|
||||
WELS_VERIFY_RETURN_PROC_IF (1, (NULL == m_pDecContext->pMemAlign), UninitDecoder())
|
||||
|
||||
WELS_VERIFY_RETURN_PROC_IF (cmInitParaError, WelsInitDecoder (m_pDecContext, pParam->bParseOnly,
|
||||
&m_pWelsTrace->m_sLogCtx), UninitDecoder())
|
||||
//fill in default value into context
|
||||
WelsDecoderDefaults (m_pDecContext, &m_pWelsTrace->m_sLogCtx);
|
||||
|
||||
//check param and update decoder context
|
||||
m_pDecContext->pParam = (SDecodingParam*) m_pDecContext->pMemAlign->WelsMallocz (sizeof (SDecodingParam),
|
||||
@ -262,6 +263,9 @@ int32_t CWelsDecoder::InitDecoder (const SDecodingParam* pParam) {
|
||||
int32_t iRet = DecoderConfigParam (m_pDecContext, pParam);
|
||||
WELS_VERIFY_RETURN_IFNEQ (iRet, cmResultSuccess);
|
||||
|
||||
//init decoder
|
||||
WELS_VERIFY_RETURN_PROC_IF (cmInitParaError, WelsInitDecoder (m_pDecContext, &m_pWelsTrace->m_sLogCtx), UninitDecoder())
|
||||
|
||||
return cmResultSuccess;
|
||||
}
|
||||
|
||||
@ -304,7 +308,7 @@ long CWelsDecoder::SetOption (DECODER_OPTION eOptID, void* pOption) {
|
||||
|
||||
iVal = * ((int*)pOption); // int value for error concealment idc
|
||||
iVal = WELS_CLIP3 (iVal, (int32_t) ERROR_CON_DISABLE, (int32_t) ERROR_CON_SLICE_MV_COPY_CROSS_IDR_FREEZE_RES_CHANGE);
|
||||
if ((m_pDecContext->bParseOnly) && (iVal != (int32_t) ERROR_CON_DISABLE)) {
|
||||
if ((m_pDecContext->pParam->bParseOnly) && (iVal != (int32_t) ERROR_CON_DISABLE)) {
|
||||
WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_INFO,
|
||||
"CWelsDecoder::SetOption for ERROR_CON_IDC = %d not allowd for parse only!.", iVal);
|
||||
return cmInitParaError;
|
||||
@ -438,7 +442,7 @@ DECODING_STATE CWelsDecoder::DecodeFrame2 (const unsigned char* kpSrc,
|
||||
const int kiSrcLen,
|
||||
unsigned char** ppDst,
|
||||
SBufferInfo* pDstInfo) {
|
||||
if (m_pDecContext->bParseOnly) {
|
||||
if (m_pDecContext->pParam->bParseOnly) {
|
||||
WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_ERROR, "bParseOnly should be false for this API calling! \n");
|
||||
m_pDecContext->iErrorCode |= dsInvalidArgument;
|
||||
return dsInvalidArgument;
|
||||
@ -583,7 +587,7 @@ DECODING_STATE CWelsDecoder::DecodeFrame2 (const unsigned char* kpSrc,
|
||||
DECODING_STATE CWelsDecoder::DecodeParser (const unsigned char* kpSrc,
|
||||
const int kiSrcLen,
|
||||
SParserBsInfo* pDstInfo) {
|
||||
if (!m_pDecContext->bParseOnly) {
|
||||
if (!m_pDecContext->pParam->bParseOnly) {
|
||||
WelsLog (&m_pWelsTrace->m_sLogCtx, WELS_LOG_ERROR, "bParseOnly should be true for this API calling! \n");
|
||||
m_pDecContext->iErrorCode |= dsInvalidArgument;
|
||||
return dsInvalidArgument;
|
||||
|
@ -26,6 +26,8 @@ class DecoderInterfaceTest : public ::testing::Test {
|
||||
}
|
||||
//Init members
|
||||
void Init();
|
||||
//Init valid members
|
||||
void ValidInit();
|
||||
//Uninit members
|
||||
void Uninit();
|
||||
//Mock input data for test
|
||||
@ -94,6 +96,24 @@ void DecoderInterfaceTest::Init() {
|
||||
ASSERT_EQ (eRet, cmResultSuccess);
|
||||
}
|
||||
|
||||
void DecoderInterfaceTest::ValidInit() {
|
||||
memset (&m_sBufferInfo, 0, sizeof (SBufferInfo));
|
||||
memset (&m_sDecParam, 0, sizeof (SDecodingParam));
|
||||
m_sDecParam.pFileNameRestructed = NULL;
|
||||
m_sDecParam.uiCpuLoad = 1;
|
||||
m_sDecParam.uiTargetDqLayer = 1;
|
||||
m_sDecParam.eEcActiveIdc = (ERROR_CON_IDC) (rand() & 7);
|
||||
m_sDecParam.sVideoProperty.size = sizeof (SVideoProperty);
|
||||
m_sDecParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
|
||||
|
||||
m_pData[0] = m_pData[1] = m_pData[2] = NULL;
|
||||
m_szBuffer[0] = m_szBuffer[1] = m_szBuffer[2] = 0;
|
||||
m_szBuffer[3] = 1;
|
||||
m_iBufLength = 4;
|
||||
CM_RETURN eRet = (CM_RETURN) m_pDec->Initialize (&m_sDecParam);
|
||||
ASSERT_EQ (eRet, cmResultSuccess);
|
||||
}
|
||||
|
||||
void DecoderInterfaceTest::Uninit() {
|
||||
if (m_pDec) {
|
||||
CM_RETURN eRet = (CM_RETURN) m_pDec->Uninitialize();
|
||||
@ -310,7 +330,7 @@ void DecoderInterfaceTest::TestEndOfStream() {
|
||||
int iTmp, iOut;
|
||||
CM_RETURN eRet;
|
||||
|
||||
Init();
|
||||
ValidInit();
|
||||
|
||||
//invalid input
|
||||
eRet = (CM_RETURN) m_pDec->SetOption (DECODER_OPTION_END_OF_STREAM, NULL);
|
||||
@ -372,7 +392,7 @@ void DecoderInterfaceTest::TestVclNal() {
|
||||
int iTmp, iOut;
|
||||
CM_RETURN eRet;
|
||||
|
||||
Init();
|
||||
ValidInit();
|
||||
|
||||
//Test SetOption
|
||||
//VclNal never supports SetOption
|
||||
@ -481,7 +501,7 @@ void DecoderInterfaceTest::TestGetDecStatistics() {
|
||||
SDecoderStatistics sDecStatic;
|
||||
int32_t iError = 0;
|
||||
|
||||
Init();
|
||||
ValidInit();
|
||||
// setoption not support,
|
||||
eRet = (CM_RETURN)m_pDec->SetOption (DECODER_OPTION_GET_STATISTICS, NULL);
|
||||
EXPECT_EQ (eRet, cmInitParaError);
|
||||
@ -504,7 +524,7 @@ void DecoderInterfaceTest::TestGetDecStatistics() {
|
||||
Uninit();
|
||||
|
||||
//Decoder error bs when the first IDR lost
|
||||
Init();
|
||||
ValidInit();
|
||||
iError = 2;
|
||||
m_pDec->SetOption (DECODER_OPTION_ERROR_CON_IDC, &iError);
|
||||
DecoderBs ("res/BA_MW_D_IDR_LOST.264");
|
||||
@ -522,7 +542,7 @@ void DecoderInterfaceTest::TestGetDecStatistics() {
|
||||
Uninit();
|
||||
|
||||
//ecoder error bs when the first P lost
|
||||
Init();
|
||||
ValidInit();
|
||||
iError = 2;
|
||||
m_pDec->SetOption (DECODER_OPTION_ERROR_CON_IDC, &iError);
|
||||
|
||||
@ -543,7 +563,7 @@ void DecoderInterfaceTest::TestGetDecStatistics() {
|
||||
//EC enable
|
||||
|
||||
//EC Off UT just correc bitstream
|
||||
Init();
|
||||
ValidInit();
|
||||
iError = 0;
|
||||
m_pDec->SetOption (DECODER_OPTION_ERROR_CON_IDC, &iError);
|
||||
DecoderBs ("res/test_vd_1d.264");
|
||||
|
@ -86,13 +86,16 @@ int32_t InitDecoder (const SDecodingParam* pParam, PWelsDecoderContext pCtx, SLo
|
||||
return cmMallocMemeError;
|
||||
}
|
||||
|
||||
WELS_VERIFY_RETURN_PROC_IF (cmInitParaError, WelsInitDecoder (pCtx, pParam->bParseOnly, pLogCtx), UninitDecoder (pCtx));
|
||||
pCtx->sLogCtx = *pLogCtx;
|
||||
|
||||
//check param and update decoder context
|
||||
pCtx->pParam = (SDecodingParam*) pCtx->pMemAlign->WelsMallocz (sizeof (SDecodingParam), "SDecodingParam");
|
||||
WELS_VERIFY_RETURN_PROC_IF (cmMallocMemeError, (NULL == pCtx->pParam), UninitDecoder (pCtx));
|
||||
int32_t iRet = DecoderConfigParam (pCtx, pCtx->pParam);
|
||||
int32_t iRet = DecoderConfigParam (pCtx, pParam);
|
||||
WELS_VERIFY_RETURN_IFNEQ (iRet, cmResultSuccess);
|
||||
|
||||
WELS_VERIFY_RETURN_PROC_IF (cmInitParaError, WelsInitDecoder (pCtx, pLogCtx), UninitDecoder (pCtx));
|
||||
|
||||
return cmResultSuccess;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user