📄 readmerm52f.txt
字号:
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 + -