⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gop_list.c

📁 由bmp生成mpeg2 的I_frame 数据
💻 C
📖 第 1 页 / 共 2 页
字号:
			fclose(out);
			return 0;
		}
		if(! write_le_int64(in->gop[i].start_frame, out)){
			fclose(out);
			return 0;
		}
		if(! write_le_int64(in->gop[i].frame_count, out)){
			fclose(out);
			return 0;
		}
		if(! write_le_int32((int)(in->gop[i].sh - in->sh), out)){
			fclose(out);
			return 0;
		}
	}

	for(i=0;i<in->num_of_sh;i++){
		if(! save_sequence_header(in->sh+i, out)){
			fclose(out);
			return 0;
		}
	}

	fclose(out);

	return 1;
}

GOP_LIST *load_gop_list(char *filepath)
{
	int offset;
	GOP_LIST *r;
	FILE *in;

	char buf[sizeof(GL_TAG)];
	
	int i;

	in = fopen(filepath, "rb");
	if(in == NULL){
		return NULL;
	}

	i = fread(buf, 1, sizeof(buf), in);
	if(i != sizeof(buf)){
		fclose(in);
		return NULL;
	}
	
	if(memcmp(buf, GL_TAG, sizeof(buf)) != 0){
		fclose(in);
		return NULL;
	}
	
	r = (GOP_LIST *)calloc(1, sizeof(GOP_LIST));
	if(r == NULL){
		fclose(in);
		return NULL;
	}

	if(! read_le_int64(in, &(r->stream_length)) ){
		fclose(in);
		free(r);
		return NULL;
	}

	if(! read_le_int64(in, &(r->num_of_frame)) ){
		fclose(in);
		free(r);
		return NULL;
	}

	if(! read_le_int32(in, &(r->num_of_gop)) ){
		fclose(in);
		free(r);
		return NULL;
	}

	if(! read_le_int32(in, &(r->num_of_sh)) ){
		fclose(in);
		free(r);
		return NULL;
	}

	if(r->num_of_gop < 1){
		fclose(in);
		free(r);
		return NULL;
	}

	if(r->num_of_sh < 1){
		fclose(in);
		free(r);
		return NULL;
	}

	r->gop = (GOP *)calloc(r->num_of_gop, sizeof(GOP));
	if(r->gop == NULL){
		fclose(in);
		free(r);
		return NULL;
	}

	r->sh = (SEQUENCE_HEADER *)calloc(r->num_of_sh, sizeof(SEQUENCE_HEADER));
	if(r->sh == NULL){
		fclose(in);
		free(r->gop);
		free(r);
		return NULL;
	}

	for(i=0;i<r->num_of_gop;i++){
		if(! read_le_int64(in, &(r->gop[i].offset)) ){
			fclose(in);
			free(r->gop);
			free(r->sh);
			free(r);
			return NULL;
		}
		
		if(! read_le_int64(in, &(r->gop[i].start_frame)) ){
			fclose(in);
			free(r->gop);
			free(r->sh);
			free(r);
			return NULL;
		}
		
		if(! read_le_int64(in, &(r->gop[i].frame_count)) ){
			fclose(in);
			free(r->gop);
			free(r->sh);
			free(r);
			return NULL;
		}

		if(! read_le_int32(in, &offset) ){
			fclose(in);
			free(r->gop);
			free(r->sh);
			free(r);
			return NULL;
		}
		r->gop[i].sh = r->sh + offset;
	}

	for(i=0;i<r->num_of_sh;i++){
		if(! load_sequence_header(r->sh+i, in)){
			fclose(in);
			free(r->gop);
			free(r->sh);
			free(r);
			return NULL;
		}
	}

	fclose(in);
	
	return r;
}

static void release_gop_entries(GOP_ENTRY *last)
{
	GOP_ENTRY *p;
	GOP_ENTRY *c;

	c = last;

	while(c != NULL){
		p = c->prev;
		free(c);
		c = p;
	}

}
	
static void release_sequence_entries(SEQUENCE_ENTRY *last)
{
	SEQUENCE_ENTRY *p;
	SEQUENCE_ENTRY *c;

	c = last;

	while(c != NULL){
		p = c->prev;
		free(c);
		c = p;
	}
}

static int save_sequence_header(SEQUENCE_HEADER *sh, FILE *fp)
{
	int i;
	
	if(! write_le_int32(sh->orig_h_size, fp) ){
		return 0;
	}
	if(! write_le_int32(sh->orig_v_size, fp) ){
		return 0;
	}
	if(! write_le_int32(sh->h_size, fp) ){
		return 0;
	}
	if(! write_le_int32(sh->v_size, fp) ){
		return 0;
	}
	if(! write_le_int32(sh->aspect_ratio, fp) ){
		return 0;
	}
	if(! write_le_int32(sh->picture_rate, fp) ){
		return 0;
	}
	if(! write_le_int32(sh->bit_rate, fp) ){
		return 0;
	}
	if(! write_le_int32(sh->vbv_buffer_size, fp) ){
		return 0;
	}
	if(! write_le_int32(sh->mpeg1, fp) ){
		return 0;
	}
	
	if(! write_le_int32(sh->has_intra_quantizer_matrix, fp) ){
		return 0;
	}
	if(sh->has_intra_quantizer_matrix){
		for(i=0;i<64;i++){
			fputc(sh->iqm[i], fp);
		}
	}
	
	if(! write_le_int32(sh->has_nonintra_quantizer_matrix, fp) ){
		return 0;
	}
	if(sh->has_nonintra_quantizer_matrix){
		for(i=0;i<64;i++){
			fputc(sh->nqm[i], fp);
		}
	}
	
	if(! write_le_int32(sh->has_sequence_extension, fp) ){
		return 0;
	}
	if(sh->has_sequence_extension){
		if(! write_le_int32(sh->se.profile_and_level, fp)){
			return 0;
		}
		if(! write_le_int32(sh->se.progressive, fp)){
			return 0;
		}
		if(! write_le_int32(sh->se.chroma_format, fp)){
			return 0;
		}
		if(! write_le_int32(sh->se.low_delay, fp)){
			return 0;
		}
		if(! write_le_int32(sh->se.frame_rate_ext_n, fp)){
			return 0;
		}
		if(! write_le_int32(sh->se.frame_rate_ext_d, fp)){
			return 0;
		}
	}
	
	if(! write_le_int32(sh->has_sequence_display_extension, fp)){
		return 0;
	}
	if(sh->has_sequence_display_extension){
		if(! write_le_int32(sh->sd.video_format, fp)){
			return 0;
		}
		if(! write_le_int32(sh->sd.has_color_description, fp)){
			return 0;
		}
		if(! write_le_int32(sh->sd.color_primaries, fp)){
			return 0;
		}
		if(! write_le_int32(sh->sd.transfer_characteristics, fp)){
			return 0;
		}
		if(! write_le_int32(sh->sd.matrix_coefficients, fp)){
			return 0;
		}
		if(! write_le_int32(sh->sd.display_h_size, fp)){
			return 0;
		}
		if(! write_le_int32(sh->sd.display_v_size, fp)){
			return 0;
		}
	}
	
	if(! write_le_int32(sh->has_sequence_scalable_extension, fp)){
		return 0;
	}
	if(sh->has_sequence_scalable_extension){
		if(! write_le_int32(sh->ss.scalable_mode, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.layer, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.lower_layer_prediction_h_size, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.lower_layer_prediction_v_size, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.h_subsampling_facter_m, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.h_subsampling_facter_n, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.v_subsampling_facter_m, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.v_subsampling_facter_n, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.picture_mux_enable, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.mux_to_progressive_sequence, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.pixture_mux_order, fp)){
			return 0;
		}
		if(! write_le_int32(sh->ss.pixture_mux_facter, fp)){
			return 0;
		}
	}

	return 1;
}

static int load_sequence_header(SEQUENCE_HEADER *sh, FILE *fp)
{
	int i;
	
	if(! read_le_int32(fp, &(sh->orig_h_size)) ){
		return 0;
	}
	if(! read_le_int32(fp, &(sh->orig_v_size)) ){
		return 0;
	}
	if(! read_le_int32(fp, &(sh->h_size)) ){
		return 0;
	}
	if(! read_le_int32(fp, &(sh->v_size)) ){
		return 0;
	}
	if(! read_le_int32(fp, &(sh->aspect_ratio)) ){
		return 0;
	}
	if(! read_le_int32(fp, &(sh->picture_rate)) ){
		return 0;
	}
	if(! read_le_int32(fp, &(sh->bit_rate)) ){
		return 0;
	}
	if(! read_le_int32(fp, &(sh->vbv_buffer_size)) ){
		return 0;
	}
	if(! read_le_int32(fp, &(sh->mpeg1)) ){
		return 0;
	}
	
	if(! read_le_int32(fp, &(sh->has_intra_quantizer_matrix)) ){
		return 0;
	}
	if(sh->has_intra_quantizer_matrix){
		for(i=0;i<64;i++){
			sh->iqm[i] = fgetc(fp);
		}
	}
	
	if(! read_le_int32(fp, &(sh->has_nonintra_quantizer_matrix)) ){
		return 0;
	}
	if(sh->has_nonintra_quantizer_matrix){
		for(i=0;i<64;i++){
			sh->nqm[i] = fgetc(fp);
		}
	}
	
	if(! read_le_int32(fp, &(sh->has_sequence_extension)) ){
		return 0;
	}
	if(sh->has_sequence_extension){
		if(! read_le_int32(fp, &(sh->se.profile_and_level))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->se.progressive))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->se.chroma_format))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->se.low_delay))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->se.frame_rate_ext_n))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->se.frame_rate_ext_d))){
			return 0;
		}
	}
	
	if(! read_le_int32(fp, &(sh->has_sequence_display_extension))){
		return 0;
	}
	if(sh->has_sequence_display_extension){
		if(! read_le_int32(fp, &(sh->sd.video_format))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->sd.has_color_description))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->sd.color_primaries))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->sd.transfer_characteristics))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->sd.matrix_coefficients))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->sd.display_h_size))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->sd.display_v_size))){
			return 0;
		}
	}
	
	if(! read_le_int32(fp, &(sh->has_sequence_scalable_extension))){
		return 0;
	}
	if(sh->has_sequence_scalable_extension){
		if(! read_le_int32(fp, &(sh->ss.scalable_mode))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.layer))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.lower_layer_prediction_h_size))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.lower_layer_prediction_v_size))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.h_subsampling_facter_m))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.h_subsampling_facter_n))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.v_subsampling_facter_m))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.v_subsampling_facter_n))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.picture_mux_enable))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.mux_to_progressive_sequence))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.pixture_mux_order))){
			return 0;
		}
		if(! read_le_int32(fp, &(sh->ss.pixture_mux_facter))){
			return 0;
		}
	}

	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -