⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macroblock.cpp

📁 h264编解码.用C++实现了图像的编解码功能。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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 + -