📄 spatial_domain_coding.c
字号:
Macroblock* currMB = &img->mb_data[img->current_mb_nr];
int l,k,m,n,i,j;
int b8_y = (block8x8 >>1);
int b8_x = (block8x8 % 2);
int mb_y = b8_y << 3;
int mb_x = b8_x << 3;
int SSD_rd_all = 0;
int rate_rd_all= 0;
double rd_lowest = 0.0;
double rd_cost = 0.0;
int SSD_all_zero;
int p,c;
int SD_or_FD_best=0;
int ox,oy;
int tmp_x,tmp_y;
int tmp_ox,tmp_oy;
int cbp_blk_mask;
int coded[2][2];
int SSD_all [2][2][2];
int ctr [2][2];
int rd [4];
int rd_opt [4];
int blocks_non_coded;
int blocks_non_coded_best=0;
currMB->SD_or_FD[b8_y][b8_x]=0;
for (k=0;k<2;k++)
{
for (l=0;l<2;l++)
{
tmp_x = mb_x + (k << 2);
tmp_y = mb_y + (l << 2);
cbp_blk_mask = ((mb_x+(k<<2))>>2) + (mb_y+(l<<2));
coded[l][k] = ((*cbp_blk & ((int64)1 << cbp_blk_mask))==0 ? 0:1);
//calculate SSD for frequency domain coding for 4x4-Block l,k
SSD_all[l][k][0]=0;
tmp_x = img->pix_x+mb_x+(k<<2);
tmp_y = img->pix_y+mb_y+(l<<2);
tmp_ox = img->opix_x+mb_x+(k<<2);
tmp_oy = img->opix_y+mb_y+(l<<2);
for (n=0;n<4;n++)
for (m=0;m<4;m++)
#ifdef INTERNAL_BIT_DEPTH_INCREASE
SSD_all[l][k][0]+=SQR_DEPTH(imgY_org[tmp_oy+n][tmp_ox+m], enc_picture->imgY[tmp_y+n][tmp_x+m], input->BitDepthLuma, img->BitDepthIncrease);
#else
SSD_all[l][k][0]+=img->quad[imgY_org[tmp_oy+n][tmp_ox+m]-enc_picture->imgY[tmp_y+n][tmp_x+m]];
#endif
//calculate SSD for spatial domain coding for 4x4-Block l,k
tmp_x = mb_x+(k<<2);
tmp_y = mb_y+(l<<2);
ctr[l][k]=0;
SSD_all[l][k][1]=0;
for (n=0;n<4;n++)
{
for (m=0;m<4;m++)
{
currMB->quantizer_indices [tmp_y+n][tmp_x+m]=quantizer_index(currMB->prederror [tmp_y+n][tmp_x+m], (adaptive_f_spatial_domain_4x4[img->type==B_SLICE]+img->adjust_adaptive_f_spatial_domain_4x4));
currMB->quantized_prederror[tmp_y+n][tmp_x+m]=de_quantizer (currMB->quantizer_indices[tmp_y+n][tmp_x+m]);
if (img->AdaptiveRounding)
{
if (currMB->quantizer_indices[tmp_y+n][tmp_x+m]!=0)
#ifdef INTERNAL_BIT_DEPTH_INCREASE
img->adjust_adaptive_f_spatial_domain_4x4 += (float) (ROUNDING_WEIGHT_SD * (abs(currMB->prederror[tmp_y+n][tmp_x+m])- abs(currMB->quantized_prederror[tmp_y+n][tmp_x+m]))/(SD_RD_quant_s_for_all_qps_rec_int[Clip3(0,51,currMB->qp+img->bitdepth_luma_qp_scale)]/256.0));
#else
img->adjust_adaptive_f_spatial_domain_4x4 += (float) (ROUNDING_WEIGHT_SD * (abs(currMB->prederror[tmp_y+n][tmp_x+m])- abs(currMB->quantized_prederror[tmp_y+n][tmp_x+m]))/(SD_RD_quant_s_for_all_qps_rec_int[currMB->qp]/256.0));
#endif
}
SSD_all[l][k][1]+=img->quad[currMB->prederror[tmp_y+n][tmp_x+m]-currMB->quantized_prederror[tmp_y+n][tmp_x+m]];
if (currMB->quantizer_indices [tmp_y+n][tmp_x+m]!=0)
ctr[l][k]++;
}
}
#ifdef INTERNAL_BIT_DEPTH_INCREASE
if (img->BitDepthIncrease)
{
SSD_all[l][k][1] = (SSD_all[l][k][1]+((1<<(img->BitDepthIncrease*2-1))))>>(img->BitDepthIncrease*2);
}
#endif
if (input->SD_Quantizer==1)
{
eliminate_expensive_samples(tmp_x, tmp_y,&(SSD_all[l][k][1]),&(ctr[l][k]));
}
}//k, 4x4 in x
}//l, 4x4 in y
store_coding_state (cs_spatial_domain_coding);
c=0;
for (rd[0]=0;rd[0]<2;rd[0]++)
{
for (rd[1]=0;rd[1]<2;rd[1]++)
{
for (rd[2]=0;rd[2]<2;rd[2]++)
{
for (rd[3]=0;rd[3]<2;rd[3]++)
{
SSD_rd_all = SSD_all[0][0][rd[0]]
+ SSD_all[0][1][rd[1]]
+ SSD_all[1][0][rd[2]]
+ SSD_all[1][1][rd[3]];
p = rd[0] + (rd[1]<<1)+ (rd[2]<<2)+ (rd[3]<<3);
blocks_non_coded=0;
if (rd[0]==1 && ctr [0][0]==0) blocks_non_coded++;
else if (rd[0]==0 && coded[0][0]==0) blocks_non_coded++;
if (rd[1]==1 && ctr [0][1]==0) blocks_non_coded++;
else if (rd[1]==0 && coded[0][1]==0) blocks_non_coded++;
if (rd[2]==1 && ctr [1][0]==0) blocks_non_coded++;
else if (rd[2]==0 && coded[1][0]==0) blocks_non_coded++;
if (rd[3]==1 && ctr [1][1]==0) blocks_non_coded++;
else if (rd[3]==0 && coded[1][1]==0) blocks_non_coded++;
currMB->SD_or_FD[b8_y][b8_x]=p;
if (blocks_non_coded==4)
{
rate_rd_all=0;
}
else if (((float)SSD_rd_all<rd_lowest) || c==0)
{
rate_rd_all=writeLumaCoeff8x8 (block8x8, P8x8, 0);
}
if (c!=15)
reset_coding_state_spatial_domain (cs_spatial_domain_coding);
else
reset_coding_state (cs_spatial_domain_coding);
rd_cost=rd_cost(SSD_rd_all,rate_rd_all);
if (c==0 || (rd_cost < rd_lowest) )
{
rd_lowest=rd_cost;
memcpy(rd_opt,rd, 4 * sizeof(int));
SD_or_FD_best=p;
blocks_non_coded_best=blocks_non_coded;
}
c++;
}
}
}
}
SSD_all_zero =0;
for (k=0;k<8;k++)
{
for (l=0;l<8;l++)
{
SSD_all_zero+=img->quad[currMB->prederror[mb_y+l][mb_x+k]];
}
}
#ifdef INTERNAL_BIT_DEPTH_INCREASE
if (img->BitDepthIncrease)
{
SSD_all_zero = (SSD_all_zero+((1<<(img->BitDepthIncrease*2-1))))>>(img->BitDepthIncrease*2);
}
#endif
if ((float)SSD_all_zero<rd_lowest)
{
SD_or_FD_best=15;
blocks_non_coded_best=4;
memset(ctr,0,4*sizeof(int));
for (i=0;i<4;i++)
rd_opt[i]=1;
for (l=0;l<8;l++)
{
memset(&currMB->quantizer_indices [mb_y+l][mb_x],0,8*sizeof(int));
memset(&currMB->quantized_prederror[mb_y+l][mb_x],0,8*sizeof(int));
}
}
currMB->SD_or_FD[b8_y][b8_x]=SD_or_FD_best;
if (blocks_non_coded_best==4)
{
*coeff_cost = 0;
}
else if ((blocks_non_coded_best<4) && (((*cbp)&(1<<block8x8))==0))
{
*coeff_cost=_LUMA_COEFF_COST_+1;
(*cbp)|=(1<<block8x8);
for (m=0;m<4;m++)
{
i =(m % 2);
j =(m >>1);
if (rd_opt[m]!=0 && ctr[j][i]!=0 && coded[j][i]==0)
{
cbp_blk_mask = 1<<(((mb_x+(i<<2))>>2) + (mb_y+(j<<2)));
*cbp_blk = (*cbp_blk)|cbp_blk_mask;
}
}
}
else
{
for (m=0;m<4;m++)
{
i =(m % 2);
j =(m >>1);
if (rd_opt[m]!=0 && ctr[j][i]==0 && coded[j][i]!=0)
{
cbp_blk_mask = 1<<(((mb_x+(i<<2))>>2) + (mb_y+(j<<2)));
cbp_blk_mask = ~cbp_blk_mask;
*cbp_blk = (*cbp_blk)&cbp_blk_mask;
}
else if (rd_opt[m]!=0 && ctr[j][i]!=0 && coded[j][i]==0)
{
cbp_blk_mask = 1<<(((mb_x+(i<<2))>>2) + (mb_y+(j<<2)));
*cbp_blk = (*cbp_blk)|cbp_blk_mask;
}
}
}
if (blocks_non_coded_best!=4)
{
for (m=0;m<4;m++)
{
i =(m % 2);
j =(m >>1);
if (rd_opt[m]!=0)
{
memset(img->cofAC[block8x8][m][0],0,65 * sizeof(int));
memset(img->cofAC[block8x8][m][1],0,65 * sizeof(int));
ox=(img->mb_x<<4)+mb_x+(i<<2);
oy=(img->mb_y<<4)+mb_y+(j<<2);
for (k=0;k<4;k++)
{
for (l=0;l<4;l++)
{
#ifdef INTERNAL_BIT_DEPTH_INCREASE
enc_picture->imgY[oy + l][ox + k] = min(((1<<img->bitdepth_luma)-1),max(0,currMB->quantized_prederror[mb_y + (j<<2) + l][mb_x + (i<<2) + k] + currMB->prediction[mb_y + (j<<2) + l][mb_x + (i<<2) + k]));
#else
enc_picture->imgY[oy + l][ox + k] = min(255,max(0,currMB->quantized_prederror[mb_y + (j<<2) + l][mb_x + (i<<2) + k] + currMB->prediction[mb_y + (j<<2) + l][mb_x + (i<<2) + k]));
#endif
}
}
}
}
}
}
void eliminate_expensive_samples_8x8(int bx, int by, int *SSD_best, int *ctr)
{
Macroblock* currMB = &img->mb_data[img->current_mb_nr];
int n,m;
float f_test;
int SSD=0;
double costs;
double costs_min=(float)MAX_VALUE;
int rate;
int store_SD_or_FD=currMB->SD_or_FD_t8x8;
int block8x8=by/8*2+bx/8;
float f_best=0.0;
int p;
currMB->SD_or_FD_t8x8=7;
store_coding_state (cs_spatial_domain_coding_rd_opt);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -