📄 changes_sm0.2.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 + -