int nalu_parse_pps()

in ftl_app/nalu.c [581:695]


int nalu_parse_pps(struct bitstream_elmt_t *bs, struct picture_params_set_t *pps)
{
	pps->pic_parameter_set_id = bitstream_ue(bs);
	pps->seq_parameter_set_id = bitstream_ue(bs);
	pps->entropy_coding_mode_flag = bitstream_u(bs, 1);
	pps->pic_order_present_flag = bitstream_u(bs, 1);
	pps->num_slice_groups_minus1 = bitstream_ue(bs);

	if( pps->num_slice_groups_minus1 > 0 ) 
	{
		pps->slice_group_map_type = bitstream_ue(bs);

		if( pps->slice_group_map_type  ==  0 )
		{
			int iGroup;

			pps->run_length_minus1 = malloc( (pps->num_slice_groups_minus1 + 1) * sizeof(pps->run_length_minus1[0]));

			for( iGroup = 0; iGroup <= pps->num_slice_groups_minus1; iGroup++ )
			{
				pps->run_length_minus1[iGroup] = bitstream_ue(bs);
			}
		}
		else if( pps->slice_group_map_type  ==  2 )
		{
			int iGroup;

			pps->top_left = malloc( (pps->num_slice_groups_minus1 + 1) * sizeof(pps->top_left[0]));
			pps->bottom_right = malloc( (pps->num_slice_groups_minus1 + 1) * sizeof(pps->bottom_right[0]));

			for( iGroup = 0; iGroup < pps->num_slice_groups_minus1; iGroup++ ) 
			{
				pps->top_left[iGroup] = bitstream_ue(bs);
				pps->bottom_right[iGroup] = bitstream_ue(bs);
			}
		}
		else if(  pps->slice_group_map_type  ==  3  ||  
				  pps->slice_group_map_type  ==  4  ||  
				  pps->slice_group_map_type  ==  5 ) 
		{
			pps->slice_group_change_direction_flag = bitstream_u(bs, 1);
			pps->slice_group_change_rate_minus1 = bitstream_ue(bs);
		} 
		else if( pps->slice_group_map_type  ==  6 ) 
		{
			int i;
			int bits=0;
			int pic_size;


			pps->pic_size_in_map_units_minus1 = bitstream_ue(bs);

			pps->slice_group_id = malloc( (pps->pic_size_in_map_units_minus1 + 1) * sizeof(pps->slice_group_id[0]));

			pic_size = pps->pic_size_in_map_units_minus1 + 1;

			while(pic_size != 0)
			{
				bits++;
				pic_size >>= 1;
			}


			for( i = 0; i <= pps->pic_size_in_map_units_minus1; i++ )
			{
				pps->slice_group_id[i] = bitstream_u(bs, bits);
			}
		}
	}

	pps->num_ref_idx_l0_active_minus1 = bitstream_ue(bs);
	pps->num_ref_idx_l1_active_minus1 = bitstream_ue(bs);
	pps->weighted_pred_flag = bitstream_u(bs, 1);
	pps->weighted_bipred_idc = bitstream_u(bs, 2);
	pps->pic_init_qp_minus26 = bitstream_se(bs);  /* relative to 26 */
	pps->pic_init_qs_minus26 = bitstream_se(bs);  /* relative to 26 */
	pps->chroma_qp_index_offset = bitstream_se(bs);
	pps->deblocking_filter_control_present_flag = bitstream_u(bs, 1);
	pps->constrained_intra_pred_flag = bitstream_u(bs, 1);
	pps->redundant_pic_cnt_present_flag = bitstream_u(bs, 1);

#if 0
	if( more_rbsp_data( ) ) 
	{
		pps->transform_8x8_mode_flag
		pps->pic_scaling_matrix_present_flag
		if( pps->pic_scaling_matrix_present_flag )
		{
			for( i = 0; i < 6 + 2 * pps->transform_8x8_mode_flag; i++ ) 
			{
				pps->pic_scaling_list_present_flag[i]
				if( pps->pic_scaling_list_present_flag[i] )
				{
					if( i < 6 ) 
					{
						scaling_list( ScalingList4x4[ i ], 16, 
										   UseDefaultScalingMatrix4x4Flag[ i ] )
					}
					else
					{
						scaling_list( ScalingList8x8[ i - 6 ], 64,
										   UseDefaultScalingMatrix8x8Flag[ i - 6 ] )
					}
				}
			}
		}

		second_chroma_qp_index_offset
	}
#endif

	_rbsp_trailing_bits(bs);
	
	return 0;
}