#define H264_PARSE_SEI_C

#ifdef H264_PARSE_SEI_C

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

#include "viddec_parser_ops.h"

#include "viddec_fw_item_types.h"
#include "viddec_fw_workload.h"

//////////////////////////////////////////////////////////////////////////////
// avc_sei_stream_initialise ()
//
// 

void h264_sei_stream_initialise (h264_Info* pInfo)
{
	pInfo->sei_information.capture_POC     = 0;
	pInfo->sei_information.disp_frozen     = 0;
	pInfo->sei_information.release_POC     = 0;
	pInfo->sei_information.capture_fn      = 0;
	pInfo->sei_information.recovery_fn     = 0xFFFFFFFF;
	pInfo->sei_information.scan_format     = 0;
	pInfo->sei_information.broken_link_pic = 0;
	return;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_buffering_period(void *parent,h264_Info* pInfo)
{
	h264_Status ret = H264_STATUS_SEI_ERROR;

	h264_SEI_buffering_period_t* sei_msg_ptr;
   h264_SEI_buffering_period_t  sei_buffering_period;
	int32_t SchedSelIdx;
	int num_bits = 0;
	
	sei_msg_ptr = (h264_SEI_buffering_period_t *)(&sei_buffering_period);
	
	do{
		if(pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_parameters_present_flag == 1)
		{
			num_bits = pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_initial_cpb_removal_delay_length_minus1 + 1;
		}
		else if(pInfo->active_SPS.sps_disp.vui_seq_parameters.vcl_hrd_parameters_present_flag)
		{
			num_bits = pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_initial_cpb_removal_delay_length_minus1 + 1;
		}

		sei_msg_ptr->seq_param_set_id = h264_GetVLCElement(parent, pInfo, false);
		if(sei_msg_ptr->seq_param_set_id >= NUM_SPS)
			break;

		//check if this id is same as the id of the current SPS  //fix
		
		if(pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_parameters_present_flag == 1)
		{
			if(pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_cpb_cnt_minus1 >= MAX_CPB_CNT) 
				break;
			
			for(SchedSelIdx = 0; SchedSelIdx <= pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_cpb_cnt_minus1; SchedSelIdx++)
			{
				viddec_pm_get_bits(parent, (uint32_t *)&sei_msg_ptr->initial_cpb_removal_delay_nal, num_bits);
				viddec_pm_get_bits(parent, (uint32_t *)&sei_msg_ptr->initial_cpb_removal_delay_offset_nal, num_bits);
			}
		}

		if(pInfo->active_SPS.sps_disp.vui_seq_parameters.vcl_hrd_parameters_present_flag == 1)
		{
			if(pInfo->active_SPS.sps_disp.vui_seq_parameters.vcl_hrd_cpb_cnt_minus1 >= MAX_CPB_CNT) 
				break;
				
			for(SchedSelIdx = 0; SchedSelIdx <= pInfo->active_SPS.sps_disp.vui_seq_parameters.vcl_hrd_cpb_cnt_minus1; SchedSelIdx++)
			{
				viddec_pm_get_bits(parent, (uint32_t *)&sei_msg_ptr->initial_cpb_removal_delay_vcl, num_bits);
				viddec_pm_get_bits(parent, (uint32_t *)&sei_msg_ptr->initial_cpb_removal_delay_offset_vcl, num_bits);
			}
		}

		ret = H264_STATUS_OK;
	} while (0);

	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_pic_timing(void *parent,h264_Info* pInfo)
{
	int32_t CpbDpbDelaysPresentFlag = 0;
	h264_SEI_pic_timing_t* sei_msg_ptr;
   h264_SEI_pic_timing_t  sei_pic_timing;
	int32_t num_bits_cpb = 0, num_bits_dpb = 0, time_offset_length = 0;
	uint32_t code;
   uint32_t clock_timestamp_flag = 0;
   uint32_t full_timestamp_flag = 0;
   uint32_t seconds_flag = 0;
   uint32_t minutes_flag = 0;
   uint32_t hours_flag = 0;
   uint32_t time_offset = 0;

   
   
	
	sei_msg_ptr = (h264_SEI_pic_timing_t *)(&sei_pic_timing);

	if(pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_parameters_present_flag)
	{
		num_bits_cpb = pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_cpb_removal_delay_length_minus1 +1;
		num_bits_dpb = pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_dpb_output_delay_length_minus1 + 1;
		time_offset_length = pInfo->active_SPS.sps_disp.vui_seq_parameters.nal_hrd_time_offset_length;
	}
	else if(pInfo->active_SPS.sps_disp.vui_seq_parameters.vcl_hrd_parameters_present_flag)
	{
		num_bits_cpb = pInfo->active_SPS.sps_disp.vui_seq_parameters.vcl_hrd_cpb_removal_delay_length_minus1 +1;
		num_bits_dpb = pInfo->active_SPS.sps_disp.vui_seq_parameters.vcl_hrd_dpb_output_delay_length_minus1 + 1;
	}


	CpbDpbDelaysPresentFlag = 1;		// as per amphion code
	if(CpbDpbDelaysPresentFlag)
	{
		viddec_pm_get_bits(parent, (uint32_t *)&sei_msg_ptr->cpb_removal_delay, num_bits_cpb);
		viddec_pm_get_bits(parent, (uint32_t *)&sei_msg_ptr->dpb_output_delay, num_bits_dpb);		
	}

	if(pInfo->active_SPS.sps_disp.vui_seq_parameters.pic_struct_present_flag)
	{
		int32_t i = 0, NumClockTS = 0;

		viddec_workload_item_t     wi;

		wi.vwi_payload[0] = wi.vwi_payload[1] = wi.vwi_payload[2] = 0;
		viddec_pm_get_bits(parent, &code , 4);
		sei_msg_ptr->pic_struct = (uint8_t)code;

		
		if((sei_msg_ptr->pic_struct == 0) || (sei_msg_ptr->pic_struct == 7) || (sei_msg_ptr->pic_struct == 8)) {
			pInfo->sei_information.scan_format = SEI_SCAN_FORMAT_PROGRESSIVE;
		} else {
			pInfo->sei_information.scan_format = SEI_SCAN_FORMAT_INTERLACED;
		}

		wi.vwi_type = VIDDEC_WORKLOAD_SEI_PIC_TIMING;
		wi.h264_sei_pic_timing.pic_struct = sei_msg_ptr->pic_struct;		

#ifndef VBP
      //Push to current if we are in first frame, or we do not detect previous frame end
      viddec_pm_append_workitem( parent, &wi , !(pInfo->Is_first_frame_in_stream ||(!pInfo->is_current_workload_done)));
#endif		

		if(sei_msg_ptr->pic_struct < 3) {
			NumClockTS = 1;
		} else if((sei_msg_ptr->pic_struct < 5) || (sei_msg_ptr->pic_struct == 7)) {
			NumClockTS = 2;
		} else {
			NumClockTS = 3;
		}

		for(i = 0; i < NumClockTS; i++)
		{
			viddec_pm_get_bits(parent, &code , 1);
         clock_timestamp_flag = code;
			//sei_msg_ptr->clock_timestamp_flag[i] = (uint8_t)code;
			
			if(clock_timestamp_flag)
			{
				viddec_pm_get_bits(parent, &code , 2);
				//sei_msg_ptr->ct_type[i] = (uint8_t)code;

				viddec_pm_get_bits(parent, &code , 1);
				//sei_msg_ptr->nuit_field_based_flag[i] = (uint8_t)code;

				viddec_pm_get_bits(parent, &code , 5);
				//sei_msg_ptr->counting_type[i] = (uint8_t)code;

				viddec_pm_get_bits(parent, &code , 1);
				//sei_msg_ptr->full_timestamp_flag[i] = (uint8_t)code;
				full_timestamp_flag = code;

				viddec_pm_get_bits(parent, &code , 1);
				//sei_msg_ptr->discontinuity_flag[i] = (uint8_t)code;

				viddec_pm_get_bits(parent, &code , 1);
				//sei_msg_ptr->cnt_dropped_flag[i] = (uint8_t)code;

				viddec_pm_get_bits(parent, &code , 8);
				//sei_msg_ptr->n_frames[i] = (uint8_t)code;


				if(full_timestamp_flag)
				{
					viddec_pm_get_bits(parent, &code , 6);
					//sei_msg_ptr->seconds_value[i] = (uint8_t)code;

					viddec_pm_get_bits(parent, &code , 6);
					//sei_msg_ptr->minutes_value[i] = (uint8_t)code;

					viddec_pm_get_bits(parent, &code , 5);
					//sei_msg_ptr->hours_value[i] = (uint8_t)code;
				}
				else
				{
					viddec_pm_get_bits(parent, &code , 1);
					//sei_msg_ptr->seconds_flag[i] = (uint8_t)code;
					seconds_flag = code;
					
					if(seconds_flag)
					{
						viddec_pm_get_bits(parent, &code , 6);
						//sei_msg_ptr->seconds_value[i] = (uint8_t)code;

						viddec_pm_get_bits(parent, &code , 1);
						//sei_msg_ptr->minutes_flag[i] = (uint8_t)code;
						minutes_flag = code;

						if(minutes_flag)
						{
							viddec_pm_get_bits(parent, &code , 6);
							//sei_msg_ptr->minutes_value[i] = (uint8_t)code;

							viddec_pm_get_bits(parent, &code , 1);
							//sei_msg_ptr->hours_flag[i] = (uint8_t)code;
							hours_flag = code;
							
							if(hours_flag){
								viddec_pm_get_bits(parent, &code , 6);
								//sei_msg_ptr->hours_value[i] = (uint8_t)code;
							}
						}
					}
				}
				
				if(time_offset_length > 0)
				{
					viddec_pm_get_bits(parent, (uint32_t *)&time_offset, time_offset_length);		
				}
			}
		}
	}
	

	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_pan_scan(void *parent,h264_Info* pInfo)
{
	h264_SEI_pan_scan_rectangle_t* sei_msg_ptr;
   h264_SEI_pan_scan_rectangle_t  sei_pan_scan;
	uint32_t code;

	viddec_workload_item_t     wi;

   h264_memset( &(sei_pan_scan), 0x0, sizeof(h264_SEI_pan_scan_rectangle_t) );
	
   viddec_fw_reset_workload_item(&wi);
	wi.vwi_type = VIDDEC_WORKLOAD_H264_PAN_SCAN;

	sei_msg_ptr = (h264_SEI_pan_scan_rectangle_t *)(&sei_pan_scan);

	sei_msg_ptr->pan_scan_rect_id = h264_GetVLCElement(parent, pInfo, false);

	wi.h264_sei_pan_scan.pan_scan_rect_id = sei_msg_ptr->pan_scan_rect_id;

	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->pan_scan_rect_cancel_flag = (uint8_t)code;
   viddec_fw_h264_sei_pan_scan_set_cancel_flag(&(wi.h264_sei_pan_scan), sei_msg_ptr->pan_scan_rect_cancel_flag);
	
	if(!sei_msg_ptr->pan_scan_rect_cancel_flag)
	{
		int32_t i;
		sei_msg_ptr->pan_scan_cnt_minus1 = h264_GetVLCElement(parent, pInfo, false);

		viddec_fw_h264_sei_pan_scan_set_cnt_minus1(&(wi.h264_sei_pan_scan), sei_msg_ptr->pan_scan_cnt_minus1);
		if(sei_msg_ptr->pan_scan_cnt_minus1 > MAX_PAN_SCAN_CNT -1) 
		{
			return H264_STATUS_SEI_ERROR;
		}
		for(i=0; i<= sei_msg_ptr->pan_scan_cnt_minus1; i++)
		{
			sei_msg_ptr->pan_scan_rect_left_offset[i] = h264_GetVLCElement(parent, pInfo, true);
			sei_msg_ptr->pan_scan_rect_right_offset[i] = h264_GetVLCElement(parent, pInfo, true);
			sei_msg_ptr->pan_scan_rect_top_offset[i] = h264_GetVLCElement(parent, pInfo, true);
			sei_msg_ptr->pan_scan_rect_bottom_offset[i] = h264_GetVLCElement(parent, pInfo, true);
		}
		sei_msg_ptr->pan_scan_rect_repetition_period = h264_GetVLCElement(parent, pInfo, false);
		wi.h264_sei_pan_scan.pan_scan_rect_repetition_period = sei_msg_ptr->pan_scan_rect_repetition_period;
	}
#ifndef VBP	
   //cur is first frame
   viddec_pm_append_workitem( parent, &wi , !(pInfo->Is_first_frame_in_stream ||(!pInfo->is_current_workload_done)));
#endif   

	if(!sei_msg_ptr->pan_scan_rect_cancel_flag)
	{
		int32_t i;

      viddec_fw_reset_workload_item(&wi);
		wi.vwi_type = VIDDEC_WORKLOAD_SEI_PAN_SCAN_RECT;

		for(i=0; i<= sei_msg_ptr->pan_scan_cnt_minus1; i++)
		{
         viddec_fw_h264_pan_scan_set_left(&(wi.h264_pan_scan_rect), sei_msg_ptr->pan_scan_rect_left_offset[i]);
         viddec_fw_h264_pan_scan_set_right(&(wi.h264_pan_scan_rect), sei_msg_ptr->pan_scan_rect_right_offset[i]);
         viddec_fw_h264_pan_scan_set_top(&(wi.h264_pan_scan_rect), sei_msg_ptr->pan_scan_rect_top_offset[i]);
         viddec_fw_h264_pan_scan_set_bottom(&(wi.h264_pan_scan_rect), sei_msg_ptr->pan_scan_rect_bottom_offset[i]);
#ifndef VBP         
         //cur is first frame
         viddec_pm_append_workitem( parent, &wi , !pInfo->Is_first_frame_in_stream);
#endif         
		}
	}

	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_filler_payload(void *parent,h264_Info* pInfo, uint32_t payload_size)
{
	
	h264_SEI_filler_payload_t* sei_msg_ptr;
   h264_SEI_filler_payload_t sei_filler_payload;
	uint32_t k;
	uint32_t code;

   //remove warning
   pInfo = pInfo; 
	
	sei_msg_ptr = (h264_SEI_filler_payload_t *)(&sei_filler_payload);
	for(k=0; k < payload_size; k++)
	{
		viddec_pm_get_bits(parent, &code , 8);
		sei_msg_ptr->ff_byte = (uint8_t)code;
	}

	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_userdata_reg(void *parent,h264_Info* pInfo, uint32_t payload_size)
{
	
	h264_SEI_userdata_registered_t* sei_msg_ptr;
   h264_SEI_userdata_registered_t  sei_userdata_registered;
	uint32_t i;
	int32_t byte = 0;
	uint32_t code = 0;
	viddec_workload_item_t     wi;

	wi.vwi_type = VIDDEC_WORKLOAD_SEI_USER_DATA_REGISTERED;
    wi.vwi_payload[0] = wi.vwi_payload[1] = wi.vwi_payload[2] = 0;
   //remove warning
   pInfo = pInfo;    
	
	sei_msg_ptr = (h264_SEI_userdata_registered_t *)(&sei_userdata_registered);

	viddec_pm_get_bits(parent, &code , 8);
	sei_msg_ptr->itu_t_t35_country_code = (uint8_t)code;
	
	if(sei_msg_ptr->itu_t_t35_country_code != 0xff)	{
		i = 1;
	} else {
		viddec_pm_get_bits(parent, &code , 8);
		sei_msg_ptr->itu_t_t35_country_code_extension_byte = (uint8_t)code;
		i = 2;
	}

	
	wi.user_data.size =0;
	do
	{	
		
		viddec_pm_get_bits(parent, (uint32_t *)&byte, 8); 	

      wi.user_data.data_payload[wi.user_data.size]=(uint8_t)byte;
		wi.user_data.size++;
    
    	if(11 == wi.user_data.size)
    	{  
          viddec_pm_setup_userdata(&wi);
#ifndef VBP          
          //cur is first frame
          viddec_pm_append_workitem( parent, &wi , !(pInfo->Is_first_frame_in_stream ||(!pInfo->is_current_workload_done)));
#endif          
          wi.user_data.size =0;    		
    	}          
    	
    	i++;
	}while(i < payload_size);

	if(0!=wi.user_data.size)
	{
       viddec_pm_setup_userdata(&wi);
#ifndef VBP       
       //cur is first frame
       viddec_pm_append_workitem( parent, &wi , !pInfo->Is_first_frame_in_stream);
#endif       
	}
	
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_userdata_unreg(void *parent, h264_Info* pInfo, uint32_t payload_size)
{
	
	h264_SEI_userdata_unregistered_t* sei_msg_ptr;
   h264_SEI_userdata_unregistered_t  sei_userdata_unregistered;
	uint32_t i;
	int32_t byte = 0;
	uint32_t code;

	viddec_workload_item_t     wi;

    wi.vwi_type = VIDDEC_WORKLOAD_SEI_USER_DATA_UNREGISTERED;

    //remove warning
    pInfo = pInfo; 

	sei_msg_ptr = (h264_SEI_userdata_unregistered_t *)(&sei_userdata_unregistered);

	for (i = 0; i < 4; i++) 
  	{
		viddec_pm_get_bits(parent, &code , 32);
		sei_msg_ptr->uuid_iso_iec_11578[i] = (uint8_t)code;
  	}
  
  	wi.user_data.size =0;
  	for(i = 16; i < payload_size; i++) 
  	{
    	
		viddec_pm_get_bits(parent, (uint32_t *)&byte, 8); 	

		wi.user_data.data_payload[wi.user_data.size]=(uint8_t)byte;
		wi.user_data.size++;
    
    	if(11 == wi.user_data.size)
    	{  
          viddec_pm_setup_userdata(&wi);
#ifndef VBP          
          //cur is first frame
          viddec_pm_append_workitem( parent, &wi , !(pInfo->Is_first_frame_in_stream ||(!pInfo->is_current_workload_done)));
#endif         
          wi.user_data.size =0;     		
    	}    	
  	}

	if(0!=wi.user_data.size)
	{
       viddec_pm_setup_userdata(&wi);
#ifndef VBP       
       //cur is first frame
       viddec_pm_append_workitem( parent, &wi , !pInfo->Is_first_frame_in_stream);
#endif       
	}
	
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_recovery_point(void *parent, h264_Info* pInfo)
{
	
	h264_SEI_recovery_point_t* sei_msg_ptr;
   h264_SEI_recovery_point_t  sei_recovery_point;
	uint32_t code;
	viddec_workload_item_t     wi;

	
	sei_msg_ptr = (h264_SEI_recovery_point_t *)(&sei_recovery_point);
	
	sei_msg_ptr->recovery_frame_cnt = h264_GetVLCElement(parent, pInfo, false);

	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->exact_match_flag = (uint8_t)code;

	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->broken_link_flag = (uint8_t)code;

	viddec_pm_get_bits(parent, &code , 2);
	sei_msg_ptr->changing_slice_group_idc = (uint8_t)code;

	pInfo->sei_information.recovery_point = 1;
	pInfo->sei_information.recovery_frame_cnt = (int32_t) sei_msg_ptr->recovery_frame_cnt;
	pInfo->sei_information.capture_fn         = 1;
	pInfo->sei_information.broken_link_pic    = sei_msg_ptr->broken_link_flag;

	if(pInfo->got_start)	{
		pInfo->img.recovery_point_found |= 2;

		//// Enable the RP recovery if no IDR ---Cisco
		if((pInfo->img.recovery_point_found & 1)==0)
			pInfo->sei_rp_received = 1;
	}	

	//
	/// Append workload for SEI
	//
   viddec_fw_reset_workload_item(&wi);
   wi.vwi_type = VIDDEC_WORKLOAD_SEI_RECOVERY_POINT;
	wi.h264_sei_recovery_point.recovery_frame_cnt = sei_msg_ptr->recovery_frame_cnt;
   viddec_fw_h264_h264_sei_recovery_set_exact_match_flag(&(wi.h264_sei_recovery_point), sei_msg_ptr->exact_match_flag);
   viddec_fw_h264_h264_sei_recovery_set_broken_link_flag(&(wi.h264_sei_recovery_point), sei_msg_ptr->broken_link_flag);
	wi.h264_sei_recovery_point.changing_slice_group_idc = sei_msg_ptr->changing_slice_group_idc;
#ifndef VBP	
   //cur is first frame
   viddec_pm_append_workitem( parent, &wi , !(pInfo->Is_first_frame_in_stream ||(!pInfo->is_current_workload_done)));
#endif   

	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_dec_ref_pic_marking_rep(void *parent,h264_Info* pInfo)
{
	
	h264_SEI_decoded_ref_pic_marking_repetition_t* sei_msg_ptr;
   h264_SEI_decoded_ref_pic_marking_repetition_t  sei_ref_pic;
	uint32_t code;
	
	sei_msg_ptr = (h264_SEI_decoded_ref_pic_marking_repetition_t *)(&sei_ref_pic);

	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->original_idr_flag = (uint8_t)code;
	
	sei_msg_ptr->original_frame_num = h264_GetVLCElement(parent, pInfo, false);

	if(!(pInfo->active_SPS.sps_disp.frame_mbs_only_flag))
	{
		viddec_pm_get_bits(parent, &code , 1);
		sei_msg_ptr->orignal_field_pic_flag = (uint8_t)code;
	
		if(sei_msg_ptr->orignal_field_pic_flag)
		{
			viddec_pm_get_bits(parent, &code , 1);
			sei_msg_ptr->original_bottom_field_pic_flag = (uint8_t)code;
		}
	}
	h264_Parse_Dec_Ref_Pic_Marking(parent, pInfo, &pInfo->SliceHeader);
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_spare_pic(void *parent,h264_Info* pInfo)
{
	
	//h264_SEI_spare_picture_t* sei_msg_ptr;

   //remove warning
   pInfo = pInfo; 
   parent = parent;
	
	//sei_msg_ptr = (h264_SEI_spare_picture_t *)(&user_data->user_data[0]);

	//OS_INFO("Not supported SEI\n");
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_scene_info(void *parent,h264_Info* pInfo)
{
	
	h264_SEI_scene_info_t* sei_msg_ptr;
   h264_SEI_scene_info_t  sei_scene_info;
	uint32_t code;
	
	sei_msg_ptr = (h264_SEI_scene_info_t*)(&sei_scene_info);
	
	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->scene_info_present_flag = (uint8_t)code;

	if(sei_msg_ptr->scene_info_present_flag)
	{
		sei_msg_ptr->scene_id = h264_GetVLCElement(parent, pInfo, false);
		sei_msg_ptr->scene_transitioning_type= h264_GetVLCElement(parent, pInfo, false);
		if(sei_msg_ptr->scene_transitioning_type > 3)
		{
			sei_msg_ptr->second_scene_id = h264_GetVLCElement(parent, pInfo, false);
		}
	}
	
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_sub_seq_info(void *parent,h264_Info* pInfo)
{
	
	h264_SEI_sub_sequence_info_t* sei_msg_ptr;
   h264_SEI_sub_sequence_info_t  sei_sub_sequence_info;
	uint32_t code;
	
	sei_msg_ptr = (h264_SEI_sub_sequence_info_t *)(&sei_sub_sequence_info);

	sei_msg_ptr->sub_seq_layer_num = h264_GetVLCElement(parent, pInfo,false);
	sei_msg_ptr->sub_seq_id= h264_GetVLCElement(parent, pInfo,false);

	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->first_ref_pic_flag = (uint8_t)code;

	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->leading_non_ref_pic_flag = (uint8_t)code;

	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->last_pic_flag = (uint8_t)code;

	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->sub_seq_frame_num_flag = (uint8_t)code;

	
	if(sei_msg_ptr->sub_seq_frame_num_flag)
	{
		sei_msg_ptr->sub_seq_frame_num = h264_GetVLCElement(parent, pInfo,false);	
	}
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_sub_seq_layer(void *parent,h264_Info* pInfo)
{
	
	h264_SEI_sub_sequence_layer_t* sei_msg_ptr;
   h264_SEI_sub_sequence_layer_t  sei_sub_sequence_layer;
	int32_t layer;
	uint32_t code;
	
	sei_msg_ptr = (h264_SEI_sub_sequence_layer_t *)(&sei_sub_sequence_layer);
	sei_msg_ptr->num_sub_seq_layers_minus1 = h264_GetVLCElement(parent, pInfo,false);

	if(sei_msg_ptr->num_sub_seq_layers_minus1 >= MAX_SUB_SEQ_LAYERS)
	{
		return H264_STATUS_SEI_ERROR;
	}
	
	for(layer = 0;layer <= sei_msg_ptr->num_sub_seq_layers_minus1; layer++)
	{
		viddec_pm_get_bits(parent, &code , 1);
		sei_msg_ptr->accurate_statistics_flag[layer] = (uint8_t)code;

		viddec_pm_get_bits(parent, &code , 16);
		sei_msg_ptr->average_bit_rate[layer] = (uint16_t)code;

		viddec_pm_get_bits(parent, &code , 16);
		sei_msg_ptr->average_frame_rate[layer] = (uint16_t)code;

	}
	
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_sub_seq(void *parent,h264_Info* pInfo)
{
	int32_t n;
	uint32_t code;

	h264_SEI_sub_sequence_t* sei_msg_ptr;
   h264_SEI_sub_sequence_t  sei_sub_sequence;
	
	sei_msg_ptr = (h264_SEI_sub_sequence_t *)(&sei_sub_sequence);

	sei_msg_ptr->sub_seq_layer_num = h264_GetVLCElement(parent, pInfo, false);
	sei_msg_ptr->sub_seq_id= h264_GetVLCElement(parent, pInfo, false);
	
	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->duration_flag = (uint8_t)code;

	if(sei_msg_ptr->duration_flag)
	{
		viddec_pm_get_bits(parent, (uint32_t *)&sei_msg_ptr->sub_seq_duration, 32);
	}
	
	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->average_rate_flag = (uint8_t)code;

	if(sei_msg_ptr->average_rate_flag)
	{
		viddec_pm_get_bits(parent, &code , 1);
		sei_msg_ptr->average_statistics_flag = (uint8_t)code;

		viddec_pm_get_bits(parent, &code , 16);
		sei_msg_ptr->average_bit_rate = (uint8_t)code;

		viddec_pm_get_bits(parent, &code , 16);
		sei_msg_ptr->average_frame_rate = (uint8_t)code;

	}
	sei_msg_ptr->num_referenced_subseqs = h264_GetVLCElement(parent, pInfo, false);
	if(sei_msg_ptr->num_referenced_subseqs >= MAX_NUM_REF_SUBSEQS)
	{
		return H264_STATUS_SEI_ERROR;
	}

	for(n = 0; n < sei_msg_ptr->num_referenced_subseqs; n++)
	{
		sei_msg_ptr->ref_sub_seq_layer_num= h264_GetVLCElement(parent, pInfo, false);
		sei_msg_ptr->ref_sub_seq_id= h264_GetVLCElement(parent, pInfo, false);
		
		viddec_pm_get_bits(parent, &code , 1);
		sei_msg_ptr->ref_sub_seq_direction = (uint8_t)code;
	}
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_full_frame_freeze(void *parent,h264_Info* pInfo)
{
	
	h264_SEI_full_frame_freeze_t* sei_msg_ptr;
   h264_SEI_full_frame_freeze_t  sei_full_frame_freeze;
	
	sei_msg_ptr = (h264_SEI_full_frame_freeze_t *)(&sei_full_frame_freeze);

	sei_msg_ptr->full_frame_freeze_repetition_period= h264_GetVLCElement(parent, pInfo, false);
	
	pInfo->sei_information.capture_POC        = 1;
	pInfo->sei_information.freeze_rep_period  = sei_msg_ptr->full_frame_freeze_repetition_period;
	//pInfo->img.sei_freeze_this_image          = 1;
	
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_full_frame_freeze_release(void *parent,h264_Info* pInfo)
{
   //remove warning
   parent = parent;
   pInfo = pInfo;

   
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_full_frame_snapshot(void *parent,h264_Info* pInfo)
{
	
	h264_SEI_full_frame_snapshot_t* sei_msg_ptr;
   h264_SEI_full_frame_snapshot_t  sei_full_frame_snapshot;
	
	sei_msg_ptr = (h264_SEI_full_frame_snapshot_t *)(&sei_full_frame_snapshot);

	sei_msg_ptr->snapshot_id = h264_GetVLCElement(parent, pInfo, false);
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_progressive_segement_start(void *parent,h264_Info* pInfo)
{
	
	h264_SEI_progressive_segment_start_t* sei_msg_ptr;
   h264_SEI_progressive_segment_start_t  sei_progressive_segment_start;
	
	sei_msg_ptr = (h264_SEI_progressive_segment_start_t *)(&sei_progressive_segment_start);

	sei_msg_ptr->progressive_refinement_id= h264_GetVLCElement(parent, pInfo, false);
	sei_msg_ptr->num_refinement_steps_minus1= h264_GetVLCElement(parent, pInfo, false);
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_progressive_segment_end(void *parent,h264_Info* pInfo)
{
	
	h264_SEI_progressive_segment_end_t* sei_msg_ptr;
   h264_SEI_progressive_segment_end_t  sei_progressive_segment_end;
	
	sei_msg_ptr = (h264_SEI_progressive_segment_end_t *)(&sei_progressive_segment_end);

	sei_msg_ptr->progressive_refinement_id = h264_GetVLCElement(parent, pInfo, false);
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_motion_constrained_slice_grp_set(void *parent, h264_Info* pInfo)
{
	int32_t i;
	uint32_t code;
	h264_SEI_motion_constrained_slice_group_t* sei_msg_ptr;
   h264_SEI_motion_constrained_slice_group_t  sei_motion_constrained_slice_group;
	
	sei_msg_ptr = (h264_SEI_motion_constrained_slice_group_t *)(&sei_motion_constrained_slice_group);

	sei_msg_ptr->num_slice_groups_in_set_minus1= h264_GetVLCElement(parent, pInfo, false);
	if(sei_msg_ptr->num_slice_groups_in_set_minus1 >= MAX_NUM_SLICE_GRPS)
	{
		return H264_STATUS_SEI_ERROR;
	}
	
	for(i=0; i<= sei_msg_ptr->num_slice_groups_in_set_minus1; i++)
	{
		viddec_pm_get_bits(parent, &code , 1);
		sei_msg_ptr->slice_group_id[i] = (uint8_t)code;
	}
	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->exact_sample_value_match_flag = (uint8_t)code;

	viddec_pm_get_bits(parent, &code , 1);
	sei_msg_ptr->pan_scan_rect_flag = (uint8_t)code;

	
	if(sei_msg_ptr->pan_scan_rect_flag)
	{
		sei_msg_ptr->pan_scan_rect_id= h264_GetVLCElement(parent, pInfo, false);
	}
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_film_grain_characteristics(void *parent,h264_Info* pInfo)
{
	//OS_INFO("Not supported SEI\n");

   //remove warning
   parent = parent;
   pInfo = pInfo; 



   
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_deblocking_filter_display_preferences(void *parent,h264_Info* pInfo)
{
	
	//h264_SEI_deblocking_filter_display_pref_t* sei_msg_ptr;

   //remove warning
   parent = parent;
   pInfo = pInfo;  
	
	//sei_msg_ptr = (h264_SEI_deblocking_filter_display_pref_t *)(&user_data->user_data[0]);

	//OS_INFO("Not supported SEI\n");
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_sei_stereo_video_info(void *parent,h264_Info* pInfo)
{
	
	//h264_SEI_stereo_video_info_t* sei_msg_ptr;

   //remove warning
   parent = parent;
   pInfo = pInfo;
   
	
	//sei_msg_ptr = (h264_SEI_stereo_video_info_t *)(&user_data->user_data[0]);

	//OS_INFO("Not supported SEI\n");
	return H264_STATUS_OK;
}
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
uint32_t h264_sei_reserved_sei_message(void *parent, h264_Info* pInfo, uint32_t payload_size)
{
	int32_t k, byte_index, user_data_byte_index;
   uint32_t i;
	int32_t word, bits;
   uint32_t user_data;
	//h264_SEI_reserved_t* sei_msg_ptr;
   //h264_SEI_reserved_t  sei_reserved;

   //remove warning
   pInfo = pInfo;   
	
	//sei_msg_ptr = (h264_SEI_reserved_t *)(&sei_reserved);
	
  	byte_index = 0;
	word = 0;
	user_data_byte_index = 0x0;
	
	for(i = 0, k = 0; i < payload_size; i++) 
	{
		if(byte_index == 0) word = 0;
		viddec_pm_get_bits(parent, (uint32_t *)&bits, 8);
		
		switch (byte_index)
		{
			case 1: 
			 	word = (bits << 8) | word; 
				break;
		  	case 2: 
				word = (bits << 16) | word; 
				break;
		  	case 3: 
				word = (bits << 24) | word; 
				break;
		  	default : 
				word = bits; 
				break;
		} 
		
		if(byte_index == 3)
		{  
		  byte_index = 0;
		  user_data = word;
		  k++;
		}		   
		else
		{
			byte_index++;
		}
	
		user_data_byte_index++;
		if ( user_data_byte_index == MAX_USER_DATA_SIZE) 
		{	  
			//user_data->user_data_size = user_data_byte_index;
			//sei_msg_ptr = (h264_SEI_reserved_t *)(&user_data->user_data[0]);
		  	byte_index = 0;
		  	word = 0;
		  	user_data_byte_index = 0x0;
		}
	}
	
	if(byte_index)
		user_data = word;
	
	//user_data->user_data_size = user_data_byte_index;
	
	return user_data_byte_index;
	
//	return H264_STATUS_OK;
}

////// TODO
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_SEI_payload(void *parent, h264_Info* pInfo, h264_sei_payloadtype payloadType, int32_t payloadSize)
{
	//int32_t bit_equal_to_zero;
	h264_Status status = H264_STATUS_OK;

   //removing warning
   payloadSize = payloadSize;

	switch(payloadType)
	{
		case SEI_BUF_PERIOD:
			status = h264_sei_buffering_period(parent, pInfo);
			break;
		case SEI_PIC_TIMING:
			status = h264_sei_pic_timing(parent, pInfo);
			break;
		case SEI_PAN_SCAN:
			status = h264_sei_pan_scan(parent, pInfo);
			break;
		case SEI_FILLER_PAYLOAD:
			status = h264_sei_filler_payload(parent, pInfo, payloadSize);
			break;
		case SEI_REG_USERDATA:
			status = h264_sei_userdata_reg(parent, pInfo, payloadSize);
			break;
		case SEI_UNREG_USERDATA:
			status = h264_sei_userdata_unreg(parent, pInfo, payloadSize);
			break;
		case SEI_RECOVERY_POINT:
			h264_sei_recovery_point(parent, pInfo);
			break;
		case SEI_DEC_REF_PIC_MARKING_REP:
			status = h264_sei_dec_ref_pic_marking_rep(parent, pInfo);
			break;
		case SEI_SPARE_PIC:
			status = h264_sei_spare_pic(parent, pInfo);
			break;
		case SEI_SCENE_INFO:
			status = h264_sei_scene_info(parent, pInfo);
			break;
		case SEI_SUB_SEQ_INFO:
			status = h264_sei_sub_seq_info(parent, pInfo);
			break;
		case SEI_SUB_SEQ_LAYER:
			status = h264_sei_sub_seq_layer(parent, pInfo);
			break;
		case SEI_SUB_SEQ:
			status = h264_sei_sub_seq(parent, pInfo);
			break;
		case SEI_FULL_FRAME_FREEZE:
			status = h264_sei_full_frame_freeze(parent, pInfo);
			break;
		case SEI_FULL_FRAME_FREEZE_RELEASE:
			h264_sei_full_frame_freeze_release(parent, pInfo);
			break;
		case SEI_FULL_FRAME_SNAPSHOT:
			status = h264_sei_full_frame_snapshot(parent, pInfo);
			break;
		case SEI_PROGRESSIVE_SEGMENT_START:
			status = h264_sei_progressive_segement_start(parent, pInfo);
			break;
		case SEI_PROGRESSIVE_SEGMENT_END:
			status = h264_sei_progressive_segment_end(parent, pInfo);
			break;
		case SEI_MOTION_CONSTRAINED_SLICE_GRP_SET:
			status = h264_sei_motion_constrained_slice_grp_set(parent, pInfo);
			break;
		case SEI_FILM_GRAIN_CHARACTERISTICS:
			status = h264_sei_film_grain_characteristics(parent, pInfo);
			break;
		case SEI_DEBLK_FILTER_DISPLAY_PREFERENCE:
			status = h264_sei_deblocking_filter_display_preferences(parent, pInfo);
			break;
		case SEI_STEREO_VIDEO_INFO:
			status = h264_sei_stereo_video_info(parent, pInfo);
			break;
		default:
			status = (h264_Status)h264_sei_reserved_sei_message(parent, pInfo, payloadSize);
			break;
	}

/*
	viddec_pm_get_bits(parent, (uint32_t *)&tmp, 1);
	
	if(tmp == 0x1)		// if byte is not aligned
	{
		while(pInfo->bitoff != 0)
		{
			viddec_pm_get_bits(parent, (uint32_t *)&bit_equal_to_zero, 1);
		}
	}
*/
	return status;
}

/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------ */
h264_Status h264_Parse_Supplemental_Enhancement_Information_Message(void *parent, h264_Info* pInfo)
{
	h264_Status status = H264_STATUS_OK;
	int32_t  payload_type, payload_size;
	uint32_t next_8_bits = 0,bits_offset=0,byte_offset = 0;
	uint8_t  is_emul = 0; 
	int32_t  bits_operation_result = 0;
	
	do {
		//// payload_type
		payload_type = 0;
		viddec_pm_get_bits(parent, (uint32_t *)&next_8_bits, 8);	
		while (next_8_bits == 0xFF)
		{
			bits_operation_result = viddec_pm_get_bits(parent, (uint32_t *)&next_8_bits, 8);
			if(-1 == bits_operation_result)
			{
			   status = H264_STATUS_SEI_ERROR;
			   return status;
			}
		    payload_type += 255;
			
		}
		//viddec_pm_get_bits(parent, (uint32_t *)&next_8_bits, 8);
		payload_type += next_8_bits;

		//// payload_size
		payload_size = 0;
		viddec_pm_get_bits(parent, (uint32_t *)&next_8_bits, 8);
		while (next_8_bits == 0xFF)
		{
			payload_size += 255;
			bits_operation_result = viddec_pm_get_bits(parent, (uint32_t *)&next_8_bits, 8);
			if(-1 == bits_operation_result)
			{
			   status = H264_STATUS_SEI_ERROR;
			   return status;
			}
		}
		//viddec_pm_get_bits(parent, (uint32_t *)&next_8_bits, 8);
		payload_size += next_8_bits;

		//PRINTF(MFD_NONE, " SEI: payload type = %d, payload size = %d \n", payload_type, payload_size);


		/////////////////////////////////
		// Parse SEI payloads
		/////////////////////////////////		
		status = h264_SEI_payload(parent, pInfo, (h264_sei_payloadtype)payload_type, payload_size);
		if(status != H264_STATUS_OK)
			break;

		viddec_pm_get_au_pos(parent, &bits_offset, &byte_offset, &is_emul);
		// OS_INFO("SEI byte_offset 3= %d, bits_offset=%d\n", byte_offset, bits_offset);

		if(bits_offset!=0)
		{
		 viddec_pm_get_bits(parent, (uint32_t *)&next_8_bits, 8-bits_offset);         
		}

		bits_operation_result = viddec_pm_peek_bits(parent, (uint32_t *)&next_8_bits, 8);     
		if(-1 == bits_operation_result)
		{
		   status = H264_STATUS_SEI_ERROR;
		   return status;		
		}

		// OS_INFO("next_8_bits = %08x\n", next_8_bits);

	}while(next_8_bits != 0x80);

	//} while (h264_More_RBSP_Data(parent, pInfo) && status == H264_STATUS_OK);

	return status;
}

#endif

