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

📄 vlc.cpp

📁 h264编解码.用C++实现了图像的编解码功能。
💻 CPP
字号:
#include <math.h>
#include "global.h"
#include <malloc.h>
#include <assert.h>
/**************by guoxq********************/

unsigned char *outDataBuff;
int *ulen,*uinfo;
int *slen,*sinfo1,*sinfo2;
BIT2BYTE bb;

void InitInfoTable()
{
	int i,j,k=0;
	int value,len;
	
	ulen = (int *)malloc(16384);
	uinfo= (int *)malloc(16384);
	for(i=0;i<12;i++)
	{
		len = 2*i+1;
		value = (int)pow(2,i);
		for(j=0;j<value;j++)
		{
			ulen[k]=len;
			uinfo[k]=(1<<i)|(j&((1<<i)-1));
			k++;
		}
	}
	
	slen = (int *)malloc(16384);
	sinfo1=(int *)malloc(16384);
	sinfo2=(int *)malloc(16384);
	k=0;
	slen[k]=1;sinfo1[k]=1;
	k++;
	for(i=1;i<13;i++)
	{
		len = 2*i+1;
		value = (int)pow(2,i-1);
		for(j=0;j<value;j++)
		{
			slen[k] = len; 
			sinfo1[k]=(1<<i)|((2*j+1)&((1<<i)-1));
			sinfo2[k]=(1<<i)|((2*j)&((1<<i)-1));
			k++;
		}
	}
}

/*void InitCavlcTable()
{
	int numcoeff_vlc,numcoeff,numtrailingones;
	int totalzeros,run,level;
	
	NumCoeffTable=(int *)malloc(1024*4);
	for(numcoeff_vlc=0;numcoeff_vlc<4;numcoeff_vlc++)
		for(numcoeff=0;numcoeff<17;numcoeff++)
			for(numtrailingones=0;numtrailingones<4;numtrailingones++)
				writeSyntaxElement_NumCoeffTrailingOnes(numcoeff_vlc, numcoeff, numtrailingones);
	
	NumCoeffDCTable=(int *)malloc(64*4);
	for(numcoeff=0;numcoeff<5;numcoeff++)
		for(numtrailingones=0;numtrailingones<4;numtrailingones++)
			writeSyntaxElement_NumCoeffTrailingOnesChromaDC(0, numcoeff, numtrailingones);
	
	TotalZerosTable=(int *)malloc(512*4);
	for(numcoeff_vlc=0;numcoeff_vlc<16;numcoeff_vlc++)
		for(totalzeros=0;totalzeros<16;totalzeros++)
			writeSyntaxElement_TotalZeros(totalzeros,numcoeff_vlc);
	
	TotalZerosDCTable=(int *)malloc(32*4);
	for(numcoeff_vlc=0;numcoeff_vlc<4;numcoeff_vlc++)
		for(totalzeros=0;totalzeros<4;totalzeros++)
			writeSyntaxElement_TotalZerosChromaDC(totalzeros,numcoeff_vlc);
			
	RunTable=(int *)malloc(256*4);
	for(numcoeff_vlc=0;numcoeff_vlc<7;numcoeff_vlc++)
		for(run=0;run<16;run++)
			writeSyntaxElement_Run(run,numcoeff_vlc);
	
	LevelTable=(int *)malloc(1024*8*2*4);
	for(numcoeff_vlc=0;numcoeff_vlc<7;numcoeff_vlc++)//maybe 7!!!!!!!!!!!!!!!!!!!!!!!!!!!
		for(level=-512;level<512;level++)
		{
			if(level==0) continue;
			if(numcoeff_vlc==0)
				writeSyntaxElement_Level_VLC1(level);
			else
				writeSyntaxElement_Level_VLCN(level, numcoeff_vlc);
		}
			
}*/

void freeInfo()
{
  free(ulen);
  free(uinfo);
  free(slen);
  free(sinfo1);
  free(sinfo2);
}

void InitBits()
{
	bb.bExist=0;
	bb.cExist=0;
	bb.data.ii=0;
}

void PutBits(int n, int val)
{
	bb.bExist+=n;
	val<<=(32-bb.bExist);
	bb.data.ii|=val;
	while(bb.bExist>7)
	{
		*(outDataBuff++)=bb.data.cc[3];
		bb.data.ii<<=8;
		bb.bExist-=8;
		bb.cExist++;
	}
}

void AlignBits()
{
	PutBits(1,1);
	while (bb.bExist!=0) PutBits (1,0);
}

int ue_v (int value)
{	
	int len,code;
	len = ulen[value];
	code= uinfo[value];
	PutBits(len, code);

	return len;
}

int se_v (int value)
{
	int len,code;
	int absval;

	absval =abs(value);
	len = slen[absval];
	code=(value<=0)? sinfo1[absval]:sinfo2[absval];
	PutBits(len, code);

	return len;
}

int u_1 (int value)
{
	PutBits(1, value);

	return 1;
}

int u_v (int n, int value)
{
	PutBits(n, value);

	return n;
}

int GenerateSeq_parameter_set_rbsp (byte img_format)
{
  int len = 0;

  u_v(8,0);
  u_v(8,0);
  u_v(8,0);
  u_v(8,1);
  u_v(8,0x67);
  
  len+=u_v  (8, 88);//profile_idc
  len+=u_1  (0);    //constrained_set0_flag
  len+=u_1  (0);    //constrained_set1_flag
  len+=u_1  (0);    //constrained_set2_flag
  len+=u_v  (5, 0); //reserved_zero
  len+=u_v  (8, 21);//level_idc
  len+=ue_v (0);    //seq_parameter_set_id
  len+=ue_v (4);    //log2_max_frame_num_minus4
  len+=ue_v (0);    //pic_order_cnt_type
  len+=ue_v (4);    //log2_max_pic_order_cnt_lsb_minus4
  len+=ue_v (1);    //num_ref_frames
  len+=u_1  (0);    //gaps_in_frame_num_value_allowed_flag
  len+=ue_v (10 + img_format*11);   //pic_width_in_mbs_minus1,QCIF:10,CIF:21
  len+=ue_v (8 + img_format*9);    //pic_height_in_map_units_minus1,QCIF:8,CIF,17
  len+=u_1  (1);    //frame_mbs_only_flag
  len+=u_1  (0);    //direct_8x8_inference_flag
  len+=u_1  (0);    //frame_cropping_flag
  len+=u_1  (0);    //vui_parameters_present_flag
  
  return len;
}

int GeneratePic_parameter_set_rbsp ()
{
  int len = 0;

  u_v(8,0);
  u_v(8,0);
  u_v(8,0);
  u_v(8,1);
  u_v(8,0x68);

  len+=ue_v (0);    //pic_parameter_set_id
  len+=ue_v (0);    //seq_parameter_set_id
  len+=u_1  (0);    //entropy_coding_mode_flag
  len+=u_1  (0);    //pic_order_present_flag
  len+=ue_v (0);    //num_slice_groups_minus1
  len+=ue_v (0);    //num_ref_idx_l0_active_minus1
  len+=ue_v (0);    //num_ref_idx_l1_active_minus1
  len+=u_1  (0);    //weighted_pred_flag
  len+=u_v  (2,0);  //weighted_bipred_idc
  len+=se_v (0);    //pic_init_qp_minus26
  len+=se_v (0);    //pic_init_qs_minus26
  len+=se_v (0);    //chroma_qp_index_offset
  len+=u_1  (0);    //deblocking_filter_control_present_flag
  len+=u_1  (0);    //constrained_intra_pred_flag
  len+=u_1  (0);    //redundant_pic_cnt_present_flag

  return len;
}

int SliceHeader(int num, int type, int qp)
{
  int len = 0;

  u_v(8,0);
  u_v(8,0);
  u_v(8,0);
  u_v(8,1);
  if(num==0) u_v(8,0x65);
  else u_v(8,0x41);

  len  = ue_v(0);		//first_mb_in_slice
  len += ue_v(type+5);		//slice_type
  len += ue_v(0);		//pic_parameter_set_id
  len += u_v (8,num&0xff);	//frame_num

  if(num==0)
	  len += ue_v (0);	//idr_pic_id

  len += u_v (8,(num<<1)&0xff);		//pic_order_cnt_lsb

  if (type == P_SLICE)
  {
    len +=  u_1 (1);		//num_ref_idx_active_override_flag        
    len += ue_v (0);		//num_ref_idx_l0_active_minus1
  }
  //ref_pic_list_reordering();
  if (type!=I_SLICE)
  {
    len += u_1 (0);		//ref_pic_list_reordering_flag_l0
  }

  //dec_ref_pic_marking();
  if (num==0)
  {
	  len += u_1(0);		//no_output_of_prior_pics_flag
	  len += u_1(0);		//long_term_reference_flag
  }
  else
  {
	  len += u_1(0);		//adaptive_ref_pic_buffering_flag
  }

  len += se_v(qp - 26);	//slice_qp_delta
  return len;
}

int Write_Intra4x4PredictionMode(int mode)
{
	int len,inf;

  if (mode == -1)
  {
    len = 1;
    inf = 1;
  }
  else 
  {
    len = 4;  
    inf = mode;
  }

  PutBits(len, inf);

  return (len);
}

int writeSyntaxElement_NumCoeffTrailingOnes(int numcoeff_vlc, int numcoeff, int numtrailingones)
{
  int lentab[3][4][17] = 
  {
    {   // 0702
      { 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
      { 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
      { 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
      { 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16},
    },                                                 
    {                                                  
      { 2, 6, 6, 7, 8, 8, 9,11,11,12,12,12,13,13,13,14,14},
      { 0, 2, 5, 6, 6, 7, 8, 9,11,11,12,12,13,13,14,14,14},
      { 0, 0, 3, 6, 6, 7, 8, 9,11,11,12,12,13,13,13,14,14},
      { 0, 0, 0, 4, 4, 5, 6, 6, 7, 9,11,11,12,13,13,13,14},
    },                                                 
    {                                                  
      { 4, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9,10,10,10,10},
      { 0, 4, 5, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,10},
      { 0, 0, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10},
      { 0, 0, 0, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 9,10,10,10},
    },

  };

  int codtab[3][4][17] = 
  {
    {
      { 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7,4}, 
      { 0, 1, 4, 6, 6, 6, 6,14,10,14,10,14,10, 1,14,10,6}, 
      { 0, 0, 1, 5, 5, 5, 5, 5,13, 9,13, 9,13, 9,13, 9,5}, 
      { 0, 0, 0, 3, 3, 4, 4, 4, 4, 4,12,12, 8,12, 8,12,8},
    },
    {
      { 3,11, 7, 7, 7, 4, 7,15,11,15,11, 8,15,11, 7, 9,7}, 
      { 0, 2, 7,10, 6, 6, 6, 6,14,10,14,10,14,10,11, 8,6}, 
      { 0, 0, 3, 9, 5, 5, 5, 5,13, 9,13, 9,13, 9, 6,10,5}, 
      { 0, 0, 0, 5, 4, 6, 8, 4, 4, 4,12, 8,12,12, 8, 1,4},
    },
    {
      {15,15,11, 8,15,11, 9, 8,15,11,15,11, 8,13, 9, 5,1}, 
      { 0,14,15,12,10, 8,14,10,14,14,10,14,10, 7,12, 8,4},
      { 0, 0,13,14,11, 9,13, 9,13,10,13, 9,13, 9,11, 7,3},
      { 0, 0, 0,12,11,10, 9, 8,13,12,12,12, 8,12,10, 6,2},
    },
  };
  int vlcnum,len,inf;

  vlcnum = numcoeff_vlc;

  // se->value1 : numcoeff
  // se->value2 : numtrailingones

  if (vlcnum == 3)
  {
    len = 6;  // 4 + 2 bit FLC
    if (numcoeff > 0)
    {
      inf = ((numcoeff-1) << 2) | numtrailingones;
    }
    else
    {
      inf = 3;
    }
  }
  else
  {
    len = lentab[vlcnum][numtrailingones][numcoeff];
    inf = codtab[vlcnum][numtrailingones][numcoeff];
  }
  PutBits(len,inf);
  return (len);
}

int writeSyntaxElement_NumCoeffTrailingOnesChromaDC(int numcoeff_vlc, int numcoeff, int numtrailingones)
{
  int lentab[4][5] = 
  {
    { 2, 6, 6, 6, 6,},          
    { 0, 1, 6, 7, 8,}, 
    { 0, 0, 3, 7, 8,}, 
    { 0, 0, 0, 6, 7,},
  };

  int codtab[4][5] = 
  {
    {1,7,4,3,2},
    {0,1,6,3,3},
    {0,0,1,2,2},
    {0,0,0,5,0},
  };
  int len,inf;

  len = lentab[numtrailingones][numcoeff];
  inf = codtab[numtrailingones][numcoeff];

  PutBits(len,inf);

  return (len);
}

int writeSyntaxElement_Level_VLC1(int value1)
{
  int level, levabs, sign;
  int len, inf;

  level = value1;
  levabs = abs(level);
  sign = (level < 0 ? 1 : 0);

  if (levabs < 8)
  {
    len = levabs * 2 + sign - 1;
    inf = 1;
	PutBits(len, inf);
  }
  else if (levabs < 8+8)
  {
    // escape code1
    len = 14 + 1 + 4;
    inf = (1 << 4) | ((levabs - 8) << 1) | sign;
	PutBits(len, inf);
  }
  else
  {
    // escape code2
    len = 14 + 2 + 12;
    inf = (0x1 << 12) | ((levabs - 16)<< 1) | sign;
	PutBits(16, inf>>12);
	PutBits(12, inf&0xfff);
  }

  return (len);
}

int writeSyntaxElement_Level_VLCN(int value1, int vlc)
{
  int iCodeword;
  int iLength;
  int len, inf;

  int level = value1;

  int levabs = abs(level);
  int sign = (level < 0 ? 1 : 0);  

  int shift = vlc-1;
  int escape = (15<<shift)+1;

  int numPrefix = (levabs-1)>>shift;

  int sufmask = ~((0xffffffff)<<shift);
  int suffix = (levabs-1)&sufmask;

  if (levabs < escape)
  {
    iLength = numPrefix + vlc + 1;
    iCodeword = (1<<(shift+1))|(suffix<<1)|sign;
  }
  else
  {
    iLength = 28;
    iCodeword = (1<<12)|((levabs-escape)<<1)|sign;
  }
  len = iLength;
  inf = iCodeword;

  if(len==28)
  {
	  PutBits(16, inf>>12);
	  PutBits(12, inf&0xfff);
  }
  else
	  PutBits(len, inf);

  return (len);
}

int writeSyntaxElement_TotalZeros(int value1, int length)
{
  int lentab[TOTRUN_NUM][16] = 
  {
    { 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},  
    { 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},  
    { 4,3,3,3,4,4,3,3,4,5,5,6,5,6},  
    { 5,3,4,4,3,3,3,4,3,4,5,5,5},  
    { 4,4,4,3,3,3,3,3,4,5,4,5},  
    { 6,5,3,3,3,3,3,3,4,3,6},  
    { 6,5,3,3,3,2,3,4,3,6},  
    { 6,4,5,3,2,2,3,3,6},  
    { 6,6,4,2,2,3,2,5},  
    { 5,5,3,2,2,2,4},  
    { 4,4,3,3,1,3},  
    { 4,4,2,1,3},  
    { 3,3,1,2},  
    { 2,2,1},  
    { 1,1},  
  };

  int codtab[TOTRUN_NUM][16] = 
  {
    {1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},
    {7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},
    {5,7,6,5,4,3,4,3,2,3,2,1,1,0},
    {3,7,5,4,6,5,4,3,3,2,2,1,0},
    {5,4,3,7,6,5,4,3,2,1,1,0},
    {1,1,7,6,5,4,3,2,1,1,0},
    {1,1,5,4,3,3,2,1,1,0},
    {1,1,1,3,3,2,2,1,0},
    {1,0,1,3,2,1,1,1,},
    {1,0,1,3,2,1,1,},
    {0,1,1,2,1,3},
    {0,1,1,1,1},
    {0,1,1,1},
    {0,1,1},
    {0,1},  
  };
  int vlcnum;
  int len, inf;

  vlcnum = length;

  // se->value1 : TotalZeros
  len = lentab[vlcnum][value1];
  inf = codtab[vlcnum][value1];

  assert(len != 0);

  PutBits(len, inf);

  return (len);
}

int writeSyntaxElement_TotalZerosChromaDC(int value1, int length)
{
  int lentab[3][4] = 
  {
    { 1, 2, 3, 3,},
    { 1, 2, 2, 0,},
    { 1, 1, 0, 0,}, 
  };

  int codtab[3][4] = 
  {
    { 1, 1, 1, 0,},
    { 1, 1, 0, 0,},
    { 1, 0, 0, 0,},
  };
  int vlcnum;
  int len, inf;

  vlcnum = length;

  // se->value1 : TotalZeros
  len = lentab[vlcnum][value1];
  inf = codtab[vlcnum][value1];

  PutBits(len, inf);

  return (len);
}

int writeSyntaxElement_Run(int value1, int length)
{
  int lentab[TOTRUN_NUM][16] = 
  {
    {1,1},
    {1,2,2},
    {2,2,2,2},
    {2,2,2,3,3},
    {2,2,3,3,3,3},
    {2,3,3,3,3,3,3},
    {3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},
  };

  int codtab[TOTRUN_NUM][16] = 
  {
    {1,0},
    {1,1,0},
    {3,2,1,0},
    {3,2,1,1,0},
    {3,2,3,2,1,0},
    {3,0,1,3,2,5,4},
    {7,6,5,4,3,2,1,1,1,1,1,1,1,1,1},
  };
  int vlcnum;
  int len, inf;

  vlcnum = length;

  // se->value1 : run
  len = lentab[vlcnum][value1];
  inf = codtab[vlcnum][value1];

  PutBits(len, inf);

  return (len);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -