📄 macroblock.c
字号:
}
DistanceIndexFw0 = 2*img->imgtr_last_P_frm+1;
if (DistanceIndexRef == DistanceIndexFw0)
{
fw_ref_frame = 0;//fw reference
}
else
{
fw_ref_frame = 1;
}
//DistanceIndexBw
bw_ref_frame = 0;//bw reference
}
if(scale_frame < 0)
{
fw_ref_frame = 0;
bw_ref_frame = 1;
}
}
}
#endif
fw_ref_idx = fw_ref_frame;
bw_ref_idx = bw_ref_frame;
//===== INTER PREDICTION =====
if (fw_mode || (direct && (fw_ref_frame!=-1)) || skipped)
{
if(!img->picture_structure)
OneComponentChromaPrediction4x4 (fw_pred, pic_pix_x, pic_pix_y, fmv_array , fw_ref_frame, fw_mode, uv, (directforward ?1 :0));
else
OneComponentChromaPrediction4x4 (fw_pred, pic_pix_x, pic_pix_y, fmv_array , (directforward ?0 :fw_ref_frame), fw_mode, uv, (directforward ?1 :0));
}
if (bw_mode || (direct && (bw_ref_frame!=-1)) ||(direct && !img->picture_structure && (bw_ref_frame ==-1)))
{
//OneComponentChromaPrediction4x4 (bw_pred, pic_pix_x, pic_pix_y, bmv_array, -1, bw_mode, uv, 0 );
if(fw_mode && bw_mode)
OneComponentChromaPrediction4x4_dir (bw_pred, pic_pix_x, pic_pix_y, fmv_array,
(!img->picture_structure) ? -2+bw_ref_frame : -1, bw_mode, uv,fw_ref_frame);
else
OneComponentChromaPrediction4x4 (bw_pred, pic_pix_x, pic_pix_y, bmv_array,
(!img->picture_structure) ? -2+bw_ref_frame : -1, bw_mode, uv,0);
}
if (direct || (fw_mode && bw_mode))
{
if(!img->picture_structure)
bw_ref_frame=1-bw_ref_frame; //cjw used for bw reference buffer address changing 20060112 bw
fw_ref_num=(img->picture_structure)?(fw_ref_frame):(2*fw_ref_frame); //cjw 20060112 fw
bw_ref_num=(img->picture_structure)?(bw_ref_frame+1):(2*bw_ref_frame+1); //cjw 20060112 bw
fw_scale = img->chroma_scale[fw_ref_num];
fw_shift = img->chroma_shift[fw_ref_num];
bw_scale = img->chroma_scale[bw_ref_num];
bw_shift = img->chroma_shift[bw_ref_num];
for (j=block_y; j<block_y4; j++)
for (i=block_x; i<block_x4; i++){
img->mpr[i][j] = (*fpred + *bpred + 1) / 2;
if(img->LumVarFlag == 1) //cjw 20051219 Weighted Predition
img->mpr_weight[i][j] = (Clip1((((*fpred)*fw_scale+16)>>5) + fw_shift)
+ Clip1((((*bpred)*bw_scale+16)>>5) + bw_shift) + 1) / 2;
fpred++ ;
bpred++ ;
}
}
else if (fw_mode || skipped) //P fw and B one direction fw
{
if(img->type==B_IMG){
fw_ref_num=(img->picture_structure)?(fw_ref_frame):(2*fw_ref_frame); //cjw 20060112 B fw
fw_scale = img->chroma_scale[fw_ref_num];
fw_shift = img->chroma_shift[fw_ref_num];
}
else{ //P fw
fw_scale = img->chroma_scale[fw_ref_frame];
fw_shift = img->chroma_shift[fw_ref_frame];
}
for (j=block_y; j<block_y4; j++)
for (i=block_x; i<block_x4; i++){
img->mpr[i][j] = *fpred;
if((!skipped) &&(img->LumVarFlag == 1)) //cjw 20051219 Weighted Predition
img->mpr_weight[i][j] = Clip1(((((*fpred)*fw_scale+16)>>5) + fw_shift));
fpred++;
}
}
else //B bw
{
if(!img->picture_structure)
bw_ref_frame=1-bw_ref_frame;
bw_ref_num=(img->picture_structure)?(bw_ref_frame+1):(2*bw_ref_frame+1); //cjw 20060112 bw
bw_scale = img->chroma_scale[bw_ref_num];
bw_shift = img->chroma_shift[bw_ref_num];
for (j=block_y; j<block_y4; j++)
for (i=block_x; i<block_x4; i++){
img->mpr[i][j] = *bpred;
if(img->LumVarFlag == 1) //cjw 20051219 Weighted Predition
img->mpr_weight[i][j] = Clip1(((((*bpred)*bw_scale+16)>>5) + bw_shift));
bpred++;
}
}
}
/*
*************************************************************************
* Function:Chroma residual coding for an macroblock
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void ChromaResidualCoding (int* cr_cbp)
{
int uv, block8, block_y, block_x, j, i;
int fw_mode, bw_mode, refframe;
int skipped = (img->mb_data[img->current_mb_nr].mb_type == 0 && img->type == INTER_IMG);
int incr = 1, offset = 0; // For MB level field/frame coding
int incr_x = 1, offset_x = 0;
int bw_ref;
short tmp_block_88[8][8];
int tmp_cbp_blk;
int tmp_block[2][8][8];/*lgp*/
int tmp_mpr[2][8][8];/*lgp*/
int incr_y=1,off_y=0;/*lgp*/
int cbpc=0;/*lgp*/
int stage_block8x8_pos=0;/*lgp*/
//cjw 20051219
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int IntraPrediction=IS_INTRA (currMB);
int direct;
for (*cr_cbp=0, uv=0; uv<2; uv++)
{
//===== prediction of chrominance blocks ===d==
block8 = 0;
for (block_y=/*0*/4*(stage_block8x8_pos/2)/*lgp*/; block_y<8; block_y+=4)
for (block_x=0; block_x<8; block_x+=4, block8++)
{
block8 = (block_y/4)*2 + block_x/4;/*lgp*/
SetModesAndRefframe (block8, &fw_mode, &bw_mode, &refframe, &bw_ref);
ChromaPrediction4x4 (uv, block_x, block_y, fw_mode, bw_mode, refframe, bw_ref);
direct = (fw_mode == 0 && bw_mode == 0 && (img->type==B_IMG));
// !! start shenyanfei
//if(((!IntraPrediction)&&/*cjw*/(!direct)&&(!skipped)&&(img->LumVarFlag == 1) && (img->mb_weighting_flag == 1)&&(img->weighting_prediction == 1))
//if(((!IntraPrediction)&&(!skipped)&&(!direct)&&(img->LumVarFlag == 1) && (img->mb_weighting_flag == 1)&&(img->weighting_prediction == 1)) //cjw 20051230
if(((!IntraPrediction)&& (!skipped) && (img->LumVarFlag == 1) && (img->mb_weighting_flag == 1)&&(img->weighting_prediction == 1)) //cjw 20060321
||((img->LumVarFlag == 1) && (img->mb_weighting_flag == 0))){
for (j=0; j<4; j++)
for (i=0; i<4; i++)
//cjw 20051219 Weighted Predition
//img->mpr[i+block_x][j+block_y] = img->mpr[i+block_x][j+block_y];
img->mpr[i+block_x][j+block_y] = img->mpr_weight[i+block_x][j+block_y];
}
// !! end shenyanfei
if (skipped||img->NoResidueDirect)
{
for (j=0; j<4; j++)
for (i=block_x; i<block_x+4; i++)
{
imgUV[uv][img->pix_c_y+block_y+incr_y*j+off_y][img->pix_c_x+i] = img->mpr[i][block_y+j];
}
}
else
for (j=0; j<4; j++)
for (i=block_x; i<block_x+4; i++)
{
tmp_mpr[uv][i][block_y+j] = img->mpr[i][block_y+j];
tmp_block[uv][block_y+j][i] = imgUV_org[uv][img->pix_c_y+block_y+incr_y*j+off_y][img->pix_c_x+i] - img->mpr[i][block_y+j];
img->m7[i][block_y+j] = imgUV_org[uv][img->pix_c_y+block_y+incr_y*j+off_y][img->pix_c_x+i] - img->mpr[i][block_y+j];
}
}
//===== DCT, Quantization, inverse Quantization, IDCT, and Reconstruction =====
//===== Call function for skip mode in SP frames to properly process frame ====
if ( !skipped&&!img->NoResidueDirect)
{
for (j=0;j<8; j++)
for (i=0;i<8; i++)
{
tmp_block_88[j][i] = img->m7[i][j];
}
transform_B8(tmp_block_88);
//Lou 1013 scanquant_B8 (QP_SCALE_CR[ img->qp+QP_OFS-MIN_QP],4,4+uv,tmp_block_88,0,cr_cbp,&tmp_cbp_blk);
scanquant_B8 (QP_SCALE_CR[ img->qp-MIN_QP], 4, 4+uv, tmp_block_88,0,cr_cbp,&tmp_cbp_blk);
}
}
//===== update currMB->cbp =====
img->mb_data[img->current_mb_nr].cbp +=(*cr_cbp);//((*cr_cbp)<<4); /*lgp*dct*/
}
/*
*************************************************************************
* Function:Predict an intra chroma 8x8 block
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void IntraChromaPrediction8x8 (int *mb_up, int *mb_left, int*mb_up_left)
{
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
unsigned char edgepixu[40]= {0};
#define EPU (edgepixu+20)
unsigned char edgepixv[40]= {0};
#define EPV (edgepixv+20)
int last_pix,new_pix;
int bs_x=8;
int bs_y=8;
int x, y;
int i, j, k;
pel_t** image;
int block_x, block_y, b4;
int img_cx = img->pix_c_x;
int img_cy = img->pix_c_y;
int img_cx_1 = img->pix_c_x-1;
int img_cx_4 = img->pix_c_x+4;
int img_cy_1 = img->pix_c_y-1;
int img_cy_4 = img->pix_c_y+4;
int b8_x = img->pix_c_x/4;
int b8_y = img->pix_c_y/4;
int mb_nr = img->current_mb_nr;
int mb_width = img->width/16;
/*
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
int ih,iv;
int ib,ic,iaa;
int uv;
int hline[8], vline[8];
int mode;
int best_mode = DC_PRED_8; //just an initilaization here, should always be overwritten
int cost;
int min_cost;
int diff[16];
int incr_y=1,off_y=0;/*lgp*/
int stage_block8x8_pos=0;/*lgp*/
if(input->slice_set_enable) //added by mz, 2008.04
{
mb_available_up_right = ((img_cy==0)||(b8_x>=(img->width_cr/BLOCK_SIZE-2))) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr-mb_width+1].slice_set_index );
mb_available_left_down = ((img_cx==0)||(b8_y>=(img->height_cr/BLOCK_SIZE-2))) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr+mb_width-1].slice_set_index );
mb_available_up = (img_cy == 0) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr-mb_width].slice_set_index );
mb_available_left = (img_cx == 0) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr-1].slice_set_index );
mb_available_up_left = (img_cx/BLOCK_SIZE == 0 || img_cy/BLOCK_SIZE == 0 ) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr-mb_width-1].slice_set_index );
}
if (mb_up)
*mb_up = mb_available_up;
if (mb_left)
*mb_left = mb_available_left;
if( mb_up_left )
*mb_up_left = mb_available_up_left;
// compute all chroma intra prediction modes for both U and V
uv=0;
if(mb_available_up)
{
for(x=0;x<bs_x;x++)
EPU[x+1]=imgUV[uv][img_cy-1][img_cx+x];
/*
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_y;x++)
EPU[1+x+bs_x]=imgUV[uv][img_cy-1][img_cx+bs_x+x];
}
else{
for(x=0;x<bs_y;x++)
EPU[1+x+bs_x]=EPU[bs_x]; //bs_x=8; EPU[9~16]=r[8]
}
//by oliver according to 1658
EPU[0]=imgUV[uv][img_cy-1][img_cx];
}
if(mb_available_left)
{
for(y=0;y<bs_y;y++)
EPU[-1-y]=imgUV[uv][img_cy+y][img_cx-1];
for(y=0;y<bs_x;y++)
EPU[-1-y-bs_y]=EPU[-bs_y];
EPU[0]=imgUV[uv][img_cy][img_cx-1];
}
if(!input->slice_set_enable) //added by mz, 2008.04
{
if(mb_available_up&&mb_available_left)
EPU[0]=imgUV[uv][img_cy-1][img_cx-1];
}
else
{
if(mb_available_up_left)
EPU[0]=imgUV[uv][img_cy-1][img_cx-1];
else if(mb_available_up)
EPU[0]=imgUV[uv][img_cy-1][img_cx];
else if(mb_available_left)
EPU[0]=imgUV[uv][img_cy][img_cx-1];
}
//lowpass (Those emlements that are not needed will not disturb)
last_pix=EPU[-8];
for(i=-8;i<=8;i++)
{
new_pix=( last_pix + (EPU[i]<<1) + EPU[i+1] + 2 )>>2;
last_pix=EPU[i];
EPU[i]=(unsigned char)new_pix;
}
uv=1;
if(mb_available_up)
{
for(x=0;x<bs_x;x++)
EPV[x+1]=imgUV[uv][img_cy-1][img_cx+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_y;x++)
EPV[1+x+bs_x]=imgUV[uv][img_cy-1][img_cx+bs_x+x];
}
else{
for(x=0;x<bs_y;x++)
EPV[1+x+bs_x]=EPV[bs_x]; //bs_x=8; EPV[9~16]=r[8]
}
//by oliver according to 1658
EPV[0]=imgUV[uv][img_cy-1][img_cx];
}
if(mb_available_left)
{
for(y=0;y<bs_y;y++)
EPV[-1-y]=imgUV[uv][img_cy+y][img_cx-1];
for(y=0;y<bs_x;y++)
EPV[-1-y-bs_y]=EPV[-bs_y];
EPV[0]=imgUV[uv][img_cy][img_cx-1];
}
if(!input->slice_set_enable) //added by mz, 2008.04
{
if(mb_available_up&&mb_available_left)
EPV[0]=imgUV[uv][img_cy-1][img_cx-1];
}
else
{
if(mb_available_up_left)
EPV[0]=imgUV[uv][img_cy-1][img_cx-1];
else if(mb_available_up)
EPV[0]=imgUV[uv][img_cy-1][img_cx];
else if(mb_available_left)
EPV[0]=imgUV[uv][img_cy][img_cx-1];
}
//lowpass (Those emlements that are not needed will not disturb)
last_pix=EPV[-8];
for(i=-8;i<=8;i++)
{
new_pix=( last_pix + (EPV[i]<<1) + EPV[i+1] + 2 )>>2;
la
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -