ref: 222c84c19381a8fd2185f8a2c051984639a06af7
parent: 54a194ce664c22f2d492b838439acd61ef6c18a7
parent: b77b68ffa0948490134d93913b3b7bad5b67d976
author: sijchen <sijchen@cisco.com>
date: Thu Nov 19 08:20:28 EST 2015
Merge pull request #2260 from shihuade/MultiThread_V4.1_SliceCtx_V10V11_Pull_V4 change input parameters for UpdateMbNeighbourInfoForNextSlice etc.
--- a/codec/encoder/core/inc/svc_enc_slice_segment.h
+++ b/codec/encoder/core/inc/svc_enc_slice_segment.h
@@ -142,12 +142,12 @@
/*!
* \brief Get slice idc for given iMbXY (apply in Single/multiple slices and FMO)
*
- * \param pSliceCtx SSlice context
- * \param kiMbXY MB xy index
+ * \param pCurDq current layer info
+ * \param kiMbXY MB xy index
*
* \return uiSliceIdc - successful; (uint8_t)(-1) - failed;
*/
-uint16_t WelsMbToSliceIdc (SSliceCtx* pSliceCtx, const int32_t kiMbXY);
+uint16_t WelsMbToSliceIdc (SDqLayer* pCurDq, const int32_t kiMbXY);
/*!
* \brief Get first mb in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
@@ -162,12 +162,12 @@
/*!
* \brief Get successive mb to be processed in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
*
- * \param pSliceCtx SSlice context
- * \param kiMbXY MB xy index
+ * \param pCurDq current layer info
+ * \param kiMbXY MB xy index
*
* \return next_mb - successful; -1 - failed;
*/
-int32_t WelsGetNextMbOfSlice (SSliceCtx* pSliceCtx, const int32_t kiMbXY);
+int32_t WelsGetNextMbOfSlice (SDqLayer* pCurDq, const int32_t kiMbXY);
/*!
* \brief Get previous mb to be processed in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
--- a/codec/encoder/core/inc/svc_encode_slice.h
+++ b/codec/encoder/core/inc/svc_encode_slice.h
@@ -87,7 +87,7 @@
void WelsInitSliceEncodingFuncs (uint32_t uiCpuFlag);
-void UpdateMbNeighbourInfoForNextSlice (SSliceCtx* pSliceCtx,
+void UpdateMbNeighbourInfoForNextSlice (SDqLayer* pCurDq,
SMB* pMbList,
const int32_t kiNextSliceFirstMbIdx,
const int32_t kiLastMbIdxInPartition);
--- a/codec/encoder/core/src/deblocking.cpp
+++ b/codec/encoder/core/src/deblocking.cpp
@@ -691,7 +691,6 @@
}
void DeblockingFilterSliceAvcbase (SDqLayer* pCurDq, SWelsFuncPtrList* pFunc, const int32_t kiSliceIdx) {
- SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
SMB* pMbList = pCurDq->sMbDataP;
SSliceHeaderExt* sSliceHeaderExt = &pCurDq->sLayerInfo.pSliceInLayer[kiSliceIdx].sSliceHeaderExt;
SMB* pCurrentMbBlock;
@@ -731,7 +730,7 @@
DeblockingMbAvcbase (pFunc, pCurrentMbBlock, &pFilter);
++iNumMbFiltered;
- iNextMbIdx = WelsGetNextMbOfSlice (pSliceCtx, iCurMbIdx);
+ iNextMbIdx = WelsGetNextMbOfSlice (pCurDq, iCurMbIdx);
//whether all of MB in current slice filtered or not
if (iNextMbIdx == -1 || iNextMbIdx >= kiTotalNumMb || iNumMbFiltered >= kiTotalNumMb) {
break;
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -764,7 +764,6 @@
int32_t iMbHeight = pLayer->iMbHeight;
int32_t iIdx;
int32_t iMbNum = iMbWidth * iMbHeight;
- SSliceCtx* pSliceCtx = &pLayer->sSliceEncCtx;
uint32_t uiNeighborAvail;
const int32_t kiOffset = (kiDlayerId & 0x01) * kiMaxMbNum;
SMVUnitXY (*pLayerMvUnitBlock4x4)[MB_BLOCK4x4_NUM] = (SMVUnitXY (*)[MB_BLOCK4x4_NUM]) (
@@ -784,18 +783,18 @@
pList[iIdx].iMbY = pEnc->pStrideTab->pMbIndexY[kiDlayerId][iIdx];
pList[iIdx].iMbXY = iIdx;
- uiSliceIdc = WelsMbToSliceIdc (pSliceCtx, iIdx);
+ uiSliceIdc = WelsMbToSliceIdc (pLayer, iIdx);
iLeftXY = iIdx - 1;
iTopXY = iIdx - iMbWidth;
iLeftTopXY = iTopXY - 1;
iRightTopXY = iTopXY + 1;
- bLeft = (pList[iIdx].iMbX > 0) && (uiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iLeftXY));
- bTop = (pList[iIdx].iMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iTopXY));
+ bLeft = (pList[iIdx].iMbX > 0) && (uiSliceIdc == WelsMbToSliceIdc (pLayer, iLeftXY));
+ bTop = (pList[iIdx].iMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pLayer, iTopXY));
bLeftTop = (pList[iIdx].iMbX > 0) && (pList[iIdx].iMbY > 0) && (uiSliceIdc ==
- WelsMbToSliceIdc (pSliceCtx, iLeftTopXY));
+ WelsMbToSliceIdc (pLayer, iLeftTopXY));
bRightTop = (pList[iIdx].iMbX < (iMbWidth - 1)) && (pList[iIdx].iMbY > 0) && (uiSliceIdc ==
- WelsMbToSliceIdc (pSliceCtx, iRightTopXY));
+ WelsMbToSliceIdc (pLayer, iRightTopXY));
uiNeighborAvail = 0;
if (bLeft) {
@@ -2682,7 +2681,8 @@
return fDlp->uiCodingIdx2TemporalId[kiCodingIdx];
}
-void DynslcUpdateMbNeighbourInfoListForAllSlices (SSliceCtx* pSliceCtx, SMB* pMbList) {
+void DynslcUpdateMbNeighbourInfoListForAllSlices (SDqLayer* pCurDq, SMB* pMbList) {
+ SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
const int32_t kiMbWidth = pSliceCtx->iMbWidth;
const int32_t kiEndMbInSlice = pSliceCtx->iMbNumInFrame - 1;
int32_t iIdx = 0;
@@ -2700,7 +2700,7 @@
uint16_t uiSliceIdc;
int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
- uiSliceIdc = WelsMbToSliceIdc (pSliceCtx, kiMbXY);
+ uiSliceIdc = WelsMbToSliceIdc (pCurDq, kiMbXY);
pMb->uiSliceIdc = uiSliceIdc;
iLeftXY = kiMbXY - 1;
iTopXY = kiMbXY - kiMbWidth;
@@ -2707,10 +2707,10 @@
iLeftTopXY = iTopXY - 1;
iRightTopXY = iTopXY + 1;
- bLeft = (kiMbX > 0) && (uiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iLeftXY));
- bTop = (kiMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iTopXY));
- bLeftTop = (kiMbX > 0) && (kiMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iLeftTopXY));
- bRightTop = (kiMbX < (kiMbWidth - 1)) && (kiMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iRightTopXY));
+ bLeft = (kiMbX > 0) && (uiSliceIdc == WelsMbToSliceIdc (pCurDq, iLeftXY));
+ bTop = (kiMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pCurDq, iTopXY));
+ bLeftTop = (kiMbX > 0) && (kiMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pCurDq, iLeftTopXY));
+ bRightTop = (kiMbX < (kiMbWidth - 1)) && (kiMbY > 0) && (uiSliceIdc == WelsMbToSliceIdc (pCurDq, iRightTopXY));
if (bLeft) {
uiNeighborAvailFlag |= LEFT_MB_POS;
@@ -2744,10 +2744,8 @@
void WelsInitCurrentQBLayerMltslc (sWelsEncCtx* pCtx) {
//pData init
SDqLayer* pCurDq = pCtx->pCurDqLayer;
- SSliceCtx* pSliceCtx = &(pCurDq->sSliceEncCtx);
-
//mb_neighbor
- DynslcUpdateMbNeighbourInfoListForAllSlices (pSliceCtx, pCurDq->sMbDataP);
+ DynslcUpdateMbNeighbourInfoListForAllSlices (pCurDq, pCurDq->sMbDataP);
}
void UpdateSlicepEncCtxWithPartition (SDqLayer* pCurDq, int32_t iPartitionNum) {
--- a/codec/encoder/core/src/svc_enc_slice_segment.cpp
+++ b/codec/encoder/core/src/svc_enc_slice_segment.cpp
@@ -69,20 +69,22 @@
*/
int32_t AssignMbMapMultipleSlices (SDqLayer* pCurDq,const SSliceArgument* kpSliceArgument) {
SSliceCtx* pSliceSeg = &pCurDq->sSliceEncCtx;
+ int32_t iSliceIdx = 0;
if (NULL == pSliceSeg || SM_SINGLE_SLICE == pSliceSeg->uiSliceMode)
return 1;
if ((SM_RASTER_SLICE == pSliceSeg->uiSliceMode) && (0 == kpSliceArgument->uiSliceMbNum[0])) {
const int32_t kiMbWidth = pSliceSeg->iMbWidth;
- int32_t iSliceNum = pSliceSeg->iSliceNumInFrame, uiSliceIdx = 0;
+ int32_t iSliceNum = pSliceSeg->iSliceNumInFrame;
- while (uiSliceIdx < iSliceNum) {
- const int32_t kiFirstMb = uiSliceIdx * kiMbWidth;
- pSliceSeg->pCountMbNumInSlice[uiSliceIdx] = kiMbWidth;
- pSliceSeg->pFirstMbInSlice[uiSliceIdx] = kiFirstMb;
- WelsSetMemMultiplebytes_c(pSliceSeg->pOverallMbMap + kiFirstMb, uiSliceIdx,
+ iSliceIdx = 0;
+ while (iSliceIdx < iSliceNum) {
+ const int32_t kiFirstMb = iSliceIdx * kiMbWidth;
+ pSliceSeg->pCountMbNumInSlice[iSliceIdx] = kiMbWidth;
+ pSliceSeg->pFirstMbInSlice[iSliceIdx] = kiFirstMb;
+ WelsSetMemMultiplebytes_c(pSliceSeg->pOverallMbMap + kiFirstMb, iSliceIdx,
kiMbWidth, sizeof(uint16_t));
- ++ uiSliceIdx;
+ ++ iSliceIdx;
}
return 0;
@@ -91,9 +93,9 @@
const int32_t* kpSlicesAssignList = (int32_t*) & (kpSliceArgument->uiSliceMbNum[0]);
const int32_t kiCountNumMbInFrame = pSliceSeg->iMbNumInFrame;
const int32_t kiCountSliceNumInFrame = pSliceSeg->iSliceNumInFrame;
- uint16_t iSliceIdx = 0;
int32_t iMbIdx = 0;
+ iSliceIdx = 0;
do {
const int32_t kiCurRunLength = kpSlicesAssignList[iSliceIdx];
int32_t iRunIdx = 0;
@@ -111,9 +113,10 @@
++ iSliceIdx;
} while (iSliceIdx < kiCountSliceNumInFrame && iMbIdx < kiCountNumMbInFrame);
} else if (SM_SIZELIMITED_SLICE == pSliceSeg->uiSliceMode) {
- int32_t iSliceIdx = 0;
const int32_t kiMaxSliceNum = pSliceSeg->iMaxSliceNumConstraint;
const int32_t kiCountNumMbInFrame = pSliceSeg->iMbNumInFrame;
+
+ iSliceIdx = 0;
do {
pSliceSeg->pFirstMbInSlice[iSliceIdx] = 0;
pSliceSeg->pCountMbNumInSlice[iSliceIdx] = kiCountNumMbInFrame;
@@ -562,12 +565,16 @@
/*!
* \brief Get slice idc for given iMbXY (apply in Single/multiple slices and FMO)
*
- * \param pSliceCtx SSlice context
- * \param kiMbXY MB xy index
+ * \param pCurDq current layer info
+ * \param kiMbXY MB xy index
*
* \return uiSliceIdc - successful; -1 - failed;
*/
-uint16_t WelsMbToSliceIdc (SSliceCtx* pSliceCtx, const int32_t kiMbXY) {
+uint16_t WelsMbToSliceIdc (SDqLayer* pCurDq, const int32_t kiMbXY) {
+ if (NULL == pCurDq)
+ return (uint16_t) (-1);
+
+ SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
if (NULL != pSliceCtx && kiMbXY < pSliceCtx->iMbNumInFrame && kiMbXY >= 0)
return pSliceCtx->pOverallMbMap[ kiMbXY ];
return (uint16_t) (-1);
@@ -588,14 +595,14 @@
/*!
* \brief Get successive mb to be processed in slice/slice_group: uiSliceIdc (apply in Single/multiple slices and FMO)
*
- * \param pSliceCtx SSlice context
- * \param kiMbXY MB xy index
+ * \param pCurDq current layer info
+ * \param kiMbXY MB xy index
*
* \return next_mb - successful; -1 - failed;
*/
-int32_t WelsGetNextMbOfSlice (SSliceCtx* pSliceCtx, const int32_t kiMbXY) {
- if (NULL != pSliceCtx) {
- SSliceCtx* pSliceSeg = pSliceCtx;
+int32_t WelsGetNextMbOfSlice (SDqLayer* pCurDq, const int32_t kiMbXY) {
+ if (NULL != pCurDq) {
+ SSliceCtx* pSliceSeg = &pCurDq->sSliceEncCtx;
if (NULL == pSliceSeg || kiMbXY < 0 || kiMbXY >= pSliceSeg->iMbNumInFrame)
return -1;
if (SM_SINGLE_SLICE == pSliceSeg->uiSliceMode) {
--- a/codec/encoder/core/src/svc_encode_slice.cpp
+++ b/codec/encoder/core/src/svc_encode_slice.cpp
@@ -483,8 +483,7 @@
//second. lower than highest Dependency Layer, and for every Dependency Layer with one quality layer(single layer)
int32_t WelsISliceMdEnc (sWelsEncCtx* pEncCtx, SSlice* pSlice) { //pMd + encoding
SDqLayer* pCurLayer = pEncCtx->pCurDqLayer;
- SSliceCtx* pSliceCtx = &pCurLayer->sSliceEncCtx;
- SMbCache* pMbCache = &pSlice->sMbCacheInfo;
+ SMbCache* pMbCache = &pSlice->sMbCacheInfo;
SSliceHeaderExt* pSliceHdExt = &pSlice->sSliceHeaderExt;
SMB* pMbList = pCurLayer->sMbDataP;
SMB* pCurMb = NULL;
@@ -533,7 +532,7 @@
pEncCtx->pFuncList->pfRc.pfWelsRcMbInfoUpdate (pEncCtx, pCurMb, sMd.iCostLuma, pSlice);
++iNumMbCoded;
- iNextMbIdx = WelsGetNextMbOfSlice (pSliceCtx, iCurMbIdx);
+ iNextMbIdx = WelsGetNextMbOfSlice (pCurLayer, iCurMbIdx);
if (iNextMbIdx == -1 || iNextMbIdx >= kiTotalNumMb || iNumMbCoded >= kiTotalNumMb) {
break;
}
@@ -615,7 +614,7 @@
++iNumMbCoded;
- iNextMbIdx = WelsGetNextMbOfSlice (pSliceCtx, iCurMbIdx);
+ iNextMbIdx = WelsGetNextMbOfSlice (pCurLayer, iCurMbIdx);
//whether all of MB in current pSlice encoded or not
if (iNextMbIdx == -1 || iNextMbIdx >= kiTotalNumMb || iNumMbCoded >= kiTotalNumMb) {
pSliceCtx->pCountMbNumInSlice[kiSliceIdx] = iCurMbIdx - pCurLayer->pLastCodedMbIdxOfPartition[kiPartitionId];
@@ -759,10 +758,11 @@
}
//pFunc: UpdateMbNeighbourInfoForNextSlice()
-void UpdateMbNeighbourInfoForNextSlice (SSliceCtx* pSliceCtx,
+void UpdateMbNeighbourInfoForNextSlice (SDqLayer* pCurDq,
SMB* pMbList,
const int32_t kiFirstMbIdxOfNextSlice,
const int32_t kiLastMbIdxInPartition) {
+ SSliceCtx* pSliceCtx = &pCurDq->sSliceEncCtx;
const int32_t kiMbWidth = pSliceCtx->iMbWidth;
int32_t iIdx = kiFirstMbIdxOfNextSlice;
int32_t iNextSliceFirstMbIdxRowStart = ((kiFirstMbIdxOfNextSlice % kiMbWidth) ? 1 : 0);
@@ -781,7 +781,7 @@
bool bLeftTop;
bool bRightTop;
int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
- const uint16_t kuiSliceIdc = WelsMbToSliceIdc (pSliceCtx, kiMbXY);
+ const uint16_t kuiSliceIdc = WelsMbToSliceIdc (pCurDq, kiMbXY);
pMb->uiSliceIdc = kuiSliceIdc;
iLeftXY = kiMbXY - 1;
@@ -789,10 +789,10 @@
iLeftTopXY = iTopXY - 1;
iRightTopXY = iTopXY + 1;
- bLeft = (kiMbX > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iLeftXY));
- bTop = (kiMbY > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iTopXY));
- bLeftTop = (kiMbX > 0) && (kiMbY > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iLeftTopXY));
- bRightTop = (kiMbX < (kiMbWidth - 1)) && (kiMbY > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pSliceCtx, iRightTopXY));
+ bLeft = (kiMbX > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pCurDq, iLeftXY));
+ bTop = (kiMbY > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pCurDq, iTopXY));
+ bLeftTop = (kiMbX > 0) && (kiMbY > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pCurDq, iLeftTopXY));
+ bRightTop = (kiMbX < (kiMbWidth - 1)) && (kiMbY > 0) && (kuiSliceIdc == WelsMbToSliceIdc (pCurDq, iRightTopXY));
if (bLeft) {
uiNeighborAvailFlag |= LEFT_MB_POS;
@@ -848,7 +848,7 @@
(kiLastMbIdxInPartition - iFirstMbIdxOfNextSlice + 1), sizeof (uint16_t));
//DYNAMIC_SLICING_ONE_THREAD: update pMbList slice_neighbor_info
- UpdateMbNeighbourInfoForNextSlice (pSliceCtx, pMbList, iFirstMbIdxOfNextSlice, kiLastMbIdxInPartition);
+ UpdateMbNeighbourInfoForNextSlice (pCurLayer, pMbList, iFirstMbIdxOfNextSlice, kiLastMbIdxInPartition);
}
bool DynSlcJudgeSliceBoundaryStepBack (void* pCtx, void* pSlice, SSliceCtx* pSliceCtx, SMB* pCurMb,
@@ -942,7 +942,6 @@
SWelsMD* pMd = (SWelsMD*)pWelsMd;
SBitStringAux* pBs = pSlice->pSliceBsa;
SDqLayer* pCurLayer = pEncCtx->pCurDqLayer;
- SSliceCtx* pSliceCtx = &pCurLayer->sSliceEncCtx;
SMbCache* pMbCache = &pSlice->sMbCacheInfo;
SMB* pMbList = pCurLayer->sMbDataP;
SMB* pCurMb = NULL;
@@ -1013,7 +1012,7 @@
/*judge if all pMb in cur pSlice has been encoded*/
++ iNumMbCoded;
- iNextMbIdx = WelsGetNextMbOfSlice (pSliceCtx, iCurMbIdx);
+ iNextMbIdx = WelsGetNextMbOfSlice (pCurLayer, iCurMbIdx);
//whether all of MB in current pSlice encoded or not
if (iNextMbIdx == -1 || iNextMbIdx >= kiTotalNumMb || iNumMbCoded >= kiTotalNumMb) {
break;
@@ -1130,7 +1129,7 @@
/*judge if all pMb in cur pSlice has been encoded*/
++ iNumMbCoded;
- iNextMbIdx = WelsGetNextMbOfSlice (pSliceCtx, iCurMbIdx);
+ iNextMbIdx = WelsGetNextMbOfSlice (pCurLayer, iCurMbIdx);
//whether all of MB in current pSlice encoded or not
if (iNextMbIdx == -1 || iNextMbIdx >= kiTotalNumMb || iNumMbCoded >= kiTotalNumMb) {
pCurLayer->pLastCodedMbIdxOfPartition[kiPartitionId] =