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

📄 readmerm52f.txt

📁 AVS视频编解码器 能实现视频图像的高效率压缩 能在VC上高速运行
💻 TXT
📖 第 1 页 / 共 2 页
字号:
from rm52d  to  rm52e
from rm52e  to rm52f Beta
1.Chroma的帧内预测

macroblock.c中的int decode_one_macroblock(struct img_par *img,struct inp_par *inp)

int mb_available_up_right = (img->mb_y == 0 || img->mb_x == img->width/MB_BLOCK_SIZE-1) ? 0 
	  : (mb_data[mb_nr].slice_nr == mb_data[mb_nr-mb_width+1].slice_nr);

					//for(x=0;x<bs_y;x++)
					//	EPU[1+x+bs_x]=EPU[bs_x];
					if ( mb_available_up_right )
					{
						for(x=0;x<bs_x;x++)
							EPU[1+x+bs_x]=imgUV[uv][img->pix_c_y-1][img->pix_c_x+x+bs_x];
					}
					else
					{
						for(x=0;x<bs_x;x++)
						EPU[1+x+bs_x]=EPU[bs_x];
					}

					//for(x=0;x<bs_y;x++)
					//	EPV[1+x+bs_x]=EPV[bs_x];
					if ( mb_available_up_right )
					{
						for(x=0;x<bs_x;x++)
							EPV[1+x+bs_x]=imgUV[uv][img->pix_c_y-1][img->pix_c_x+x+bs_x];
					}
					else
					{
						for(x=0;x<bs_x;x++)
						EPV[1+x+bs_x]=EPV[bs_x];
					}


2.直接模式的MV存储;


image.c中的void store_field_MV(struct img_par *img)
              //refFrArr_top[j][i] = refFrArr_bot[j][i] = refFrArr_frm[2*j][i]*2;
              refFrArr_top[j][i] = refFrArr_frm[2*j][i]*2;
              refFrArr_bot[j][i] = refFrArr_frm[2*j][i]*2 + 1;


3. 帧内预测模式的初始值

  解码端:
(1)macroblock.c中init_macroblock()
 for (i=0;i<2;i++)
  {                           // reset vectors and pred. modes
    for(j=0;j<2;j++)
    {
    //  img->ipredmode[img->block_x+i+1][img->block_y+j+1] = DC_PRED;
		img->ipredmode[img->block_x+i+1][img->block_y+j+1] = -1;            //by oliver 0512
    }
  }

(2)ldecod.c中init_globel_buffers()
加上
// Prediction mode is set to -1 outside the frame, indicating that no prediction can be made from this part
	for (i=0; i < img->width/(B8_SIZE)+2; i++)
	{
		for (j=0; j < vertical_size/(B8_SIZE)+2; j++)
		{
				img->ipredmode[i][j]=-1;
		}
	}
//by oliver 0512

编码端:
(1)rdopt.c中set_stored_macroblock_parameters ()中1378行

//        ipredmodes    [i][j] = DC_PRED;
        currMB->intra_pred_modes[k] = DC_PRED;

		ipredmodes    [i][j] = -1;
(2)rdopt.c中2109行
		//		ipredmodes    [i][j] = DC_PRED;
				ipredmodes    [i][j] = -1;
(3)rdopt.c中2479行

//		ipredmodes    [i][j] = DC_PRED;
				ipredmodes    [i][j] = -1;
(4)macroblock.c 的1576行
/*
  int     mb_available_up   = (img_cy/BLOCK_SIZE == 0 || (img_cy/BLOCK_SIZE >0 && img->ipredmode[1+b8_x][1+b8_y-1]<0)) ? 0 : 1;
   int     mb_available_left = (img_cx/BLOCK_SIZE == 0 || (img_cx/BLOCK_SIZE >0 && img->ipredmode[1+b8_x - 1][1+b8_y]<0)) ? 0 : 1;
   int     mb_available_up_left = (img_cx/BLOCK_SIZE == 0 || img_cy/BLOCK_SIZE == 0 || (img_cy/BLOCK_SIZE >0 && img->ipredmode[1+b8_x][1+b8_y-1]<0) || 
 	                             (img_cx/BLOCK_SIZE >0 && img->ipredmode[1+b8_x - 1][1+b8_y]<0)) ? 0 : 1;
    int     mb_available_up_right= (img_cy > 0)&&(b8_x<(img->width_cr/BLOCK_SIZE-2))&&(img->ipredmode[1+b8_x+1][1+b8_y-1]>=0);
   int	  mb_available_left_down=(img_cx > 0)&&(b8_y<(img->height_cr/BLOCK_SIZE-2))&&(img->ipredmode[1+b8_x - 1][1+b8_y+1]>=0);
  //by oliver according to 1658*/
 /***********************************/
int	mb_available_up_right=((img_cy==0)||(b8_x>=(img->width_cr/BLOCK_SIZE-2))) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr-mb_width+1].slice_nr);
int  mb_available_left_down=((img_cx==0)||(b8_y>=(img->height_cr/BLOCK_SIZE-2))) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr+mb_width-1].slice_nr);
int mb_available_up   = (img_cy == 0) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr-mb_width].slice_nr);
int mb_available_left = (img_cx == 0) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr-1].slice_nr);
int mb_available_up_left = (img_cx/BLOCK_SIZE == 0 || img_cy/BLOCK_SIZE == 0 ) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr-mb_width-1].slice_nr);

  //changed by oliver 0512


以上注释的是原来的代码,紧跟变后面的是修改后的代码


4. 加权预测部分的修改

编码端:
   A.在帧模式编码下添加了加权预测的参数估计函数estimate_weighting_factor_field
   采用了自适应的加权算法,此算法不唯一,仅仅是编码端的问题。
   在场编码模式下也加入了此参数估计算法
   B. 支持编码色度加权预测
     ChromaPrediction4x4() 色度加权部分应该加上对应的条件
     ChromaResidualCoding()函数中应该赋值加权后的值
   C. Direct宏块进行加权
   D. I帧的底场应该进行加
   E. 修改了img->allframeweight变量的意义使得跟文档一致。
     修改为:img->allframeweight=0全帧宏块都加权;
            img->allframeweight=1宏块根据宏块内的mb_weighting_flag判断是否进行加权。
   F. 根据文档,如果使用加权预测,解码的加权预测参数按参考索引值由小到
大依次分配给各参考图像(或场)。如果当前图像是B帧,对参考索引值相同的前
后参考图像(或场),解码的加权预测参数先分配给前向参考图像(或场),再分
配给后向参考图像(或场)。在代码里面这里是有问题的。
	//cjw weighted prediction parameter map 20060112
  	///frame coding/////////
	P		img->lum_scale[0]  fw[0] 
			img->lum_scale[1]  fw[1]			
	B	    img->lum_scale[0]  fw[0]
			img->lum_scale[1]  bw[0]
	///field coding////////
	P		img->lum_scale[0]  fw[0] ; img->lum_scale[1]  fw[1] 
			img->lum_scale[2]  fw[2] ; img->lum_scale[3]  fw[3] 			
	B		img->lum_scale[0]  fw[0] ; img->lum_scale[1]  bw[0] 
			img->lum_scale[2]  fw[1] ; img->lum_scale[3]  bw[1] 
   	//For B framecoding		 
			fw	[fw_ref]
			bw	[bw_ref+1]
	//For B fieldcoding      
			fw	[fw_ref*2]
			bw	[bw_ref*2+1]	

解码端:
   A. 支持解码色度加权
	具体实现在Decode_one_macroblock()函数
   B. Direct宏块进行加权
   C. I帧的底场应该进行加权
   D. 修改了img->allframeweight变量的意义使得跟文档一致。
      修改为:img->allframeweight=0全帧宏块都加权;
             img->allframeweight=1宏块根据宏块内的mb_weighting_flag判断是否进行加权。 
   F. But in spec p50, 如果使用加权预测,解码的加权预测参数按参考索引值由小到
大依次分配给各参考图像(或场)。如果当前图像是B帧,对参考索引值相同的前
后参考图像(或场),解码的加权预测参数先分配给前向参考图像(或场),再分
配给后向参考图像(或场)。
	//cjw weighted prediction parameter map 20060112
  	///frame coding/////////
	P		img->lum_scale[0]  fw[0] 
			img->lum_scale[1]  fw[1]			
	B	        img->lum_scale[0]  fw[0]
			img->lum_scale[1]  bw[0]
	///field coding////////
	P		img->lum_scale[0]  fw[0] ; img->lum_scale[1]  fw[1] 
			img->lum_scale[2]  fw[2] ; img->lum_scale[3]  fw[3] 			
	B		img->lum_scale[0]  fw[0] ; img->lum_scale[1]  bw[0] 
			img->lum_scale[2]  fw[1] ; img->lum_scale[3]  bw[1] 
   	//For B framecoding		 
			fw	[fw_ref]
			bw	[bw_ref+1]
	//For B fieldcoding      
			fw	[fw_ref*2]
			bw	[bw_ref*2+1]
	refframe=(img->picture_structure)?(refframe):(2*refframe);  //cjw 20060112 fw 
	refframe=(img->picture_structure)?(refframe+1):(2*refframe+1);  //cjw 20060112 bw
  	fw_refframe=(img->picture_structure)?(fw_refframe):(2*fw_refframe);  //cjw 20060112 fw 
	bw_refframe=(img->picture_structure)?(bw_refframe+1):(2*bw_refframe+1);  //cjw 20060112 bw

文档中修改的相关内容:
   A. 对weighting_prediction进行了初值操作,如果没有这个标志位,则初值为0。即对skip宏块不进行加权。
   B. Direct宏块进行加权
   C. I帧的底场应该进行加权

在编码和解码端代码里面搜索cjw 就可以看到所有跟加权预测相关的修改。


5.关于帧内预测周围参考块可得性的修改

编码端:

函数intrapred_luma_AVS()中1225行

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 == img->mb_data[mb_nr+1].slice_nr):1;  /*oliver*/
   else
  mb_up_right_available =((img_x-img->pix_x)>0? (currMB->slice_nr == img->mb_data[mb_nr-MBRowSize+1].slice_nr):(currMB->slice_nr== img->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;

⌨️ 快捷键说明

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