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

📄 vcdll.cpp

📁 jpeg and mpeg 编解码技术源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// vcDll.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "winuser.h"
#include <stdlib.h>
#include <stdio.h>
#include "vcDll.h"

#include "GViewCtl.h"
#include "GRecCtl.h"
#include "GChipCtl.h"

#define _DLL_FOR_SINGLE 0

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// 内部自定义函数
void GetAppPath( CString& pathName1);		// 获取程序当前路径
void GetINIParameters(DWORD dwSlotNumber);  // 读取当前通道的设置参数
void ModifyMpegFileName(DWORD dwSlotNumber, CTime curTime);  // 修改指定通道录像文件名称,其中加入指定时间

CONFIGINFO	_ConfigInfo[_MAX_SLOT_NUMBER];			// 保存各通道参数
CString	m_fileSavePath[_MAX_SLOT_NUMBER];			// 保存各通道存盘路径
CString	m_fileDelPath[_MAX_SLOT_NUMBER];			// 保存各通道的进行过期文件删除的指定路径
char _cRegistryPath[_REGISTRY_PATH_LENGTH];			// 硬件卡初始化用的注册路径


/////////////////////////////////////////////////////////////////////////////
// CVcDllApp

BEGIN_MESSAGE_MAP(CVcDllApp, CWinApp)
	//{{AFX_MSG_MAP(CVcDllApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CVcDllApp construction

CVcDllApp::CVcDllApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CVcDllApp object

CVcDllApp theApp;

// 启用VCD2000AV卡
int _stdcall DVS_InitRecAndView()
{
DWORD	_dwNumberOfSlots;
	
#ifdef _DLL_FOR_SINGLE 
	GetPrivateProfileString("Setup","RegistryPath","Software\\MPEG-I\\WMPEG200",_cRegistryPath,_REGISTRY_PATH_LENGTH,"1.ini");
	if (RECCTL_Init(NULL,&_dwNumberOfSlots,(LPBYTE)_cRegistryPath) != ERR_OK)
		return -1;

	for(  DWORD iLoop = 0; iLoop < _dwNumberOfSlots; iLoop++ )
		if ( RECCTL_SetBufferFunction(iLoop,VIEWCTL_HandleVideoBuffer) != ERR_OK)
			return -1;
	
	RECCTL_EnableSoundCard(FALSE);	//声卡不可用

#else
	if(( iReturnCode = RECCTL_Init(NULL, &_dwNumberOfSlots )) != ERR_OK )
		return -1;

	for(  DWORD iLoop = 0; iLoop < _dwNumberOfSlots; iLoop++ )
		if( RECCTL_SetBufferFunction(iLoop, (COMMON_PHandleBufferFunction) VIEWCTL_HandleVideoBuffer) != ERR_OK )
			return -1;

#endif

	if (VIEWCTL_Init(_cRegistryPath) != ERR_OK)
		return -1;

	if (_dwNumberOfSlots > _MAX_SLOT_NUMBER)
		_dwNumberOfSlots = _MAX_SLOT_NUMBER;

	return _dwNumberOfSlots;
}

// 关闭VCD2000AV卡
int _stdcall DVS_CloseRecAndView()
{
	VIEWCTL_Close();
	RECCTL_Close( );
	
	return 0;
}

//初始化一个通道
int _stdcall DVS_InitVideoDecoder( DWORD dwSlotNumber )
{

	GetINIParameters( dwSlotNumber);

	RECCTL_VIDEO_DECODER_CONFIG I2CConfig;

	I2CConfig.dwSlotNumber =dwSlotNumber;
	I2CConfig.iVideoStandard = (_ConfigInfo[dwSlotNumber].iVideoStandard == 0) ? MPJ_NTSC : MPJ_PAL;
	I2CConfig.iVideoSource = _ConfigInfo[dwSlotNumber].iInputSource;
	I2CConfig.iBrightness = _ConfigInfo[dwSlotNumber].iVideoBri + 128;
	I2CConfig.iContrast = _ConfigInfo[dwSlotNumber].iVideoCta;
	I2CConfig.iSaturation = _ConfigInfo[dwSlotNumber].iVideoSta;
	I2CConfig.iHue = _ConfigInfo[dwSlotNumber].iVideoHue;

	if (RECCTL_InitVideoDecoder(&I2CConfig) != ERR_OK)
		return -1;
	else
		return 0;
}

//打开一个新通道
int _stdcall DVS_NewSlot(DWORD dwSlotNumber, HWND hWnd )
{

	if ( RECCTL_SetWindowHandle(dwSlotNumber, hWnd) != ERR_OK)
		return -2;		
	
	if( DVS_InitVideoDecoder( dwSlotNumber ) != ERR_OK) //初始化出错
		return -1;

	return 0;
}

//在给定位置显示LVPT窗体,并创建View
int _stdcall DVS_ShowLVPTWindow(DWORD dwSlotNumber, HWND hW, int nL, int nT, int nW, int nH, int nSIF)
{
	CRect rect;

	VIEWCTL_DISPLAYINFO nDisplayInfo;

	if (_ConfigInfo[dwSlotNumber].iVideoStandard == 0) //NTSC
	{
		if (nSIF== 0) //SIF
		{
			nDisplayInfo.dwImageWidth	= 320;
			nDisplayInfo.dwImageHeight	= 240;
		}
		else
		{
			nDisplayInfo.dwImageWidth	= 160;
			nDisplayInfo.dwImageHeight	= 120;
		}
	}
	else // PAL
	{
		if (nSIF==0)
		{
			nDisplayInfo.dwImageWidth	= 352;
			nDisplayInfo.dwImageHeight	= 288;
		}
		else
		{
			nDisplayInfo.dwImageWidth	= 176;
			nDisplayInfo.dwImageHeight	= 144;
		}
	}

	nDisplayInfo.dwSlotNumber = dwSlotNumber;
	nDisplayInfo.hWnd = hW;

	rect.left = nL;
	rect.top = nT;
	rect.right = nL + nW;
	rect.bottom = nT + nH;
	
	nDisplayInfo.rOutputArea = rect;
	nDisplayInfo.bColorKeyRed = 0;
	nDisplayInfo.bColorKeyGreen = 0;
	nDisplayInfo.bColorKeyBlue = 255;		
	nDisplayInfo.dwDataType = DATATYPE_YUV420_DATA;
	
	int iR = VIEWCTL_CreateDisplay(nDisplayInfo);
	return iR ;
}

//开始LVPT
int _stdcall DVS_StartLVPT(DWORD dwSlotNumber, int nSIF)
{

	RECCTL_LVPT_CONFIG   LVPTConfig;

	LVPTConfig.dwSlotNumber = dwSlotNumber;

	LVPTConfig.lpLogoBuffer = NULL;
    LVPTConfig.fLogoEnable = FALSE;
	LVPTConfig.iLogoX = 0;
	LVPTConfig.iLogoY = 0;

	if (nSIF==0)
		LVPTConfig.Resolution = MPJ_SIF;  //0:SIF, 1:QSIF
	else
		LVPTConfig.Resolution = MPJ_QSIF;  //0:SIF, 1:QSIF

	LVPTConfig.VideoStandard = (_ConfigInfo[dwSlotNumber].iVideoStandard == 0) ? MPJ_NTSC : MPJ_PAL;
	LVPTConfig.StreamType = MPJ_VIDEO_STREAM;
	LVPTConfig.dwAudioBitRate = 224;
	LVPTConfig.dwAudioSampleRate = 44100;
	LVPTConfig.iAdjustAudioSamplesPeriodically=0;
	LVPTConfig.iDelayTicks = 0;

	if (RECCTL_LiveVideoPassThrough(&LVPTConfig) != ERR_OK )
		return -1;
	else
		return 0;
}

//暂停Capture,不关闭View
int _stdcall DVS_PauseLVPT( DWORD dwSlotNumber )
{

	RECCTL_StopCapture( dwSlotNumber );
	return 0;
}

//停止Capture,关闭View
int _stdcall DVS_StopLVPT( DWORD dwSlotNumber )
{

	RECCTL_StopCapture( dwSlotNumber );
	VIEWCTL_CloseDisplay(dwSlotNumber, TRUE); 
	return 0;
}

//暂停录像,不关闭View
int _stdcall DVS_PauseLVE( DWORD dwSlotNumber )
{

	CTime tCurTime = CTime::GetCurrentTime();
	
	RECCTL_StopCapture( dwSlotNumber );
	ModifyMpegFileName(dwSlotNumber, tCurTime);	//改变录像文件名
	
	return 0;
}

//停止录像,关闭View
int _stdcall DVS_StopLVE( DWORD dwSlotNumber )
{

	CTime tCurTime = CTime::GetCurrentTime();
	
	RECCTL_StopCapture( dwSlotNumber );
	VIEWCTL_CloseDisplay(dwSlotNumber, TRUE); 
	ModifyMpegFileName(dwSlotNumber, tCurTime);	//改变录像文件名

	RECCTL_EnableSoundCard(FALSE);
	return 0;
}

//在给定位置显示LVE窗体,并创建View
int _stdcall DVS_ShowLVEWindow(DWORD dwSlotNumber, HWND hW, int nL, int nT, int nW, int nH)
{
	CRect rect;

	VIEWCTL_DISPLAYINFO nDisplayInfo;

	if (_ConfigInfo[dwSlotNumber].iVideoStandard == 0) //NTSC
	{
		if (_ConfigInfo[dwSlotNumber].iPictureSize == 0) //SIF
		{
			nDisplayInfo.dwImageWidth  = 320;
			nDisplayInfo.dwImageHeight= 240;
		}
		else
		{
			nDisplayInfo.dwImageWidth  = 160;
			nDisplayInfo.dwImageHeight= 120;
		}
	}
	else // PAL
	{
		if (_ConfigInfo[dwSlotNumber].iPictureSize == 0) //SIF
		{
			nDisplayInfo.dwImageWidth  = 352;	//352;
			nDisplayInfo.dwImageHeight= 288;//	288;
		}
		else
		{
			nDisplayInfo.dwImageWidth  = 176;
			nDisplayInfo.dwImageHeight= 144;
		}
	}

	nDisplayInfo.dwSlotNumber = dwSlotNumber;
	nDisplayInfo.hWnd = hW;

	rect.left = nL;
	rect.top = nT;
	rect.right = nL + nW;
	rect.bottom = nT + nH;
	
	nDisplayInfo.rOutputArea = rect;
	nDisplayInfo.bColorKeyRed = 0;
	nDisplayInfo.bColorKeyGreen = 0;
	nDisplayInfo.bColorKeyBlue = 255;		
	nDisplayInfo.dwDataType = DATATYPE_MPEG1_VIDEO_DATA;
	
	int iR = VIEWCTL_CreateDisplay(nDisplayInfo);

	return iR ;
}

//开始LVE
int _stdcall DVS_StartLVE(DWORD dwSlotNumber )

⌨️ 快捷键说明

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