📄 macroblock.cpp
字号:
#include <math.h>
#include <stdlib.h>
#include <memory.h>
#include "global.h"
#include "macroblock.h"
#define SMALLBLOCK
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
int writeCoeff4x4_CAVLC (int block_type, int i, int j, int param, struct img_par *img);
int MBType2Value(int type,int i16offset);/*yummy*/
extern int skip_mv[2];
extern int MbCr[64];
extern char intra_mb_pos[72][92];
extern char intra_mb_pos1[72][92];
void WriteMb_CAVLC(struct img_par *img,int *intra_pred_modes,int cbp)
{
int i,j;
int mb_x,mb_y;
int ii,jj,uv;
int MbMode;
int b4,b8;
//mb header
for (i=0; i < 4; i++)
for (j=0; j < 6; j++)
img->nz_coeff [img->mb_x ][img->mb_y ][i][j]=0; // CAVLC
if(img->type==INTRA_IMG)
{
if(img->imod == INTRA_MB_NEW)/*yummy*/
{
ue_v(img->i16offset);
ue_v(0);//chroma pred is DC
}
else
{
ue_v(0);//img->mb_mode is I_4x4
for(i=0;i<16;i++)
Write_Intra4x4PredictionMode(intra_pred_modes[i]);
ue_v(0);//chroma pred is DC
ue_v(NCBP[cbp][0]);//CBP
}
}
else
{
if(img->mb_mode == COPY_MB)
{
img->cod_counter++;
if(img->current_mb_nr == img->total_number_mb)
{
ue_v(img->cod_counter);
}
return;
}
ue_v(img->cod_counter);
img->cod_counter = 0;
MbMode=MBType2Value(img->mb_mode,img->i16offset);/*yummy*/
ue_v(MbMode);//0(16x16),1(16x8),2(8x16),4(8x8),6(intra4x4),>6(intra16x16)
if(MbMode>5) /*yummy*/
ue_v(0);//chroma pred is DC
else if(MbMode==5)
{
for(i=0;i<16;i++)
{
Write_Intra4x4PredictionMode(intra_pred_modes[i]);
}
ue_v(0);//chroma pred is DC
ue_v(NCBP[cbp][0]);//CBP
}
else
{
if(img->mb_mode==1)
{
se_v(curr_mvx-img->mv[0]);
se_v(curr_mvy-img->mv[1]);
}
else if(img->mb_mode==2)
{
se_v(curr_mvx1[0]-img->mv1[0][0]);
se_v(curr_mvy1[0]-img->mv1[0][1]);
se_v(curr_mvx1[1]-img->mv1[1][0]);
se_v(curr_mvy1[1]-img->mv1[1][1]);
}
else if(img->mb_mode==3)
{
se_v(curr_mvx2[0]-img->mv2[0][0]);
se_v(curr_mvy2[0]-img->mv2[0][1]);
se_v(curr_mvx2[1]-img->mv2[1][0]);
se_v(curr_mvy2[1]-img->mv2[1][1]);
}
else
{
ue_v(img->SubMBType1);
ue_v(img->SubMBType2);
ue_v(img->SubMBType3);
ue_v(img->SubMBType4);
switch(img->SubMBType1)
{
case 0:
se_v(curr_mvx3[0][0]-img->mv3[0][0][0]);
se_v(curr_mvy3[0][0]-img->mv3[0][0][1]);
break;
case 1:
se_v(curr_mvx3[1][0]-img->mv3[1][0][0]);
se_v(curr_mvy3[1][0]-img->mv3[1][0][1]);
se_v(curr_mvx3[1][1]-img->mv3[1][1][0]);
se_v(curr_mvy3[1][1]-img->mv3[1][1][1]);
break;
case 2:
se_v(curr_mvx3[2][0]-img->mv3[2][0][0]);
se_v(curr_mvy3[2][0]-img->mv3[2][0][1]);
se_v(curr_mvx3[2][1]-img->mv3[2][1][0]);
se_v(curr_mvy3[2][1]-img->mv3[2][1][1]);
break;
case 3:
se_v(curr_mvx3[3][0]-img->mv3[3][0][0]);
se_v(curr_mvy3[3][0]-img->mv3[3][0][1]);
se_v(curr_mvx3[3][1]-img->mv3[3][1][0]);
se_v(curr_mvy3[3][1]-img->mv3[3][1][1]);
se_v(curr_mvx3[3][2]-img->mv3[3][2][0]);
se_v(curr_mvy3[3][2]-img->mv3[3][2][1]);
se_v(curr_mvx3[3][3]-img->mv3[3][3][0]);
se_v(curr_mvy3[3][3]-img->mv3[3][3][1]);
break;
}
switch(img->SubMBType2)
{
case 0:
se_v(curr_mvx3[0][1]-img->mv3[0][1][0]);
se_v(curr_mvy3[0][1]-img->mv3[0][1][1]);
break;
case 1:
se_v(curr_mvx3[1][2]-img->mv3[1][2][0]);
se_v(curr_mvy3[1][2]-img->mv3[1][2][1]);
se_v(curr_mvx3[1][3]-img->mv3[1][3][0]);
se_v(curr_mvy3[1][3]-img->mv3[1][3][1]);
break;
case 2:
se_v(curr_mvx3[2][2]-img->mv3[2][2][0]);
se_v(curr_mvy3[2][2]-img->mv3[2][2][1]);
se_v(curr_mvx3[2][3]-img->mv3[2][3][0]);
se_v(curr_mvy3[2][3]-img->mv3[2][3][1]);
break;
case 3:
se_v(curr_mvx3[3][4]-img->mv3[3][4][0]);
se_v(curr_mvy3[3][4]-img->mv3[3][4][1]);
se_v(curr_mvx3[3][5]-img->mv3[3][5][0]);
se_v(curr_mvy3[3][5]-img->mv3[3][5][1]);
se_v(curr_mvx3[3][6]-img->mv3[3][6][0]);
se_v(curr_mvy3[3][6]-img->mv3[3][6][1]);
se_v(curr_mvx3[3][7]-img->mv3[3][7][0]);
se_v(curr_mvy3[3][7]-img->mv3[3][7][1]);
break;
}
switch(img->SubMBType3)
{
case 0:
se_v(curr_mvx3[0][2]-img->mv3[0][2][0]);
se_v(curr_mvy3[0][2]-img->mv3[0][2][1]);
break;
case 1:
se_v(curr_mvx3[1][4]-img->mv3[1][4][0]);
se_v(curr_mvy3[1][4]-img->mv3[1][4][1]);
se_v(curr_mvx3[1][5]-img->mv3[1][5][0]);
se_v(curr_mvy3[1][5]-img->mv3[1][5][1]);
break;
case 2:
se_v(curr_mvx3[2][4]-img->mv3[2][4][0]);
se_v(curr_mvy3[2][4]-img->mv3[2][4][1]);
se_v(curr_mvx3[2][5]-img->mv3[2][5][0]);
se_v(curr_mvy3[2][5]-img->mv3[2][5][1]);
break;
case 3:
se_v(curr_mvx3[3][8 ]-img->mv3[3][8 ][0]);
se_v(curr_mvy3[3][8 ]-img->mv3[3][8 ][1]);
se_v(curr_mvx3[3][9 ]-img->mv3[3][9 ][0]);
se_v(curr_mvy3[3][9 ]-img->mv3[3][9 ][1]);
se_v(curr_mvx3[3][10]-img->mv3[3][10][0]);
se_v(curr_mvy3[3][10]-img->mv3[3][10][1]);
se_v(curr_mvx3[3][11]-img->mv3[3][11][0]);
se_v(curr_mvy3[3][11]-img->mv3[3][11][1]);
break;
}
switch(img->SubMBType4)
{
case 0:
se_v(curr_mvx3[0][3]-img->mv3[0][3][0]);
se_v(curr_mvy3[0][3]-img->mv3[0][3][1]);
break;
case 1:
se_v(curr_mvx3[1][6]-img->mv3[1][6][0]);
se_v(curr_mvy3[1][6]-img->mv3[1][6][1]);
se_v(curr_mvx3[1][7]-img->mv3[1][7][0]);
se_v(curr_mvy3[1][7]-img->mv3[1][7][1]);
break;
case 2:
se_v(curr_mvx3[2][6]-img->mv3[2][6][0]);
se_v(curr_mvy3[2][6]-img->mv3[2][6][1]);
se_v(curr_mvx3[2][7]-img->mv3[2][7][0]);
se_v(curr_mvy3[2][7]-img->mv3[2][7][1]);
break;
case 3:
se_v(curr_mvx3[3][12]-img->mv3[3][12][0]);
se_v(curr_mvy3[3][12]-img->mv3[3][12][1]);
se_v(curr_mvx3[3][13]-img->mv3[3][13][0]);
se_v(curr_mvy3[3][13]-img->mv3[3][13][1]);
se_v(curr_mvx3[3][14]-img->mv3[3][14][0]);
se_v(curr_mvy3[3][14]-img->mv3[3][14][1]);
se_v(curr_mvx3[3][15]-img->mv3[3][15][0]);
se_v(curr_mvy3[3][15]-img->mv3[3][15][1]);
break;
}
}
ue_v(NCBP[cbp][1]);//CBP
}
}
/*yummy*/
if(cbp!=0||img->i16offset) se_v(0);//dquant
//luma cofficient
if(!img->i16offset)
for (mb_y=0; mb_y < 4; mb_y += 2)
{
for (mb_x=0; mb_x < 4; mb_x += 2)
{
for (j=mb_y; j < mb_y+2; j++)
{
jj=j/2;
for (i=mb_x; i < mb_x+2; i++)
{
ii=i/2;
if ((cbp & (int)pow(2,ii+jj*2)) != 0) /* check for any coeffisients */
{
writeCoeff4x4_CAVLC (LUMA, i, j, 0, img);//luma,param=0;
}
}
}
}
}
/*write 16x16 MB*//*yummy*/
else//(img->i16offset)
{
writeCoeff4x4_CAVLC (LUMA_INTRA16x16DC, 0, 0, 0,img);
if (cbp & 15)
{
for (mb_y=0; mb_y < 4; mb_y += 2)
for (mb_x=0; mb_x < 4; mb_x += 2)/*??*/
for (j=mb_y; j < mb_y+2; j++)
for (i=mb_x; i < mb_x+2; i++)
{
b8 = 2*(j/2) + (i/2);
b4 = 2*(j&0x01) + (i&0x01);
writeCoeff4x4_CAVLC (LUMA_INTRA16x16AC, b8, b4, 0,img);// CAVLC
}
}
}
if (cbp > 15)
{
for (uv=0; uv < 2; uv++)
{
//param = uv;
writeCoeff4x4_CAVLC (CHROMA_DC, 0, 0, uv, img);
}
}
// Bits for chroma AC-coeffs.
if (cbp >> 4 == 2)
{
for (mb_y=4; mb_y < 6; mb_y += 2)
{
for (mb_x=0; mb_x < 4; mb_x += 2)
{
for (j=mb_y; j < mb_y+2; j++)
{
for (i=mb_x; i < mb_x+2; i++)
{
//param = i << 4 | j;
writeCoeff4x4_CAVLC (CHROMA_AC, i, j, i << 4 | j, img);
}
}
}
}
}
}
int predict_nnz(int i,int j,struct img_par *img)
{
int Left_block,Top_block, pred_nnz;
int cnt=0;
int decr = 1;
int mb_available_up = (img->mb_y == 0 ) ? 0 : 1;
int mb_available_left = (img->mb_x == 0 ) ? 0 : 1;
if (i)
Left_block= img->nz_coeff [img->mb_x ][img->mb_y ][i-1][j];
else
Left_block= mb_available_left ? img->nz_coeff [img->mb_x-1 ][img->mb_y ][3][j] : -1;
if (j)
Top_block= img->nz_coeff [img->mb_x ][img->mb_y ][i][j-1];
else
Top_block= mb_available_up ? img->nz_coeff [img->mb_x ][img->mb_y-decr ][i][3] : -1;
pred_nnz=0;
if (Left_block>-1)
{
pred_nnz=Left_block;
cnt++;
}
if (Top_block>-1)
{
pred_nnz+=Top_block;
cnt++;
}
if (cnt==2)
pred_nnz++;
if (cnt)
pred_nnz/=cnt;
return pred_nnz;
}
int predict_nnz_chroma(int i,int j, struct img_par *img)
{
int Left_block,Top_block, pred_nnz;
int cnt=0;
int mb_y = img->mb_y;
int decr = 1;
int mb_available_up = (img->mb_y == 0 ) ? 0 : 1;
int mb_available_left = (img->mb_x == 0 ) ? 0 : 1;
if (i==1 || i==3)
Left_block= img->nz_coeff [img->mb_x ][mb_y ][i-1][j];
else
Left_block= mb_available_left ? img->nz_coeff [img->mb_x-1 ][img->mb_y ][i+1][j] : -1;
if (j==5)
Top_block= img->nz_coeff [img->mb_x ][img->mb_y ][i][j-1];
else
Top_block= mb_available_up ? img->nz_coeff [img->mb_x ][img->mb_y-decr ][i][5] : -1;
pred_nnz=0;
if (Left_block>-1)
{
pred_nnz=Left_block;
cnt++;
}
if (Top_block>-1)
{
pred_nnz+=Top_block;
cnt++;
}
if (cnt==2)
pred_nnz++;
if (cnt)
pred_nnz/=cnt;
return pred_nnz;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -