📄 block.c
字号:
break;
case VERT_RIGHT_PRED:/* diagonal prediction -22.5 deg to horizontal plane */
img->mpr[0+ioff][0+joff] =
img->mpr[1+ioff][2+joff] = (P_X + P_A + 1) / 2;
img->mpr[1+ioff][0+joff] =
img->mpr[2+ioff][2+joff] = (P_A + P_B + 1) / 2;
img->mpr[2+ioff][0+joff] =
img->mpr[3+ioff][2+joff] = (P_B + P_C + 1) / 2;
img->mpr[3+ioff][0+joff] = (P_C + P_D + 1) / 2;
img->mpr[0+ioff][1+joff] =
img->mpr[1+ioff][3+joff] = (P_I + 2*P_X + P_A + 2) / 4;
img->mpr[1+ioff][1+joff] =
img->mpr[2+ioff][3+joff] = (P_X + 2*P_A + P_B + 2) / 4;
img->mpr[2+ioff][1+joff] =
img->mpr[3+ioff][3+joff] = (P_A + 2*P_B + P_C + 2) / 4;
img->mpr[3+ioff][1+joff] = (P_B + 2*P_C + P_D + 2) / 4;
img->mpr[0+ioff][2+joff] = (P_X + 2*P_I + P_J + 2) / 4;
img->mpr[0+ioff][3+joff] = (P_I + 2*P_J + P_K + 2) / 4;
break;
case VERT_LEFT_PRED:/* diagonal prediction -22.5 deg to horizontal plane */
img->mpr[0+ioff][0+joff] = (P_A + P_B + 1) / 2;
img->mpr[1+ioff][0+joff] =
img->mpr[0+ioff][2+joff] = (P_B + P_C + 1) / 2;
img->mpr[2+ioff][0+joff] =
img->mpr[1+ioff][2+joff] = (P_C + P_D + 1) / 2;
img->mpr[3+ioff][0+joff] =
img->mpr[2+ioff][2+joff] = (P_D + P_E + 1) / 2;
img->mpr[3+ioff][2+joff] = (P_E + P_F + 1) / 2;
img->mpr[0+ioff][1+joff] = (P_A + 2*P_B + P_C + 2) / 4;
img->mpr[1+ioff][1+joff] =
img->mpr[0+ioff][3+joff] = (P_B + 2*P_C + P_D + 2) / 4;
img->mpr[2+ioff][1+joff] =
img->mpr[1+ioff][3+joff] = (P_C + 2*P_D + P_E + 2) / 4;
img->mpr[3+ioff][1+joff] =
img->mpr[2+ioff][3+joff] = (P_D + 2*P_E + P_F + 2) / 4;
img->mpr[3+ioff][3+joff] = (P_E + 2*P_F + P_G + 2) / 4;
break;
case HOR_UP_PRED:/* diagonal prediction -22.5 deg to horizontal plane */
img->mpr[0+ioff][0+joff] = (P_I + P_J + 1) / 2;
img->mpr[1+ioff][0+joff] = (P_I + 2*P_J + P_K + 2) / 4;
img->mpr[2+ioff][0+joff] =
img->mpr[0+ioff][1+joff] = (P_J + P_K + 1) / 2;
img->mpr[3+ioff][0+joff] =
img->mpr[1+ioff][1+joff] = (P_J + 2*P_K + P_L + 2) / 4;
img->mpr[2+ioff][1+joff] =
img->mpr[0+ioff][2+joff] = (P_K + P_L + 1) / 2;
img->mpr[3+ioff][1+joff] =
img->mpr[1+ioff][2+joff] = (P_K + 2*P_L + P_L + 2) / 4;
img->mpr[3+ioff][2+joff] =
img->mpr[1+ioff][3+joff] =
img->mpr[0+ioff][3+joff] =
img->mpr[2+ioff][2+joff] =
img->mpr[2+ioff][3+joff] =
img->mpr[3+ioff][3+joff] = P_L;
break;
case HOR_DOWN_PRED:/* diagonal prediction -22.5 deg to horizontal plane */
img->mpr[0+ioff][0+joff] =
img->mpr[2+ioff][1+joff] = (P_X + P_I + 1) / 2;
img->mpr[1+ioff][0+joff] =
img->mpr[3+ioff][1+joff] = (P_I + 2*P_X + P_A + 2) / 4;
img->mpr[2+ioff][0+joff] = (P_X + 2*P_A + P_B + 2) / 4;
img->mpr[3+ioff][0+joff] = (P_A + 2*P_B + P_C + 2) / 4;
img->mpr[0+ioff][1+joff] =
img->mpr[2+ioff][2+joff] = (P_I + P_J + 1) / 2;
img->mpr[1+ioff][1+joff] =
img->mpr[3+ioff][2+joff] = (P_X + 2*P_I + P_J + 2) / 4;
img->mpr[0+ioff][2+joff] =
img->mpr[2+ioff][3+joff] = (P_J + P_K + 1) / 2;
img->mpr[1+ioff][2+joff] =
img->mpr[3+ioff][3+joff] = (P_I + 2*P_J + P_K + 2) / 4;
img->mpr[0+ioff][3+joff] = (P_K + P_L + 1) / 2;
img->mpr[1+ioff][3+joff] = (P_J + 2*P_K + P_L + 2) / 4;
break;
default:
printf("Error: illegal prediction mode input: %d\n",predmode);
return SEARCH_SYNC;
break;
}
return DECODING_OK;
}
/*!
***********************************************************************
* \return
* best SAD
***********************************************************************
*/
int intrapred_luma_16x16(struct img_par *img, //!< image parameters
int predmode) //!< prediction mode
{
int s0=0,s1,s2;
int i,j;
int ih,iv;
int ib,ic,iaa;
int mb_width = img->width/16;
//int mb_nr_frame = img->mb_y*mb_width+img->mb_x;
int mb_nr = img->map_mb_nr;// GB img->current_mb_nr;
int mb_available_up = (img->mb_y == 0) ? 0 : (img->mb_data[mb_nr].slice_nr == img->mb_data[mb_nr-mb_width].slice_nr);
int mb_available_left = (img->mb_x == 0) ? 0 : (img->mb_data[mb_nr].slice_nr == img->mb_data[mb_nr-1].slice_nr);
int field_y = img->pix_y; // For MB level frame/field coding
if (img->mb_field)
{
field_y /= 2;
mb_available_up = (img->mb_y/2 == 0) ? 0 : 1;
if (img->current_mb_nr%2) // bottom field
{
field_y -= BLOCK_SIZE*2;
mb_available_up = ((img->mb_y-1)/2 == 0) ? 0 : 1;
}
}
if(img->constrained_intra_pred_flag)
{
if (mb_available_up && (img->intra_block[mb_nr-mb_width][2]==0 || img->intra_block[mb_nr-mb_width][3]==0))
mb_available_up = 0;
if (mb_available_left && (img->intra_block[mb_nr- 1][1]==0 || img->intra_block[mb_nr -1][3]==0))
mb_available_left = 0;
}
s1=s2=0;
switch (predmode)
{
case VERT_PRED_16: // vertical prediction from block above
for(j=0;j<MB_BLOCK_SIZE;j++)
for(i=0;i<MB_BLOCK_SIZE;i++)
img->mpr[i][j]=imgY[field_y-1][img->pix_x+i];// store predicted 16x16 block
break;
case HOR_PRED_16: // horisontal prediction from left block
for(j=0;j<MB_BLOCK_SIZE;j++)
for(i=0;i<MB_BLOCK_SIZE;i++)
img->mpr[i][j]=imgY[field_y+j][img->pix_x-1]; // store predicted 16x16 block
break;
case DC_PRED_16: // DC prediction
s1=s2=0;
for (i=0; i < MB_BLOCK_SIZE; i++)
{
if (mb_available_up)
s1 += imgY[field_y-1][img->pix_x+i]; // sum hor pix
if (mb_available_left)
s2 += imgY[field_y+i][img->pix_x-1]; // sum vert pix
}
if (mb_available_up && mb_available_left)
s0=(s1+s2+16)/(2*MB_BLOCK_SIZE); // no edge
if (!mb_available_up && mb_available_left)
s0=(s2+8)/MB_BLOCK_SIZE; // upper edge
if (mb_available_up && !mb_available_left)
s0=(s1+8)/MB_BLOCK_SIZE; // left edge
if (!mb_available_up && !mb_available_left)
s0=128; // top left corner, nothing to predict from
for(i=0;i<MB_BLOCK_SIZE;i++)
for(j=0;j<MB_BLOCK_SIZE;j++)
{
img->mpr[i][j]=s0;
}
break;
case PLANE_16:// 16 bit integer plan pred
ih=0;
iv=0;
for (i=1;i<9;i++)
{
ih += i*(imgY[field_y-1][img->pix_x+7+i] - imgY[field_y-1][img->pix_x+7-i]);
iv += i*(imgY[field_y+7+i][img->pix_x-1] - imgY[field_y+7-i][img->pix_x-1]);
}
ib=(5*ih+32)>>6;
ic=(5*iv+32)>>6;
iaa=16*(imgY[field_y-1][img->pix_x+15]+imgY[field_y+15][img->pix_x-1]);
for (j=0;j< MB_BLOCK_SIZE;j++)
{
for (i=0;i< MB_BLOCK_SIZE;i++)
{
img->mpr[i][j]=max(0,min((iaa+(i-7)*ib +(j-7)*ic + 16)/32,255));
}
}// store plane prediction
break;
default:
{ // indication of fault in bitstream,exit
printf("Error: illegal prediction mode input: %d\n",predmode);
return SEARCH_SYNC;
}
}
return DECODING_OK;
}
/*!
***********************************************************************
* \brief
* Inverse 4x4 transformation, transforms cof to m7
***********************************************************************
*/
void itrans(struct img_par *img, //!< image parameters
int ioff, //!< index to 4x4 block
int joff, //!<
int i0, //!<
int j0) //!<
{
int i,j,i1,j1;
int m5[4];
int m6[4];
// horizontal
for (j=0;j<BLOCK_SIZE;j++)
{
for (i=0;i<BLOCK_SIZE;i++)
{
m5[i]=img->cof[i0][j0][i][j];
}
m6[0]=(m5[0]+m5[2]);
m6[1]=(m5[0]-m5[2]);
m6[2]=(m5[1]>>1)-m5[3];
m6[3]=m5[1]+(m5[3]>>1);
for (i=0;i<2;i++)
{
i1=3-i;
img->m7[i][j]=m6[i]+m6[i1];
img->m7[i1][j]=m6[i]-m6[i1];
}
}
// vertical
for (i=0;i<BLOCK_SIZE;i++)
{
for (j=0;j<BLOCK_SIZE;j++)
m5[j]=img->m7[i][j];
m6[0]=(m5[0]+m5[2]);
m6[1]=(m5[0]-m5[2]);
m6[2]=(m5[1]>>1)-m5[3];
m6[3]=m5[1]+(m5[3]>>1);
for (j=0;j<2;j++)
{
j1=3-j;
img->m7[i][j] =mmax(0,mmin(255,(m6[j]+m6[j1]+(img->mpr[i+ioff][j+joff] <<DQ_BITS)+DQ_ROUND)>>DQ_BITS));
img->m7[i][j1]=mmax(0,mmin(255,(m6[j]-m6[j1]+(img->mpr[i+ioff][j1+joff]<<DQ_BITS)+DQ_ROUND)>>DQ_BITS));
}
}
}
/*!
***********************************************************************
* \brief
* invers transform
***********************************************************************
*/
void itrans_2(
struct img_par *img) //!< image parameters
{
int i,j,i1,j1;
int M5[4];
int M6[4];
int qp_per = (img->qp-MIN_QP)/6;
int qp_rem = (img->qp-MIN_QP)%6;
// horizontal
for (j=0;j<4;j++)
{
for (i=0;i<4;i++)
M5[i]=img->cof[i][j][0][0];
M6[0]=M5[0]+M5[2];
M6[1]=M5[0]-M5[2];
M6[2]=M5[1]-M5[3];
M6[3]=M5[1]+M5[3];
for (i=0;i<2;i++)
{
i1=3-i;
img->cof[i ][j][0][0]= M6[i]+M6[i1];
img->cof[i1][j][0][0]=M6[i]-M6[i1];
}
}
// vertical
for (i=0;i<4;i++)
{
for (j=0;j<4;j++)
M5[j]=img->cof[i][j][0][0];
M6[0]=M5[0]+M5[2];
M6[1]=M5[0]-M5[2];
M6[2]=M5[1]-M5[3];
M6[3]=M5[1]+M5[3];
for (j=0;j<2;j++)
{
j1=3-j;
img->cof[i][j][0][0] = (((M6[j]+M6[j1])*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
img->cof[i][j1][0][0]= (((M6[j]-M6[j1])*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
}
}
}
void itrans_sp(struct img_par *img, //!< image parameters
int ioff, //!< index to 4x4 block
int joff, //!<
int i0, //!<
int j0) //!<
{
int i,j,i1,j1;
int m5[4];
int m6[4];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -