History

Avoid memory problem when mem alloc failed during initializing pRefList

sijchen committed 10 years ago

Commit 41b4ecb2 parents a26955e 4b97dcb1 file · +19 −14Browse files

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

Unified · Split

codec/encoder/core/src/encoder_ext.cpp+19−14
@@ -1001,6 +1001,22 @@ void FreeDqLayer (SDqLayer*& pDq, CMemoryAlign* pMa) { · 1000 unmodified lines
1001 pDq = NULL;1001 pDq = NULL;
1002}1002}
1003 1003
1004void FreeRefList (SRefList*& pRefList, CMemoryAlign* pMa, const int iMaxNumRefFrame) {
1005 if (NULL == pRefList) {
1006 return;
1007 }
1008
1009 int32_t iRef = 0;
1010 do {
1011 if (pRefList->pRef[iRef] != NULL) {
1012 FreePicture (pMa, &pRefList->pRef[iRef]);
1013 }
1014 ++ iRef;
1015 } while (iRef < 1 + iMaxNumRefFrame);
1016
1017 pMa->WelsFree (pRefList, "pRefList");
1018 pRefList = NULL;
1019}
1004 1020
1005static int32_t WelsGenerateNewSps (sWelsEncCtx* pCtx, const bool kbUseSubsetSps, const int32_t iDlayerIndex,1021static int32_t WelsGenerateNewSps (sWelsEncCtx* pCtx, const bool kbUseSubsetSps, const int32_t iDlayerIndex,
1006 const int32_t iDlayerCount, const int32_t kiSpsId,1022 const int32_t iDlayerCount, const int32_t kiSpsId,
@@ -1243,7 +1259,7 @@ static inline int32_t InitDqLayers (sWelsEncCtx** ppCtx, SExistingParasetList* p · 236 unmodified lines
1243 do {1259 do {
1244 pRefList->pRef[i] = AllocPicture (pMa, kiWidth, kiHeight, true,1260 pRefList->pRef[i] = AllocPicture (pMa, kiWidth, kiHeight, true,
1245 (iDlayerIndex == iDlayerCount - 1) ? kiNeedFeatureStorage : 0); // to use actual size of current layer1261 (iDlayerIndex == iDlayerCount - 1) ? kiNeedFeatureStorage : 0); // to use actual size of current layer
1246 WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pRefList->pRef[i]), FreeMemorySvc (ppCtx))1262 WELS_VERIFY_RETURN_PROC_IF (1, (NULL == pRefList->pRef[i]), FreeRefList (pRefList, pMa, iNumRef))
1247 ++ i;1263 ++ i;
1248 } while (i < 1 + iNumRef);1264 } while (i < 1 + iNumRef);
1249 1265
@@ -2206,19 +2222,8 @@ void FreeMemorySvc (sWelsEncCtx** ppCtx) { · 956 unmodified lines
2206 if (NULL != pCtx->ppRefPicListExt && pParam != NULL) {2222 if (NULL != pCtx->ppRefPicListExt && pParam != NULL) {
2207 ilayer = 0;2223 ilayer = 0;
2208 while (ilayer < pParam->iSpatialLayerNum) {2224 while (ilayer < pParam->iSpatialLayerNum) {
2209 SRefList* pRefList = pCtx->ppRefPicListExt[ilayer];2225 FreeRefList (pCtx->ppRefPicListExt[ilayer], pMa, pParam->iMaxNumRefFrame);
2210 if (NULL != pRefList) {2226 pCtx->ppRefPicListExt[ilayer] = NULL;
2211 int32_t iRef = 0;
2212 do {
2213 if (pRefList->pRef[iRef] != NULL) {
2214 FreePicture (pMa, &pRefList->pRef[iRef]);
2215 }
2216 ++ iRef;
2217 } while (iRef < 1 + pParam->iMaxNumRefFrame);
2218
2219 pMa->WelsFree (pCtx->ppRefPicListExt[ilayer], "ppRefPicListExt[]");
2220 pCtx->ppRefPicListExt[ilayer] = NULL;
2221 }
2222 ++ ilayer;2227 ++ ilayer;
2223 }2228 }
2224 2229

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