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

📄 headers.c

📁 jpeg and mpeg 编解码技术源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "../mpeg3private.h"
#include "../mpeg3protos.h"
#include "mpeg3video.h"

#include <stdio.h>
#include <stdlib.h>

int mpeg3video_getseqhdr(mpeg3video_t *video)
{
	int i;

	int aspect_ratio, picture_rate, vbv_buffer_size;
	int constrained_parameters_flag;
	int load_intra_quantizer_matrix, load_non_intra_quantizer_matrix;

	video->horizontal_size = mpeg3bits_getbits(video->vstream, 12);
	video->vertical_size = mpeg3bits_getbits(video->vstream, 12);
	aspect_ratio = mpeg3bits_getbits(video->vstream, 4);
	video->framerate_code = mpeg3bits_getbits(video->vstream, 4);
	video->bitrate = mpeg3bits_getbits(video->vstream, 18);
	mpeg3bits_getbit_noptr(video->vstream); /* marker bit (=1) */
	vbv_buffer_size = mpeg3bits_getbits(video->vstream, 10);
	constrained_parameters_flag = mpeg3bits_getbit_noptr(video->vstream);
	video->frame_rate = mpeg3_frame_rate_table[video->framerate_code];

 	load_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
 	if(load_intra_quantizer_matrix)
	{
    	for(i = 0; i < 64; i++)
      		video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
  	}
  	else 
	{
    	for(i = 0; i < 64; i++)
      		video->intra_quantizer_matrix[i] = mpeg3_default_intra_quantizer_matrix[i];
  	}

	load_non_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
	if(load_non_intra_quantizer_matrix)
	{
    	for(i = 0; i < 64; i++)
      		video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
  	}
  	else 
	{
    	for(i = 0; i < 64; i++)
      		video->non_intra_quantizer_matrix[i] = 16;
  	}

/* copy luminance to chrominance matrices */
  	for(i = 0; i < 64; i++)
	{
    	video->chroma_intra_quantizer_matrix[i] = video->intra_quantizer_matrix[i];
   	 	video->chroma_non_intra_quantizer_matrix[i] = video->non_intra_quantizer_matrix[i];
  	}

	return 0;
}


/* decode sequence extension */

int mpeg3video_sequence_extension(mpeg3video_t *video)
{
	int prof_lev;
	int horizontal_size_extension, vertical_size_extension;
	int bit_rate_extension, vbv_buffer_size_extension, low_delay;
	int frame_rate_extension_n, frame_rate_extension_d;
	int pos = 0;

	video->mpeg2 = 1;
	video->scalable_mode = SC_NONE; /* unless overwritten by seq. scal. ext. */
	prof_lev = mpeg3bits_getbyte_noptr(video->vstream);
	video->prog_seq = mpeg3bits_getbit_noptr(video->vstream);
	video->chroma_format = mpeg3bits_getbits(video->vstream, 2);
	horizontal_size_extension = mpeg3bits_getbits(video->vstream, 2);
	vertical_size_extension = mpeg3bits_getbits(video->vstream, 2);
	bit_rate_extension = mpeg3bits_getbits(video->vstream, 12);
	mpeg3bits_getbit_noptr(video->vstream);
	vbv_buffer_size_extension = mpeg3bits_getbyte_noptr(video->vstream);
	low_delay = mpeg3bits_getbit_noptr(video->vstream);
	frame_rate_extension_n = mpeg3bits_getbits(video->vstream, 2);
	frame_rate_extension_d = mpeg3bits_getbits(video->vstream, 5);
	video->horizontal_size = (horizontal_size_extension << 12) | (video->horizontal_size & 0x0fff);
	video->vertical_size = (vertical_size_extension << 12) | (video->vertical_size & 0x0fff);
	return 0;
}


/* decode sequence display extension */

int mpeg3video_sequence_display_extension(mpeg3video_t *video)
{
	int colour_primaries = 0, transfer_characteristics = 0;
	int display_horizontal_size, display_vertical_size;
	int pos = 0;
	int video_format = mpeg3bits_getbits(video->vstream, 3);
	int colour_description = mpeg3bits_getbit_noptr(video->vstream);

	if(colour_description)
	{
    	colour_primaries = mpeg3bits_getbyte_noptr(video->vstream);
    	transfer_characteristics = mpeg3bits_getbyte_noptr(video->vstream);
    	video->matrix_coefficients = mpeg3bits_getbyte_noptr(video->vstream);
	}

	display_horizontal_size = mpeg3bits_getbits(video->vstream, 14);
	mpeg3bits_getbit_noptr(video->vstream);
	display_vertical_size = mpeg3bits_getbits(video->vstream, 14);
	return 0;
}


/* decode quant matrix entension */

int mpeg3video_quant_matrix_extension(mpeg3video_t *video)
{
	int i;
	int load_intra_quantiser_matrix, load_non_intra_quantiser_matrix;
	int load_chroma_intra_quantiser_matrix;
	int load_chroma_non_intra_quantiser_matrix;
	int pos = 0;

	if((load_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
	{
      	for(i = 0; i < 64; i++)
		{
    		video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
    			= video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
    			= mpeg3bits_getbyte_noptr(video->vstream);
      	}
	}

	if((load_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
	{
    	for (i = 0; i < 64; i++)
		{
    		video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
    			= video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
    			= mpeg3bits_getbyte_noptr(video->vstream);
    	}
	}

	if((load_chroma_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
	{
    	for(i = 0; i < 64; i++)
    		video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
	}

	if((load_chroma_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
	{
      	for(i = 0; i < 64; i++)
    		video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
	}
	return 0;
}


/* decode sequence scalable extension */

int mpeg3video_sequence_scalable_extension(mpeg3video_t *video)
{
	int layer_id;

	video->scalable_mode = mpeg3bits_getbits(video->vstream, 2) + 1; /* add 1 to make SC_DP != SC_NONE */
	layer_id = mpeg3bits_getbits(video->vstream, 4);

	if(video->scalable_mode == SC_SPAT)
	{
    	video->llw = mpeg3bits_getbits(video->vstream, 14); /* lower_layer_prediction_horizontal_size */
    	mpeg3bits_getbit_noptr(video->vstream);
    	video->llh = mpeg3bits_getbits(video->vstream, 14); /* lower_layer_prediction_vertical_size */
    	video->hm = mpeg3bits_getbits(video->vstream, 5);
    	video->hn = mpeg3bits_getbits(video->vstream, 5);
    	video->vm = mpeg3bits_getbits(video->vstream, 5);
    	video->vn = mpeg3bits_getbits(video->vstream, 5);
	}

	if(video->scalable_mode == SC_TEMP)
      	fprintf(stderr, "mpeg3video_sequence_scalable_extension: temporal scalability not implemented\n");
	return 0;
}


/* decode picture display extension */

int mpeg3video_picture_display_extension(mpeg3video_t *video)
{
	int n, i;
	short frame_centre_horizontal_offset[3];
	short frame_centre_vertical_offset[3];



	if(video->prog_seq || video->pict_struct != FRAME_PICTURE)
		n = 1;
	else 
		n = video->repeatfirst ? 3 : 2;




	for(i = 0; i < n; i++)
	{
    	frame_centre_horizontal_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
    	mpeg3bits_getbit_noptr(video->vstream);
    	frame_centre_vertical_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
    	mpeg3bits_getbit_noptr(video->vstream);
	}
	return 0;
}


/* decode picture coding extension */

int mpeg3video_picture_coding_extension(mpeg3video_t *video)
{
	int chroma_420_type, composite_display_flag;
	int v_axis = 0, field_sequence = 0, sub_carrier = 0, burst_amplitude = 0, sub_carrier_phase = 0;

	video->h_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
	video->v_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
	video->h_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
	video->v_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
	video->dc_prec = mpeg3bits_getbits(video->vstream, 2);
	video->pict_struct = mpeg3bits_getbits(video->vstream, 2);
	video->topfirst = mpeg3bits_getbit_noptr(video->vstream);
	video->frame_pred_dct = mpeg3bits_getbit_noptr(video->vstream);
	video->conceal_mv = mpeg3bits_getbit_noptr(video->vstream);
	video->qscale_type = mpeg3bits_getbit_noptr(video->vstream);
	video->intravlc = mpeg3bits_getbit_noptr(video->vstream);
	video->altscan = mpeg3bits_getbit_noptr(video->vstream);


	video->repeatfirst = mpeg3bits_getbit_noptr(video->vstream);


	chroma_420_type = mpeg3bits_getbit_noptr(video->vstream);
	video->prog_frame = mpeg3bits_getbit_noptr(video->vstream);

	if(video->repeat_count > 100)
		video->repeat_count = 0;
	video->repeat_count += 100;

	video->current_repeat = 0;

	if(video->prog_seq)
	{
		if(video->repeatfirst)
		{
			if(video->topfirst)
				video->repeat_count += 200;
			else
				video->repeat_count += 100;
		}
	}
	else
	if(video->prog_frame)
	{
		if(video->repeatfirst)
		{
			video->repeat_count += 50;
		}

⌨️ 快捷键说明

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