! ************************************************************************************* * \brief to parse Picture Parameter Set (PPS) * * \param pCtx Decoder context * \param pPpsList pps list * \param pBsAux bitstream reader auxiliary * * \return 0 - successed * 1 - failed * * \note Call it in case eNalUnitType is PPS. ******************************
| 1324 | ************************************************************************************* |
| 1325 | */ |
| 1326 | int32_t ParsePps (PWelsDecoderContext pCtx, PPps pPpsList, PBitStringAux pBsAux, uint8_t* pSrcNal, |
| 1327 | const int32_t kSrcNalLen) { |
| 1328 | |
| 1329 | PPps pPps = NULL; |
| 1330 | SPps sTempPps; |
| 1331 | uint32_t uiPpsId = 0; |
| 1332 | uint32_t iTmp; |
| 1333 | uint32_t uiCode; |
| 1334 | int32_t iCode; |
| 1335 | |
| 1336 | WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //pic_parameter_set_id |
| 1337 | uiPpsId = uiCode; |
| 1338 | if (uiPpsId >= MAX_PPS_COUNT) { |
| 1339 | return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_PPS_ID_OVERFLOW); |
| 1340 | } |
| 1341 | pPps = &sTempPps; |
| 1342 | memset (pPps, 0, sizeof (SPps)); |
| 1343 | |
| 1344 | pPps->iPpsId = uiPpsId; |
| 1345 | WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //seq_parameter_set_id |
| 1346 | pPps->iSpsId = uiCode; |
| 1347 | |
| 1348 | if (pPps->iSpsId >= MAX_SPS_COUNT) { |
| 1349 | return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_SPS_ID_OVERFLOW); |
| 1350 | } |
| 1351 | |
| 1352 | WELS_READ_VERIFY (BsGetOneBit (pBsAux, &uiCode)); //entropy_coding_mode_flag |
| 1353 | pPps->bEntropyCodingModeFlag = !!uiCode; |
| 1354 | WELS_READ_VERIFY (BsGetOneBit (pBsAux, &uiCode)); //bottom_field_pic_order_in_frame_present_flag |
| 1355 | pPps->bPicOrderPresentFlag = !!uiCode; |
| 1356 | |
| 1357 | WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //num_slice_groups_minus1 |
| 1358 | pPps->uiNumSliceGroups = NUM_SLICE_GROUPS_OFFSET + uiCode; |
| 1359 | |
| 1360 | if (pPps->uiNumSliceGroups > MAX_SLICEGROUP_IDS) { |
| 1361 | return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_INVALID_SLICEGROUP); |
| 1362 | } |
| 1363 | |
| 1364 | if (pPps->uiNumSliceGroups > 1) { |
| 1365 | WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //slice_group_map_type |
| 1366 | pPps->uiSliceGroupMapType = uiCode; |
| 1367 | if (pPps->uiSliceGroupMapType > 1) { |
| 1368 | WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING, "ParsePps(): slice_group_map_type (%d): support only 0,1.", |
| 1369 | pPps->uiSliceGroupMapType); |
| 1370 | return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_FMOTYPE); |
| 1371 | } |
| 1372 | |
| 1373 | switch (pPps->uiSliceGroupMapType) { |
| 1374 | case 0: |
| 1375 | for (iTmp = 0; iTmp < pPps->uiNumSliceGroups; iTmp++) { |
| 1376 | WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //run_length_minus1[ iGroup ] |
| 1377 | pPps->uiRunLength[iTmp] = RUN_LENGTH_OFFSET + uiCode; |
| 1378 | } |
| 1379 | break; |
| 1380 | default: |
| 1381 | break; |
| 1382 | } |
| 1383 | } |
no test coverage detected