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

📄 enc.cpp

📁 mpeg2编码解码源程序代码
💻 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 + -