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

📄 macroblock.c

📁 由bmp生成mpeg2 的I_frame 数据
💻 C
📖 第 1 页 / 共 3 页
字号:
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 3);
	}else if( (code >> 5) == 2 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 4);
	}else if( (code >> 5) == 3 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 4);
	}else if( (code >> 3) == 6 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 1;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 6);
	}else if( (code >> 3) == 7 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 1;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 6);
	}else if( (code >> 3) == 4 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 6);
	}else if( (code >> 3) == 5 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 6);
	}else if( (code >> 2) == 6 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 1;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 7);
	}else if( (code >> 2) == 7 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 1;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 7);
	}else if( (code >> 2) == 4 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 7);
	}else if( (code >> 2) == 5 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 1;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 7);
	}else if( (code >> 1) == 4 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 1;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 8);
	}else if( (code >> 1) == 5 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 8);
	}else if(code == 12){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 1;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 9);
	}else if(code == 14){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 4;
		vs_erase_bits(in, 9);
	}else if(code == 13){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 4;
		vs_erase_bits(in, 9);
	}else if(code == 15){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 4;
		vs_erase_bits(in, 9);
	}else{
		return 0;
	}

	return 1;
}

int read_macroblock_type_p_spatial_scalability(VIDEO_STREAM *in, MACROBLOCK *out)
{
	int code;

	code = vs_read_bits(in, 7);

	if( (code >> 5) == 2 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 2);
	}else if( (code >> 4) == 3 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 3);
	}else if(code == 4){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 7);
	}else if( (code >> 1) == 7 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 6);
	}else if( (code >> 3) == 2 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 4);
	}else if(code == 7){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 1;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 7);
	}else if( (code >> 3) == 3 ){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 4);
	}else if( (code >> 4) == 2 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 3);
	}else if( (code >> 1) == 4 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 6);
	}else if(code == 6){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 1;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 7);
	}else if( (code >> 5) == 3 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 1;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 2);
	}else if( (code >> 1) == 5 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 6);
	}else if( (code >> 1) == 6){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 1;
		vs_erase_bits(in, 6);
	}else if(code == 5){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 4;
		vs_erase_bits(in, 7);
	}else if(code == 2){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 4;
		vs_erase_bits(in, 7);
	}else if(code == 3){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 4;
		vs_erase_bits(in, 7);
	}else{
		return 0;
	}

	return 1;
}

int read_macroblock_type_i_spatial_scalability(VIDEO_STREAM *in, MACROBLOCK *out)
{
	int code;

	code = vs_read_bits(in, 4);

	if( (code >> 3) == 1){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 4;
		vs_erase_bits(in, 1);
	}else if( (code >> 2) == 1 ){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 1;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 4;
		vs_erase_bits(in, 2);
	}else if(code == 3){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 1;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 4);
	}else if(code == 2){
		out->macroblock_quant = 1;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 1;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;
		vs_erase_bits(in, 4);
	}else if(code == 1){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 0;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 4;
		vs_erase_bits(in, 4);
	}else{
		return 0;
	}

	return 1;
}

/*
QUANT 0010 0000 0000
MFWD  0001 0000 0000
MBWD  0000 1000 0000
PTTN  0000 0100 0000
INTR  0000 0010 0000
STCF  0000 0001 0000
                CLSS
*/

int read_macroblock_type_b(VIDEO_STREAM *in, MACROBLOCK *out)
{
	int code;

	static const BASIC_VLC_ELEMENT table[] = {
		{0x220,6},{0x2C0,6},{0x340,6},{0x3C0,5},{0x3C0,5},{0x020,5},{0x020,5},
		{0x100,4},{0x100,4},{0x100,4},{0x100,4},{0x140,4},{0x140,4},{0x140,4},{0x140,4},
		{0x080,3},{0x080,3},{0x080,3},{0x080,3},{0x080,3},{0x080,3},{0x080,3},{0x080,3},
		{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},
		{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},
		{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},
		{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},
		{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},
	};

	code = vs_read_bits(in, 6);
	if(code == 0){
		return 0;
	}
	code -= 1;

	vs_erase_bits(in, table[code].length);

	out->macroblock_quant = (table[code].value >> 9) & 1;
	out->macroblock_motion_forward = (table[code].value >> 8) & 1;
	out->macroblock_motion_backward = (table[code].value >> 7) & 1;
	out->macroblock_pattern = (table[code].value >> 6) & 1;
	out->macroblock_intra = (table[code].value >> 5) & 1;
	out->spatial_temporal_weight_code_flag = 0;
	out->spatial_temporal_weight_class = 0;

	return 1;
}

int read_macroblock_type_p(VIDEO_STREAM *in, MACROBLOCK *out)
{
	int code;

	static const BASIC_VLC_ELEMENT table[] = {
		{0x220,6},{0x240,5},{0x240,5},{0x340,5},{0x340,5},{0x020,5},{0x020,5},
		{0x100,3},{0x100,3},{0x100,3},{0x100,3},{0x100,3},{0x100,3},{0x100,3},{0x100,3},
		{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},
		{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},
		{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},
		{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},
		{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},
		{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},
	};
	
	code = vs_read_bits(in, 6);
	if(code == 0){
		return 0;
	}
	code -= 1;
	
	vs_erase_bits(in, table[code].length);

	out->macroblock_quant = (table[code].value >> 9) & 1;
	out->macroblock_motion_forward = (table[code].value >> 8) & 1;
	out->macroblock_motion_backward = 0;
	out->macroblock_pattern = (table[code].value >> 6) & 1;
	out->macroblock_intra = (table[code].value >> 5) & 1;
	out->spatial_temporal_weight_code_flag = 0;
	out->spatial_temporal_weight_class = 0;

	return 1;
}

int read_macroblock_type_i(VIDEO_STREAM *in, MACROBLOCK *out)
{
	int code;

	static const BASIC_VLC_ELEMENT table[] = {
		{0x220,2},{0x020,1},{0x020,1},
	};
	
	code = vs_read_bits(in, 2);
	if(code == 0){
		return 0;
	}
	code -= 1;

	vs_erase_bits(in, table[code].length);

	out->macroblock_quant = (table[code].value >> 9) & 1;
	out->macroblock_motion_forward = 0;
	out->macroblock_motion_backward = 0;
	out->macroblock_pattern = 0;
	out->macroblock_intra = (table[code].value >> 5) & 1;
	out->spatial_temporal_weight_code_flag = 0;
	out->spatial_temporal_weight_class = 0;

	return 1;
}

int read_macroblock_type_d(VIDEO_STREAM *in, MACROBLOCK *out)
{
	int code;

	code = vs_read_bits(in, 2);

	if(code == 3){
		out->macroblock_quant = 0;
		out->macroblock_motion_forward = 0;
		out->macroblock_motion_backward = 0;
		out->macroblock_pattern = 0;
		out->macroblock_intra = 1;
		out->spatial_temporal_weight_code_flag = 0;
		out->spatial_temporal_weight_class = 0;

⌨️ 快捷键说明

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