Showing the changes to codec/encoder/core/src/svc_encode_slice.cpp (1 of 6 files). Show all
Unified · Split
| @@ -977,6 +977,47 @@ int32_t InitSliceList (sWelsEncCtx* pCtx, · 976 unmodified lines | ||
| 977 | 977 | return ENC_RETURN_SUCCESS; |
| 978 | 978 | } |
| 979 | 979 | |
| 980 | +int32_t InitAllSlicesInThread (sWelsEncCtx* pCtx) { | |
| 981 | + SDqLayer* pDqLayer = pCtx->pCurDqLayer; | |
| 982 | + int32_t iSliceIdx = 0; | |
| 983 | + | |
| 984 | + for( ; iSliceIdx < pDqLayer->iMaxSliceNum; iSliceIdx++) { | |
| 985 | + if(NULL == pDqLayer->ppSliceInLayer[iSliceIdx]) { | |
| 986 | + return ENC_RETURN_UNEXPECTED; | |
| 987 | + } | |
| 988 | + | |
| 989 | + pDqLayer->ppSliceInLayer[iSliceIdx]->iSliceIdx = -1; | |
| 990 | + } | |
| 991 | + | |
| 992 | + return ENC_RETURN_SUCCESS; | |
| 993 | +} | |
| 994 | + | |
| 995 | +int32_t InitOneSliceInThread (sWelsEncCtx* pCtx, | |
| 996 | + SSlice*& pSlice, | |
| 997 | + const int32_t kiThreadIdx, | |
| 998 | + const int32_t kiDlayerIdx, | |
| 999 | + const int32_t kiSliceIdx) { | |
| 1000 | + SDqLayer* pDqLayer = pCtx->pCurDqLayer; | |
| 1001 | + const int32_t kiCodedNumInThread = pDqLayer->sSliceThreadInfo.iEncodedSliceNumInThread[kiThreadIdx]; | |
| 1002 | + const int32_t kiMaxSliceNumInThread = pDqLayer->sSliceThreadInfo.iMaxSliceNumInThread[kiThreadIdx]; | |
| 1003 | + int32_t iRet = 0; | |
| 1004 | + | |
| 1005 | + if (kiCodedNumInThread >= kiMaxSliceNumInThread) { | |
| 1006 | + iRet = ReallocateSliceInThread(pCtx, pDqLayer, kiDlayerIdx, kiThreadIdx); | |
| 1007 | + if (ENC_RETURN_SUCCESS != iRet) { | |
| 1008 | + return iRet; | |
| 1009 | + } | |
| 1010 | + } | |
| 1011 | + | |
| 1012 | + pSlice = pDqLayer->sSliceThreadInfo.pSliceInThread [kiThreadIdx] + kiCodedNumInThread; | |
| 1013 | + // Initialize slice bs buffer info | |
| 1014 | + pSlice->sSliceBs.uiBsPos = 0; | |
| 1015 | + pSlice->sSliceBs.iNalIndex = 0; | |
| 1016 | + pSlice->sSliceBs.pBsBuffer = pCtx->pSliceThreading->pThreadBsBuffer[kiThreadIdx]; | |
| 1017 | + | |
| 1018 | + return ENC_RETURN_SUCCESS; | |
| 1019 | +} | |
| 1020 | + | |
| 980 | 1021 | int32_t InitSliceThreadInfo (sWelsEncCtx* pCtx, |
| 981 | 1022 | SDqLayer* pDqLayer, |
| 982 | 1023 | const int32_t kiDlayerIndex, |
| @@ -1214,25 +1255,21 @@ int32_t CalculateNewSliceNum (SDqLayer* pDqLayer, · 231 unmodified lines | ||
| 1214 | 1255 | return ENC_RETURN_SUCCESS; |
| 1215 | 1256 | } |
| 1216 | 1257 | |
| 1217 | −int32_t ReallocSliceBuffer (sWelsEncCtx* pCtx) { | |
| 1258 | +int32_t ReallocateSliceInThread (sWelsEncCtx* pCtx, | |
| 1259 | + SDqLayer* pDqLayer, | |
| 1260 | + const int32_t kiDlayerIdx, | |
| 1261 | + const int32_t kiThreadIndex) { | |
| 1218 | 1262 | |
| 1219 | − CMemoryAlign* pMA = pCtx->pMemAlign; | |
| 1220 | − SDqLayer* pCurLayer = pCtx->pCurDqLayer; | |
| 1221 | − SSlice** ppSlice = NULL; | |
| 1222 | − int32_t iMaxSliceNumOld = pCurLayer->iMaxSliceNum; | |
| 1223 | − int32_t iMaxSliceNumNew = 0; | |
| 1224 | − int32_t iRet = 0; | |
| 1225 | − int32_t iSliceIdx = 0; | |
| 1226 | − const int32_t kiCurDid = pCtx->uiDependencyId; | |
| 1263 | + int32_t iMaxSliceNumInThread = pDqLayer->sSliceThreadInfo.iMaxSliceNumInThread[kiThreadIndex]; | |
| 1264 | + int32_t iMaxSliceNumUpdate = 0; | |
| 1265 | + int32_t iRet = 0; | |
| 1266 | + SSlice* pLastCodedSlice = pDqLayer->sSliceThreadInfo.pSliceInThread[kiThreadIndex] + (iMaxSliceNumInThread - 1); | |
| 1267 | + SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiDlayerIdx].sSliceArgument; | |
| 1227 | 1268 | |
| 1228 | − int32_t* pFirstMbIdxofSlice = NULL; | |
| 1229 | − int32_t* pCountMbNumInSlice = NULL; | |
| 1230 | − SSlice* pLastCodedSlice = pCurLayer->sSliceThreadInfo.pSliceInThread[0] + (iMaxSliceNumOld - 1); | |
| 1231 | − SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiCurDid].sSliceArgument; | |
| 1232 | − iRet = CalculateNewSliceNum (pCurLayer, | |
| 1269 | + iRet = CalculateNewSliceNum (pDqLayer, | |
| 1233 | 1270 | pLastCodedSlice, |
| 1234 | − iMaxSliceNumOld, | |
| 1235 | − iMaxSliceNumNew); | |
| 1271 | + iMaxSliceNumInThread, | |
| 1272 | + iMaxSliceNumUpdate); | |
| 1236 | 1273 | |
| 1237 | 1274 | if (ENC_RETURN_SUCCESS != iRet) { |
| 1238 | 1275 | return iRet; |
| @@ -1240,44 +1277,91 @@ int32_t ReallocSliceBuffer (sWelsEncCtx* pCtx) { · 1 unmodified line | ||
| 1240 | 1277 | |
| 1241 | 1278 | iRet = ReallocateSliceList (pCtx, |
| 1242 | 1279 | pSliceArgument, |
| 1243 | − pCurLayer->sSliceThreadInfo.pSliceInThread[0], | |
| 1244 | − iMaxSliceNumOld, | |
| 1245 | − iMaxSliceNumNew); | |
| 1280 | + pDqLayer->sSliceThreadInfo.pSliceInThread[kiThreadIndex], | |
| 1281 | + iMaxSliceNumInThread, | |
| 1282 | + iMaxSliceNumUpdate); | |
| 1246 | 1283 | if (ENC_RETURN_SUCCESS != iRet) { |
| 1247 | 1284 | return iRet; |
| 1248 | 1285 | } |
| 1249 | 1286 | |
| 1287 | + return ENC_RETURN_SUCCESS; | |
| 1288 | +} | |
| 1289 | + | |
| 1290 | +int32_t ExtendLayerBuffer(sWelsEncCtx* pCtx, | |
| 1291 | + const int32_t kiMaxSliceNumOld, | |
| 1292 | + const int32_t kiMaxSliceNumNew){ | |
| 1293 | + CMemoryAlign* pMA = pCtx->pMemAlign; | |
| 1294 | + SDqLayer* pCurLayer = pCtx->pCurDqLayer; | |
| 1295 | + SSlice** ppSlice = NULL; | |
| 1296 | + int32_t* pFirstMbIdxofSlice = NULL; | |
| 1297 | + int32_t* pCountMbNumInSlice = NULL; | |
| 1298 | + | |
| 1250 | 1299 | // update for ppsliceInlayer |
| 1251 | − ppSlice = (SSlice**)pMA->WelsMallocz (sizeof (SSlice*) * iMaxSliceNumNew, "ppSlice"); | |
| 1300 | + ppSlice = (SSlice**)pMA->WelsMallocz (sizeof (SSlice*) * kiMaxSliceNumNew, "ppSlice"); | |
| 1252 | 1301 | if (NULL == ppSlice) { |
| 1253 | − WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::ReallocSliceBuffer: ppSlice is NULL"); | |
| 1302 | + WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::ExtendLayerBuffer: ppSlice is NULL"); | |
| 1254 | 1303 | return ENC_RETURN_MEMALLOCERR; |
| 1255 | 1304 | } |
| 1256 | 1305 | pMA->WelsFree (pCurLayer->ppSliceInLayer, "ppSliceInLayer"); |
| 1257 | 1306 | pCurLayer->ppSliceInLayer = ppSlice; |
| 1258 | 1307 | |
| 1259 | 1308 | // update for pFirstMbIdxInSlice |
| 1260 | − pFirstMbIdxofSlice = (int32_t*)pMA->WelsMallocz (sizeof (int32_t*) * iMaxSliceNumNew, "pFirstMbIdxofSlice"); | |
| 1309 | + pFirstMbIdxofSlice = (int32_t*)pMA->WelsMallocz (sizeof (int32_t*) * kiMaxSliceNumNew, "pFirstMbIdxofSlice"); | |
| 1261 | 1310 | if (NULL == pFirstMbIdxofSlice) { |
| 1262 | − WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::ReallocSliceBuffer: pFirstMbIdxofSlice is NULL"); | |
| 1311 | + WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::ExtendLayerBuffer: pFirstMbIdxofSlice is NULL"); | |
| 1263 | 1312 | return ENC_RETURN_MEMALLOCERR; |
| 1264 | 1313 | } |
| 1265 | − memset (pFirstMbIdxofSlice, 0, sizeof(int32_t) * iMaxSliceNumNew); | |
| 1266 | − memcpy (pFirstMbIdxofSlice, pCurLayer->pFirstMbIdxOfSlice, sizeof (int32_t) * iMaxSliceNumOld); | |
| 1314 | + memset (pFirstMbIdxofSlice, 0, sizeof(int32_t) * kiMaxSliceNumNew); | |
| 1315 | + memcpy (pFirstMbIdxofSlice, pCurLayer->pFirstMbIdxOfSlice, sizeof (int32_t) * kiMaxSliceNumOld); | |
| 1267 | 1316 | pMA->WelsFree (pCurLayer->pFirstMbIdxOfSlice, "pFirstMbIdxofSlice"); |
| 1268 | 1317 | pCurLayer->pFirstMbIdxOfSlice = pFirstMbIdxofSlice; |
| 1269 | 1318 | |
| 1270 | 1319 | // update for pCountMbNumInSlice |
| 1271 | − pCountMbNumInSlice = (int32_t*)pMA->WelsMallocz (sizeof (int32_t*) * iMaxSliceNumNew, "pCountMbNumInSlice"); | |
| 1320 | + pCountMbNumInSlice = (int32_t*)pMA->WelsMallocz (sizeof (int32_t*) * kiMaxSliceNumNew, "pCountMbNumInSlice"); | |
| 1272 | 1321 | if (NULL == pCountMbNumInSlice) { |
| 1273 | − WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::ReallocSliceBuffer: pCountMbNumInSlice is NULL"); | |
| 1322 | + WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::ExtendLayerBuffer: pCountMbNumInSlice is NULL"); | |
| 1274 | 1323 | return ENC_RETURN_MEMALLOCERR; |
| 1275 | 1324 | } |
| 1276 | − memset (pCountMbNumInSlice, 0, sizeof(int32_t) * iMaxSliceNumNew); | |
| 1277 | − memcpy (pCountMbNumInSlice, pCurLayer->pCountMbNumInSlice, sizeof (int32_t) * iMaxSliceNumOld); | |
| 1325 | + memset (pCountMbNumInSlice, 0, sizeof(int32_t) * kiMaxSliceNumNew); | |
| 1326 | + memcpy (pCountMbNumInSlice, pCurLayer->pCountMbNumInSlice, sizeof (int32_t) * kiMaxSliceNumOld); | |
| 1278 | 1327 | pMA->WelsFree (pCurLayer->pCountMbNumInSlice, "pCountMbNumInSlice"); |
| 1279 | 1328 | pCurLayer->pCountMbNumInSlice = pCountMbNumInSlice; |
| 1280 | 1329 | |
| 1330 | + return ENC_RETURN_SUCCESS; | |
| 1331 | +} | |
| 1332 | + | |
| 1333 | +int32_t ReallocSliceBuffer (sWelsEncCtx* pCtx) { | |
| 1334 | + | |
| 1335 | + SDqLayer* pCurLayer = pCtx->pCurDqLayer; | |
| 1336 | + int32_t iMaxSliceNumOld = pCurLayer->iMaxSliceNum; | |
| 1337 | + int32_t iMaxSliceNumNew = 0; | |
| 1338 | + int32_t iRet = 0; | |
| 1339 | + int32_t iSliceIdx = 0; | |
| 1340 | + const int32_t kiCurDid = pCtx->uiDependencyId; | |
| 1341 | + SSlice* pLastCodedSlice = pCurLayer->sSliceThreadInfo.pSliceInThread[0] + (iMaxSliceNumOld - 1); | |
| 1342 | + SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiCurDid].sSliceArgument; | |
| 1343 | + iRet = CalculateNewSliceNum (pCurLayer, | |
| 1344 | + pLastCodedSlice, | |
| 1345 | + iMaxSliceNumOld, | |
| 1346 | + iMaxSliceNumNew); | |
| 1347 | + | |
| 1348 | + if (ENC_RETURN_SUCCESS != iRet) { | |
| 1349 | + return iRet; | |
| 1350 | + } | |
| 1351 | + | |
| 1352 | + iRet = ReallocateSliceList (pCtx, | |
| 1353 | + pSliceArgument, | |
| 1354 | + pCurLayer->sSliceThreadInfo.pSliceInThread[0], | |
| 1355 | + iMaxSliceNumOld, | |
| 1356 | + iMaxSliceNumNew); | |
| 1357 | + if (ENC_RETURN_SUCCESS != iRet) { | |
| 1358 | + return iRet; | |
| 1359 | + } | |
| 1360 | + | |
| 1361 | + iRet = ExtendLayerBuffer(pCtx, iMaxSliceNumOld, iMaxSliceNumNew); | |
| 1362 | + if (ENC_RETURN_SUCCESS != iRet) { | |
| 1363 | + return iRet; | |
| 1364 | + } | |
| 1281 | 1365 | |
| 1282 | 1366 | for (iSliceIdx = 0; iSliceIdx < iMaxSliceNumNew; iSliceIdx++) { |
| 1283 | 1367 | pCurLayer->ppSliceInLayer[iSliceIdx] = pCurLayer->sSliceThreadInfo.pSliceInThread[0] + iSliceIdx; |
| @@ -1292,6 +1376,22 @@ int32_t ReallocSliceBuffer (sWelsEncCtx* pCtx) { · 8 unmodified lines | ||
| 1292 | 1376 | return ENC_RETURN_SUCCESS; |
| 1293 | 1377 | } |
| 1294 | 1378 | |
| 1379 | +static inline int32_t CheckAllSliceBuffer(SDqLayer* pCurLayer, const int32_t kiCodedSliceNum) { | |
| 1380 | + int32_t iSliceIdx = 0; | |
| 1381 | + for(; iSliceIdx <kiCodedSliceNum ; iSliceIdx ++ ) { | |
| 1382 | + if ( NULL == pCurLayer->ppSliceInLayer[iSliceIdx]) { | |
| 1383 | + return ENC_RETURN_UNEXPECTED; | |
| 1384 | + } | |
| 1385 | + | |
| 1386 | + if ( iSliceIdx != pCurLayer->ppSliceInLayer[iSliceIdx]->iSliceIdx) { | |
| 1387 | + return ENC_RETURN_UNEXPECTED; | |
| 1388 | + } | |
| 1389 | + } | |
| 1390 | + | |
| 1391 | + return ENC_RETURN_SUCCESS; | |
| 1392 | +} | |
| 1393 | + | |
| 1394 | + | |
| 1295 | 1395 | int32_t ReOrderSliceInLayer (SDqLayer* pCurLayer, |
| 1296 | 1396 | const int32_t kiThreadNum, |
| 1297 | 1397 | const int32_t kiPartitionNum) { |
| @@ -1301,18 +1401,26 @@ int32_t ReOrderSliceInLayer (SDqLayer* pCurLayer, · 3 unmodified lines | ||
| 1301 | 1401 | int32_t iPartitionID = 0; |
| 1302 | 1402 | int32_t iSliceIdx = 0; |
| 1303 | 1403 | int32_t iSliceNumInThread = 0; |
| 1304 | − int32_t iPartitionOffset = 0; | |
| 1404 | + int32_t iEncodeSliceNum = 0; | |
| 1305 | 1405 | int32_t iActualSliceIdx = 0; |
| 1406 | + int32_t iNonUsedBufferNum = 0; | |
| 1407 | + int32_t iUsedSliceNum = 0; | |
| 1306 | 1408 | int32_t aiPartitionOffset[MAX_THREADS_NUM] = {0}; |
| 1307 | 1409 | |
| 1308 | 1410 | //for non-dynamic slice mode, kiPartitionNum = 1, iPartitionOffset = 0 |
| 1309 | 1411 | for(iPartitionIdx = 0; iPartitionIdx < kiPartitionNum; iPartitionIdx++) { |
| 1310 | − aiPartitionOffset[iPartitionIdx] = iPartitionOffset; | |
| 1311 | − iPartitionOffset += pCurLayer->pNumSliceCodedOfPartition[iPartitionIdx]; | |
| 1412 | + aiPartitionOffset[iPartitionIdx] = iEncodeSliceNum; | |
| 1413 | + iEncodeSliceNum += pCurLayer->pNumSliceCodedOfPartition[iPartitionIdx]; | |
| 1414 | + } | |
| 1415 | + | |
| 1416 | + if( iEncodeSliceNum != pCurLayer->sSliceEncCtx.iSliceNumInFrame) { | |
| 1417 | + return ENC_RETURN_UNEXPECTED; | |
| 1312 | 1418 | } |
| 1313 | 1419 | |
| 1420 | + //before encode all slices in layer, slices' index are init with -1 | |
| 1421 | + //pSliceInThread->iSliceIdx will be set to actual slice index when encode one slice | |
| 1314 | 1422 | for (iThreadIdx = 0; iThreadIdx < kiThreadNum; iThreadIdx++) { |
| 1315 | − iSliceNumInThread = pCurLayer->sSliceThreadInfo.iEncodedSliceNumInThread[iThreadIdx]; | |
| 1423 | + iSliceNumInThread = pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[iThreadIdx]; | |
| 1316 | 1424 | |
| 1317 | 1425 | for(iSliceIdx =0; iSliceIdx < iSliceNumInThread; iSliceIdx++) { |
| 1318 | 1426 | pSliceInThread = pCurLayer->sSliceThreadInfo.pSliceInThread[iThreadIdx] + iSliceIdx; |
| @@ -1320,78 +1428,105 @@ int32_t ReOrderSliceInLayer (SDqLayer* pCurLayer, · 1 unmodified line | ||
| 1320 | 1428 | return ENC_RETURN_UNEXPECTED; |
| 1321 | 1429 | } |
| 1322 | 1430 | |
| 1323 | − iPartitionID = pSliceInThread->iSliceIdx % kiPartitionNum; | |
| 1324 | − iActualSliceIdx = aiPartitionOffset[iPartitionID] + pSliceInThread->iSliceIdx / kiPartitionNum; | |
| 1325 | − pCurLayer->ppSliceInLayer[iActualSliceIdx] = pSliceInThread; | |
| 1431 | + if( -1 != pSliceInThread->iSliceIdx) { | |
| 1432 | + iPartitionID = pSliceInThread->iSliceIdx % kiPartitionNum; | |
| 1433 | + iActualSliceIdx = aiPartitionOffset[iPartitionID] + pSliceInThread->iSliceIdx / kiPartitionNum; | |
| 1434 | + pCurLayer->ppSliceInLayer[iActualSliceIdx] = pSliceInThread; | |
| 1435 | + iUsedSliceNum ++; | |
| 1436 | + } else { | |
| 1437 | + pCurLayer->ppSliceInLayer[iEncodeSliceNum + iNonUsedBufferNum] = pSliceInThread; | |
| 1438 | + iNonUsedBufferNum ++; | |
| 1439 | + } | |
| 1326 | 1440 | } |
| 1327 | 1441 | } |
| 1328 | 1442 | |
| 1443 | + if( iUsedSliceNum != iEncodeSliceNum || | |
| 1444 | + pCurLayer->iMaxSliceNum != (iNonUsedBufferNum + iUsedSliceNum)) { | |
| 1445 | + return ENC_RETURN_UNEXPECTED; | |
| 1446 | + } | |
| 1447 | + | |
| 1448 | + if (ENC_RETURN_SUCCESS != CheckAllSliceBuffer(pCurLayer, iEncodeSliceNum)) { | |
| 1449 | + return ENC_RETURN_UNEXPECTED; | |
| 1450 | + } | |
| 1451 | + | |
| 1329 | 1452 | return ENC_RETURN_SUCCESS; |
| 1330 | 1453 | } |
| 1331 | 1454 | |
| 1332 | −static inline int32_t CheckAllSliceBuffer(SDqLayer* pCurLayer, const int32_t kiCodedSliceNum) { | |
| 1333 | − int32_t iSliceIdx = 0; | |
| 1334 | − for(; iSliceIdx <kiCodedSliceNum ; iSliceIdx ++ ) { | |
| 1335 | − if ( NULL == pCurLayer->ppSliceInLayer[iSliceIdx]) { | |
| 1336 | − return ENC_RETURN_UNEXPECTED; | |
| 1337 | − } | |
| 1455 | +int32_t FrameBsRealloc (sWelsEncCtx* pCtx, | |
| 1456 | + SFrameBSInfo* pFrameBsInfo, | |
| 1457 | + SLayerBSInfo* pLayerBsInfo, | |
| 1458 | + const int32_t kiMaxSliceNumOld) { | |
| 1459 | + CMemoryAlign* pMA = pCtx->pMemAlign; | |
| 1460 | + int32_t iCountNals = pCtx->pOut->iCountNals; | |
| 1461 | + iCountNals += kiMaxSliceNumOld * (pCtx->pSvcParam->iSpatialLayerNum + pCtx->bNeedPrefixNalFlag); | |
| 1462 | + | |
| 1463 | + SWelsNalRaw* pNalList = (SWelsNalRaw*)pMA->WelsMallocz (iCountNals * sizeof (SWelsNalRaw), "pOut->sNalList"); | |
| 1464 | + if (NULL == pNalList) { | |
| 1465 | + WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::FrameBsRealloc: pNalList is NULL"); | |
| 1466 | + return ENC_RETURN_MEMALLOCERR; | |
| 1467 | + } | |
| 1468 | + memcpy (pNalList, pCtx->pOut->sNalList, sizeof (SWelsNalRaw) * pCtx->pOut->iCountNals); | |
| 1469 | + pMA->WelsFree (pCtx->pOut->sNalList, "pOut->sNalList"); | |
| 1470 | + pCtx->pOut->sNalList = pNalList; | |
| 1338 | 1471 | |
| 1339 | − if ( iSliceIdx != pCurLayer->ppSliceInLayer[iSliceIdx]->iSliceIdx) { | |
| 1340 | − return ENC_RETURN_UNEXPECTED; | |
| 1341 | − } | |
| 1472 | + int32_t* pNalLen = (int32_t*)pMA->WelsMallocz (iCountNals * sizeof (int32_t), "pOut->pNalLen"); | |
| 1473 | + if (NULL == pNalLen) { | |
| 1474 | + WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::FrameBsRealloc: pNalLen is NULL"); | |
| 1475 | + return ENC_RETURN_MEMALLOCERR; | |
| 1476 | + } | |
| 1477 | + memcpy (pNalLen, pCtx->pOut->pNalLen, sizeof (int32_t) * pCtx->pOut->iCountNals); | |
| 1478 | + pMA->WelsFree (pCtx->pOut->pNalLen, "pOut->pNalLen"); | |
| 1479 | + pCtx->pOut->pNalLen = pNalLen; | |
| 1480 | + | |
| 1481 | + pCtx->pOut->iCountNals = iCountNals; | |
| 1482 | + SLayerBSInfo* pLBI1, *pLBI2; | |
| 1483 | + pLBI1 = &pFrameBsInfo->sLayerInfo[0]; | |
| 1484 | + pLBI1->pNalLengthInByte = pCtx->pOut->pNalLen; | |
| 1485 | + while (pLBI1 != pLayerBsInfo) { | |
| 1486 | + pLBI2 = pLBI1; | |
| 1487 | + ++ pLBI1; | |
| 1488 | + pLBI1->pNalLengthInByte = pLBI2->pNalLengthInByte + pLBI2->iNalCount; | |
| 1342 | 1489 | } |
| 1343 | 1490 | |
| 1344 | 1491 | return ENC_RETURN_SUCCESS; |
| 1345 | 1492 | } |
| 1346 | 1493 | |
| 1347 | −int32_t SliceLayerInfoUpdate (sWelsEncCtx* pCtx, const int32_t kiDlayerIndex) { | |
| 1348 | − | |
| 1349 | − CMemoryAlign* pMA = pCtx->pMemAlign; | |
| 1494 | +int32_t SliceLayerInfoUpdate (sWelsEncCtx* pCtx, | |
| 1495 | + SFrameBSInfo* pFrameBsInfo, | |
| 1496 | + SLayerBSInfo* pLayerBsInfo, | |
| 1497 | + const int32_t kiPartitionNum) { | |
| 1350 | 1498 | SDqLayer* pCurLayer = pCtx->pCurDqLayer; |
| 1351 | − SSlice** ppSlice = NULL; | |
| 1352 | − int32_t iCodedSliceNum = 0; | |
| 1499 | + int32_t iMaxSliceNum = 0; | |
| 1353 | 1500 | int32_t iThreadIdx = 0; |
| 1354 | 1501 | int32_t iRet = 0; |
| 1355 | 1502 | int32_t iThreadNum = 1; //TODO: should be equal to pCurLayer->iMaxSliceNum; |
| 1356 | − SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument; | |
| 1357 | − int32_t iPartitionNum = (SM_SIZELIMITED_SLICE == pSliceArgument->uiSliceMode) ? pCtx->iActiveThreadsNum : 1; | |
| 1358 | 1503 | |
| 1359 | 1504 | for ( ; iThreadIdx < iThreadNum; iThreadIdx++) { |
| 1360 | − iCodedSliceNum += pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[iThreadIdx]; | |
| 1361 | − } | |
| 1362 | − | |
| 1363 | − if (iCodedSliceNum <= 0) { | |
| 1364 | − return ENC_RETURN_UNEXPECTED; | |
| 1505 | + iMaxSliceNum += pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[iThreadIdx]; | |
| 1365 | 1506 | } |
| 1366 | 1507 | |
| 1367 | 1508 | //reallocate ppSliceInLayer if total encoded slice num exceed max slice num |
| 1368 | − if (iCodedSliceNum > pCurLayer->iMaxSliceNum) { | |
| 1369 | − ppSlice = (SSlice**)pMA->WelsMallocz (sizeof (SSlice*) * iCodedSliceNum, "ppSlice"); | |
| 1370 | − if (NULL == ppSlice) { | |
| 1371 | − WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::SliceLayerInfoUpdate: ppSlice is NULL"); | |
| 1372 | − return ENC_RETURN_MEMALLOCERR; | |
| 1509 | + if (iMaxSliceNum > pCurLayer->iMaxSliceNum) { | |
| 1510 | + iRet = FrameBsRealloc (pCtx, pFrameBsInfo, pLayerBsInfo, pCtx->pCurDqLayer->iMaxSliceNum); | |
| 1511 | + if(ENC_RETURN_SUCCESS != iRet) { | |
| 1512 | + return iRet; | |
| 1373 | 1513 | } |
| 1374 | 1514 | |
| 1375 | − pMA->WelsFree (pCurLayer->ppSliceInLayer, "ppSliceInLayer"); | |
| 1376 | − pCurLayer->ppSliceInLayer = ppSlice; | |
| 1377 | − pCurLayer->iMaxSliceNum = iCodedSliceNum; | |
| 1515 | + iRet = ExtendLayerBuffer(pCtx, pCtx->pCurDqLayer->iMaxSliceNum, iMaxSliceNum); | |
| 1516 | + if (ENC_RETURN_SUCCESS != iRet) { | |
| 1517 | + return iRet; | |
| 1518 | + } | |
| 1519 | + pCurLayer->iMaxSliceNum = iMaxSliceNum; | |
| 1378 | 1520 | } |
| 1379 | 1521 | |
| 1380 | 1522 | //update ppSliceInLayer based on pSliceInThread, reordering based on slice index |
| 1381 | − iRet = ReOrderSliceInLayer (pCurLayer, iThreadNum, iPartitionNum); | |
| 1523 | + iRet = ReOrderSliceInLayer (pCurLayer, iThreadNum, kiPartitionNum); | |
| 1382 | 1524 | if (ENC_RETURN_SUCCESS != iRet) { |
| 1383 | 1525 | WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, |
| 1384 | 1526 | "CWelsH264SVCEncoder::SliceLayerInfoUpdate: ReOrderSliceInLayer failed"); |
| 1385 | 1527 | return iRet; |
| 1386 | 1528 | } |
| 1387 | 1529 | |
| 1388 | − iRet = CheckAllSliceBuffer(pCurLayer, pCtx->iActiveThreadsNum); | |
| 1389 | − if (ENC_RETURN_SUCCESS != iRet) { | |
| 1390 | − WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, | |
| 1391 | − "CWelsH264SVCEncoder::SliceLayerInfoUpdate: ReOrderSliceInLayerDynamic failed"); | |
| 1392 | − return iRet; | |
| 1393 | − } | |
| 1394 | − | |
| 1395 | 1530 | return ENC_RETURN_SUCCESS; |
| 1396 | 1531 | } |
| 1397 | 1532 | |
| @@ -1450,7 +1585,6 @@ void UpdateMbNeighbourInfoForNextSlice (SDqLayer* pCurDq, · 52 unmodified lines | ||
| 1450 | 1585 | (iIdx <= kiLastMbIdxInPartition)); |
| 1451 | 1586 | } |
| 1452 | 1587 | |
| 1453 | − | |
| 1454 | 1588 | void AddSliceBoundary (sWelsEncCtx* pEncCtx, SSlice* pCurSlice, SSliceCtx* pSliceCtx, SMB* pCurMb, |
| 1455 | 1589 | int32_t iFirstMbIdxOfNextSlice, const int32_t kiLastMbIdxInPartition) { |
| 1456 | 1590 | SDqLayer* pCurLayer = pEncCtx->pCurDqLayer; |