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

📄 changes_sm0.2.txt

📁 avs-s最新代码,包括编码器和解码器源码
💻 TXT
字号:
===========================================================================================
提案M2192(核心帧技术)相关的修改

===========================================================================================
编码器:

bin目录下增加一个文件名为3的文件,该文件是ITU的错误模型,这个可以根据需要随机产生更新

配置文件encoder.cfg中增加
###########################################################################################
#Core frame
###########################################################################################
CoreFrameFlag         = 1   # coreframe enable flag (0=disable, 1=enable)
Log2CoreFrameBufSize  = 4   # log2 coreframe buffer size (1--4)
CoreFramePeriod       = 2   # Period of CoreFramePeriod(only replace I P )
LossPack              = 0   # Loss Pack(0=disable, 1=enable)

与提案M2192相关的代码修改都用如下宏定义包围
#ifdef COREFRAME
#endif

丢包功能增加
bitstream.c文件664行增加丢包修改
  int loss_flag=0;
  if(losspack_flag == 0)
  {
  }
  else
  {
  	……
  }


===========================================================================================
解码器

与核心帧相关的代码修改用如下的宏定义包围
#ifdef CRPS
#endif

添加简单错误保护以支持丢包码流解码
(1)	global.h中添加全局变量及宏定义
#define MAXNALULEN	80000
int bBitstreamErr;
int prevPictureheaderloss;
unsigned char gBuf[MAXNALULEN];
int gbuflen;
int gstartcodepos;
(2)header.h中,将void SliceHeader();改为:
#ifndef ERROR_CONTROL
void SliceHeader();
#else
int SliceHeader();
#endif

(3)block.c中,对readLumaCoeff_B8()添加错误保护代码;
(4)header.c中,当ERROR_CONTROL打开时,SliceHeader()中添加	return mb_index;
(5)macroblock.c中,在readCBPandCoeffsFromNAL()中readLumaCoeff_B8()之后,
添加对bBitstreamErr进行判断退出的代码。
(6)image.c中,对decode_one_frame()、Header()、picture_data()、top_field()、
bot_field()添加支持丢包码流解码的代码。


===========================================================================================
提案M2189相关的修改

与提案M2189相关的修改都由宏:
#ifdef BACKGROUND
...
#endif
包围
 
另外:在encoder.cfg中加了
###########################################################################################
#Background-predictive picture
###########################################################################################
BackgroundEnable        =  1  # (0 = Disable, 1 = Enable)
BackgroundOutput        =  1  # (0 = Not display background, 1 = Display background) 

===========================================================================================
提案M2210相关的修改
===========================================================================================
编码器修改:
在encoder.cfg中增加level id(8:1.0),增加不限定的frame rate code(15)

在函数static void LevelCheck()中增加对level1.0的check以及不限制的帧率
在main函数中将
 if(input->RCEnable)
  {
	 rc_init_seq();
  }
改为
 if(input->RCEnable)
  {
	  if (input->frame_rate_code==15)
	  {
		  printf("Rate control can't be used when frame rate is not limited!\n");
		  exit(0);
	  }
	  rc_init_seq();
  }

===========================================================================================
解码器修改:

修改函数void SequenceHeader (char *buf,int startcodepos, int length)中与bit_rate
和bbv_buffer_size相关的部分

if (frame_rate_code==15)	
	{
		u_v  (18, "bit_rate_lower"  );
		u_v  (1, "marker bit"  );
		u_v  (12, "bit_rate_upper"  );
		low_delay                   = u_v  (1, "low_delay"  );
		u_v  (1, "marker bit"  );
		u_v(18,"bbv buffer size");
	} 
	else
	{
		bit_rate_lower              = u_v  (18, "bit_rate_lower"  );
		u_v  (1, "marker bit"  );
		bit_rate_upper              = u_v  (12, "bit_rate_upper"  );
		low_delay                   = u_v  (1, "low_delay"  );
		u_v  (1, "marker bit"  );
		bbv_buffer_size = u_v(18,"bbv buffer size");
	}
	
===========================================================================================
高层与语法的修改

===========================================================================================
编码器修改

1)sequence header相关的修改
修改函数int WriteSequenceHeader()中以下部分
	bitscount+=u_v(1,"marker bit",1,bitstream);
	bitscount+=u_v(1,"background predictive flag", input->background^0x01, bitstream);
	bitscount+=u_v(1, "coreframe_flag", core_frame_enable_flag^0x01, bitstream);
	if (core_frame_enable_flag)
	{
		bitscount+=u_v(2,"log2_coreframe_ref_num_1",log2_core_frame_buffer_size-1, bitstream);
	}
	bitscount+=u_v(2,"reserved bits", 0, bitstream);
	
另外对函数中以下部分

	k = bitscount >> 3;
	j = bitscount % 8;
	
	stuffbits = 8-(bitscount%8);

	if (stuffbits<8)
		bitscount+=u_v(stuffbits,"stuff bits for byte align",0,bitstream);
改成
	stuffbits = 8-(bitscount%8);
	
	if (stuffbits<8)
		bitscount+=u_v(stuffbits,"stuff bits for byte align",0,bitstream);

	k = bitscount >> 3;
	j = bitscount % 8;

2)I picture header相关修改
在函数int IPictureHeader(int frame)中增加
	if(input->background){
		if(img->typeb == BACKGROUND_IMG){
			len+=u_v(1,"picture_coding_type",1,bitstream);
			len+= u_v(1, "picture_output_flag", input->backgroundOutput, bitstream);
		}
		else
			len+=u_v(1,"picture_coding_type",0,bitstream);
	}

	if(core_frame_enable_flag)
	{
		len+=u_v(1, "Is_coreframe_flag", cur_core_frame_flag, bitstream);
		if(cur_core_frame_flag)
		{
			len+=u_v(log2_core_frame_buffer_size, "Coreframe_num", core_frame_num, bitstream);

		}

	}
	
3)PB picture header相关修改
在函数int PBPictureHeader()中增加
if(picture_coding_type==1 && core_frame_enable_flag)
{
	len+=u_v(1, "Is_coreframe_flag", cur_core_frame_flag, bitstream);
	if(cur_core_frame_flag)
	{
		len+=u_v(log2_core_frame_buffer_size, "Coreframe_num", core_frame_num, bitstream);
		len+=u_v(log2_core_frame_buffer_size, "Coreframe_ref_num", core_frame_ref_num, bitstream);			
	}		
}
修改	
if (!(((picture_coding_type == 2 || picture_coding_type == 3)&& img->picture_structure==1)
	||(cur_core_frame_flag&&img->picture_structure==1)))
{
	len+=u_v(1,"piture reference flag",picture_reference_flag,bitstream);
}
	
4)区域扩展相关修改
增加结构体
type struct{
	int region_num;
	int region_id[MAX_REGION_NUM];
	int region_event_id[MAX_REGION_NUM];
	int region_top_left_x[MAX_REGION_NUM];
	int region_top_left_y[MAX_REGION_NUM];
	int region_bottom_right_x[MAX_REGION_NUM];
	int region_bottom_right_y[MAX_REGION_NUM];
}RegionParamters;
增加区域扩展函数int WriteRegionExtension()

===========================================================================================
解码器修改

1)sequence header相关修改
函数void SequenceHeader (char *buf,int startcodepos, int length)中

	u_v  (1, "marker bit"  );
	background_predictive = 0x01 ^ u_v(1,"background predictive flag");
	core_frame_enable_flag =0x01 ^ u_v(1,"coreframe_flag");
	if(core_frame_enable_flag)
	{
		log2_core_frame_buffer_size = u_v(2, "log2_core_frame_buffer_size-1")+1;
	}
	core_frame_buffer_size = (unsigned int )( pow(2, log2_core_frame_buffer_size) );
	u_v  (2,"reseved bits");

2)I Picture header相关修改
函数void I_Picture_Header(char *buf,int startcodepos, int length)中增加
	if(background_predictive){
		picture_coding_type = u_v(1,"picture coding type");
		if(picture_coding_type){
			img->typeb = BACKGROUND_IMG;
			background_output_flag = u_v(1,"picture output flag");
		}
		else
			img->typeb = 0;
	}
	if(core_frame_enable_flag)
	{
        cur_core_frame_flag = u_v(1, "Is_coreframe_flag");
		if(cur_core_frame_flag)
		{
			core_frame_num = u_v(log2_core_frame_buffer_size, "Coreframe_num");
			core_frame_ref_num = 0;
		}
	}
	else
	{
		cur_core_frame_flag = 0;
		core_frame_ref_num  = 0;
	}

3)PB Picture header相关修改
函数void PB_Picture_Header(char *buf,int startcodepos, int length)中增加
	if(picture_coding_type==1 && core_frame_enable_flag)
	{
		cur_core_frame_flag =u_v(1, "Is_coreframe_flag");
		if(cur_core_frame_flag)
		{
			//printf("core frame's img->pic_distance:%d\n",img->pic_distance);
			core_frame_num =u_v(log2_core_frame_buffer_size, "Coreframe_num");
			core_frame_ref_num =u_v(log2_core_frame_buffer_size, "Coreframe_ref_num");			
		}
	}
	else
	{
		cur_core_frame_flag = 0;
	}
修改
	if(!(((picture_coding_type == 2) ||(img->typeb == BP_IMG) && img->picture_structure==1)
	||(cur_core_frame_flag&&img->picture_structure==1)))
	{
		picture_reference_flag = u_v(1,"picture_reference_flag");
	}
	else
	{
		picture_reference_flag = 1;
	}
	
4)区域扩展相关修改
增加结构体
type struct{
	int region_num;
	int region_id[MAX_REGION_NUM];
	int region_event_id[MAX_REGION_NUM];
	int region_top_left_x[MAX_REGION_NUM];
	int region_top_left_y[MAX_REGION_NUM];
	int region_bottom_right_x[MAX_REGION_NUM];
	int region_bottom_right_y[MAX_REGION_NUM];
}RegionParamters;
增加区域扩展函数void region_extension(), 在函数
void extension_data(char *buf,int startcodepos, int length)增加区域扩展解析

⌨️ 快捷键说明

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