📄 vcdll.cpp
字号:
// 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 + -