

#include "h264.h"
#include "h264parse.h"

/*---------------------------------------------*/
/*---------------------------------------------*/
/*---------------------------------------------*/
h264_Status h264_Parse_PicParameterSet(void *parent,h264_Info * pInfo,h264_PicParameterSet_t* PictureParameterSet)
{
	h264_Status ret = H264_PPS_ERROR;

	//h264_PicParameterSet_t* PictureParameterSet = &pInfo->PictureParameterSet;
	uint32_t code=0, i = 0;

	do {
		///// PPS par1: pic_parameter_set_id & seq_parameter_set_id
	   code = h264_GetVLCElement(parent, pInfo, false);
		if(code > MAX_PIC_PARAMS) {
			break;
		}	   
		PictureParameterSet->pic_parameter_set_id = (uint8_t)code;

	   
		code = h264_GetVLCElement(parent, pInfo, false);
		if(code > MAX_NUM_SPS-1) {
			break;
		}
	   PictureParameterSet->seq_parameter_set_id = (uint8_t)code;
		
		///// entropy_coding_mode_flag
		viddec_pm_get_bits(parent, &code, 1);
		PictureParameterSet->entropy_coding_mode_flag = (uint8_t)code;
		///// pic_order_present_flag
		viddec_pm_get_bits(parent, &code, 1);
		PictureParameterSet->pic_order_present_flag = (uint8_t)code;
		
		PictureParameterSet->num_slice_groups_minus1 = h264_GetVLCElement(parent, pInfo, false);
	  
		//
		// In main profile, FMO is excluded and num_slice_groups_minus1 should be 0
		//
		if(PictureParameterSet->num_slice_groups_minus1 > 0) //MAX_NUM_SLICE_GRPS)
			break;
		
		PictureParameterSet->num_ref_idx_l0_active = h264_GetVLCElement(parent, pInfo, false)+1;
		PictureParameterSet->num_ref_idx_l1_active = h264_GetVLCElement(parent, pInfo, false)+1;

		//// PPS->num_ref_idx_l0_active --- [0,32]	
		if(((PictureParameterSet->num_ref_idx_l0_active) > MAX_NUM_REF_FRAMES) || ((PictureParameterSet->num_ref_idx_l1_active) > MAX_NUM_REF_FRAMES))
		{
			break;
		}
		
		//// weighting prediction
		viddec_pm_get_bits(parent, &code, 1);
		PictureParameterSet->weighted_pred_flag = (uint8_t)code;

		viddec_pm_get_bits(parent, &code, 2);
		PictureParameterSet->weighted_bipred_idc = (uint8_t)code;

		//// QP
		PictureParameterSet->pic_init_qp_minus26 = h264_GetVLCElement(parent, pInfo, true);
		PictureParameterSet->pic_init_qs_minus26 = h264_GetVLCElement(parent, pInfo, true);
		if(((PictureParameterSet->pic_init_qp_minus26+26) > MAX_QP) || ((PictureParameterSet->pic_init_qs_minus26+26) > MAX_QP))
			break;		
		PictureParameterSet->chroma_qp_index_offset = h264_GetVLCElement(parent, pInfo, true);

		//// Deblocking ctl parameters
		viddec_pm_get_bits(parent, &code, 1);
		PictureParameterSet->deblocking_filter_control_present_flag = (uint8_t)code;

		viddec_pm_get_bits(parent, &code, 1);
		PictureParameterSet->constrained_intra_pred_flag = (uint8_t)code;

		if( viddec_pm_get_bits(parent, &code, 1) == -1)
			break;
		PictureParameterSet->redundant_pic_cnt_present_flag = (uint8_t)code;

		//// Check if have more RBSP Data for additional parameters
		if(h264_More_RBSP_Data(parent, pInfo))
		{
			viddec_pm_get_bits(parent,  &code, 1);
			PictureParameterSet->transform_8x8_mode_flag = (uint8_t)code; 

			if( viddec_pm_get_bits(parent, &code, 1) == -1)
				break;			
			PictureParameterSet->pic_scaling_matrix_present_flag = (uint8_t)code;

			if(PictureParameterSet->pic_scaling_matrix_present_flag)
	    	{
				uint32_t n_ScalingList = 6 + (PictureParameterSet->transform_8x8_mode_flag << 1);
	      		for(i=0; i<n_ScalingList; i++)
	      		{
						if( viddec_pm_get_bits(parent, &code, 1) == -1)
							break;	
						PictureParameterSet->pic_scaling_list_present_flag[i] = (uint8_t)code;

						if(PictureParameterSet->pic_scaling_list_present_flag[i])
		        		{
	          			if(i<6)
				            h264_Scaling_List(parent, PictureParameterSet->ScalingList4x4[i], 16, &PictureParameterSet->UseDefaultScalingMatrix4x4Flag[i], pInfo);
	          			else
				            h264_Scaling_List(parent, PictureParameterSet->ScalingList8x8[i-6], 64, &PictureParameterSet->UseDefaultScalingMatrix8x8Flag[i-6], pInfo);
		        		}
	      		}
	    	}
			
			PictureParameterSet->second_chroma_qp_index_offset = h264_GetVLCElement(parent, pInfo, true); //fix		
			//if((PictureParameterSet->second_chroma_qp_index_offset>12) || (PictureParameterSet->second_chroma_qp_index_offset < -12))
			//	break;
		}
	 	else
		{
			PictureParameterSet->transform_8x8_mode_flag = 0;
			PictureParameterSet->pic_scaling_matrix_present_flag = 0;
			PictureParameterSet->second_chroma_qp_index_offset = PictureParameterSet->chroma_qp_index_offset;
		}

		ret = H264_STATUS_OK;
	}while(0);
	
	//h264_Parse_rbsp_trailing_bits(pInfo);
	return ret;
}

////////// EOF///////////////

