www.pudn.com > wm2.5.zip > parset.c


 
//cbzhu 041219 
#include  
#include  
#include  
#include  
#include  
#include  
 
#include "global.h" 
#include "define.h" 
#include "types.h" 
#include "vlc.h" 
#include "nalu.h" 
 
#include "parset.h" 
//#include "memalloc.h" 
 
extern void no_mem_exit (char *where); 
extern void Form_RBSP(Bitstream *currBitStream); 
 
seq_parameter_set *AllocSPS() 
{ 
	seq_parameter_set *p; 
	if ((p=calloc (1,sizeof (seq_parameter_set) )) == NULL) 
		no_mem_exit ("AllocSPS: SPS"); 
	return p; 
} 
 
pic_parameter_set *AllocPPS() 
{ 
	pic_parameter_set *p; 
	if ((p=calloc (1,sizeof (pic_parameter_set) )) == NULL) 
		no_mem_exit ("AllocPPS: PPS"); 
	return p; 
} 
 
pic_header *AllocPicHeader() 
{ 
	pic_header *p; 
	if((p=calloc (1,sizeof (pic_header))) == NULL) 
		no_mem_exit("AllocPicHeader: PicHeader"); 
	return p; 
} 
 
void FreeParameterSets () 
{ 
  FreeSPS (active_sps); 
  FreePPS (active_pps); 
} 
 
void GenerateParameterSets () 
{ 
	seq_parameter_set *sps=NULL; 
	pic_parameter_set *pps=NULL; 
 
	sps = AllocSPS(); 
	pps = AllocPPS(); 
 
	FillParameterSetStructures (sps, pps); 
 
	active_sps = sps; 
	active_pps = pps; 
 
	//write_parset(active_sps,active_pps); 
} 
 
void FillParameterSetStructures (seq_parameter_set *sps,  
                                 pic_parameter_set *pps)  
{ 
	assert (sps != NULL); 
	assert (pps != NULL); 
	sps->profile_idc =  input.profile_idc = 0x20; 
	sps->level_idc = input.level_idc = 0x42; 
	sps->seq_parameter_set_id = 0; 
	sps->num_ref_frames = input.num_reference_frames; 
	sps->horizontal_size_minus1 = input.img_width/MB_BLOCK_SIZE - 1; 
	sps->vertical_size_minus1 = input.img_height/MB_BLOCK_SIZE -1; 
	sps->aspect_ratio = ASPECT_RATIO_DAR_16_9; 
	sps->frame_cropping_flag = 0; 
 
	//if(sps->frame_cropping_flag) 
	sps->frame_cropping_left_offset = 0; 
	sps->frame_crop_right_offset = 0; 
	sps->frame_crop_top_offset = 0; 
	sps->frame_crop_bottom_offset = 0; 
 
	sps->delta_time_picture_distance_1 =  90000 / input.PictureRate; 
	sps->hrd_parameters_present_flag = 0; 
 
	pps->pic_parameter_set_id = 0; 
	pps->seq_parameter_set_id = 0; 
	pps->fixed_picture_qp_flag = pgImage->fixed_picture_qp; 
	pps->picture_reference_flag = pgImage->picture_reference_flag; 
	pps->sliding_window_size_flag = 0; 
	 
	pps->skip_mode_flag = 1;  //problem// 
	 
	pps->loop_filter_disable_flag = 0; 
 
	//if(pps->loop_filter_disable_flag == 0) 
	pps->loop_filter_parameter_flag = 1; 
	 
	pps->constrained_intra_pred_flag = 1;   //MZ 
	pps->half_pixel_mv_flag = input.HalfPixelMVEnable; 
	 
} 
 
void FreeSPS (seq_parameter_set *sps) 
{ 
	assert (sps != NULL); 
	free (sps); 
} 
 
void FreePPS(pic_parameter_set *pps) 
{ 
	assert (pps != NULL); 
	free (pps); 
} 
 
void FreePicHeader (pic_header *ph) 
{ 
	assert (ph != NULL); 
	free (ph); 
} 
 
void write_parset(seq_parameter_set *sps , pic_parameter_set *pps) 
{ 
	write_SPS(sps); 
	write_PPS(pps); 
} 
 
void write_SPS(seq_parameter_set *sps) 
{ 
	NALU_t *nalu;//WJP FOR NAL 
	 
	pgcurrBitStream->byte_pos = 0; 
	pgcurrBitStream->bits_to_go = 8; 
	 
	//u_v(32,"parset start code",0x1b0); 
	u_v(8,"profile_idc",sps->profile_idc); 
	u_v(8,"level_idc",sps->level_idc); 
	ue_linfo(sps->seq_parameter_set_id); 
	u_v(16,"delta_time_picture_distance_1",sps->delta_time_picture_distance_1);  // 
	ue_linfo(sps->num_ref_frames); 
	ue_linfo(sps->horizontal_size_minus1); 
	ue_linfo(sps->vertical_size_minus1); 
	u_v(4,"aspect_ratio",sps->aspect_ratio); 
	u_v(1,"frame_cropping_flag",sps->frame_cropping_flag); 
	 
	if(sps->frame_cropping_flag) 
	{ 
		ue_linfo(sps->frame_cropping_left_offset); 
		ue_linfo(sps->frame_crop_right_offset); 
		ue_linfo(sps->frame_crop_top_offset); 
		ue_linfo(sps->frame_crop_bottom_offset); 
	} 
 
	//u_v(16,"delta_time_picture_distance_1",sps->delta_time_picture_distance_1); 
	u_v(1,"HRD parameter flag",sps->hrd_parameters_present_flag); 
 
	//isolated region information,not included in fcd,but only for encoder-decoder matching 
	//u_v(1,"isolated region enable",input.IREGEnable); 
	//u_v(8,"isolated region evolution rate",input.IREGRate); 
 
	//WJP FOR NAL 
	Form_RBSP(pgcurrBitStream); 
	nalu = AllocNALU(pgcurrBitStream->byte_pos+1);		 
	Form_NALU(nalu, NALU_TYPE_SPS, NAL_REF_IDC_SPS, pgcurrBitStream->streamBuffer, pgcurrBitStream->byte_pos); 
	gTotalBits += 8*Write_NALU2File(nalu,pgcurrBitStream->f); 
	FreeNALU(nalu); 
	//END 
 
} 
 
void write_PPS(pic_parameter_set *pps) 
{ 
	NALU_t *nalu;//WJP FOR NAL 
	 
	pgcurrBitStream->byte_pos = 0; 
	pgcurrBitStream->bits_to_go = 8; 
 
	ue_linfo(pps->pic_parameter_set_id); 
	ue_linfo(pps->seq_parameter_set_id); 
	u_v(1,"fixed qp flag",pps->fixed_picture_qp_flag); 
	u_v(1,"picture_reference_flag",pps->picture_reference_flag); 
	 
	if(pps->picture_reference_flag == 0) 
	{ 
		u_v(1,"sliding window size flag",pps->sliding_window_size_flag); 
	} 
 
	u_v(1,"skip mode flag",pps->skip_mode_flag); 
	u_v(1,"loop filter disable flag",pps->loop_filter_disable_flag); 
 
	if(pps->loop_filter_disable_flag == 0) 
	{ 
		u_v(1,"loopfilter parameter flag",pps->loop_filter_parameter_flag); 
	} 
 
	u_v(1,"constrained intra predict flag",pps->constrained_intra_pred_flag);//MZ 
	u_v(1,"half pixel mv flag",pps->half_pixel_mv_flag); 
 
	//WJP FOR NAL 
	Form_RBSP(pgcurrBitStream); 
	nalu = AllocNALU(pgcurrBitStream->byte_pos+1);		 
	Form_NALU(nalu, NALU_TYPE_PPS, NAL_REF_IDC_PPS, pgcurrBitStream->streamBuffer, pgcurrBitStream->byte_pos); 
	gTotalBits += 8*Write_NALU2File(nalu,pgcurrBitStream->f); 
	FreeNALU(nalu); 
	//END 
 
//	byte_align(pgcurrBitStream); 
//	fwrite(pgcurrBitStream->streamBuffer,1,pgcurrBitStream->byte_pos,pgcurrBitStream->f); 
} 
 
 
void FillPicHeader(pic_header *p) 
{ 
	picture_header_rbsp->picture_coding_type = pgImage->picture_code_type; 
	picture_header_rbsp->pic_parameter_set_id = 0; 
	picture_header_rbsp->alpha_ci_offset = pgImage->alpha_ci_offset; 
	picture_header_rbsp->cp_offset = pgImage->cp_offset; 
	picture_header_rbsp->frame_num = pgImage->frame_num; 
	picture_header_rbsp->loopfilter_qp_offset = pgImage->loopfilter_qp_offset; 
	picture_header_rbsp->picture_distance = pgImage->picture_distance; 
	picture_header_rbsp->picture_distance_gap_minus1 = pgImage->picture_distance_gap_minus1; 
	picture_header_rbsp->sliding_window_size_minus1 = 0; 
	picture_header_rbsp->picture_qp = pgMbData->qp_mb;         
	      
} 
 
void write_PicHeader(pic_header *p) 
{ 
	NALU_t *nalu; 
	pic_header *ph; 
	ph = AllocPicHeader(); 
	picture_header_rbsp = ph; 
	//cbzhu 041221 
	 
	FillPicHeader(picture_header_rbsp); 
	 
	//if(pgImage->picture_code_type == 0) 
	//	u_v(8, "I picture start code",0xB3); 
	//else 
	//	u_v(8, "P picture start code",0xB6); 
	u_v(2, "picture coding type",picture_header_rbsp->picture_coding_type);  //p_pic_type  
	u_v(8, "picture distance", picture_header_rbsp->picture_distance); 
	 
  ue_linfo(picture_header_rbsp->pic_parameter_set_id); 
   
  //?mazhan 
  //if(picture_header_rbsp->picture_distance==0) 
   ue_linfo(picture_header_rbsp->picture_distance_gap_minus1); 
	 
   
  u_v(5 , "frame number",picture_header_rbsp->frame_num); 
	u_v(6 , "piture qp",picture_header_rbsp->picture_qp); 
	if(active_pps->loop_filter_parameter_flag) 
	{ 
		se_linfo(picture_header_rbsp->alpha_ci_offset); 
		se_linfo(picture_header_rbsp->cp_offset); 
		se_linfo(picture_header_rbsp->loopfilter_qp_offset); 
	} 
	if(active_pps->sliding_window_size_flag) 
	{ 
		u_v(1,"sliding window size minus 1",picture_header_rbsp->sliding_window_size_minus1); 
	} 
	 
 
	//printf("%d %d %d\n" , pgImage->picture_reference_flag ,pgImage->p_pic_type, pgImage->nb_references); 
 
	FreePicHeader(picture_header_rbsp); 
	//WJP FOR NAL 
	Form_RBSP(pgcurrBitStream); 
	nalu = AllocNALU(pgcurrBitStream->byte_pos+1); 
   
	if(pgImage->p_pic_type == 0) //as reference 
		Form_NALU(nalu, NALU_TYPE_P_HEADER, NAL_REF_IDC_REF, pgcurrBitStream->streamBuffer, pgcurrBitStream->byte_pos); 
	else  //non reference 
		Form_NALU(nalu, NALU_TYPE_P_HEADER, NAL_REF_IDC_NONREF, pgcurrBitStream->streamBuffer, pgcurrBitStream->byte_pos); 
	 
  gTotalBits += 8*Write_NALU2File(nalu,pgcurrBitStream->f); 
	FreeNALU(nalu); 
	 
	//END 
}