fixing OverallMbMap for slice_idx>255 and some log improvements
This commit is contained in:
parent
08baf65251
commit
54c677cdd7
@ -42,6 +42,7 @@
|
|||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
#include "typedefs.h"
|
#include "typedefs.h"
|
||||||
|
|
||||||
|
|
||||||
@ -273,8 +274,36 @@ static inline bool WELS_POWER2_IF (uint32_t v) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline bool CheckInRangeCloseOpen (const int16_t kiCurrent, const int16_t kiMin, const int16_t kiMax) {
|
inline bool CheckInRangeCloseOpen (const int16_t kiCurrent, const int16_t kiMin, const int16_t kiMax) {
|
||||||
return ((kiCurrent >= kiMin) && (kiCurrent < kiMax));
|
return ((kiCurrent >= kiMin) && (kiCurrent < kiMax));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void WelsSetMemUint32_c (uint32_t* pDst, uint32_t iValue, int32_t iSizeOfData) {
|
||||||
|
for (int i = 0; i < iSizeOfData; i++) {
|
||||||
|
pDst[i] = iValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void WelsSetMemUint16_c (uint16_t* pDst, uint16_t iValue, int32_t iSizeOfData) {
|
||||||
|
for (int i = 0; i < iSizeOfData; i++) {
|
||||||
|
pDst[i] = iValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void WelsSetMemMultiplebytes_c (void* pDst, uint32_t iValue, int32_t iSizeOfData, int32_t iDataLengthOfData) {
|
||||||
|
assert (4 == iDataLengthOfData || 2 == iDataLengthOfData || 1 == iDataLengthOfData);
|
||||||
|
|
||||||
|
// TODO: consider add assembly for these functions
|
||||||
|
if (0 != iValue) {
|
||||||
|
if (4 == iDataLengthOfData) {
|
||||||
|
WelsSetMemUint32_c (static_cast<uint32_t*> (pDst), static_cast<uint32_t> (iValue), iSizeOfData);
|
||||||
|
} else if (2 == iDataLengthOfData) {
|
||||||
|
WelsSetMemUint16_c (static_cast<uint16_t*> (pDst), static_cast<uint16_t> (iValue), iSizeOfData);
|
||||||
|
} else {
|
||||||
|
memset (static_cast<uint8_t*> (pDst), static_cast<uint8_t> (iValue), iSizeOfData);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
memset (static_cast<uint8_t*> (pDst), 0, iSizeOfData * iDataLengthOfData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif//WELS_MACRO_UTILIZATIONS_H__
|
#endif//WELS_MACRO_UTILIZATIONS_H__
|
||||||
|
@ -68,12 +68,12 @@ SMVUnitXY sP16x16Mv;
|
|||||||
|
|
||||||
uint8_t uiLumaQp; // uiLumaQp: pPps->iInitialQp + sSliceHeader->delta_qp + mb->dquant.
|
uint8_t uiLumaQp; // uiLumaQp: pPps->iInitialQp + sSliceHeader->delta_qp + mb->dquant.
|
||||||
uint8_t uiChromaQp;
|
uint8_t uiChromaQp;
|
||||||
uint8_t uiSliceIdc; // AVC: pFirstMbInSlice?; SVC: (pFirstMbInSlice << 7) | ((uiDependencyId << 4) | uiQualityId);
|
uint16_t uiSliceIdc; // 2^16=65536 > MaxFS(36864) of level 5.1; AVC: pFirstMbInSlice?; SVC: (pFirstMbInSlice << 7) | ((uiDependencyId << 4) | uiQualityId);
|
||||||
uint32_t uiChromPredMode;
|
uint32_t uiChromPredMode;
|
||||||
int32_t iLumaDQp;
|
int32_t iLumaDQp;
|
||||||
SMVUnitXY sMvd[4];
|
SMVUnitXY sMvd[4];
|
||||||
int32_t iCbpDc;
|
int32_t iCbpDc;
|
||||||
uint8_t reserved_filling_bytes[1]; // filling bytes reserved to make structure aligned with 4 bytes, higher cache hit on less structure size by 2 cache lines( 2 * 64 bytes) once hit
|
//uint8_t reserved_filling_bytes[1]; // not deleting this line for further changes of this structure. filling bytes reserved to make structure aligned with 4 bytes, higher cache hit on less structure size by 2 cache lines( 2 * 64 bytes) once hit
|
||||||
} SMB, *PMb;
|
} SMB, *PMb;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ int16_t iMbWidth; /* width of picture size in mb */
|
|||||||
int16_t iMbHeight; /* height of picture size in mb */
|
int16_t iMbHeight; /* height of picture size in mb */
|
||||||
int16_t iSliceNumInFrame; /* count number of slices in frame; */
|
int16_t iSliceNumInFrame; /* count number of slices in frame; */
|
||||||
int32_t iMbNumInFrame; /* count number of MBs in frame */
|
int32_t iMbNumInFrame; /* count number of MBs in frame */
|
||||||
uint8_t* pOverallMbMap; /* overall MB map in frame, store virtual slice idc; */
|
uint16_t* pOverallMbMap; /* overall MB map in frame, store virtual slice idc; */
|
||||||
int16_t* pFirstMbInSlice; /* first MB address top-left based in every slice respectively; */
|
int16_t* pFirstMbInSlice; /* first MB address top-left based in every slice respectively; */
|
||||||
int32_t* pCountMbNumInSlice; /* count number of MBs in every slice respectively; */
|
int32_t* pCountMbNumInSlice; /* count number of MBs in every slice respectively; */
|
||||||
uint32_t uiSliceSizeConstraint;/*in byte*/
|
uint32_t uiSliceSizeConstraint;/*in byte*/
|
||||||
@ -140,7 +140,7 @@ void UninitSlicePEncCtx (SSliceCtx* pSliceCtx, CMemoryAlign* pMa);
|
|||||||
*
|
*
|
||||||
* \return uiSliceIdc - successful; (uint8_t)(-1) - failed;
|
* \return uiSliceIdc - successful; (uint8_t)(-1) - failed;
|
||||||
*/
|
*/
|
||||||
uint8_t WelsMbToSliceIdc (SSliceCtx* pSliceCtx, const int16_t kiMbXY);
|
uint16_t WelsMbToSliceIdc (SSliceCtx* pSliceCtx, const int16_t kiMbXY);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Get first mb in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
|
* \brief Get first mb in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
|
||||||
|
@ -597,7 +597,7 @@ static void InitMbInfo (sWelsEncCtx* pEnc, SMB* pList, SDqLayer* pLayer, con
|
|||||||
bool bLeftTop;
|
bool bLeftTop;
|
||||||
bool bRightTop;
|
bool bRightTop;
|
||||||
int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
|
int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
|
||||||
uint8_t uiSliceIdc;
|
uint16_t uiSliceIdc;
|
||||||
|
|
||||||
pList[iIdx].iMbX = pEnc->pStrideTab->pMbIndexX[kiDlayerId][iIdx];
|
pList[iIdx].iMbX = pEnc->pStrideTab->pMbIndexX[kiDlayerId][iIdx];
|
||||||
pList[iIdx].iMbY = pEnc->pStrideTab->pMbIndexY[kiDlayerId][iIdx];
|
pList[iIdx].iMbY = pEnc->pStrideTab->pMbIndexY[kiDlayerId][iIdx];
|
||||||
@ -2272,7 +2272,7 @@ void DynslcUpdateMbNeighbourInfoListForAllSlices (SSliceCtx* pSliceCtx, SMB* pMb
|
|||||||
bool bTop;
|
bool bTop;
|
||||||
bool bLeftTop;
|
bool bLeftTop;
|
||||||
bool bRightTop;
|
bool bRightTop;
|
||||||
int32_t uiSliceIdc;
|
uint16_t uiSliceIdc;
|
||||||
int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
|
int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
|
||||||
|
|
||||||
uiSliceIdc = WelsMbToSliceIdc (pSliceCtx, kiMbXY);
|
uiSliceIdc = WelsMbToSliceIdc (pSliceCtx, kiMbXY);
|
||||||
@ -2347,7 +2347,8 @@ void UpdateSlicepEncCtxWithPartition (SSliceCtx* pSliceCtx, int32_t iPartitionNu
|
|||||||
}
|
}
|
||||||
pSliceCtx->pFirstMbInSlice[i] = iFirstMbIdx;
|
pSliceCtx->pFirstMbInSlice[i] = iFirstMbIdx;
|
||||||
|
|
||||||
memset (pSliceCtx->pOverallMbMap + iFirstMbIdx, (uint8_t)i, pSliceCtx->pCountMbNumInSlice[i]*sizeof (uint8_t));
|
WelsSetMemMultiplebytes_c(pSliceCtx->pOverallMbMap + iFirstMbIdx, i,
|
||||||
|
pSliceCtx->pCountMbNumInSlice[i], sizeof(uint16_t));
|
||||||
|
|
||||||
// for next partition(or pSlice)
|
// for next partition(or pSlice)
|
||||||
iFirstMbIdx += pSliceCtx->pCountMbNumInSlice[i];
|
iFirstMbIdx += pSliceCtx->pCountMbNumInSlice[i];
|
||||||
@ -3924,15 +3925,19 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx,
|
|||||||
iMaxSliceNum *= SLICE_NUM_EXPAND_COEF;
|
iMaxSliceNum *= SLICE_NUM_EXPAND_COEF;
|
||||||
|
|
||||||
SWelsNalRaw* pNalList = (SWelsNalRaw*)pMA->WelsMalloc (iCountNals * sizeof (SWelsNalRaw), "pOut->sNalList");
|
SWelsNalRaw* pNalList = (SWelsNalRaw*)pMA->WelsMalloc (iCountNals * sizeof (SWelsNalRaw), "pOut->sNalList");
|
||||||
if (NULL == pNalList)
|
if (NULL == pNalList) {
|
||||||
|
WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: pNalList is NULL");
|
||||||
return ENC_RETURN_MEMALLOCERR;
|
return ENC_RETURN_MEMALLOCERR;
|
||||||
|
}
|
||||||
memcpy (pNalList, pCtx->pOut->sNalList, sizeof (SWelsNalRaw) * pCtx->pOut->iCountNals);
|
memcpy (pNalList, pCtx->pOut->sNalList, sizeof (SWelsNalRaw) * pCtx->pOut->iCountNals);
|
||||||
pMA->WelsFree (pCtx->pOut->sNalList, "pOut->sNalList");
|
pMA->WelsFree (pCtx->pOut->sNalList, "pOut->sNalList");
|
||||||
pCtx->pOut->sNalList = pNalList;
|
pCtx->pOut->sNalList = pNalList;
|
||||||
|
|
||||||
int32_t* pNalLen = (int32_t*)pMA->WelsMalloc (iCountNals * sizeof (int32_t), "pOut->pNalLen");
|
int32_t* pNalLen = (int32_t*)pMA->WelsMalloc (iCountNals * sizeof (int32_t), "pOut->pNalLen");
|
||||||
if (NULL == pNalLen)
|
if (NULL == pNalLen) {
|
||||||
|
WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: pNalLen is NULL");
|
||||||
return ENC_RETURN_MEMALLOCERR;
|
return ENC_RETURN_MEMALLOCERR;
|
||||||
|
}
|
||||||
memcpy (pNalLen, pCtx->pOut->pNalLen, sizeof (int32_t) * pCtx->pOut->iCountNals);
|
memcpy (pNalLen, pCtx->pOut->pNalLen, sizeof (int32_t) * pCtx->pOut->iCountNals);
|
||||||
pMA->WelsFree (pCtx->pOut->pNalLen, "pOut->pNalLen");
|
pMA->WelsFree (pCtx->pOut->pNalLen, "pOut->pNalLen");
|
||||||
pCtx->pOut->pNalLen = pNalLen;
|
pCtx->pOut->pNalLen = pNalLen;
|
||||||
@ -3948,8 +3953,10 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
SSlice* pSlice = (SSlice*)pMA->WelsMallocz (sizeof (SSlice) * iMaxSliceNum, "Slice");
|
SSlice* pSlice = (SSlice*)pMA->WelsMallocz (sizeof (SSlice) * iMaxSliceNum, "Slice");
|
||||||
if (NULL == pSlice)
|
if (NULL == pSlice) {
|
||||||
|
WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: pSlice is NULL");
|
||||||
return ENC_RETURN_MEMALLOCERR;
|
return ENC_RETURN_MEMALLOCERR;
|
||||||
|
}
|
||||||
memcpy (pSlice, pCurLayer->sLayerInfo.pSliceInLayer, sizeof (SSlice) * iMaxSliceNumOld);
|
memcpy (pSlice, pCurLayer->sLayerInfo.pSliceInLayer, sizeof (SSlice) * iMaxSliceNumOld);
|
||||||
int32_t uiSliceIdx;
|
int32_t uiSliceIdx;
|
||||||
uiSliceIdx = iMaxSliceNumOld;
|
uiSliceIdx = iMaxSliceNumOld;
|
||||||
@ -3963,8 +3970,11 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx,
|
|||||||
pSliceIdx->pSliceBsa = &pCtx->pSliceBs[uiSliceIdx].sBsWrite;
|
pSliceIdx->pSliceBsa = &pCtx->pSliceBs[uiSliceIdx].sBsWrite;
|
||||||
else
|
else
|
||||||
pSliceIdx->pSliceBsa = &pCtx->pOut->sBsWrite;
|
pSliceIdx->pSliceBsa = &pCtx->pOut->sBsWrite;
|
||||||
if (AllocMbCacheAligned (&pSliceIdx->sMbCacheInfo, pMA))
|
if (AllocMbCacheAligned (&pSliceIdx->sMbCacheInfo, pMA)) {
|
||||||
|
WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: realloc MbCache not successful at slice_idx=%d (max-slice=%d)",
|
||||||
|
uiSliceIdx, iMaxSliceNum);
|
||||||
return ENC_RETURN_MEMALLOCERR;
|
return ENC_RETURN_MEMALLOCERR;
|
||||||
|
}
|
||||||
|
|
||||||
pSliceIdx->bSliceHeaderExtFlag = pBaseSlice->bSliceHeaderExtFlag;
|
pSliceIdx->bSliceHeaderExtFlag = pBaseSlice->bSliceHeaderExtFlag;
|
||||||
pSHExt->sSliceHeader.iPpsId = pBaseSHExt->sSliceHeader.iPpsId;
|
pSHExt->sSliceHeader.iPpsId = pBaseSHExt->sSliceHeader.iPpsId;
|
||||||
@ -3983,8 +3993,10 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx,
|
|||||||
pCurLayer->sLayerInfo.pSliceInLayer = pSlice;
|
pCurLayer->sLayerInfo.pSliceInLayer = pSlice;
|
||||||
|
|
||||||
int16_t* pFirstMbInSlice = (int16_t*)pMA->WelsMalloc (iMaxSliceNum * sizeof (int16_t), "pSliceSeg->pFirstMbInSlice");
|
int16_t* pFirstMbInSlice = (int16_t*)pMA->WelsMalloc (iMaxSliceNum * sizeof (int16_t), "pSliceSeg->pFirstMbInSlice");
|
||||||
if (NULL == pFirstMbInSlice)
|
if (NULL == pFirstMbInSlice) {
|
||||||
|
WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: pFirstMbInSlice is NULL");
|
||||||
return ENC_RETURN_MEMALLOCERR;
|
return ENC_RETURN_MEMALLOCERR;
|
||||||
|
}
|
||||||
memset (pFirstMbInSlice, 0, sizeof (int16_t) * iMaxSliceNum);
|
memset (pFirstMbInSlice, 0, sizeof (int16_t) * iMaxSliceNum);
|
||||||
memcpy (pFirstMbInSlice, pCurLayer->pSliceEncCtx->pFirstMbInSlice, sizeof (int16_t) * iMaxSliceNumOld);
|
memcpy (pFirstMbInSlice, pCurLayer->pSliceEncCtx->pFirstMbInSlice, sizeof (int16_t) * iMaxSliceNumOld);
|
||||||
pMA->WelsFree (pCurLayer->pSliceEncCtx->pFirstMbInSlice, "pSliceSeg->pFirstMbInSlice");
|
pMA->WelsFree (pCurLayer->pSliceEncCtx->pFirstMbInSlice, "pSliceSeg->pFirstMbInSlice");
|
||||||
@ -3992,8 +4004,10 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx,
|
|||||||
|
|
||||||
int32_t* pCountMbNumInSlice = (int32_t*)pMA->WelsMalloc (iMaxSliceNum * sizeof (int32_t),
|
int32_t* pCountMbNumInSlice = (int32_t*)pMA->WelsMalloc (iMaxSliceNum * sizeof (int32_t),
|
||||||
"pSliceSeg->pCountMbNumInSlice");
|
"pSliceSeg->pCountMbNumInSlice");
|
||||||
if (NULL == pCountMbNumInSlice)
|
if (NULL == pCountMbNumInSlice) {
|
||||||
|
WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: realloc pCountMbNumInSlice not successful");
|
||||||
return ENC_RETURN_MEMALLOCERR;
|
return ENC_RETURN_MEMALLOCERR;
|
||||||
|
}
|
||||||
memcpy (pCountMbNumInSlice, pCurLayer->pSliceEncCtx->pCountMbNumInSlice, sizeof (int32_t) * iMaxSliceNumOld);
|
memcpy (pCountMbNumInSlice, pCurLayer->pSliceEncCtx->pCountMbNumInSlice, sizeof (int32_t) * iMaxSliceNumOld);
|
||||||
uiSliceIdx = iMaxSliceNumOld;
|
uiSliceIdx = iMaxSliceNumOld;
|
||||||
while (uiSliceIdx < iMaxSliceNum) {
|
while (uiSliceIdx < iMaxSliceNum) {
|
||||||
@ -4004,8 +4018,10 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx,
|
|||||||
pCurLayer->pSliceEncCtx->pCountMbNumInSlice = pCountMbNumInSlice;
|
pCurLayer->pSliceEncCtx->pCountMbNumInSlice = pCountMbNumInSlice;
|
||||||
|
|
||||||
SRCSlicing* pSlcingOverRc = (SRCSlicing*)pMA->WelsMalloc (iMaxSliceNum * sizeof (SRCSlicing), "SlicingOverRC");
|
SRCSlicing* pSlcingOverRc = (SRCSlicing*)pMA->WelsMalloc (iMaxSliceNum * sizeof (SRCSlicing), "SlicingOverRC");
|
||||||
if (NULL == pSlcingOverRc)
|
if (NULL == pSlcingOverRc) {
|
||||||
|
WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: realloc pSlcingOverRc not successful");
|
||||||
return ENC_RETURN_MEMALLOCERR;
|
return ENC_RETURN_MEMALLOCERR;
|
||||||
|
}
|
||||||
memcpy (pSlcingOverRc, pCtx->pWelsSvcRc->pSlicingOverRc, sizeof (SRCSlicing) * iMaxSliceNumOld);
|
memcpy (pSlcingOverRc, pCtx->pWelsSvcRc->pSlicingOverRc, sizeof (SRCSlicing) * iMaxSliceNumOld);
|
||||||
uiSliceIdx = iMaxSliceNumOld;
|
uiSliceIdx = iMaxSliceNumOld;
|
||||||
SRCSlicing* pSORC = &pSlcingOverRc[uiSliceIdx];
|
SRCSlicing* pSORC = &pSlcingOverRc[uiSliceIdx];
|
||||||
@ -4069,9 +4085,13 @@ int32_t WelsCodeOnePicPartition (sWelsEncCtx* pCtx,
|
|||||||
|
|
||||||
if (iSliceIdx >= (pSliceCtx->iMaxSliceNumConstraint - kiSliceIdxStep)) { // insufficient memory in pSliceInLayer[]
|
if (iSliceIdx >= (pSliceCtx->iMaxSliceNumConstraint - kiSliceIdxStep)) { // insufficient memory in pSliceInLayer[]
|
||||||
if (pCtx->iActiveThreadsNum == 1) {
|
if (pCtx->iActiveThreadsNum == 1) {
|
||||||
if (DynSliceRealloc (pCtx, pFrameBSInfo, pLayerBsInfo)) //only single thread support re-alloc now
|
//only single thread support re-alloc now
|
||||||
|
if (DynSliceRealloc (pCtx, pFrameBSInfo, pLayerBsInfo)) {
|
||||||
|
WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::WelsCodeOnePicPartition: DynSliceRealloc not successful");
|
||||||
return ENC_RETURN_MEMALLOCERR;
|
return ENC_RETURN_MEMALLOCERR;
|
||||||
|
}
|
||||||
} else if (iSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) {
|
} else if (iSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) {
|
||||||
|
WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::WelsCodeOnePicPartition: iSliceIdx(%d) over iMaxSliceNumConstraint(%d)", iSliceIdx, pSliceCtx->iMaxSliceNumConstraint);
|
||||||
return ENC_RETURN_MEMALLOCERR;
|
return ENC_RETURN_MEMALLOCERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ namespace WelsEnc {
|
|||||||
void UpdateMbListNeighborParallel (SSliceCtx* pSliceCtx,
|
void UpdateMbListNeighborParallel (SSliceCtx* pSliceCtx,
|
||||||
SMB* pMbList,
|
SMB* pMbList,
|
||||||
const int32_t uiSliceIdc) {
|
const int32_t uiSliceIdc) {
|
||||||
const uint8_t* kpMbMap = pSliceCtx->pOverallMbMap;
|
const uint16_t* kpMbMap = pSliceCtx->pOverallMbMap;
|
||||||
const int32_t kiMbWidth = pSliceCtx->iMbWidth;
|
const int32_t kiMbWidth = pSliceCtx->iMbWidth;
|
||||||
int32_t iIdx = pSliceCtx->pFirstMbInSlice[uiSliceIdc];
|
int32_t iIdx = pSliceCtx->pFirstMbInSlice[uiSliceIdc];
|
||||||
const int32_t kiEndMbInSlice = iIdx + pSliceCtx->pCountMbNumInSlice[uiSliceIdc] - 1;
|
const int32_t kiEndMbInSlice = iIdx + pSliceCtx->pCountMbNumInSlice[uiSliceIdc] - 1;
|
||||||
|
@ -78,7 +78,8 @@ int32_t AssignMbMapMultipleSlices (SSliceCtx* pSliceSeg, const SSliceConfig* kpM
|
|||||||
const int16_t kiFirstMb = uiSliceIdx * kiMbWidth;
|
const int16_t kiFirstMb = uiSliceIdx * kiMbWidth;
|
||||||
pSliceSeg->pCountMbNumInSlice[uiSliceIdx] = kiMbWidth;
|
pSliceSeg->pCountMbNumInSlice[uiSliceIdx] = kiMbWidth;
|
||||||
pSliceSeg->pFirstMbInSlice[uiSliceIdx] = kiFirstMb;
|
pSliceSeg->pFirstMbInSlice[uiSliceIdx] = kiFirstMb;
|
||||||
memset (pSliceSeg->pOverallMbMap + kiFirstMb, (uint8_t)uiSliceIdx, kiMbWidth * sizeof (uint8_t));
|
WelsSetMemMultiplebytes_c(pSliceSeg->pOverallMbMap + kiFirstMb, uiSliceIdx,
|
||||||
|
kiMbWidth, sizeof(uint16_t));
|
||||||
++ uiSliceIdx;
|
++ uiSliceIdx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,7 +90,7 @@ int32_t AssignMbMapMultipleSlices (SSliceCtx* pSliceSeg, const SSliceConfig* kpM
|
|||||||
const int32_t* kpSlicesAssignList = (int32_t*) & (kpMso->sSliceArgument.uiSliceMbNum[0]);
|
const int32_t* kpSlicesAssignList = (int32_t*) & (kpMso->sSliceArgument.uiSliceMbNum[0]);
|
||||||
const int32_t kiCountNumMbInFrame = pSliceSeg->iMbNumInFrame;
|
const int32_t kiCountNumMbInFrame = pSliceSeg->iMbNumInFrame;
|
||||||
const int32_t kiCountSliceNumInFrame = pSliceSeg->iSliceNumInFrame;
|
const int32_t kiCountSliceNumInFrame = pSliceSeg->iSliceNumInFrame;
|
||||||
int32_t iSliceIdx = 0;
|
uint16_t iSliceIdx = 0;
|
||||||
int16_t iMbIdx = 0;
|
int16_t iMbIdx = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -392,7 +393,7 @@ int32_t InitSliceSegment (SSliceCtx* pSliceSeg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (SM_SINGLE_SLICE == uiSliceMode) {
|
if (SM_SINGLE_SLICE == uiSliceMode) {
|
||||||
pSliceSeg->pOverallMbMap = (uint8_t*)pMa->WelsMalloc (kiCountMbNum * sizeof (uint8_t), "pSliceSeg->pOverallMbMap");
|
pSliceSeg->pOverallMbMap = (uint16_t*)pMa->WelsMalloc (kiCountMbNum * sizeof (uint16_t), "pSliceSeg->pOverallMbMap");
|
||||||
|
|
||||||
WELS_VERIFY_RETURN_IF (1, NULL == pSliceSeg->pOverallMbMap)
|
WELS_VERIFY_RETURN_IF (1, NULL == pSliceSeg->pOverallMbMap)
|
||||||
pSliceSeg->iSliceNumInFrame = 1;
|
pSliceSeg->iSliceNumInFrame = 1;
|
||||||
@ -419,11 +420,12 @@ int32_t InitSliceSegment (SSliceCtx* pSliceSeg,
|
|||||||
&& uiSliceMode != SM_DYN_SLICE && uiSliceMode != SM_AUTO_SLICE)
|
&& uiSliceMode != SM_DYN_SLICE && uiSliceMode != SM_AUTO_SLICE)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
pSliceSeg->pOverallMbMap = (uint8_t*)pMa->WelsMalloc (kiCountMbNum * sizeof (uint8_t), "pSliceSeg->pOverallMbMap");
|
pSliceSeg->pOverallMbMap = (uint16_t*)pMa->WelsMalloc (kiCountMbNum * sizeof (uint16_t), "pSliceSeg->pOverallMbMap");
|
||||||
|
|
||||||
WELS_VERIFY_RETURN_IF (1, NULL == pSliceSeg->pOverallMbMap)
|
WELS_VERIFY_RETURN_IF (1, NULL == pSliceSeg->pOverallMbMap)
|
||||||
|
|
||||||
memset (pSliceSeg->pOverallMbMap, 0, kiCountMbNum * sizeof (uint8_t));
|
WelsSetMemMultiplebytes_c(pSliceSeg->pOverallMbMap, 0, kiCountMbNum, sizeof(uint16_t));
|
||||||
|
|
||||||
//SM_DYN_SLICE: init, set pSliceSeg->iSliceNumInFrame = 1;
|
//SM_DYN_SLICE: init, set pSliceSeg->iSliceNumInFrame = 1;
|
||||||
pSliceSeg->iSliceNumInFrame = GetInitialSliceNum (kiMbWidth, kiMbHeight, pMso);
|
pSliceSeg->iSliceNumInFrame = GetInitialSliceNum (kiMbWidth, kiMbHeight, pMso);
|
||||||
|
|
||||||
@ -550,10 +552,10 @@ void UninitSlicePEncCtx (SSliceCtx* pSliceCtx, CMemoryAlign* pMa) {
|
|||||||
*
|
*
|
||||||
* \return uiSliceIdc - successful; -1 - failed;
|
* \return uiSliceIdc - successful; -1 - failed;
|
||||||
*/
|
*/
|
||||||
uint8_t WelsMbToSliceIdc (SSliceCtx* pSliceCtx, const int16_t kiMbXY) {
|
uint16_t WelsMbToSliceIdc (SSliceCtx* pSliceCtx, const int16_t kiMbXY) {
|
||||||
if (NULL != pSliceCtx && kiMbXY < pSliceCtx->iMbNumInFrame && kiMbXY >= 0)
|
if (NULL != pSliceCtx && kiMbXY < pSliceCtx->iMbNumInFrame && kiMbXY >= 0)
|
||||||
return pSliceCtx->pOverallMbMap[ kiMbXY ];
|
return pSliceCtx->pOverallMbMap[ kiMbXY ];
|
||||||
return (uint8_t) (-1);
|
return (uint16_t) (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -688,7 +690,8 @@ int32_t DynamicAdjustSlicePEncCtxAll (SSliceCtx* pSliceCtx,
|
|||||||
pSliceCtx->pFirstMbInSlice[iSliceIdx] = iFirstMbIdx;
|
pSliceCtx->pFirstMbInSlice[iSliceIdx] = iFirstMbIdx;
|
||||||
pSliceCtx->pCountMbNumInSlice[iSliceIdx] = kiSliceRun;
|
pSliceCtx->pCountMbNumInSlice[iSliceIdx] = kiSliceRun;
|
||||||
|
|
||||||
memset (pSliceCtx->pOverallMbMap + iFirstMbIdx, (uint8_t)iSliceIdx, kiSliceRun * sizeof (uint8_t));
|
WelsSetMemMultiplebytes_c(pSliceCtx->pOverallMbMap + iFirstMbIdx, iSliceIdx,
|
||||||
|
kiSliceRun, sizeof(uint16_t));
|
||||||
|
|
||||||
iFirstMbIdx += kiSliceRun;
|
iFirstMbIdx += kiSliceRun;
|
||||||
|
|
||||||
|
@ -776,7 +776,7 @@ void UpdateMbNeighbourInfoForNextSlice (SSliceCtx* pSliceCtx,
|
|||||||
bool bLeftTop;
|
bool bLeftTop;
|
||||||
bool bRightTop;
|
bool bRightTop;
|
||||||
int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
|
int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
|
||||||
const uint8_t kuiSliceIdc = WelsMbToSliceIdc (pSliceCtx, kiMbXY);
|
const uint16_t kuiSliceIdc = WelsMbToSliceIdc (pSliceCtx, kiMbXY);
|
||||||
|
|
||||||
pMb->uiSliceIdc = kuiSliceIdc;
|
pMb->uiSliceIdc = kuiSliceIdc;
|
||||||
iLeftXY = kiMbXY - 1;
|
iLeftXY = kiMbXY - 1;
|
||||||
@ -814,9 +814,9 @@ void AddSliceBoundary (sWelsEncCtx* pEncCtx, SSlice* pCurSlice, SSliceCtx* pSlic
|
|||||||
int32_t iFirstMbIdxOfNextSlice, const int32_t kiLastMbIdxInPartition) {
|
int32_t iFirstMbIdxOfNextSlice, const int32_t kiLastMbIdxInPartition) {
|
||||||
SDqLayer* pCurLayer = pEncCtx->pCurDqLayer;
|
SDqLayer* pCurLayer = pEncCtx->pCurDqLayer;
|
||||||
int32_t iCurMbIdx = pCurMb->iMbXY;
|
int32_t iCurMbIdx = pCurMb->iMbXY;
|
||||||
int32_t iCurSliceIdc = pSliceCtx->pOverallMbMap[ iCurMbIdx ];
|
uint16_t iCurSliceIdc = pSliceCtx->pOverallMbMap[ iCurMbIdx ];
|
||||||
const int32_t kiSliceIdxStep = pEncCtx->iActiveThreadsNum;
|
const int32_t kiSliceIdxStep = pEncCtx->iActiveThreadsNum;
|
||||||
int32_t iNextSliceIdc = iCurSliceIdc + kiSliceIdxStep;
|
uint16_t iNextSliceIdc = iCurSliceIdc + kiSliceIdxStep;
|
||||||
SSlice* pNextSlice = NULL;
|
SSlice* pNextSlice = NULL;
|
||||||
|
|
||||||
SMB* pMbList = pCurLayer->sMbDataP;
|
SMB* pMbList = pCurLayer->sMbDataP;
|
||||||
@ -839,9 +839,8 @@ void AddSliceBoundary (sWelsEncCtx* pEncCtx, SSlice* pCurSlice, SSliceCtx* pSlic
|
|||||||
sizeof (SSliceHeaderExt)); // confirmed_safe_unsafe_usage
|
sizeof (SSliceHeaderExt)); // confirmed_safe_unsafe_usage
|
||||||
|
|
||||||
pSliceCtx->pFirstMbInSlice[iNextSliceIdc] = iFirstMbIdxOfNextSlice;
|
pSliceCtx->pFirstMbInSlice[iNextSliceIdc] = iFirstMbIdxOfNextSlice;
|
||||||
|
WelsSetMemMultiplebytes_c (pSliceCtx->pOverallMbMap + iFirstMbIdxOfNextSlice, iNextSliceIdc,
|
||||||
memset (pSliceCtx->pOverallMbMap + iFirstMbIdxOfNextSlice, (uint8_t)iNextSliceIdc,
|
(kiLastMbIdxInPartition - iFirstMbIdxOfNextSlice + 1), sizeof(uint16_t));
|
||||||
(kiLastMbIdxInPartition - iFirstMbIdxOfNextSlice + 1)*sizeof (uint8_t));
|
|
||||||
|
|
||||||
//DYNAMIC_SLICING_ONE_THREAD: update pMbList slice_neighbor_info
|
//DYNAMIC_SLICING_ONE_THREAD: update pMbList slice_neighbor_info
|
||||||
UpdateMbNeighbourInfoForNextSlice (pSliceCtx, pMbList, iFirstMbIdxOfNextSlice, kiLastMbIdxInPartition);
|
UpdateMbNeighbourInfoForNextSlice (pSliceCtx, pMbList, iFirstMbIdxOfNextSlice, kiLastMbIdxInPartition);
|
||||||
@ -875,6 +874,10 @@ bool DynSlcJudgeSliceBoundaryStepBack (void* pCtx, void* pSlice, SSliceCtx* pSli
|
|||||||
&& JUMPPACKETSIZE_JUDGE (uiLen, iCurMbIdx, pSliceCtx->uiSliceSizeConstraint)) /*jump_avoiding_pack_exceed*/
|
&& JUMPPACKETSIZE_JUDGE (uiLen, iCurMbIdx, pSliceCtx->uiSliceSizeConstraint)) /*jump_avoiding_pack_exceed*/
|
||||||
&& kbCurMbNotLastMbOfCurPartition) { //decide to add new pSlice
|
&& kbCurMbNotLastMbOfCurPartition) { //decide to add new pSlice
|
||||||
|
|
||||||
|
WelsLog (&pEncCtx->sLogCtx, WELS_LOG_DETAIL,
|
||||||
|
"DynSlcJudgeSliceBoundaryStepBack: AddSliceBoundary: iCurMbIdx=%d, uiLen=%d, uiSliceIdx=%d", iCurMbIdx, uiLen,
|
||||||
|
pCurSlice->uiSliceIdx);
|
||||||
|
|
||||||
if (pEncCtx->pSvcParam->iMultipleThreadIdc > 1) {
|
if (pEncCtx->pSvcParam->iMultipleThreadIdc > 1) {
|
||||||
WelsMutexLock (&pEncCtx->pSliceThreading->mutexSliceNumUpdate);
|
WelsMutexLock (&pEncCtx->pSliceThreading->mutexSliceNumUpdate);
|
||||||
//lock the acessing to this variable: pSliceCtx->iSliceNumInFrame
|
//lock the acessing to this variable: pSliceCtx->iSliceNumInFrame
|
||||||
|
@ -718,7 +718,7 @@ int32_t RequestScreenBlockFeatureStorage (CMemoryAlign* pMa, const int32_t kiFra
|
|||||||
pScreenBlockFeatureStorage->iIs16x16 = !bIsBlock8x8;
|
pScreenBlockFeatureStorage->iIs16x16 = !bIsBlock8x8;
|
||||||
pScreenBlockFeatureStorage->uiFeatureStrategyIndex = kiFeatureStrategyIndex;
|
pScreenBlockFeatureStorage->uiFeatureStrategyIndex = kiFeatureStrategyIndex;
|
||||||
pScreenBlockFeatureStorage->iActualListSize = kiListSize;
|
pScreenBlockFeatureStorage->iActualListSize = kiListSize;
|
||||||
memset (pScreenBlockFeatureStorage->uiSadCostThreshold, UINT_MAX, BLOCK_SIZE_ALL * sizeof (uint32_t));
|
WelsSetMemMultiplebytes_c (pScreenBlockFeatureStorage->uiSadCostThreshold, UINT_MAX, BLOCK_SIZE_ALL, sizeof(uint32_t));
|
||||||
pScreenBlockFeatureStorage->bRefBlockFeatureCalculated = false;
|
pScreenBlockFeatureStorage->bRefBlockFeatureCalculated = false;
|
||||||
|
|
||||||
return ENC_RETURN_SUCCESS;
|
return ENC_RETURN_SUCCESS;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user