Showing the changes to codec/encoder/core/src/svc_encode_slice.cpp (1 of 6 files). Show all
Unified · Split
| @@ -1325,6 +1325,110 @@ int32_t ReallocSliceBuffer (sWelsEncCtx* pCtx) { · 1324 unmodified lines | ||
| 1325 | 1325 | return ENC_RETURN_SUCCESS; |
| 1326 | 1326 | } |
| 1327 | 1327 | |
| 1328 | +/* | |
| 1329 | +int32_t ReOrderSliceInLayer (SDqLayer* pCurLayer, | |
| 1330 | + const int32_t kiThreadNum, | |
| 1331 | + const int32_t kiPartitionNum) { | |
| 1332 | + SSlice* pSliceInThread = NULL; | |
| 1333 | + int32_t iThreadIdx = 0; | |
| 1334 | + int32_t iPartitionIdx = 0; | |
| 1335 | + int32_t iPartitionID = 0; | |
| 1336 | + int32_t iSliceIdx = 0; | |
| 1337 | + int32_t iSliceNumInThread = 0; | |
| 1338 | + int32_t iPartitionOffset = 0; | |
| 1339 | + int32_t iActualSliceIdx = 0; | |
| 1340 | + int32_t aiPartitionOffset[MAX_THREADS_NUM] = {0}; | |
| 1341 | + | |
| 1342 | + //for non-dynamic slice mode, kiPartitionNum = 1, iPartitionOffset = 0 | |
| 1343 | + for(iPartitionIdx = 0; iPartitionIdx < kiPartitionNum; iPartitionIdx++) { | |
| 1344 | + aiPartitionOffset[iPartitionIdx] = iPartitionOffset; | |
| 1345 | + iPartitionOffset += pCurLayer->pNumSliceCodedOfPartition[iPartitionIdx]; | |
| 1346 | + } | |
| 1347 | + | |
| 1348 | + for (iThreadIdx = 0; iThreadIdx < kiThreadNum; iThreadIdx++) { | |
| 1349 | + iSliceNumInThread = pCurLayer->sSliceThreadInfo.iEncodedSliceNumInThread[iThreadIdx]; | |
| 1350 | + | |
| 1351 | + for(iSliceIdx =0; iSliceIdx < iSliceNumInThread; iSliceIdx++) { | |
| 1352 | + pSliceInThread = pCurLayer->sSliceThreadInfo.pSliceInThread[iThreadIdx] + iSliceIdx; | |
| 1353 | + if (NULL == pSliceInThread) { | |
| 1354 | + return ENC_RETURN_UNEXPECTED; | |
| 1355 | + } | |
| 1356 | + | |
| 1357 | + iPartitionID = pSliceInThread->uiSliceIdx % kiPartitionNum; | |
| 1358 | + iActualSliceIdx = aiPartitionOffset[iPartitionID] + pSliceInThread->uiSliceIdx / kiPartitionNum; | |
| 1359 | + pCurLayer->ppSliceInLayer[iActualSliceIdx] = pSliceInThread; | |
| 1360 | + } | |
| 1361 | + } | |
| 1362 | + | |
| 1363 | + return ENC_RETURN_SUCCESS; | |
| 1364 | +} | |
| 1365 | + | |
| 1366 | +static inline int32_t CheckAllSliceBuffer(SDqLayer* pCurLayer, const int32_t kiCodedSliceNum) { | |
| 1367 | + int32_t iSliceIdx = 0; | |
| 1368 | + for(; iSliceIdx <kiCodedSliceNum ; iSliceIdx ++ ) { | |
| 1369 | + if ( NULL == pCurLayer->ppSliceInLayer[iSliceIdx]) { | |
| 1370 | + return ENC_RETURN_UNEXPECTED; | |
| 1371 | + } | |
| 1372 | + | |
| 1373 | + if ( iSliceIdx != pCurLayer->ppSliceInLayer[iSliceIdx]->uiSliceIdx) { | |
| 1374 | + return ENC_RETURN_UNEXPECTED; | |
| 1375 | + } | |
| 1376 | + } | |
| 1377 | + | |
| 1378 | + return ENC_RETURN_SUCCESS; | |
| 1379 | +} | |
| 1380 | + | |
| 1381 | +int32_t SliceLayerInfoUpdate (sWelsEncCtx* pCtx, const int32_t kiDlayerIndex) { | |
| 1382 | + | |
| 1383 | + CMemoryAlign* pMA = pCtx->pMemAlign; | |
| 1384 | + SDqLayer* pCurLayer = pCtx->pCurDqLayer; | |
| 1385 | + SSlice** ppSlice = NULL; | |
| 1386 | + int32_t iCodedSliceNum = 0; | |
| 1387 | + int32_t iThreadIdx = 0; | |
| 1388 | + int32_t iRet = 0; | |
| 1389 | + SSliceArgument* pSliceArgument = & pCtx->pSvcParam->sSpatialLayers[kiDlayerIndex].sSliceArgument; | |
| 1390 | + int32_t iPartitionNum = (SM_SIZELIMITED_SLICE == pSliceArgument->uiSliceMode) ? pCtx->iActiveThreadsNum : 1; | |
| 1391 | + | |
| 1392 | + for ( ; iThreadIdx < pCtx->iActiveThreadsNum; iThreadIdx++) { | |
| 1393 | + iCodedSliceNum += pCurLayer->sSliceThreadInfo.iMaxSliceNumInThread[iThreadIdx]; | |
| 1394 | + } | |
| 1395 | + | |
| 1396 | + if (iCodedSliceNum <= 0) { | |
| 1397 | + return ENC_RETURN_UNEXPECTED; | |
| 1398 | + } | |
| 1399 | + | |
| 1400 | + //reallocate ppSliceInLayer if total encoded slice num exceed max slice num | |
| 1401 | + if (iCodedSliceNum > pCurLayer->sSliceEncCtx.iMaxSliceNumConstraint) { | |
| 1402 | + ppSlice = (SSlice**)pMA->WelsMallocz (sizeof (SSlice*) * iCodedSliceNum, "ppSlice"); | |
| 1403 | + if (NULL == ppSlice) { | |
| 1404 | + WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "CWelsH264SVCEncoder::SliceLayerInfoUpdate: ppSlice is NULL"); | |
| 1405 | + return ENC_RETURN_MEMALLOCERR; | |
| 1406 | + } | |
| 1407 | + | |
| 1408 | + pMA->WelsFree (pCurLayer->ppSliceInLayer, "ppSliceInLayer"); | |
| 1409 | + pCurLayer->ppSliceInLayer = ppSlice; | |
| 1410 | + pCurLayer->sSliceEncCtx.iMaxSliceNumConstraint = iCodedSliceNum; | |
| 1411 | + } | |
| 1412 | + | |
| 1413 | + //update ppSliceInLayer based on pSliceInThread, reordering based on slice index | |
| 1414 | + iRet = ReOrderSliceInLayer (pCurLayer, pCtx->iActiveThreadsNum, iPartitionNum); | |
| 1415 | + if (ENC_RETURN_SUCCESS != iRet) { | |
| 1416 | + WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, | |
| 1417 | + "CWelsH264SVCEncoder::SliceLayerInfoUpdate: ReOrderSliceInLayer failed"); | |
| 1418 | + return iRet; | |
| 1419 | + } | |
| 1420 | + | |
| 1421 | + iRet = CheckAllSliceBuffer(pCurLayer, pCtx->iActiveThreadsNum); | |
| 1422 | + if (ENC_RETURN_SUCCESS != iRet) { | |
| 1423 | + WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, | |
| 1424 | + "CWelsH264SVCEncoder::SliceLayerInfoUpdate: ReOrderSliceInLayerDynamic failed"); | |
| 1425 | + return iRet; | |
| 1426 | + } | |
| 1427 | + | |
| 1428 | + return ENC_RETURN_SUCCESS; | |
| 1429 | +} | |
| 1430 | +*/ | |
| 1431 | + | |
| 1328 | 1432 | int32_t WelsCodeOneSlice (sWelsEncCtx* pEncCtx, const int32_t kiSliceIdx, const int32_t kiNalType) { |
| 1329 | 1433 | SDqLayer* pCurLayer = pEncCtx->pCurDqLayer; |
| 1330 | 1434 | SNalUnitHeaderExt* pNalHeadExt = &pCurLayer->sLayerInfo.sNalHeaderExt; |