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

📄 changes_rm52f.txt

📁 AVS编解码是学习AVS程序开发的入门资料,可以帮助初学者获得很多的收获.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  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 + -