Showing the changes to codec/encoder/core/src/encoder_ext.cpp (1 of 5 files). Show all
Unified · Split
| @@ -226,8 +226,7 @@ int32_t ParamValidationExt (sWelsEncCtx*pCtx,SWelsSvcCodingParam* pCodingParam) · 225 unmodified lines | ||
| 226 | 226 | fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[iIdx] = 0; |
| 227 | 227 | } |
| 228 | 228 | break; |
| 229 | − case SM_FIXEDSLCNUM_SLICE: | |
| 230 | − case SM_AUTO_SLICE:{ | |
| 229 | + case SM_FIXEDSLCNUM_SLICE:{ | |
| 231 | 230 | fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0; |
| 232 | 231 | |
| 233 | 232 | iMbWidth = (kiPicWidth + 15) >> 4; |
| @@ -235,7 +234,7 @@ int32_t ParamValidationExt (sWelsEncCtx*pCtx,SWelsSvcCodingParam* pCodingParam) · 1 unmodified line | ||
| 235 | 234 | iMbNumInFrame = iMbWidth * iMbHeight; |
| 236 | 235 | iMaxSliceNum = MAX_SLICES_NUM; |
| 237 | 236 | if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum <= 0 |
| 238 | − || fDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) { | |
| 237 | + || fDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) { | |
| 239 | 238 | WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceNum (%d) settings!\n", fDlp->sSliceCfg.sSliceArgument.uiSliceNum); |
| 240 | 239 | return ENC_RETURN_UNSUPPORTED_PARA; |
| 241 | 240 | } |
| @@ -267,6 +266,10 @@ int32_t ParamValidationExt (sWelsEncCtx*pCtx,SWelsSvcCodingParam* pCodingParam) · 25 unmodified lines | ||
| 267 | 266 | } |
| 268 | 267 | } |
| 269 | 268 | break; |
| 269 | + case SM_AUTO_SLICE:{ | |
| 270 | + fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0; | |
| 271 | + } | |
| 272 | + break; | |
| 270 | 273 | case SM_RASTER_SLICE: { |
| 271 | 274 | fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0; |
| 272 | 275 | |
| @@ -1704,7 +1707,6 @@ int32_t InitSliceSettings (SWelsSvcCodingParam* pCodingParam, const int32_t kiCp · 1431 unmodified lines | ||
| 1704 | 1707 | break; // go through for MT_ENABLED & SM_DYN_SLICE? |
| 1705 | 1708 | //#endif//MT_ENABLED |
| 1706 | 1709 | case SM_FIXEDSLCNUM_SLICE: |
| 1707 | − case SM_AUTO_SLICE: | |
| 1708 | 1710 | if (iSliceNum > iMaxSliceCount) |
| 1709 | 1711 | iMaxSliceCount = iSliceNum; |
| 1710 | 1712 | // need perform check due uiSliceNum might change, although has been initialized somewhere outside |
| @@ -1726,6 +1728,40 @@ int32_t InitSliceSettings (SWelsSvcCodingParam* pCodingParam, const int32_t kiCp · 15 unmodified lines | ||
| 1726 | 1728 | if (iSliceNum > iMaxSliceCount) |
| 1727 | 1729 | iMaxSliceCount = iSliceNum; |
| 1728 | 1730 | break; |
| 1731 | + case SM_AUTO_SLICE: | |
| 1732 | + iMaxSliceCount = MAX_SLICES_NUM; | |
| 1733 | + pDlp->sSliceCfg.sSliceArgument.uiSliceNum = kiCpuCores; | |
| 1734 | + if (pDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceCount){ | |
| 1735 | + pDlp->sSliceCfg.sSliceArgument.uiSliceNum = iMaxSliceCount; | |
| 1736 | + } | |
| 1737 | + if (pDlp->sSliceCfg.sSliceArgument.uiSliceNum == 1) { | |
| 1738 | + WelsLog (NULL, WELS_LOG_DEBUG, | |
| 1739 | + "InitSliceSettings(), uiSliceNum(%d) you set for SM_AUTO_SLICE, now turn to SM_SINGLE_SLICE type!\n", | |
| 1740 | + pDlp->sSliceCfg.sSliceArgument.uiSliceNum); | |
| 1741 | + pDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE; | |
| 1742 | + break; | |
| 1743 | + } | |
| 1744 | + if (pCodingParam->bEnableRc) { // multiple slices verify with gom | |
| 1745 | + //check uiSliceNum | |
| 1746 | + GomValidCheckSliceNum (kiMbWidth, kiMbHeight, &pDlp->sSliceCfg.sSliceArgument.uiSliceNum); | |
| 1747 | + assert (pDlp->sSliceCfg.sSliceArgument.uiSliceNum > 1); | |
| 1748 | + //set uiSliceMbNum with current uiSliceNum | |
| 1749 | + GomValidCheckSliceMbNum (kiMbWidth, kiMbHeight, &pDlp->sSliceCfg.sSliceArgument); | |
| 1750 | + } else if (!CheckFixedSliceNumMultiSliceSetting (kiMbNumInFrame, | |
| 1751 | + &pDlp->sSliceCfg.sSliceArgument)) { // verify interleave mode settings | |
| 1752 | + //check uiSliceMbNum with current uiSliceNum | |
| 1753 | + WelsLog (NULL, WELS_LOG_ERROR, "InitSliceSettings(), invalid uiSliceMbNum (%d) settings!,now turn to SM_SINGLE_SLICE type\n", | |
| 1754 | + pDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[0]); | |
| 1755 | + pDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE; | |
| 1756 | + pDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1; | |
| 1757 | + } | |
| 1758 | + // considering the coding efficient and performance, iCountMbNum constraint by MIN_NUM_MB_PER_SLICE condition of multi-pSlice mode settting | |
| 1759 | + if (kiMbNumInFrame <= MIN_NUM_MB_PER_SLICE) { | |
| 1760 | + pDlp->sSliceCfg.uiSliceMode = SM_SINGLE_SLICE; | |
| 1761 | + pDlp->sSliceCfg.sSliceArgument.uiSliceNum = 1; | |
| 1762 | + break; | |
| 1763 | + } | |
| 1764 | + break; | |
| 1729 | 1765 | default: |
| 1730 | 1766 | break; |
| 1731 | 1767 | } |