📄 lencod.cpp
字号:
#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 + -