! * \brief Generate MB allocated map for various type of slice group cases (TYPE 0, .., 6) * * \param pFmo fmo context * \param pPps pps context * \param kiMbWidth MB width * \param kiMbHeight MB height * * \return 0 - successful; none 0 - failed */
| 118 | * \return 0 - successful; none 0 - failed |
| 119 | */ |
| 120 | static inline int32_t FmoGenerateSliceGroup (PFmo pFmo, const PPps kpPps, const int32_t kiMbWidth, |
| 121 | const int32_t kiMbHeight, CMemoryAlign* pMa) { |
| 122 | int32_t iNumMb = 0; |
| 123 | int32_t iErr = 0; |
| 124 | bool bResolutionChanged = false; |
| 125 | |
| 126 | // the cases we would not like |
| 127 | WELS_VERIFY_RETURN_IF (ERR_INFO_INVALID_PARAM, (NULL == pFmo || NULL == kpPps)) |
| 128 | |
| 129 | iNumMb = kiMbWidth * kiMbHeight; |
| 130 | |
| 131 | if (0 == iNumMb) |
| 132 | return ERR_INFO_INVALID_PARAM; |
| 133 | |
| 134 | pMa->WelsFree (pFmo->pMbAllocMap, "_fmo->pMbAllocMap"); |
| 135 | pFmo->pMbAllocMap = (uint8_t*)pMa->WelsMallocz (iNumMb * sizeof (uint8_t), "_fmo->pMbAllocMap"); |
| 136 | WELS_VERIFY_RETURN_IF (ERR_INFO_OUT_OF_MEMORY, (NULL == pFmo->pMbAllocMap)) // out of memory |
| 137 | |
| 138 | pFmo->iCountMbNum = iNumMb; |
| 139 | |
| 140 | if (kpPps->uiNumSliceGroups < 2 && iNumMb > 0) { // only one slice group, exactly it is single slice based |
| 141 | memset (pFmo->pMbAllocMap, 0, iNumMb * sizeof (int8_t)); // for safe |
| 142 | |
| 143 | pFmo->iSliceGroupCount = 1; |
| 144 | |
| 145 | return ERR_NONE; |
| 146 | } |
| 147 | |
| 148 | if (bResolutionChanged || ((int32_t)kpPps->uiSliceGroupMapType != pFmo->iSliceGroupType) |
| 149 | || ((int32_t)kpPps->uiNumSliceGroups != pFmo->iSliceGroupCount)) { |
| 150 | switch (kpPps->uiSliceGroupMapType) { |
| 151 | case 0: |
| 152 | iErr = FmoGenerateMbAllocMapType0 (pFmo, kpPps); |
| 153 | break; |
| 154 | case 1: |
| 155 | iErr = FmoGenerateMbAllocMapType1 (pFmo, kpPps, kiMbWidth); |
| 156 | break; |
| 157 | case 2: |
| 158 | case 3: |
| 159 | case 4: |
| 160 | case 5: |
| 161 | case 6: |
| 162 | // Reserve for others slice group type |
| 163 | iErr = 1; |
| 164 | break; |
| 165 | default: |
| 166 | return ERR_INFO_UNSUPPORTED_FMOTYPE; |
| 167 | } |
| 168 | } |
| 169 | |
| 170 | if (0 == iErr) { // well now |
| 171 | pFmo->iSliceGroupCount = kpPps->uiNumSliceGroups; |
| 172 | pFmo->iSliceGroupType = kpPps->uiSliceGroupMapType; |
| 173 | } |
| 174 | |
| 175 | return iErr; |
| 176 | } |
| 177 |
no test coverage detected