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 | fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[iIdx] = 0; | 226 | fDlp->sSliceCfg.sSliceArgument.uiSliceMbNum[iIdx] = 0; |
| 227 | } | 227 | } |
| 228 | break; | 228 | break; |
| 229 | case SM_FIXEDSLCNUM_SLICE: | 229 | case SM_FIXEDSLCNUM_SLICE:{ |
| 230 | case SM_AUTO_SLICE:{ | ||
| 231 | fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0; | 230 | fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0; |
| 232 | 231 | ||
| 233 | iMbWidth = (kiPicWidth + 15) >> 4; | 232 | iMbWidth = (kiPicWidth + 15) >> 4; |
| @@ -235,7 +234,7 @@ int32_t ParamValidationExt (sWelsEncCtx*pCtx,SWelsSvcCodingParam* pCodingParam) · 1 unmodified line | |||
| 235 | iMbNumInFrame = iMbWidth * iMbHeight; | 234 | iMbNumInFrame = iMbWidth * iMbHeight; |
| 236 | iMaxSliceNum = MAX_SLICES_NUM; | 235 | iMaxSliceNum = MAX_SLICES_NUM; |
| 237 | if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum <= 0 | 236 | if (fDlp->sSliceCfg.sSliceArgument.uiSliceNum <= 0 |
| 238 | || fDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) { | 237 | || fDlp->sSliceCfg.sSliceArgument.uiSliceNum > iMaxSliceNum) { |
| 239 | WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceNum (%d) settings!\n", fDlp->sSliceCfg.sSliceArgument.uiSliceNum); | 238 | WelsLog (pCtx, WELS_LOG_ERROR, "ParamValidationExt(), invalid uiSliceNum (%d) settings!\n", fDlp->sSliceCfg.sSliceArgument.uiSliceNum); |
| 240 | return ENC_RETURN_UNSUPPORTED_PARA; | 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 | break; | 268 | break; |
| 269 | case SM_AUTO_SLICE:{ | ||
| 270 | fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0; | ||
| 271 | } | ||
| 272 | break; | ||
| 270 | case SM_RASTER_SLICE: { | 273 | case SM_RASTER_SLICE: { |
| 271 | fDlp->sSliceCfg.sSliceArgument.uiSliceSizeConstraint = 0; | 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 | break; // go through for MT_ENABLED & SM_DYN_SLICE? | 1707 | break; // go through for MT_ENABLED & SM_DYN_SLICE? |
| 1705 | //#endif//MT_ENABLED | 1708 | //#endif//MT_ENABLED |
| 1706 | case SM_FIXEDSLCNUM_SLICE: | 1709 | case SM_FIXEDSLCNUM_SLICE: |
| 1707 | case SM_AUTO_SLICE: | ||
| 1708 | if (iSliceNum > iMaxSliceCount) | 1710 | if (iSliceNum > iMaxSliceCount) |
| 1709 | iMaxSliceCount = iSliceNum; | 1711 | iMaxSliceCount = iSliceNum; |
| 1710 | // need perform check due uiSliceNum might change, although has been initialized somewhere outside | 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 | if (iSliceNum > iMaxSliceCount) | 1728 | if (iSliceNum > iMaxSliceCount) |
| 1727 | iMaxSliceCount = iSliceNum; | 1729 | iMaxSliceCount = iSliceNum; |
| 1728 | break; | 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 | default: | 1765 | default: |
| 1730 | break; | 1766 | break; |
| 1731 | } | 1767 | } |