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

📄 gethdr.c

📁 DVD转换到AVI的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	int frame_rate_extension_n;
	int frame_rate_extension_d;

	int horizontal_size_extension;
	int vertical_size_extension;
	int bit_rate_extension;
	int vbv_buffer_size_extension;

	profile_and_level_indication = Get_Bits(8);
	progressive_sequence         = Get_Bits(1);
	chroma_format                = Get_Bits(2);
	horizontal_size_extension    = Get_Bits(2);
	vertical_size_extension      = Get_Bits(2);
	bit_rate_extension           = Get_Bits(12);
	Flush_Buffer(1);	// marker bit
	vbv_buffer_size_extension    = Get_Bits(8);
	low_delay                    = Get_Bits(1);
 
	frame_rate_extension_n       = Get_Bits(2);
	frame_rate_extension_d       = Get_Bits(5);
	frame_rate = (float)(frame_rate_Table[frame_rate_code] * (frame_rate_extension_n+1)/(frame_rate_extension_d+1));

	horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
	vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
}

/* decode sequence display extension */
static void sequence_display_extension()
{
	int video_format;  
	int color_description;
	int color_primaries;
	int transfer_characteristics;
	int matrix_coefficients;
	int display_horizontal_size;
	int display_vertical_size;

	video_format      = Get_Bits(3);
	color_description = Get_Bits(1);

	if (color_description)
	{
		color_primaries          = Get_Bits(8);
		transfer_characteristics = Get_Bits(8);
		matrix_coefficients      = Get_Bits(8);
	}

	display_horizontal_size = Get_Bits(14);
	Flush_Buffer(1);	// marker bit
	display_vertical_size   = Get_Bits(14);
}

/* decode quant matrix entension */
/* ISO/IEC 13818-2 section 6.2.3.2 */
static void quant_matrix_extension()
{
	int i;

	if (load_intra_quantizer_matrix = Get_Bits(1))
		for (i=0; i<64; i++)
			chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
				= intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);

	if (load_non_intra_quantizer_matrix = Get_Bits(1))
		for (i=0; i<64; i++)
			chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
				= non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);

	if (load_chroma_intra_quantizer_matrix = Get_Bits(1))
		for (i=0; i<64; i++)
			chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);

	if (load_chroma_non_intra_quantizer_matrix = Get_Bits(1))
		for (i=0; i<64; i++)
			chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
}

/* decode picture display extension */
/* ISO/IEC 13818-2 section 6.2.3.3. */
static void picture_display_extension()
{
	int frame_center_horizontal_offset[3];
	int frame_center_vertical_offset[3];

	int i;
	int number_of_frame_center_offsets;

	/* based on ISO/IEC 13818-2 section 6.3.12 
	   (November 1994) Picture display extensions */

	/* derive number_of_frame_center_offsets */
	if (progressive_sequence)
	{
		if (repeat_first_field)
		{
			if (top_field_first)
				number_of_frame_center_offsets = 3;
			else
				number_of_frame_center_offsets = 2;
		}
		else
			number_of_frame_center_offsets = 1;
	}
	else
	{
		if (picture_structure!=FRAME_PICTURE)
			number_of_frame_center_offsets = 1;
		else
		{
			if (repeat_first_field)
				number_of_frame_center_offsets = 3;
			else
				number_of_frame_center_offsets = 2;
		}
	}

	/* now parse */
	for (i=0; i<number_of_frame_center_offsets; i++)
	{
		frame_center_horizontal_offset[i] = Get_Bits(16);
		Flush_Buffer(1);	// marker bit

		frame_center_vertical_offset[i] = Get_Bits(16);
		Flush_Buffer(1);	// marker bit
	}
}

/* decode picture coding extension */
static void picture_coding_extension()
{
	int chroma_420_type;
	int composite_display_flag;
	int v_axis;
	int field_sequence;
	int sub_carrier;
	int burst_amplitude;
	int sub_carrier_phase;

	f_code[0][0] = Get_Bits(4);
	f_code[0][1] = Get_Bits(4);
	f_code[1][0] = Get_Bits(4);
	f_code[1][1] = Get_Bits(4);

	intra_dc_precision			= Get_Bits(2);
	picture_structure			= Get_Bits(2);
	top_field_first				= Get_Bits(1);
	frame_pred_frame_dct		= Get_Bits(1);
	concealment_motion_vectors	= Get_Bits(1);
	q_scale_type				= Get_Bits(1);
	intra_vlc_format			= Get_Bits(1);
	alternate_scan				= Get_Bits(1);
	repeat_first_field			= Get_Bits(1);
	chroma_420_type				= Get_Bits(1);
	progressive_frame			= Get_Bits(1);
	composite_display_flag		= Get_Bits(1);

	d2v_current.pf = progressive_frame;
	d2v_current.trf = (top_field_first<<1) + repeat_first_field;

	if (composite_display_flag)
	{
		v_axis            = Get_Bits(1);
		field_sequence    = Get_Bits(3);
		sub_carrier       = Get_Bits(1);
		burst_amplitude   = Get_Bits(7);
		sub_carrier_phase = Get_Bits(8);
	}
}

/* decode extra bit information */
/* ISO/IEC 13818-2 section 6.2.3.4. */
static int extra_bit_information()
{
	int Byte_Count = 0;

	while (Get_Bits(1))
	{
		Flush_Buffer(8);
		Byte_Count++;
	}

	return(Byte_Count);
}

/* Copyright extension */
/* ISO/IEC 13818-2 section 6.2.3.6. */
/* (header added in November, 1994 to the IS document) */
static void copyright_extension()
{
	int copyright_flag;
	int copyright_identifier;
	int original_or_copy;
	int copyright_number_1;
	int copyright_number_2;
	int copyright_number_3;

	int reserved_data;

	copyright_flag =       Get_Bits(1); 
	copyright_identifier = Get_Bits(8);
	original_or_copy =     Get_Bits(1);
  
	/* reserved */
	reserved_data = Get_Bits(7);

	Flush_Buffer(1); // marker bit
	copyright_number_1 =   Get_Bits(20);
	Flush_Buffer(1); // marker bit
	copyright_number_2 =   Get_Bits(22);
	Flush_Buffer(1); // marker bit
	copyright_number_3 =   Get_Bits(22);
}

static void Statistics()
{
	static int Old_NTSC_Purity;
	int pts;

	if (VOB_ID || CELL_ID)
	{
		sprintf(szBuffer, "%d", VOB_ID);
		SetDlgItemText(hDlg, IDC_VOB_ID, szBuffer);

		sprintf(szBuffer, "%d", CELL_ID);
		SetDlgItemText(hDlg, IDC_CELL_ID, szBuffer);
	}
	else if (process.locate==LOCATE_INIT)
	{
		SetDlgItemText(hDlg, IDC_VOB_ID, szBlank);
		SetDlgItemText(hDlg, IDC_CELL_ID, szBlank);
	}

	sprintf(szBuffer, "%d / %d", File_Flag+1, File_Limit);
	SetDlgItemText(hDlg, IDC_NUMBER, szBuffer);

	sprintf(szBuffer, "%s", AspectRatio[aspect_ratio_information]);
	SetDlgItemText(hDlg, IDC_ASPECT_RATIO, szBuffer);

	sprintf(szBuffer, "%.3f fps", Frame_Rate);
	SetDlgItemText(hDlg, IDC_FRAME_RATE, szBuffer);

	if (Track_Flag!=TRACK_NONE)
	{
		switch (CH[Track_Flag])
		{
			case FORMAT_AC3:
				sprintf(szBuffer, "DD %s %d", AC3Mode[ac3[Track_Flag].mode], AC3Rate[ac3[Track_Flag].rate]);
				SetDlgItemText(hDlg, IDC_AUDIO_TYPE, szBuffer);
				break;

			case FORMAT_MPA:
				SetDlgItemText(hDlg, IDC_AUDIO_TYPE, "MPEG Audio");
				break;

			case FORMAT_LPCM:
				SetDlgItemText(hDlg, IDC_AUDIO_TYPE, "Linear PCM");
				break;

			case FORMAT_DTS:
				SetDlgItemText(hDlg, IDC_AUDIO_TYPE, "DTS");
				break;

			default:
				SetDlgItemText(hDlg, IDC_AUDIO_TYPE, szBlank);
				break;
		}
	}
	else
		SetDlgItemText(hDlg, IDC_AUDIO_TYPE, szBlank);

	if (SystemStream_Flag && process.locate!=LOCATE_INIT)
	{
		pts = (int)AudioPTS/1000;
		sprintf(szBuffer, "%d:%02d:%02d", pts/3600, (pts%3600)/60, pts%60);
		SetDlgItemText(hDlg, IDC_TIMESTAMP, szBuffer);
	}
	else
		SetDlgItemText(hDlg, IDC_TIMESTAMP, szBlank);

	if (process.locate==LOCATE_RIP)
	{
		if (NTSC_Purity || FILM_Purity)
		{
			if (!FILM_Purity)
			{
				if (frame_rate==25)
					sprintf(szBuffer, "PAL");
				else
					sprintf(szBuffer, "NTSC");
			}
			else if (!NTSC_Purity)
				sprintf(szBuffer, "FILM");
			else if (NTSC_Purity > Old_NTSC_Purity)
				sprintf(szBuffer, "NTSC %2d %%", 100 - (FILM_Purity*100)/(FILM_Purity+NTSC_Purity));
			else
				sprintf(szBuffer, "FILM %2d %%", (FILM_Purity*100)/(FILM_Purity+NTSC_Purity));

			Old_NTSC_Purity = NTSC_Purity;
			SetDlgItemText(hDlg, IDC_VIDEO_TYPE, szBuffer);
		}

		if (process.op)
		{
			process.ed = timeGetTime();
			process.elapsed = (process.ed-process.op)/1000;
			process.percent = (float)(100.0*(process.run-process.start+_telli64(Infile[File_Flag]))/(process.end-process.start));
			process.remain = (int)((process.ed-process.op)*(100.0-process.percent)/process.percent)/1000;

			sprintf(szBuffer, "%d:%02d:%02d", process.elapsed/3600, (process.elapsed%3600)/60, process.elapsed%60);
			SetDlgItemText(hDlg, IDC_ELAPSED, szBuffer);

			sprintf(szBuffer, "%d:%02d:%02d", process.remain/3600, (process.remain%3600)/60, process.remain%60);
			SetDlgItemText(hDlg, IDC_REMAIN, szBuffer);
		}
	}
	else if (GetDlgItemText(hDlg, IDC_ELAPSED, szBuffer, 9))
	{
		SetDlgItemText(hDlg, IDC_VIDEO_TYPE, szBlank);
		SetDlgItemText(hDlg, IDC_FRAME_TYPE, szBlank);
		SetDlgItemText(hDlg, IDC_CODED_NUMBER, szBlank);
		SetDlgItemText(hDlg, IDC_PLAYBACK_NUMBER, szBlank);
		SendDlgItemMessage(hDlg, IDC_PROGRESS, PBM_SETPOS, 0, 0);
		SetDlgItemText(hDlg, IDC_FILE, szBlank);
		SetDlgItemText(hDlg, IDC_FILE_SIZE, szBlank);
		SetDlgItemText(hDlg, IDC_ELAPSED, szBlank);
		SetDlgItemText(hDlg, IDC_REMAIN, szBlank);
		SetDlgItemText(hDlg, IDC_FPS, szBlank);
	}
}

⌨️ 快捷键说明

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