History

Merge pull request #1490 from sijchen/after_review

[Encoder] Fixing for large number of slices

ruil2 committed 12 years ago

Commit 8ed4e832 parents b896faa 54c677c8 files · +87 −32Browse files

Showing the changes to codec/encoder/core/src/encoder_ext.cpp (1 of 8 files). Show all

Unified · Split

codec/encoder/core/src/encoder_ext.cpp+31−11
@@ -597,7 +597,7 @@ static void InitMbInfo (sWelsEncCtx* pEnc, SMB* pList, SDqLayer* pLayer, con · 596 unmodified lines
597 bool bLeftTop;597 bool bLeftTop;
598 bool bRightTop;598 bool bRightTop;
599 int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;599 int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
600 uint8_t uiSliceIdc;600 uint16_t uiSliceIdc;
601 601
602 pList[iIdx].iMbX = pEnc->pStrideTab->pMbIndexX[kiDlayerId][iIdx];602 pList[iIdx].iMbX = pEnc->pStrideTab->pMbIndexX[kiDlayerId][iIdx];
603 pList[iIdx].iMbY = pEnc->pStrideTab->pMbIndexY[kiDlayerId][iIdx];603 pList[iIdx].iMbY = pEnc->pStrideTab->pMbIndexY[kiDlayerId][iIdx];
@@ -2272,7 +2272,7 @@ void DynslcUpdateMbNeighbourInfoListForAllSlices (SSliceCtx* pSliceCtx, SMB* pMb · 1668 unmodified lines
2272 bool bTop;2272 bool bTop;
2273 bool bLeftTop;2273 bool bLeftTop;
2274 bool bRightTop;2274 bool bRightTop;
2275 int32_t uiSliceIdc;2275 uint16_t uiSliceIdc;
2276 int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;2276 int32_t iLeftXY, iTopXY, iLeftTopXY, iRightTopXY;
2277 2277
2278 uiSliceIdc = WelsMbToSliceIdc (pSliceCtx, kiMbXY);2278 uiSliceIdc = WelsMbToSliceIdc (pSliceCtx, kiMbXY);
@@ -2347,7 +2347,8 @@ void UpdateSlicepEncCtxWithPartition (SSliceCtx* pSliceCtx, int32_t iPartitionNu · 68 unmodified lines
2347 }2347 }
2348 pSliceCtx->pFirstMbInSlice[i] = iFirstMbIdx;2348 pSliceCtx->pFirstMbInSlice[i] = iFirstMbIdx;
2349 2349
2350 memset (pSliceCtx->pOverallMbMap + iFirstMbIdx, (uint8_t)i, pSliceCtx->pCountMbNumInSlice[i]*sizeof (uint8_t));2350 WelsSetMemMultiplebytes_c(pSliceCtx->pOverallMbMap + iFirstMbIdx, i,
2351 pSliceCtx->pCountMbNumInSlice[i], sizeof(uint16_t));
2351 2352
2352 // for next partition(or pSlice)2353 // for next partition(or pSlice)
2353 iFirstMbIdx += pSliceCtx->pCountMbNumInSlice[i];2354 iFirstMbIdx += pSliceCtx->pCountMbNumInSlice[i];
@@ -3924,15 +3925,19 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx, · 1570 unmodified lines
3924 iMaxSliceNum *= SLICE_NUM_EXPAND_COEF;3925 iMaxSliceNum *= SLICE_NUM_EXPAND_COEF;
3925 3926
3926 SWelsNalRaw* pNalList = (SWelsNalRaw*)pMA->WelsMalloc (iCountNals * sizeof (SWelsNalRaw), "pOut->sNalList");3927 SWelsNalRaw* pNalList = (SWelsNalRaw*)pMA->WelsMalloc (iCountNals * sizeof (SWelsNalRaw), "pOut->sNalList");
3927 if (NULL == pNalList)3928 if (NULL == pNalList) {
3929 WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: pNalList is NULL");
3928 return ENC_RETURN_MEMALLOCERR;3930 return ENC_RETURN_MEMALLOCERR;
3931 }
3929 memcpy (pNalList, pCtx->pOut->sNalList, sizeof (SWelsNalRaw) * pCtx->pOut->iCountNals);3932 memcpy (pNalList, pCtx->pOut->sNalList, sizeof (SWelsNalRaw) * pCtx->pOut->iCountNals);
3930 pMA->WelsFree (pCtx->pOut->sNalList, "pOut->sNalList");3933 pMA->WelsFree (pCtx->pOut->sNalList, "pOut->sNalList");
3931 pCtx->pOut->sNalList = pNalList;3934 pCtx->pOut->sNalList = pNalList;
3932 3935
3933 int32_t* pNalLen = (int32_t*)pMA->WelsMalloc (iCountNals * sizeof (int32_t), "pOut->pNalLen");3936 int32_t* pNalLen = (int32_t*)pMA->WelsMalloc (iCountNals * sizeof (int32_t), "pOut->pNalLen");
3934 if (NULL == pNalLen)3937 if (NULL == pNalLen) {
3938 WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: pNalLen is NULL");
3935 return ENC_RETURN_MEMALLOCERR;3939 return ENC_RETURN_MEMALLOCERR;
3940 }
3936 memcpy (pNalLen, pCtx->pOut->pNalLen, sizeof (int32_t) * pCtx->pOut->iCountNals);3941 memcpy (pNalLen, pCtx->pOut->pNalLen, sizeof (int32_t) * pCtx->pOut->iCountNals);
3937 pMA->WelsFree (pCtx->pOut->pNalLen, "pOut->pNalLen");3942 pMA->WelsFree (pCtx->pOut->pNalLen, "pOut->pNalLen");
3938 pCtx->pOut->pNalLen = pNalLen;3943 pCtx->pOut->pNalLen = pNalLen;
@@ -3948,8 +3953,10 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx, · 9 unmodified lines
3948 }3953 }
3949 3954
3950 SSlice* pSlice = (SSlice*)pMA->WelsMallocz (sizeof (SSlice) * iMaxSliceNum, "Slice");3955 SSlice* pSlice = (SSlice*)pMA->WelsMallocz (sizeof (SSlice) * iMaxSliceNum, "Slice");
3951 if (NULL == pSlice)3956 if (NULL == pSlice) {
3957 WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: pSlice is NULL");
3952 return ENC_RETURN_MEMALLOCERR;3958 return ENC_RETURN_MEMALLOCERR;
3959 }
3953 memcpy (pSlice, pCurLayer->sLayerInfo.pSliceInLayer, sizeof (SSlice) * iMaxSliceNumOld);3960 memcpy (pSlice, pCurLayer->sLayerInfo.pSliceInLayer, sizeof (SSlice) * iMaxSliceNumOld);
3954 int32_t uiSliceIdx;3961 int32_t uiSliceIdx;
3955 uiSliceIdx = iMaxSliceNumOld;3962 uiSliceIdx = iMaxSliceNumOld;
@@ -3963,8 +3970,11 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx, · 7 unmodified lines
3963 pSliceIdx->pSliceBsa = &pCtx->pSliceBs[uiSliceIdx].sBsWrite;3970 pSliceIdx->pSliceBsa = &pCtx->pSliceBs[uiSliceIdx].sBsWrite;
3964 else3971 else
3965 pSliceIdx->pSliceBsa = &pCtx->pOut->sBsWrite;3972 pSliceIdx->pSliceBsa = &pCtx->pOut->sBsWrite;
3966 if (AllocMbCacheAligned (&pSliceIdx->sMbCacheInfo, pMA))3973 if (AllocMbCacheAligned (&pSliceIdx->sMbCacheInfo, pMA)) {
3974 WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: realloc MbCache not successful at slice_idx=%d (max-slice=%d)",
3975 uiSliceIdx, iMaxSliceNum);
3967 return ENC_RETURN_MEMALLOCERR;3976 return ENC_RETURN_MEMALLOCERR;
3977 }
3968 3978
3969 pSliceIdx->bSliceHeaderExtFlag = pBaseSlice->bSliceHeaderExtFlag;3979 pSliceIdx->bSliceHeaderExtFlag = pBaseSlice->bSliceHeaderExtFlag;
3970 pSHExt->sSliceHeader.iPpsId = pBaseSHExt->sSliceHeader.iPpsId;3980 pSHExt->sSliceHeader.iPpsId = pBaseSHExt->sSliceHeader.iPpsId;
@@ -3983,8 +3993,10 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx, · 12 unmodified lines
3983 pCurLayer->sLayerInfo.pSliceInLayer = pSlice;3993 pCurLayer->sLayerInfo.pSliceInLayer = pSlice;
3984 3994
3985 int16_t* pFirstMbInSlice = (int16_t*)pMA->WelsMalloc (iMaxSliceNum * sizeof (int16_t), "pSliceSeg->pFirstMbInSlice");3995 int16_t* pFirstMbInSlice = (int16_t*)pMA->WelsMalloc (iMaxSliceNum * sizeof (int16_t), "pSliceSeg->pFirstMbInSlice");
3986 if (NULL == pFirstMbInSlice)3996 if (NULL == pFirstMbInSlice) {
3997 WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: pFirstMbInSlice is NULL");
3987 return ENC_RETURN_MEMALLOCERR;3998 return ENC_RETURN_MEMALLOCERR;
3999 }
3988 memset (pFirstMbInSlice, 0, sizeof (int16_t) * iMaxSliceNum);4000 memset (pFirstMbInSlice, 0, sizeof (int16_t) * iMaxSliceNum);
3989 memcpy (pFirstMbInSlice, pCurLayer->pSliceEncCtx->pFirstMbInSlice, sizeof (int16_t) * iMaxSliceNumOld);4001 memcpy (pFirstMbInSlice, pCurLayer->pSliceEncCtx->pFirstMbInSlice, sizeof (int16_t) * iMaxSliceNumOld);
3990 pMA->WelsFree (pCurLayer->pSliceEncCtx->pFirstMbInSlice, "pSliceSeg->pFirstMbInSlice");4002 pMA->WelsFree (pCurLayer->pSliceEncCtx->pFirstMbInSlice, "pSliceSeg->pFirstMbInSlice");
@@ -3992,8 +4004,10 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx, · 1 unmodified line
3992 4004
3993 int32_t* pCountMbNumInSlice = (int32_t*)pMA->WelsMalloc (iMaxSliceNum * sizeof (int32_t),4005 int32_t* pCountMbNumInSlice = (int32_t*)pMA->WelsMalloc (iMaxSliceNum * sizeof (int32_t),
3994 "pSliceSeg->pCountMbNumInSlice");4006 "pSliceSeg->pCountMbNumInSlice");
3995 if (NULL == pCountMbNumInSlice)4007 if (NULL == pCountMbNumInSlice) {
4008 WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: realloc pCountMbNumInSlice not successful");
3996 return ENC_RETURN_MEMALLOCERR;4009 return ENC_RETURN_MEMALLOCERR;
4010 }
3997 memcpy (pCountMbNumInSlice, pCurLayer->pSliceEncCtx->pCountMbNumInSlice, sizeof (int32_t) * iMaxSliceNumOld);4011 memcpy (pCountMbNumInSlice, pCurLayer->pSliceEncCtx->pCountMbNumInSlice, sizeof (int32_t) * iMaxSliceNumOld);
3998 uiSliceIdx = iMaxSliceNumOld;4012 uiSliceIdx = iMaxSliceNumOld;
3999 while (uiSliceIdx < iMaxSliceNum) {4013 while (uiSliceIdx < iMaxSliceNum) {
@@ -4004,8 +4018,10 @@ int32_t DynSliceRealloc (sWelsEncCtx* pCtx, · 4 unmodified lines
4004 pCurLayer->pSliceEncCtx->pCountMbNumInSlice = pCountMbNumInSlice;4018 pCurLayer->pSliceEncCtx->pCountMbNumInSlice = pCountMbNumInSlice;
4005 4019
4006 SRCSlicing* pSlcingOverRc = (SRCSlicing*)pMA->WelsMalloc (iMaxSliceNum * sizeof (SRCSlicing), "SlicingOverRC");4020 SRCSlicing* pSlcingOverRc = (SRCSlicing*)pMA->WelsMalloc (iMaxSliceNum * sizeof (SRCSlicing), "SlicingOverRC");
4007 if (NULL == pSlcingOverRc)4021 if (NULL == pSlcingOverRc) {
4022 WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::DynSliceRealloc: realloc pSlcingOverRc not successful");
4008 return ENC_RETURN_MEMALLOCERR;4023 return ENC_RETURN_MEMALLOCERR;
4024 }
4009 memcpy (pSlcingOverRc, pCtx->pWelsSvcRc->pSlicingOverRc, sizeof (SRCSlicing) * iMaxSliceNumOld);4025 memcpy (pSlcingOverRc, pCtx->pWelsSvcRc->pSlicingOverRc, sizeof (SRCSlicing) * iMaxSliceNumOld);
4010 uiSliceIdx = iMaxSliceNumOld;4026 uiSliceIdx = iMaxSliceNumOld;
4011 SRCSlicing* pSORC = &pSlcingOverRc[uiSliceIdx];4027 SRCSlicing* pSORC = &pSlcingOverRc[uiSliceIdx];
@@ -4069,9 +4085,13 @@ int32_t WelsCodeOnePicPartition (sWelsEncCtx* pCtx, · 57 unmodified lines
4069 4085
4070 if (iSliceIdx >= (pSliceCtx->iMaxSliceNumConstraint - kiSliceIdxStep)) { // insufficient memory in pSliceInLayer[]4086 if (iSliceIdx >= (pSliceCtx->iMaxSliceNumConstraint - kiSliceIdxStep)) { // insufficient memory in pSliceInLayer[]
4071 if (pCtx->iActiveThreadsNum == 1) {4087 if (pCtx->iActiveThreadsNum == 1) {
4072 if (DynSliceRealloc (pCtx, pFrameBSInfo, pLayerBsInfo)) //only single thread support re-alloc now4088 //only single thread support re-alloc now
4089 if (DynSliceRealloc (pCtx, pFrameBSInfo, pLayerBsInfo)) {
4090 WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::WelsCodeOnePicPartition: DynSliceRealloc not successful");
4073 return ENC_RETURN_MEMALLOCERR;4091 return ENC_RETURN_MEMALLOCERR;
4092 }
4074 } else if (iSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) {4093 } else if (iSliceIdx >= pSliceCtx->iMaxSliceNumConstraint) {
4094 WelsLog (&(pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::WelsCodeOnePicPartition: iSliceIdx(%d) over iMaxSliceNumConstraint(%d)", iSliceIdx, pSliceCtx->iMaxSliceNumConstraint);
4075 return ENC_RETURN_MEMALLOCERR;4095 return ENC_RETURN_MEMALLOCERR;
4076 }4096 }
4077 }4097 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t