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

📄 lencod.cpp

📁 h264编解码.用C++实现了图像的编解码功能。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include "global.h"
#include "Lencod.h"
#include "Win.h"

#include "..\\encoder264.h"


void CAVLC_init(struct img_par *img);
int RBSPtoEBSP(byte *streamBuffer, int begin_bytepos, int end_bytepos);
void WriteImage(struct img_par *img);
void ShowImage(struct img_par *img);
/* files */
FILE *p_dec;        /* internal decoded image*/
FILE *p_in;         /* YUV */
extern bool b_display;
extern bool b_save;
extern bool b_264Save;								//标记是否开始存储264数据
extern bool b_FirstSave;
extern FILE* fileEncoder;								//264文件句柄

byte *Emcef[2];
byte *Eipol[16];
byte *EimgY_org;
byte *EimgUV_org[2];
extern byte *EimgY;
extern byte *EimgUV[2];
byte *imgY;
byte *imgUV[2];
byte *imgY_org;
byte *imgUV_org[2];

extern byte *mcef[2];
extern byte *ipol[16];

extern Point search[9];
extern Point qsearch[4][9];
extern SAD_TABLE sadTable[SAD_TABLE_SIZE];

extern unsigned char *outDataBuff;

unsigned char *HeadBuf;
extern int GenerateSeq_parameter_set_rbsp (byte img_format);
extern int GeneratePic_parameter_set_rbsp ();
extern void InitQuantTable();
char intra_mb_pos[72][92];
char intra_mb_pos1[72][92];

extern bool continueFlag;
extern char *cmrRGB;
extern struct codpar codpar;
char *SendBuff;

//用于计算帧率的参数
int startTime, curTime, imgNum=0;

//buffer读写控制指针
char * m_pEnd;
char * m_pHead;
char * m_pRead;
char * m_pWrite;
int  m_nTotalBytes;
void writeOnePacket(unsigned char *pBuff, int nBytes);

//RGB2YUV转换使用的数组
unsigned int RGBYUV02990[256],RGBYUV05870[256],RGBYUV01140[256];
unsigned int RGBYUV03316[256],RGBYUV01684[256],RGBYUV04187[256],RGBYUV00813[256];

void coder()
{
  struct inp_par    *inp;         /* input parameters from input configuration file   */
  struct img_par    *img;         /* image parameters                                 */
  
  unsigned char *CodeBuff;
  FILE *streamfile;
  int size;

  /* allocate memory */
  inp =  (struct inp_par *) calloc(1, sizeof(struct inp_par)); 
  img =  (struct img_par *) calloc(1, sizeof(struct img_par));    
  
  streamfile = fopen ("D:/stream.264", "wb");
  InitQuantTable();  
  read_input(codpar,inp);
  init(inp->img_format,img);
  CAVLC_init(img);
  CodeBuff = (unsigned char *)malloc(28000);
  outDataBuff = CodeBuff;
  InitInfoTable();
  
  
  InitBits();
  GenerateSeq_parameter_set_rbsp (inp->img_format);
  AlignBits();
  GeneratePic_parameter_set_rbsp ();
  AlignBits();
  fwrite(CodeBuff,1,21,streamfile);

  
  inp->img_format? initDisplay (352,288): initDisplay (176,144); 

  startTime = clock();
  for (img->number=0; img->number < inp->no_frames; img->number++) 
  {
	ReadImage(img);
	outDataBuff = CodeBuff;
	InitBits();
	size = image(img,inp);
	DeblockFrame(img);
	
	imgNum = img->number;
	curTime = clock()-startTime;
    
	size = RBSPtoEBSP(CodeBuff, 5 ,size);
	fwrite(CodeBuff,1,size,streamfile);

	if (inp->write_dec)           
    {
		//WriteImage(img);
		ShowImage(img);
    }
	else
		ShowImage(img);
  }
  closeDisplay();
  fclose (streamfile);

  fclose (p_in);
  if (inp->write_dec) fclose(p_dec);
  freeInfo();
  free(CodeBuff);	CodeBuff = NULL;
}

int getFrmRate()
{
	if(imgNum ==0)	return 0;
	else 
		return imgNum*1000/curTime;
}

void cmrcod(void)
{
  struct inp_par    *inp;         
  struct img_par    *img;        
  
  unsigned char *CodeBuff;
  int size;
  	
  SendBuff = new char[10242];
  m_pHead = SendBuff;
  m_pRead = m_pWrite = m_pHead;
  m_pEnd = SendBuff + 10240;


  inp =  (struct inp_par *) calloc(1, sizeof(struct inp_par)); 
  img =  (struct img_par *) calloc(1, sizeof(struct img_par));    
  
  InitQuantTable();  
  read_input1(codpar,inp);
  init(inp->img_format,img);
  CAVLC_init(img);
  CodeBuff = (unsigned char *)malloc(28000);
  HeadBuf=(unsigned char*)malloc(21);
  memset(CodeBuff,0,28000);
  outDataBuff = CodeBuff;
  InitInfoTable();
  
  InitBits();
  GenerateSeq_parameter_set_rbsp (inp->img_format);
  AlignBits();
  GeneratePic_parameter_set_rbsp ();
  AlignBits();
  writeOnePacket(CodeBuff,21);
  memcpy(HeadBuf,CodeBuff,21);
/*
  if(fileEncoder!=NULL)
  {
		fwrite(CodeBuff,1,21,fileEncoder);
  }*/

//	  b_264First=false;
//  }


  bool b_initDisplay=false;
  if(b_display)
  {
	  b_initDisplay=true;
	  inp->img_format? initDisplay (352,288): initDisplay (176,144);	//建立显示窗口
  }
  InitLookupTable();		//初始化RGB2YUV转换数组
  img->number=0;

  startTime = clock();
  while(continueFlag) 
  {	
	//RGB2YUV
	//将转化后的数据拷贝到编码缓存
	if(inp->img_format)
		RGB2YUV (352, 288, cmrRGB, imgY_org, imgUV_org[0], imgUV_org[1]);
	else
		RGB2YUV (176, 144, cmrRGB, imgY_org, imgUV_org[0], imgUV_org[1]);

	outDataBuff = CodeBuff;			//输出缓冲区
	InitBits();
	size = image(img,inp);
	DeblockFrame(img);
	
	imgNum = img->number;
	curTime = clock()-startTime;
    
	size = RBSPtoEBSP(CodeBuff, 5 ,size);
	writeOnePacket(CodeBuff,size);	
	

	//存储
	if(b_264Save)
	{
		
		if(fileEncoder!=NULL)
		{
			//第一次存储
			if(b_FirstSave)
			{
				b_FirstSave=false;
				fwrite(HeadBuf,1,21,fileEncoder);
			}
			fwrite(CodeBuff,1,size,fileEncoder);
		}
	}
//	if(fileEncoder!=NULL)
//		fwrite(CodeBuff,1,size,fileEncoder);
//	
	//写解码数据
	if (b_save)//inp->write_dec)   
	{
		
		WriteImage(img);
//		ShowImage(img);
	}
	if(b_display)
	{
		if(!b_initDisplay)
		{
			b_initDisplay=true;
			inp->img_format? initDisplay (352,288): initDisplay (176,144);	//建立显示窗口
  		}
		ShowImage(img);
	}
	else
	{
		if(b_initDisplay)
		{
			b_initDisplay=false;
			closeDisplay();
		}
	}
	
	img->number++;
	Sleep(100);
  }

  if(b_initDisplay)
	  closeDisplay();
  
  if (inp->write_dec) fclose(p_dec);
  freeInfo();
  free(CodeBuff);
  free(HeadBuf);
  if(fileEncoder!=NULL)
  {
	  fclose(fileEncoder);
	  fileEncoder=NULL;
  }
  if(SendBuff)
  {
	  delete SendBuff;
	  SendBuff = NULL;
  }
}

/************************************************************************
*
*  Name :       read_input()
*
*  Description: Read input from configuration file
*
*  Input      : Name of configuration filename
*
*  Output     : none    
*                    
************************************************************************/

void read_input(struct codpar parameter,struct inp_par *inp)
{
	inp->no_frames = parameter.codnum;
	inp->qp0 = parameter.QPset?parameter.QPset:28;
	inp->qpN = parameter.QPset?parameter.QPset:28;
	inp->jumpd = parameter.drop;
	inp->hadamard = parameter.hadama;
	inp->search_range = parameter.srchrange;
	inp->no_multpred = 1;
	inp->postfilter = parameter.defilter;
	inp->img_format = parameter.format;	// 0: QCIF. 1: CIF
	inp->intra_upd = parameter.force?parameter.force:100;
	inp->write_dec = parameter.desave;

	inp->blc_size[0][0]=0;	/* init block size array */
	inp->blc_size[0][1]=0;

    inp->blc_size[1][0]=16;
    inp->blc_size[1][1]=16;

    inp->blc_size[2][0]=16;
    inp->blc_size[2][1]= 8;
    
    inp->blc_size[3][0]= 8;
    inp->blc_size[3][1]=16;

    inp->blc_size[4][0]= 8;
    inp->blc_size[4][1]= 8;

    inp->blc_size[5][0]= 8;
    inp->blc_size[5][1]= 4;

    inp->blc_size[6][0]= 4;
    inp->blc_size[6][1]= 8;

    inp->blc_size[7][0]= 4;
    inp->blc_size[7][1]= 4;

	strcpy (inp->infile, parameter.filename);
	
    if ((p_in=fopen(inp->infile,"rb"))==0)
    {
      exit(0);
    } 
	
	if(inp->write_dec)
		if ((p_dec=fopen("D:/stream.yuv","wb"))==0)              /* decoded picture */
			exit(0);
}

void read_input1(struct codpar parameter,struct inp_par *inp)
{
	inp->no_frames = parameter.codnum;
	inp->qp0 = parameter.QPset?parameter.QPset:28;
	inp->qpN = parameter.QPset?parameter.QPset:28;
	inp->jumpd = parameter.drop;
	inp->hadamard = parameter.hadama;
	inp->search_range = parameter.srchrange;
	inp->no_multpred = 1;
	inp->postfilter = parameter.defilter;
	inp->img_format = parameter.format;	// 0: QCIF. 1: CIF
	inp->intra_upd = parameter.force?parameter.force:100;
	inp->write_dec = parameter.desave;

	inp->blc_size[0][0]=0;	/* init block size array */
	inp->blc_size[0][1]=0;

    inp->blc_size[1][0]=16;
    inp->blc_size[1][1]=16;

    inp->blc_size[2][0]=16;
    inp->blc_size[2][1]= 8;
    
    inp->blc_size[3][0]= 8;
    inp->blc_size[3][1]=16;

    inp->blc_size[4][0]= 8;
    inp->blc_size[4][1]= 8;

    inp->blc_size[5][0]= 8;
    inp->blc_size[5][1]= 4;

    inp->blc_size[6][0]= 4;
    inp->blc_size[6][1]= 8;

    inp->blc_size[7][0]= 4;
    inp->blc_size[7][1]= 4;
	
	if(inp->write_dec)
		if ((p_dec=fopen("D:/stream.yuv","wb"))==0)              /* decodet picture */
			exit(0);
}

/************************************************************************
*
*  Name :       init()
*
*  Description: Some matrices are initilized here.
*
*  Input      : none
*
*  Output     : none    
*                    
************************************************************************/
void init(byte iformat, struct img_par *img)
{
  int memory_size=0;
  int i,j,k,l,l2,ii,ind;
  int scale_factor;
  SAD_TABLE SAD_TABLES[SAD_TABLE_SIZE]=
	{
		{ 0, 0},
		{ 0, 1}, { 0,-1}, { 1, 0}, {-1, 0}, { 1, 1}, { 1,-1}, {-1, 1}, {-1,-1},
		{ 0, 2}, { 0,-2}, { 2, 0}, {-2, 0}, { 1, 2}, { 1,-2}, {-1, 2}, {-1,-2},
		{ 2, 1}, { 2,-1}, {-2, 1}, {-2,-1}, { 2, 2}, { 2,-2}, {-2, 2}, {-2,-2},
		{ 3, 0}, { 0, 3}, { 0,-3}, { 3, 1}, {-3, 0}, { 1, 3}, { 1,-3}, {-1, 3},
		{-3, 1}, {-1,-3}, {-3,-1}, { 3,-1}, { 3, 2}, { 3, 3}, { 3,-2}, { 2, 3},
		{ 2,-3}, {-2, 3}, {-2,-3}, {-3, 2}, {-3, 3}, {-3,-2}, {-3,-3}, { 3,-3},
	};
  SAD_TABLE *sad=SAD_TABLES;
	Point sch[9]=
	{\
		{ 0, 0, 0, 0, 0},
		{ 0, 2, 8, 0, 1},
		{ 2, 0, 2, 0, 2},
		{ 0,-2, 8, 0, 1},
		{-2, 0, 2,-1, 2},
		{ 2, 2,10, 0, 3},
		{ 2,-2,10, 0, 3},
		{-2, 2,10,-1, 3},
		{-2,-2,10, 0, 3},
	};
	Point qsch[4][9]=
	{\
	{\
		{ 0, 0, 0, 0},
		{ 0, 1, 4, 0},
		{ 1, 0, 1, 0},
		{ 0,-1,12, 0},
		{-1, 0, 3,-1},
		{ 1, 1, 5, 0},
		{ 1,-1,13, 0},
		{-1, 1, 7,-1},
		{-1,-1,15, 0},
	},
	{\
		{ 0, 0, 8, 0},
		{ 0, 1,12, 0},
		{ 1, 0, 9, 0},
		{ 0,-1, 4, 0},
		{-1, 0,11,-1},
		{ 1, 1,13, 0},
		{ 1,-1, 5, 0},
		{-1, 1,15,-1},
		{-1,-1, 7,-1},
	},
	{\
		{ 0, 0, 2, 0},
		{ 0, 1, 6, 0},
		{ 1, 0, 3, 0},
		{ 0,-1,14, 0},
		{-1, 0, 1, 0},
		{ 1, 1, 7, 0},
		{ 1,-1,15, 0},
		{-1, 1, 5, 0},
		{-1,-1,13, 0},
	},
	{\
		{ 0, 0,10, 0},
		{ 0, 1,14, 0},
		{ 1, 0,11, 0},
		{ 0,-1, 6, 0},
		{-1, 0, 9, 0},
		{ 1, 1,15, 0},
		{ 1,-1, 7, 0},
		{-1, 1,13, 0},
		{-1,-1, 5, 0},
	}
	};
  
  int offset;
  int coffset;

  if (iformat == QCIF)                       
   scale_factor=1;
  else                                      
   scale_factor=2; /* CIF */
  
  img->width      = IMG_WIDTH     * scale_factor;
  img->width_cr   = IMG_WIDTH_CR  * scale_factor;

⌨️ 快捷键说明

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