📄 enc.cpp
字号:
// mpeg2dll.cpp : Defines the initialization routines for the DLL.
//
#include "global.h"
#include "globalenc.h"
extern LPBYTE lpHead; /* format of input frames */
#define FILE_MODE 0
#define BUFFER_MODE 1
struct code_param
{
short Mode;
long Long;
long iWidth;
long iHeight;
short color;
FILE *outfile;
long frameno;
};
//以下是压缩MJPG和MPEG4文件的全局变量
struct header //数据头结构
{
// 公用部分
long headsize; //数据头大小
long totalframe; //总帧数 (out)
long horizontal_size; //宽度,缺省768 (in,out)
long vertical_size; //高度,缺省576 (in,out)
double frame_rate; //帧速率,缺省25.0 (in,out)
//用于MJPG的参数
long quality; /*jpeg质量因子,缺省75,(in) 若大于此值会增加编码时间,
在某些情况下无法达到实时采集*/
long color;
//用于MPEG4编码器,建议以下采用缺省值
double bit_rate; // 位速率,缺省值4000000(in)。码位率过低降低图像质量。
long Encode_Mode; /*编码模式 ,缺省值0(in),范围(0-1)整数。=0表示双通道;
=1表示固定码率,固定码率值为bit_rate*/
long Interval; /*关键帧间隔,缺省值100(in),范围(1--300)整数.
此值过高会降低反向播放的速度。过低会降低压缩比。*/
long BNum; /*B帧模式,缺省值0(in),范围(0-2)整数. =0时可以保证实时采集;
=1是与divx5.0兼容,=2可以大大提高压缩比,
但是会增加编码时间,在某些情况下无法达到实时采集。*/
long Q; /*mpeg4质量因子,缺省值0(in). 范围(0---6)之间整数,
值越高图像质量越好,但会增加编码时间,无法进行实时采集。*/
long reserved1; //保留
long reserved2; //保留
long reserved3; //保留
long reserved4; //保留
};
void init_yuv()
{
}
typedef struct mpg2_header_info1 //数据头结构
{
// 公用部分
long headsize; //数据头大小
long horizontal_size; //宽度,缺省768 (in,out)
long vertical_size; //高度,缺省576 (in,out)
long color;
long totalframe; //总帧数 (out)
long reserved0; //保留
//用于MPEG4编码器,建议以下采用缺省值
double frame_rate; //帧速率,缺省25.0 (in,out)
double bit_rate; // 位速率,缺省值4000000(in)。码位率过低降低图像质量。
long reserved1; //保留
long reserved2; //保留
long reserved3; //保留
long reserved4; //保留
}Mpg2_Header_Info1;
struct mpg2_frame_info1 //数据头结构
{
long headsize;
long frame_type;
long skip;
long reserved1; //保留
long reserved2; //保留
long reserved3; //保留
long reserved4; //保留
}Mpg2_Frame_Info1;
extern "C" HANDLE WINAPI okMPG2BeginEncode(header* head, LPSTR szFileName)
{
HANDLE hMPG2;
code_param *pMPG2;
double bitrate,framerate;
MessageBox(NULL,NULL,"okMPG2BeginEncode",MB_OK);
hMPG2=GlobalAlloc(GHND,sizeof(code_param));
if(!hMPG2)
return 0;
pMPG2=(code_param *)GlobalLock(hMPG2);
if(head->horizontal_size>0)
pMPG2->iWidth=head->horizontal_size;
else
{
pMPG2->iWidth=768;
GlobalUnlock(hMPG2);
return 0;
}
if(head->color>0)
pMPG2->color=head->color;
else
{
pMPG2->color=24;
GlobalUnlock(pMPG2);
return 0;
}
if(head->vertical_size>0)
pMPG2->iHeight=head->vertical_size;
else
{
pMPG2->iHeight=576;
GlobalUnlock(hMPG2);
return 0;
}
if(head->bit_rate>0)
bitrate=head->bit_rate;
else
{
bitrate=5000000.0;
GlobalUnlock(hMPG2);
return 0;
}
if(head->frame_rate>0)
framerate=head->frame_rate;
else
{
framerate=25.0;
GlobalUnlock(hMPG2);
return 0;
}
if(szFileName!=NULL)
{
outfile=fopen(szFileName,"wb");
pMPG2->Mode=FILE_MODE;
outmode=0;
}
else
{
pMPG2->Mode=BUFFER_MODE;
outmode=1;
outlength=0;
bufsize=pMPG2->iHeight*pMPG2->iWidth*3;
lpHead=(LPBYTE)malloc(pMPG2->iHeight*pMPG2->iWidth*3);
lpOutBuf=lpHead;
}
set_param(head->horizontal_size,head->vertical_size,bitrate,framerate);
enc_init();
pMPG2->frameno=0;
GlobalUnlock(hMPG2);
return hMPG2;
}
extern "C" long WINAPI okMPG2WriteFrame(HANDLE hMPG2, LPBYTE input_image,long stride, LPBYTE lpOut)
{
//To define a standard DIB extension for storing MJPG-encoded
code_param *pMPG2;
long Long;
long temp;
if(!hMPG2)
return 0;
//分配存储空间
pMPG2=(code_param *)GlobalLock(hMPG2);
vertical_size=pMPG2->iHeight;
horizontal_size=pMPG2->iWidth;
if(pMPG2->Mode==FILE_MODE)
{
outlength=0;
putseq(pMPG2->frameno,input_image,stride,pMPG2->color);
pMPG2->frameno++;
temp=0;
}
else
{
if(pMPG2->frameno==0)
{
memcpy(lpOut,lpHead,outlength);
temp=outlength;
free(lpHead);
}
else
temp=0;
outlength=0;
bufsize=pMPG2->iHeight*pMPG2->iWidth*3;
lpOutBuf=lpOut+temp;
putseq(pMPG2->frameno,input_image,stride,pMPG2->color);
pMPG2->frameno++;
}
GlobalUnlock(hMPG2);
return outlength+temp;
}
extern "C" void WINAPI okMPG2EndEncode(HANDLE hMPG2)
{
code_param *pMPG2;
pMPG2=(code_param *)GlobalLock(hMPG2);
if(pMPG2->Mode==FILE_MODE)
{
EncOver();
}
GlobalUnlock(hMPG2);
GlobalFree(hMPG2);
}
extern "C" HANDLE WINAPI okMPG2BeginEncodeEx(LPARAM lpParam, LPSTR szFileName)
{
HANDLE hMPG2;
code_param *pMPG2;
mpg2_header_info1 *head;
head=(mpg2_header_info1*)lpParam;
double bitrate,framerate;
hMPG2=GlobalAlloc(GHND,sizeof(code_param));
if(!hMPG2)
return 0;
pMPG2=(code_param *)GlobalLock(hMPG2);
if(head->horizontal_size>0)
pMPG2->iWidth=head->horizontal_size;
else
{
pMPG2->iWidth=768;
GlobalUnlock(hMPG2);
return 0;
}
if(head->color>0)
pMPG2->color=head->color;
else
{
pMPG2->color=24;
GlobalUnlock(pMPG2);
return 0;
}
if(head->vertical_size>0)
pMPG2->iHeight=head->vertical_size;
else
{
pMPG2->iHeight=576;
GlobalUnlock(hMPG2);
return 0;
}
if(head->bit_rate>0)
bitrate=head->bit_rate;
else
{
bitrate=5000000.0;
GlobalUnlock(hMPG2);
return 0;
}
if(head->frame_rate>0)
framerate=head->frame_rate;
else
{
framerate=25.0;
GlobalUnlock(hMPG2);
return 0;
}
if(szFileName!=NULL)
{
outfile=fopen(szFileName,"wb");
pMPG2->Mode=FILE_MODE;
outmode=0;
}
else
{
pMPG2->Mode=BUFFER_MODE;
outmode=1;
outlength=0;
bufsize=pMPG2->iHeight*pMPG2->iWidth*3;
lpHead=(LPBYTE)malloc(pMPG2->iHeight*pMPG2->iWidth*3);
lpOutBuf=lpHead;
}
set_param(head->horizontal_size,head->vertical_size,bitrate,framerate);
enc_init();
pMPG2->frameno=0;
GlobalUnlock(hMPG2);
return hMPG2;
}
extern "C" long WINAPI okMPG2WriteFrameEx(HANDLE hMPG2, LPBYTE input_image,long stride, LPBYTE lpOut,LPARAM lpParam)
{
//To define a standard DIB extension for storing MJPG-encoded
code_param *pMPG2;
long Long;
long temp;
mpg2_frame_info1 *info;
info=(mpg2_frame_info1*)lpParam;
if(!hMPG2)
return 0;
//分配存储空间
pMPG2=(code_param *)GlobalLock(hMPG2);
vertical_size=pMPG2->iHeight;
horizontal_size=pMPG2->iWidth;
if(pMPG2->Mode==FILE_MODE)
{
outlength=0;
putseq(pMPG2->frameno,input_image,stride,pMPG2->color);
pMPG2->frameno++;
temp=0;
}
else
{
if(pMPG2->frameno==0)
{
memcpy(lpOut,lpHead,outlength);
temp=outlength;
free(lpHead);
}
else
temp=0;
outlength=0;
bufsize=pMPG2->iHeight*pMPG2->iWidth*3;
lpOutBuf=lpOut+temp;
putseq(pMPG2->frameno,input_image,stride,pMPG2->color);
pMPG2->frameno++;
}
if(info)
info->frame_type=pict_type;
GlobalUnlock(hMPG2);
return outlength+temp;
}
extern "C" void WINAPI okMPG2EndEncodeEx(HANDLE hMPG2)
{
code_param *pMPG2;
pMPG2=(code_param *)GlobalLock(hMPG2);
if(pMPG2->Mode==FILE_MODE)
{
EncOver();
}
GlobalUnlock(hMPG2);
GlobalFree(hMPG2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -