📄 changes_rm52f.txt
字号:
else if(img_x-img->pix_x>0)
mb_left_down_available =(img_y-img->pix_y)>0? (currMB->slice_nr == img->mb_data[mb_nr+MBRowSize].slice_nr):1; /*oliver*/
else
mb_left_down_available =((img_y-img->pix_y)>0? (currMB->slice_nr == img->mb_data[mb_nr+MBRowSize-1].slice_nr):(currMB->slice_nr == img->mb_data[mb_nr-1].slice_nr)); /*oliver*/
去掉了ipredmode[][]>=0的限制
解码端:
intrapred()函数982行:
block_available_up=( b8_y-1>=0 && mb_up_available);
//check block up right
block_available_up_right=( b8_x+1<(img->width>>3) && b8_y-1>=0 && mb_up_right_available);
//check block left
block_available_left=( b8_x - 1 >=0 && mb_left_available);
//check block left down
block_available_left_down=( b8_x - 1>=0 && b8_y + 1 < (img->height>>3) && mb_left_down_available);
if((img->mb_y==0)||(img->mb_x==img->width/MB_BLOCK_SIZE-1))
mb_up_right_available =1;
else if((img_y-img->pix_y)>0)
mb_up_right_available =(img_x-img->pix_x)>0? (currMB->slice_nr == mb_data[mb_nr+1].slice_nr):1; /*oliver*/
else
mb_up_right_available =((img_x-img->pix_x)>0? (currMB->slice_nr == mb_data[mb_nr-MBRowSize+1].slice_nr):(currMB->slice_nr== mb_data[mb_nr-MBRowSize].slice_nr)); /*oliver*/
if((img->mb_x==0)||(img->mb_y==img->height/MB_BLOCK_SIZE-1))
mb_left_down_available = 1;
else if(img_x-img->pix_x>0)
mb_left_down_available =(img_y-img->pix_y)>0? (currMB->slice_nr == mb_data[mb_nr+MBRowSize].slice_nr):1; /*oliver*/
else
mb_left_down_available =((img_y-img->pix_y)>0? (currMB->slice_nr == mb_data[mb_nr+MBRowSize-1].slice_nr):(currMB->slice_nr == mb_data[mb_nr-1].slice_nr)); /*oliver*/
//0512
6. 关于deblock量化部分的修改 N1204
编码解码的 DeblockMB函数里面
//EdgeLoop( SrcU + (edge<<2) * ((dir)? img->width_cr:1 ), Strength, QP_SCALE_CR[QP], dir, img->width_cr, 1 ) ;
//EdgeLoop( SrcV + (edge<<2) * ((dir)? img->width_cr:1 ), Strength, QP_SCALE_CR[QP], dir, img->width_cr, 1 ) ;
//modified by cjw 20060310
QPchroma=(QP_SCALE_CR[MbP->qp]+QP_SCALE_CR[MbQ->qp]+1)/2;
EdgeLoop( SrcU + (edge<<2) * ((dir)? img->width_cr:1 ), Strength, QPchroma, dir, img->width_cr, 1 ) ;
EdgeLoop( SrcV + (edge<<2) * ((dir)? img->width_cr:1 ), Strength, QPchroma, dir, img->width_cr, 1 ) ;
7. 关于第二个GOP I后的B帧无法解码的错误
编码端main()函数里面对应代码位置添加一句话,恢复img->buf_cycle
if ((input->successive_Bframe != 0) && (IMG_NUMBER > 0)) // B-frame(s) to encode
{
img->type = B_IMG; // set image type to B-frame
picture_coding_type = 1;
img->types = INTER_IMG;
//cjw for weighted prediction
img->buf_cycle = tmp_buf_cycle;
img->frame_num++; //increment frame_num once for B-frames
img->frame_num %= (1 << (LOG2_MAX_FRAME_NUM_MINUS4 + 4));
for(img->b_frame_to_code=1; img->b_frame_to_code<=input->successive_Bframe; img->b_frame_to_code++)
{
picture_distance = (IMG_NUMBER - 1) * (input->jumpd + 1) + img->b_frame_to_code;
encode_one_frame(); // encode one B-frame
}
}
###########################################################################################
###########################200603###########################################################
###########################################################################################
8. AVS3月会议后,参考代码rm52e中需要解决的问题
1).20060321 在函数start_slice()里,slice结束时,即使bytealign也要加10000000码。 OK
2).20060321在参考软件编码器中,存在MV取值可能越界的问题,不限制修改方法, 提供一个参考修改方法; OK
A。修改编码 RD_Cost_for_Macroblocks()
开始: mv_out_of_range =0;
最后 更新mincost前添加
if ( mv_out_of_range == 1 )
{
return 0;
}
B。 修改编码OneComponentLumaPrediction4x4
添加
//////cjw 20060321 for MV limit
//MAX_V_SEARCH_RANGE [-256, +255.75]
//MAX_V_SEARCH_RANGE_FIELD [-128, +127.75]
//MAX_H_SEARCH_RANGE [-2048, +2047.75]
MaxMVHRange= MAX_H_SEARCH_RANGE;
MaxMVVRange= MAX_V_SEARCH_RANGE;
if(!img->picture_structure) //field coding
{
MaxMVVRange=MAX_V_SEARCH_RANGE_FIELD;
}
if ( mv[0] < -MaxMVHRange || mv[0] > MaxMVHRange-1
|| mv[1] < -MaxMVVRange || mv[1] > MaxMVVRange-1 )
{
mv_out_of_range = 1;
}
//////////end cjw //////////////////////////////////////
3). 20060321 加权预测中添加Marker bit 防止伪起始码 OK
编码解码端的SliceHeader()函数中添加一行程序。
u_1 ("insert bit", 1, bitstream); //cjw 20060321
4). 20060321在设置一个参考帧的时候解码错误
此错误依然是由于加权预测的参数导致的。在目前文档里面,无论采用几个参考帧,在解码端应该
从sliceheader中获取最大参考帧数目组参数, 对每个slice都会去解析最大的参考帧数目的加权参数,
但是在编码端,我们仅仅是根据输入的要参考的帧的数目input->reference_num来写入参数的。
这样就会出错。当编码器只是参考1帧图像的时候,解码器仍然按2帧去解析参数,就会出错。
因此在编码器端,我们修改了sliceheader里面的代码,使得无论你实际使用多少参考帧。码流里面总是
写着最大参考帧的加权参数,这样虽然有些浪费,但是是目前不修改文档的最好方法了。此外解码端也采用
文档一致的规则进行解析,即解析最大参考帧数目的加权参数。修改代码编码解码都如下:
在sliceheader函数中。
//cjw 20060321 Spec 9.4.3
if(second_IField && !img->picture_structure) //I bottom
weight_para_num=1;
else if(img->type==INTER_IMG && img->picture_structure) //P frame coding
weight_para_num=2;
else if(img->type==INTER_IMG && !img->picture_structure) //P field coding
weight_para_num=4;
else if(img->type==B_IMG && img->picture_structure) //B frame
weight_para_num=2;
else if(img->type==B_IMG && !img->picture_structure) //B field
weight_para_num=4;
for(i=0;i<weight_para_num;i++) //cjw20050321
{
解析加权参数
}
此外需要修改 编码端 main函数里面的操作,修改如下: 当是I帧的时候应该为1,不能是/2,
因为如果输入为1个参考帧的话,/2后buf_cycle为0,不为期望值1。
if(image_type == INTRA_IMG) // jlzheng 7.21
//img->buf_cycle /= 2;
img->buf_cycle = 1; // cjw 20060321 for 1 reference is allowed in field coding (I bottom only 1 reference is used)
5)20060323修改了对应的Makefile中的相关内容
A.修改了编码器端 fast_me.c中 使得linux下makefile不会有问题
#ifdef WIN32
_inline int PartCalMad(pel_t *ref_pic,pel_t** orig_pic,pel_t *(*get_ref_line)(int, pel_t*, int, int), int blocksize_y,int blocksize_x, int blocksize_x4,int mcost,int min_mcost,int cand_x,int cand_y)
#else
inline int PartCalMad(pel_t *ref_pic,pel_t** orig_pic,pel_t *(*get_ref_line)(int, pel_t*, int, int), int blocksize_y,int blocksize_x, int blocksize_x4,int mcost,int min_mcost,int cand_x,int cand_y)
#endif
B.修改了编码解码中Makefile中对obj文件夹的建立
C. NextStartCode(InputStream *p) 中添加对m变量的赋值 m=0;
6)20060326 修改了编码端 writeMBweightflag()函数 使得编码解码trace符合文档 语法规定形式
具体修改参考代码中的内容
7)20060327在参考软件的直接模式(B_ DIRECT)中, 编码器不做加权预测; Ok
此问题由于文档历史原因修改非常麻烦。
原因如下:B_Direct宏块,如果当cbp为0的时候则作为skip宏块被跳过。
如果一个direct宏块,在加权后,得到的cbp为0,此宏块将被跳过,则其加权标志位也不会被写入码流。
在文档中对跳过宏块是不需要加权的,而编码端是加权后为跳过宏块的,因此出现错误。
修改方法是,在编码端的rdo循环里面,如果判断是direct模式,则当加权预测打开后,还需要判断一下cbp是否
为0,如果是0则不能选择direct模式。
编码端的修改:
在RDCost_for_macroblocks函数里面添加一部分内容
////////////////////////****cjw qhg add 20060327*************////////////
添加的内容
if(img->LumVarFlag&&img->allframeweight&&img->mbweightflag&&(IS_DIRECT(currMB))&&(currMB->cbp==0)) //qhg add
{
}
////////////////////////****end cjw qhg *********************////////////
解码端修改:
按照文档一致修改。decode_one_macroblock()中所有加权的地方的判断修改为
if(((img->slice_weighting_flag == 1) && (img->allframeweight == 1)&&(img->mbweightflag == 1)) //cjw20060321
||((img->slice_weighting_flag == 1) && (img->allframeweight == 0)))
{加权}
8).20060327 对于stuffing, de-emulation实现方式的修改
在每个slice编码结束进行de-emulation ,在slice级进行了一次stuffing
编码端:
A.添加了void Demulate(Bitstream *currStream, int current_slice_bytepos)函数。
B.在start_slice()和terminate_picture()函数里面调用,如果是slice结束则进行一次deemuliation。
将stuffing放在slice级进行。
C.将write_1_bit(OutputStream *p,int b)中将deemulation部分的代码删除。因为我们目前的deemulation是在slice级做的
这里将不再需要了。
// Because de-emulation is used in startslice, it is unecessary to do it here
9). 20060327修改了sliceheader的语法使得与文档一致
都是在sliceheader()函数中运行
编码端:移动了slice vertical position的位置
len+=u_v(8, "slice vertical position",slice_nr,bitstream); //cjw 20060327
解码端:将slice_vertical_position从32位起始码中导出
//currStream->read_len = currStream->frame_bitoffset = (startcodepos+1)*8; //delete by cjw 200600327
currStream->read_len = currStream->frame_bitoffset = (startcodepos)*8; //cjw 20060327 read 24bit starcode prefix
slice_vertical_position = u_v (8, "slice vertical position"); //cjw 20060327 read 8 bit
10)20060327 对加权预测中得到的参数进行范围的限制
在编码端CalculatePar(int refnum)函数中
//cjw 20060327 for shift range limit 7.2.4
img->lum_shift[refnum]= Clip3(-128,127,img->lum_shift[refnum]);
11) 20060327修改了代码中两个变量的名称使得跟文档描述一致,原来的描述很容易让人混淆
修改的为加权预测中的 宏块加权预测标志 mb_weighting_flag 和加权预测 weighting_prediction标志。
A.将sliceheader中的allframeweight 转换为mb_weighting_flag,
B.将宏块中的加权标志位mbweightflag转换为weighting_prediction。
12)20060327 在16x16模式被disable后,对skip宏块的支持。
原来的代码中,skip采用的是16x16宏块模式的运动矢量预测等值,如果在config文件中将16x16宏块模式取消,则
编码解码会出现不匹配。修改的方法是对skip单独做运动矢量预测
具体修改参考 编码端void FindSkipModeMotionVector ()函数。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -