diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log index 22188a1..0204813 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -1462,3 +1462,22 @@ Init:Open device succeed . _start_machine Exit: Exit_SO7Usb Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Destruct Cso7_Proto. +Construct Cso7_Proto. +Destruct Cso7_Proto. diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc index 9af9bca..060de3b 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc @@ -721,6 +721,25 @@ BEGIN LTEXT "Standard",IDC_STATIC,523,68,30,8 END +IDD_SO7_VIDEOCARD_SV4000E DIALOGEX 0, 0, 488, 316 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "SV4000E视频卡" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "开始",IDOK,372,298,50,14 + PUSHBUTTON "退出",IDCANCEL,435,298,50,14 + CONTROL "彩色图像",IDC_RADIO_SV4000E_RGB,"Button",BS_AUTORADIOBUTTON | WS_GROUP,435,49,48,10 + CONTROL "黑白图像",IDC_RADIO_SV4000E_GRAY,"Button",BS_AUTORADIOBUTTON,435,67,48,10 + CONTROL "垂直镜像",IDC_SV4000E_CHECK_MIRROR_VERTICALLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,435,93,48,10 + PUSHBUTTON "保存图片",IDC_BUTTON_SV4000E_SAVEFILE,435,117,50,14 + GROUPBOX "通道选择",IDC_STATIC,438,145,43,87 + CONTROL "",IDC_STATIC_SV4000E_PICTURE,"Static",SS_BLACKFRAME | NOT WS_VISIBLE,225,300,71,12 + CONTROL "1",IDC_RADIO_SV4000E_CHANNEL1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,451,162,20,10 + CONTROL "2",IDC_RADIO_SV4000E_CHANNEL2,"Button",BS_AUTORADIOBUTTON,451,179,20,10 + CONTROL "3",IDC_RADIO_SV4000E_CHANNEL3,"Button",BS_AUTORADIOBUTTON,451,196,20,10 + CONTROL "4",IDC_RADIO_SV4000E_CHANNEL4,"Button",BS_AUTORADIOBUTTON,451,213,20,10 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -827,6 +846,15 @@ BEGIN TOPMARGIN, 7 BOTTOMMARGIN, 247 END + + IDD_SO7_VIDEOCARD_SV4000E, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 485 + VERTGUIDE, 435 + TOPMARGIN, 7 + BOTTOMMARGIN, 312 + END END #endif // APSTUDIO_INVOKED diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp index ed9a716..f543444 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp @@ -19,6 +19,8 @@ #include "Videocard_SV2000E.h" #include "..\..\..\Videocard\TC4000\Sa7134Capture.h" #include "Videocard_TC4000.h" +#include "..\..\..\Videocard\SV4000E\SV4000E.h" +#include "Videocard_SV4000E.h" #endif //_RELEASE_FULL_VERSION #include "SO7_UtilDlg.h" @@ -221,6 +223,14 @@ void CSo7_Option::OnBnClickedOk() delete pVideocard_SV2000E; #endif //_RELEASE_FULL_VERSION } + else if (((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SV4000E))->GetCheck()) + { +#ifdef _RELEASE_FULL_VERSION + CVideocard_SV4000E* pVideocard_SV4000E=new CVideocard_SV4000E(); + pVideocard_SV4000E->DoModal(); + delete pVideocard_SV4000E; +#endif //_RELEASE_FULL_VERSION + } else if (((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_TC4000))->GetCheck()) { #ifdef _RELEASE_FULL_VERSION diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj index 1a93509..77c270e 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj @@ -43,7 +43,7 @@ Application - Dynamic + Static Unicode true @@ -142,7 +142,7 @@ $(IntDir);%(AdditionalIncludeDirectories) - ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\SV2000E\dataAcq.lib;..\..\..\Videocard\SV2000E\DXMediaCap.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;%(AdditionalDependencies) + ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;..\..\..\Videocard\SV4000E\dataAcq.lib;..\..\..\Videocard\SV4000E\DXMediaCap.lib;%(AdditionalDependencies) true Windows MachineX86 @@ -185,7 +185,7 @@ true WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_WARNINGS;_RELEASE_FULL_VERSION;%(PreprocessorDefinitions) false - MultiThreadedDLL + MultiThreaded true Use Level4 @@ -351,6 +351,7 @@ + @@ -407,6 +408,7 @@ + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters index 3b180de..098bad4 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters @@ -133,6 +133,9 @@ Sources Files + + Sources Files + @@ -297,6 +300,9 @@ Header Files + + Header Files + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV4000E.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV4000E.cpp new file mode 100644 index 0000000..a8f618c --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV4000E.cpp @@ -0,0 +1,558 @@ +// Videocard_SV4000E.cpp : implementation file +// + +#include "stdafx.h" +#include "resource.h" +#include "VideoCardDefine.h" +#include "..\..\..\Videocard\SV4000E\SV4000E.h" +#include "Videocard_SV4000E.h " +#include "afxdialogex.h" + +static const long BrightnessDefault = 5000; +static const long ContrastDefault = 5000; +static const long SaturationDefault = 5000; +static const long HueDefault = 5000; +static const long SharpnessDefault = 4; + +static BYTE g_DataBuffer[640*480*2]; +static BYTE g_DataBuffer_NAV[640*480*2]; + + +// CVideocard_SV4000E dialog + +IMPLEMENT_DYNAMIC(CVideocard_SV4000E, CDialog) + + CVideocard_SV4000E::CVideocard_SV4000E(CWnd* pParent /*=NULL*/) + : CDialog(CVideocard_SV4000E::IDD, pParent) +{ + m_dwCard=0; + m_nDevNum=0; + m_bMirror=FALSE; + m_ConvertColorType=YUY2TORGB; + m_bSaveFile=FALSE; +} + +CVideocard_SV4000E::~CVideocard_SV4000E() +{ +} + +void CVideocard_SV4000E::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(CVideocard_SV4000E, CDialog) + ON_WM_TIMER() + ON_BN_CLICKED(IDC_RADIO_SV4000E_RGB, &CVideocard_SV4000E::OnBnClickedRadioSV4000ERgb) + ON_BN_CLICKED(IDC_RADIO_SV4000E_GRAY, &CVideocard_SV4000E::OnBnClickedRadioSV4000EGray) + ON_BN_CLICKED(IDC_SV4000E_CHECK_MIRROR_VERTICALLY, &CVideocard_SV4000E::OnBnClickedCheckSV4000EMirrorVertically) + ON_BN_CLICKED(IDC_BUTTON_SV4000E_SAVEFILE, &CVideocard_SV4000E::OnBnClickedButtonSV4000ESavefile) + ON_BN_CLICKED(IDCANCEL, &CVideocard_SV4000E::OnBnClickedCancel) + ON_BN_CLICKED(IDOK, &CVideocard_SV4000E::OnBnClickedOk) + ON_BN_CLICKED(IDC_RADIO_SV4000E_CHANNEL1, &CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel1) + ON_BN_CLICKED(IDC_RADIO_SV4000E_CHANNEL2, &CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel2) + ON_BN_CLICKED(IDC_RADIO_SV4000E_CHANNEL3, &CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel3) + ON_BN_CLICKED(IDC_RADIO_SV4000E_CHANNEL4, &CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel4) +END_MESSAGE_MAP() + + +// CVideocard_SV4000E message handlers +//==================================== +BOOL CVideocard_SV4000E::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // Add "About..." menu item to system menu. + + // IDM_ABOUTBOX must be in the system command range. + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) + { + BOOL bNameValid; + CString strAboutMenu; + bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); + ASSERT(bNameValid); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + ((CButton *)GetDlgItem(IDC_RADIO_SV4000E_RGB))->SetCheck(TRUE); + ((CButton *)GetDlgItem(IDC_RADIO_SV4000E_GRAY))->SetCheck(FALSE); + bInitSdk=123; + m_Channel=0; + ((CButton *)GetDlgItem(IDC_RADIO_SV4000E_CHANNEL1))->SetCheck(TRUE); + ((CButton *)GetDlgItem(IDC_RADIO_SV4000E_CHANNEL2))->SetCheck(FALSE); + ((CButton *)GetDlgItem(IDC_RADIO_SV4000E_CHANNEL3))->SetCheck(FALSE); + ((CButton *)GetDlgItem(IDC_RADIO_SV4000E_CHANNEL4))->SetCheck(FALSE); + + return TRUE; // return TRUE unless you set the focus to a control +} +//=================================================== +void CVideocard_SV4000E::OnBnClickedOk() +{ + for (int i=0;i<4;i++) + { + m_device[i]=NULL; + } + LoadVideocard(); + SetTimer(1,50,NULL); + GetDlgItem(IDOK)->EnableWindow(false); +} +//=================================================== +void CVideocard_SV4000E::OnBnClickedCancel() +{ + KillTimer(1); + UnloadVideocard(); + CDialog::OnCancel(); +} +//=================================================== +void CVideocard_SV4000E::OnBnClickedRadioSV4000ERgb() +{ + m_ConvertColorType=YUY2TORGB; +} + +//=================================================== +void CVideocard_SV4000E::OnBnClickedRadioSV4000EGray() +{ + m_ConvertColorType=YUY2TOGRAY; +} + +//=================================================== +void CVideocard_SV4000E::OnBnClickedCheckSV4000EMirrorVertically() +{ + if (((CButton *)GetDlgItem(IDC_SV4000E_CHECK_MIRROR_VERTICALLY))->GetCheck()) + { + m_bMirror=TRUE; + } + else + { + m_bMirror=FALSE; + } +} +//=================================================== +void CVideocard_SV4000E::OnBnClickedButtonSV4000ESavefile() +{ + CString CTmpString; + CString PathName; + CString path_and_fileName; + + PathName=_T("SV4000E.bmp"); + CString szFilter=_T("BMP Files(*.bmp)|*.bmp|ALL Files(*.*)|*.*||"); + CFileDialog fdlg(FALSE,_T("BMP"),PathName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter); + + if( fdlg.DoModal()==IDOK) + { + m_SaveFile=fdlg.GetPathName(); + } + delete fdlg; + m_bSaveFile=TRUE; +} +//=================================================== +void CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel1() +{ +#ifdef _RELEASE_FULL_VERSION + m_status=DXStopRawVideoCallback(m_device[m_Channel]); + m_Channel=0; + m_status=DXSetRawVideoCallback(m_device[m_Channel], SV4000EAPrcVidCapCallBack, this); + m_status=DXStartRawVideoCallback(m_device[m_Channel],SV4000EAPrcVidCapCallBack,this); + //m_status=DXStartPreview(m_device[m_Channel], GetDlgItem(IDC_STATIC_SV4000E_PICTURE)->GetSafeHwnd(), NULL, 0); + + +#endif //_RELEASE_FULL_VERSION +} +//=================================================== +void CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel2() +{ +#ifdef _RELEASE_FULL_VERSION + m_status=DXStopRawVideoCallback(m_device[m_Channel]); + m_Channel=1; + m_status=DXSetRawVideoCallback(m_device[m_Channel], SV4000EAPrcVidCapCallBack, this); + m_status=DXStartRawVideoCallback(m_device[m_Channel],SV4000EAPrcVidCapCallBack,this); + //m_status=DXStartPreview(m_device[m_Channel], GetDlgItem(IDC_STATIC_SV4000E_PICTURE)->GetSafeHwnd(), NULL, 0); + +#endif //_RELEASE_FULL_VERSION +} +//=================================================== +void CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel3() +{ +#ifdef _RELEASE_FULL_VERSION + m_status=DXStopRawVideoCallback(m_device[m_Channel]); + m_Channel=2; + m_status=DXSetRawVideoCallback(m_device[m_Channel], SV4000EAPrcVidCapCallBack, this); + m_status=DXStartRawVideoCallback(m_device[m_Channel],SV4000EAPrcVidCapCallBack,this); + //m_status=DXStartPreview(m_device[m_Channel], GetDlgItem(IDC_STATIC_SV4000E_PICTURE)->GetSafeHwnd(), NULL, 0); + +#endif //_RELEASE_FULL_VERSION +} +//=================================================== +void CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel4() +{ +#ifdef _RELEASE_FULL_VERSION + m_status=DXStopRawVideoCallback(m_device[m_Channel]); + m_Channel=3; + m_status=DXSetRawVideoCallback(m_device[m_Channel], SV4000EAPrcVidCapCallBack, this); + m_status=DXStartRawVideoCallback(m_device[m_Channel],SV4000EAPrcVidCapCallBack,this); + //m_status=DXStartPreview(m_device[m_Channel], GetDlgItem(IDC_STATIC_SV4000E_PICTURE)->GetSafeHwnd(), NULL, 0); +#endif //_RELEASE_FULL_VERSION +} + +//======================================= +BOOL CVideocard_SV4000E::LoadVideocard() +{ + BOOL rStatus(FALSE); +#ifdef _RELEASE_FULL_VERSION + bInitSdk=DXInitialize(); + + m_nDevNum = DXGetDeviceCount(); + + if ((bInitSdk==0)&&(m_nDevNum>=4)) + { + for (int i=0;i255)Color_R=255; + if(Color_R<0)Color_R=0; + pDstData[x+2]=static_cast(Color_R); + + + Color_G=(1164*(_pSrcData[lCnt2*2]-16)-813*(_pSrcData[lCnt3+1]-128)-392*(_pSrcData[lCnt3+3]-128))/1000; + if(Color_G>255)Color_G=255; + if(Color_G<0)Color_G=0; + pDstData[x+1]=static_cast(Color_G); + + + Color_B=(1164*(_pSrcData[lCnt2*2]-16)+2017*(_pSrcData[lCnt3+1]-128))/1000; + if(Color_B>255)Color_B=255; + if(Color_B<0)Color_B=0; + pDstData[x]=static_cast(Color_B); + + break; + } + case RGB24TOGRAY: + { + pDstData[x+2]=(_pSrcData[lCnt2*3+2]+_pSrcData[lCnt2*3+1]+_pSrcData[lCnt2*3])/3; + pDstData[x+1]=(_pSrcData[lCnt2*3+2]+_pSrcData[lCnt2*3+1]+_pSrcData[lCnt2*3])/3; + pDstData[x]=(_pSrcData[lCnt2*3+2]+_pSrcData[lCnt2*3+1]+_pSrcData[lCnt2*3])/3; + break; + } + case YUY2TOGRAY: + { + pDstData[x+2]=_pSrcData[2*lCnt2]; + pDstData[x+1]=_pSrcData[2*lCnt2]; + pDstData[x]=_pSrcData[2*lCnt2]; + break; + } + } + if((lCnt1%2)==1) + lCnt3=lCnt3+4; + lCnt2++; + lCnt1++; + } + } +} +//================================================================ +BOOL CVideocard_SV4000E::SaveBitmapToFile(const CBitmap& _bitmap, CString _lpFileName) +{ + HBITMAP hBitmap; // 为刚才的屏幕位图句柄 + HDC hDC; //设备描述表 + int iBits; //当前显示分辨率下每个像素所占字节数 + WORD wBitCount(24); //位图中每个像素所占字节数 + DWORD dwPaletteSize = 0, //定义调色板大小 + dwBmBitsSize, //位图中像素字节大小 + dwDIBSize, //位图文件大小 + dwWritten; //写入文件字节数 + BITMAP Bitmap; //位图属性结构 + BITMAPFILEHEADER bmhFiledr; //位图文件头结构 + BITMAPINFOHEADER bi; //位图信息头结构 + LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 + HANDLE hFile, //定义文件 + hDib, //分配内存句柄 + hPal, //调色板句柄 + hOldPal = NULL; + + //计算位图文件每个像素所占字节数 + hBitmap = (HBITMAP)_bitmap; + hDC = CreateDC(_T("DISPLAY"),NULL,NULL,NULL); + iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); + DeleteDC(hDC); + + if (iBits <= 1) + wBitCount = 1; + else if (iBits <= 4) + wBitCount = 4; + else if (iBits <= 8) + wBitCount = 8; + else if (iBits <= 24) + wBitCount = 24; + else if (iBits <= 32) + wBitCount = 32; + + //计算调色板大小 + if (wBitCount <= 8) + dwPaletteSize = (1 << wBitCount) * sizeof (RGBQUAD); + + //设置位图信息头结构 + GetObject(hBitmap, sizeof (BITMAP), (LPSTR)&Bitmap); + bi.biSize = sizeof (BITMAPINFOHEADER); + bi.biWidth = Bitmap.bmWidth; + bi.biHeight = Bitmap.bmHeight; + bi.biPlanes = 1; + bi.biBitCount = wBitCount; + bi.biCompression = BI_RGB; + bi.biSizeImage = 0; + bi.biXPelsPerMeter = 0; + bi.biYPelsPerMeter = 0; + bi.biClrUsed = 0; + bi.biClrImportant = 0; + + dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31) / 32) * 4 * Bitmap.bmHeight; + + //为位图内容分配内存 + hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof (BITMAPINFOHEADER)); + lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); + *lpbi = bi; + + // 处理调色板 + hPal = GetStockObject(DEFAULT_PALETTE); + if (hPal) + { + hDC = ::GetDC(NULL); + hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); + RealizePalette(hDC); + } + + // 获取该调色板下新的像素值 + GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof (BITMAPINFOHEADER) + dwPaletteSize, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS); + + //恢复调色板 + if (hOldPal) + { + SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); + RealizePalette(hDC); + ::ReleaseDC(NULL, hDC); + } + + //创建位图文件 + hFile = CreateFile(_lpFileName, GENERIC_WRITE, + 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + return FALSE; + + // 设置位图文件头 + bmhFiledr.bfType = 0x4D42; // "BM" + dwDIBSize = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; + bmhFiledr.bfSize = dwDIBSize; + bmhFiledr.bfReserved1 = 0; + bmhFiledr.bfReserved2 = 0; + bmhFiledr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER) + (DWORD)sizeof (BITMAPINFOHEADER) + dwPaletteSize; + + // 写入位图文件头 + WriteFile(hFile, (LPSTR)&bmhFiledr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); + + // 写入位图文件其余内容 + WriteFile(hFile, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL); + + //清除 + GlobalUnlock(hDib); + GlobalFree(hDib); + CloseHandle(hFile); + + return TRUE; +}; +//================================================================ +void CVideocard_SV4000E::OnPaint() +{ + CDC* dc= this->GetDC(); + int nMode; + CDC* pMemDC = new CDC; + CBitmap pBitBmp; + CBitmap pBitBmpNav; + + ConvertVideoSubType(m_ImageBuffer,g_DataBuffer,m_ConvertColorType,m_bMirror); + + BYTE *pData = (BYTE *)m_ImageBuffer.ScanLine; + BITMAPINFO bmpInfo; + bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmpInfo.bmiHeader.biWidth = 640; + bmpInfo.bmiHeader.biHeight = 480; + bmpInfo.bmiHeader.biPlanes = 1; + bmpInfo.bmiHeader.biBitCount = 24;//X位色 + bmpInfo.bmiHeader.biCompression = BI_RGB; + bmpInfo.bmiHeader.biSizeImage = 0; + bmpInfo.bmiHeader.biXPelsPerMeter = 30000; + bmpInfo.bmiHeader.biYPelsPerMeter = 30000; + bmpInfo.bmiHeader.biClrUsed = 0; + bmpInfo.bmiHeader.biClrImportant = 0; + + pBitBmp.CreateCompatibleBitmap(dc,640,480); + SetDIBits(dc->m_hDC,pBitBmp,0,480,pData,&bmpInfo,DIB_RGB_COLORS); + + if (m_bSaveFile) + { + SaveBitmapToFile(pBitBmp,m_SaveFile); + //CImage imgTemp; + //imgTemp.Attach(pBitBmp.operator HBITMAP()); + //imgTemp.Save(m_SaveFile); + m_bSaveFile=FALSE; + } + + if (!pMemDC->m_hDC) + { + pMemDC->CreateCompatibleDC(dc); + } + CBitmap* pOldBitmap = pMemDC->SelectObject(&pBitBmp); + nMode = pMemDC->SetBkMode(TRANSPARENT); + + dc->BitBlt(0, 0, 640, 480, pMemDC,0,0, SRCCOPY); + + pMemDC->SetBkMode(nMode); + pMemDC->SelectObject(pOldBitmap); + ReleaseDC(pMemDC); + delete pMemDC; + ReleaseDC(dc); +} +//================================================================================================ +void CVideocard_SV4000E::OnTimer(UINT_PTR nIDEvent) +{ + switch(nIDEvent) + { + case 1: + { + OnPaint(); + break; + } + } + + CDialog::OnTimer(nIDEvent); +} + +//==================================SV4000E===================================== +unsigned CALLBACK SV4000EAPrcVidCapCallBack(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context) +{ + UNREFERENCED_PARAMETER(colorSpace); + UNREFERENCED_PARAMETER(context); + UNREFERENCED_PARAMETER(bytesWidth); + memcpy(g_DataBuffer,(BYTE*)buffer,width*height*2); + return 0; +} +//==================================SV4000E===================================== +unsigned CALLBACK SV4000EAPrcVidCapCallBackNav(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context) +{ + UNREFERENCED_PARAMETER(colorSpace); + UNREFERENCED_PARAMETER(context); + UNREFERENCED_PARAMETER(bytesWidth); + memcpy(g_DataBuffer_NAV,(BYTE*)buffer,width*height*2); + return 0; +}; + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV4000E.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV4000E.h new file mode 100644 index 0000000..3ca620a --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV4000E.h @@ -0,0 +1,58 @@ +#pragma once + +// CVideocard_SV4000E dialog +unsigned CALLBACK SV4000EAPrcVidCapCallBack(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context); +unsigned CALLBACK SV4000EAPrcVidCapCallBackNav(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context); + +class CVideocard_SV4000E : public CDialog +{ + DECLARE_DYNAMIC(CVideocard_SV4000E) + +public: + CVideocard_SV4000E(CWnd* pParent = NULL); // standard constructor + virtual ~CVideocard_SV4000E(); + + // Dialog Data + enum { IDD = IDD_SO7_VIDEOCARD_SV4000E }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual BOOL OnInitDialog(); + afx_msg void OnPaint(); + afx_msg void OnTimer(UINT_PTR nIDEvent); + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedRadioSV4000ERgb(); + afx_msg void OnBnClickedRadioSV4000EGray(); + afx_msg void OnBnClickedCheckSV4000EMirrorVertically(); + afx_msg void OnBnClickedButtonSV4000ESavefile(); + afx_msg void OnBnClickedCancel(); + afx_msg void OnBnClickedOk(); +protected: + unsigned int m_status; + device_handle m_device[4]; + + int m_nDevNum; + DWORD m_dwCard; + Image_Buffer m_ImageBuffer; + Image_Buffer m_ImageBuffer_Nav; + ConvertColorType m_ConvertColorType; + BOOL m_bMirror; + BOOL m_bSaveFile; + CString m_SaveFile; + unsigned int m_Channel; + unsigned int bInitSdk; +public: + BOOL LoadVideocard(); + BOOL UnloadVideocard(); + void OpenDevice(unsigned int _DevNo,device_handle &_OpenedDevice); + void CloseDevice(device_handle _Device); + void ConvertVideoSubType(const Image_Buffer& _ImageBuffer, BYTE *pSrcData,ConvertColorType _type,BOOL _bMirror); + BOOL SaveBitmapToFile(const CBitmap& bitmap, CString lpFileName); + + afx_msg void OnBnClickedRadioSV4000EChannel1(); + afx_msg void OnBnClickedRadioSV4000EChannel2(); + afx_msg void OnBnClickedRadioSV4000EChannel3(); + afx_msg void OnBnClickedRadioSV4000EChannel4(); + +}; \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h index 2b55c23..52f7fb9 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -45,6 +45,7 @@ #define IDD_SO7_VIDEOCARD_TC4000 166 #define IDD_SO7_UTIL_MANUAL_MACHINE 167 #define IDD_SO7_UTIL_VERIFICATION_ALGORITHM 168 +#define IDD_SO7_VIDEOCARD_SV4000E 169 #define IDC_BUTTON_INIT_MVUSB 1001 #define IDC_BUTTON_START_MACHINE 1002 #define IDC_BUTTON_START_POLL_58 1004 @@ -758,7 +759,16 @@ #define IDC_RADIO_SPEED_GEAR5 1666 #define IDC_EDIT_SO7_READ_IO_STATUS_ADDRESS 1667 #define IDC_RADIO_VIDEOCARD_SV4000E 1668 +#define IDC_RADIO_SV4000E_RGB 1669 #define IDC_MFCBUTTON_STATUS_IN_PORT6 1670 +#define IDC_RADIO_SV4000E_GRAY 1670 +#define IDC_RADIO_SV4000E_CHANNEL1 1671 +#define IDC_RADIO_SV4000E_CHANNEL2 1672 +#define IDC_RADIO_SV4000E_CHANNEL3 1673 +#define IDC_RADIO_SV4000E_CHANNEL4 1674 +#define IDC_SV4000E_CHECK_MIRROR_VERTICALLY 1675 +#define IDC_BUTTON_SV4000E_SAVEFILE 1676 +#define IDC_STATIC_SV4000E_PICTURE 1677 // Next default values for new objects // @@ -766,7 +776,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 169 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1669 +#define _APS_NEXT_CONTROL_VALUE 1678 #define _APS_NEXT_SYMED_VALUE 104 #endif #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index 9d9e935..1b9fbf0 100644 Binary files a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo and b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo differ diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/DXMediaCap.h b/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/DXMediaCap.h new file mode 100644 index 0000000..03a69b6 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/DXMediaCap.h @@ -0,0 +1,524 @@ + +#ifndef __DXMEDIACAP_2011__ +#define __DXMEDIACAP_2011__ + +#include "datastru.h" + +/* +描述: + 初始化 SDK ,必须在调用其他函数之前调用 +参数: + 无 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXInitialize(); +void __stdcall DXUninitialize(); + +/* +描述: + 获取初始化成功的设备总数 +参数: + 无 +返回值: + 匹配的设备总数 +// */ +unsigned __stdcall DXGetDeviceCount(); + +/* +描述: + 枚举音视频编码过滤器 +参数: + devTags - [out] 用于返回获得的过滤器的 TAG 的数组 + num - [in/out] 指定 devTags 数组的元素个数,返回时则是实际上获得的过滤器的 TAG 的个数 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXEnumVideoCodecs(PDEVICE_TAG devTags, unsigned& num); +unsigned __stdcall DXEnumAudioCodecs(PDEVICE_TAG devTags, unsigned& num); + +/* +描述: + 枚举视频捕捉设备过滤器 +参数: + devTags - [out] 用于返回获得的过滤器的 TAG 的数组 + num - [in/out] 指定 devTags 数组的元素个数,返回时则是实际上获得的过滤器的 TAG 的个数 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXEnumVideoDevices(PDEVICE_TAG devTags, unsigned& num); + +/* +描述: + 枚举音频捕捉和渲染设备过滤器 +参数: + devTags - [out] 用于返回获得的过滤器的 TAG 的数组 + num - [in/out] 指定 devTags 数组的元素个数,返回时则是实际上获得的过滤器的 TAG 的个数 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXEnumAudioDevices(PDEVICE_TAG devTags, unsigned& num); +unsigned __stdcall DXEnumSoundDevices(PDEVICE_TAG devTags, unsigned& num); + +/* +描述: + 占用采集设备 +参数: + idx - [in] 设备在枚举过程中的序号 + err - [out] 返回错误代码 +返回值: + 成功则返回设备句柄,否则返回 NULL。可通过 err 获得错误代码 +// */ +device_handle __stdcall DXOpenDevice(unsigned idx, unsigned* err = NULL); +void __stdcall DXCloseDevice(device_handle device); + +/* +描述: + 将属性页显示在制定窗体的指定区域 +参数: + device - [in] 设备句柄 + attrID - [in] 属性类别 + hOwner - [in] 父窗体的句柄。NULL - 隐藏属性页 + rect - [in] 在父窗体上显示的区域。NULL - 表示父窗体的整个客户区 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXShowDeviceAttr(device_handle device, unsigned attrID, HWND hOwner, RECT* rect); + +// unsigned __stdcall DXShowDeviceAttr(device_handle device, HWND XBar, HWND Capture, HWND stream, HWND codec); + +/* +描述: + 获取视频属性 +参数: + device - [in] 设备句柄 + standard - [out] 视频制式 + colorspace - [out] 色彩空间 + width - [out] 视频宽度(单位:像素) + height - [out] 视频高度(单位:像素) + framerate - [out] 视频帧率(单位:帧/秒) +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXGetVideoPara(device_handle device, unsigned& standard, unsigned& colorspace, + unsigned& width, unsigned& height, float& framerate); + +/* +描述: + 设置视频属性 +参数: + device - [in] 设备句柄 + standard - [in] 视频制式 + colorspace - [in] 色彩空间 + width - [in] 视频宽度(单位:像素) + height - [in] 视频高度(单位:像素) + framerate - [in] 视频帧率(单位:帧/秒) +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetVideoPara(device_handle device, unsigned standard, unsigned colorspace, + unsigned width, unsigned height, float framerate); + +/* +描述: + 获取显示属性的取值范围、默认值、步长、标志 +参数: + device - [in] 设备句柄 + paraType - [in] 参数类型 + 0 - 亮度,1 - 对比度,2 - 饱和度,3 - 色度,4 - 锐度 + pMin - [in] 最小值 + pMax - [in] 最大值 + pSteppingDelta - [in] 步长 + pDefault - [in] 默认值 + pCapsFlags - [in] 自动/手动标志 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXGetDisplayParaRange(device_handle device, unsigned paraType, + long* pMin, long* pMax, long* pSteppingDelta, long* pDefault, long* pCapsFlags); + +/* +描述: + 获取显示属性 +参数: + device - [in] 设备句柄 + paraType - [in] 参数类型 + 0 - 亮度,1 - 对比度,2 - 饱和度,3 - 色度,4 - 锐度 + value - [out] 参数值 + flag - [out] 自动/手动标志 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXGetDisplayPara(device_handle device, unsigned paraType, long& value, long& flags); + +/* +描述: + 设置显示属性 +参数: + device - [in] 设备句柄 + paraType - [in] 参数类型 + 0 - 亮度,1 - 对比度,2 - 饱和度,3 - 色度,4 - 锐度 + value - [in] 参数值 + flag - [in] 自动/手动标志 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetDisplayPara(device_handle device, unsigned paraType, long value, long flags); + +/* +描述: + 获取视频编码器属性 +参数: + device - [in] 设备句柄 + mode - [out] 编码模式 + bitrate - [out] 码率(单位:kbps) + keyinterval - [out] 关键帧间隔 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXGetVideoCodecPara(device_handle device, unsigned& mode, unsigned& bitrate, unsigned& keyinterval); + +/* +描述: + 设置视频编码器属性 +参数: + device - [in] 设备句柄 + mode - [in] 编码模式 + bitrate - [in] 码率(单位:kbps) + keyinterval - [in] 关键帧间隔 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetVideoCodecPara(device_handle device, unsigned mode, unsigned bitrate, unsigned keyinterval); + +/* +描述: + 获取设备当前选择的端子和包含的输入端子 +参数: + device - [in] 设备句柄 + curSource - [out] 当前选择的输入端子的序号。NULL - 忽略 + sources - [out] 包含的输入端子的类型数组(比如:S-VIDEO、DV...)。NULL - 忽略 + num - [in/out] 端子数量。NULL - 忽略,此时尽可获取当前选择的输入端子 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXGetVideoSources(device_handle device, unsigned* curSource, unsigned* sources = NULL, unsigned char* num = NULL); + +/* +描述: + 设置设备的输入端子 +参数: + device - [in] 设备句柄 + source - [in] 当前选择的输入端子的序号 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetVideoSource(device_handle device, unsigned source); + +/* +描述: + 获取设备的信号状态 +参数: + device - [in] 设备句柄 + signal - [out] 信号状态。0 - 信号丢失;1 - 信号正常 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXGetSignalPresent(device_handle device, unsigned& signal); + +/* +描述: + 控制设备运行状态 +参数: + device - [in] 设备句柄 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXDeviceRun(device_handle device); +unsigned __stdcall DXDevicePause(device_handle device); +unsigned __stdcall DXDeviceStop(device_handle device); + +/* +描述: + 获取设备运行状态 +参数: + device - [in] 设备句柄 + state - [out] 设备运行状态 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXGetDeviceState(device_handle device, unsigned& state); + +/* +描述: + 将视频显示在指定窗体的矩形区域内 +参数: + device - [in] 设备句柄 + hWnd - [in] 显示视频的窗体句柄。NULL - 停止显示视频 + rect - [in] 视频显示的矩形区域。NULL - 占用整个窗体 + vmrtype - [in] 该保留参数。(准备做指定显示过滤器只用) +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXStartPreview(device_handle device, HWND hWnd, PRECT rect, unsigned vmrtype); + +/* +描述: + 停止预览 +参数: + device - [in] 设备句柄 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXStopPreview(device_handle device); + +/* +描述: + 冻结视频显示部分 +参数: + device - [in] 设备句柄 + bFreeze - [in] TRUE - 冻结显示,FALSE - 解冻显示 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXFreezePreview(device_handle device, BOOL bFreeze); + +/* +描述: + 检查设备是否包含音频 +参数: + device - [in] 设备句柄 + bHasAudio - [out] TRUE - 包含音频,FALSE - 没有音频 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXHasAudio(device_handle device, BOOL& bHasAudio); + +/* +描述: + 为设备分配音频采集设备。 + 注意:!!! 只能在 state_stopped 状态下调用 +参数: + device - [in] 设备句柄 + bSound - [in] TRUE - 开始声音输出,FALSE - 终止声音输出 + audioDevice - [in] 音频采集设备。NULL - 使用设备自带的音频 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetAudioDevice(device_handle device, PDEVICE_TAG audioDevice = NULL); + +/* +描述: + 开始或者终止声音输出。 + 注意:!!! 只有开始了声音输出,静音操作、音量调节、录像时包含音频等操作才能成功 +参数: + device - [in] 设备句柄 + bSound - [in] TRUE - 开始声音输出,FALSE - 终止声音输出 + soundDevice - [in] 声音输出设备。NULL - 使用默认设备 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetSoundOut(device_handle device, BOOL bSound/*, PDEVICE_TAG soundDevice = NULL*/); + +/* +描述: + 静音操作 +参数: + device - [in] 设备句柄 + bMute - [in] TRUE - 静音,FALSE - 非静音 +返回值: + 0 - 成功;失败则返回错误代码,一般失败原因是因为没有开始声音输出 +// */ +unsigned __stdcall DXEnableMute(device_handle device, BOOL bMute); + +/* +描述: + 设置音量和平衡 +参数: + device - [in] 设备句柄 + volume - [in] 音量大小,取值范围(0, 100] + balance - [in] 左右平衡,取值范围[-10, 10],负数表示左声道强,正数表述右声道强,0 - 左右平衡 + 注意:!!! NULL - 表示不设置平衡 +返回值: + 0 - 成功;失败则返回错误代码,一般失败原因是因为没有开始声音输出 +// */ +unsigned __stdcall DXSetAudioVolume(device_handle device, unsigned char volume, unsigned char* const balance = NULL); + +/* +描述: + 获取音量和平衡 +参数: + device - [in] 设备句柄 + volume - [out] 音量大小,取值范围(0, 100] + 注意:!!! NULL - 表示不获取音量 + balance - [out] 左右平衡,取值范围[-10, 10],负数表示左声道强,正数表述右声道强,0 - 左右平衡 + 注意:!!! NULL - 表示不获取平衡 +返回值: + 0 - 成功;失败则返回错误代码,一般失败原因是因为没有开始声音输出 +// */ +unsigned __stdcall DXGetAudioVolume(device_handle device, unsigned char* volume, unsigned char* balance = NULL); + +/* +描述: + 更换视频编码器 + 注意:!!! 当正在进行录像时,则操作失败 +参数: + device - [in] 设备句柄 + videoEncoder - [in] 视频编码器的 TAG,NULL - 表示不用编码,即录像时采用原始数据 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetVideoCodec(device_handle device, PDEVICE_TAG videoEncoder); + +/* +描述: + 更换音频编码器 + 注意:!!! 当正在进行录像时,则操作失败 +参数: + device - [in] 设备句柄 + audioEncoder - [in] 音频编码器的 TAG,NULL - 表示不用编码,即录像时采用原始数据 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetAudioCodec(device_handle device, PDEVICE_TAG audioEncoder); + +/* +描述: + 开始录像 +参数: + device - [in] 设备句柄 + szFileName - [in] 指定录像文件全路径。NULL - 停止录像 + saveAudio - [in] 是否将音频也录制到文件中 + timeSize - [in] 限定录像文件的时间长度(单位:秒),NULL - 不限制 + dataSize - [in] 限定录像文件的数据长度(单位:字节),NULL - 不限制 + saveNotify - [in] 录像事件通知接口指针 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXStartCapture(device_handle device, TCHAR* szFileName, BOOL saveAudio, + unsigned* timeSize = NULL, unsigned* dataSize = NULL, + ISaveNotify* saveNotify = NULL); + +/* +描述: + 停止录像 +参数: + device - [in] 设备句柄 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXStopCapture(device_handle device); + +/* +描述: + 冻结录像部分(包括视频和音频) + 注意:!!! 适用于需要多段时间录像的情况 +参数: + device - [in] 设备句柄 + bFreeze - [in] TRUE - 冻结录像,FALSE - 解冻录像 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXFreezeCaputre(device_handle device, BOOL bFreeze); + +/* +描述: + 插入视频效果(针对原始视频数据) + 参数: + device - [in] 设备句柄 + ispTask - [in] 新插入的视频效果的接口指针 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXAttachIspTask(device_handle device, IispTask* ispTask); +unsigned __stdcall DXDetachIspTask(device_handle device, IispTask* ispTask); + +/* +描述: + 编码视频数据回调的函数原型 +参数: + fourcc - [in] 获取的编码数据的编码器的FOURCC + buffer - [in] 缓冲区指针 + bufferSize - [out] 获取的编码数据的缓冲区大小(单位:字节) + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +typedef unsigned (__stdcall *fnEncVideoCallback)(unsigned fourcc, unsigned char* buffer, unsigned bufferSize, void* context); + +/* +描述: + 设置编码视频数据回调的函数 +参数: + device - [in] 设备句柄 + fn - [in] 回调函数指针,NULL - 停止回调 + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetEncVideoCallback(device_handle device, fnEncVideoCallback fn, void* context); + +/* +描述: + 开始编码视频数据回调的函数 +参数: + device - [in] 设备句柄 + fn - [in] 回调函数指针,NULL - 停止回调 + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXStartEncVideoCallback(device_handle device, fnEncVideoCallback fn, void* context); + +/* +描述: + 停止编码视频数据回调的函数 +参数: + device - [in] 设备句柄 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXStopEncVideoCallback(device_handle device); + +/* +描述: + 使能去隔行功能 +参数: + device - [in] 设备句柄 + deinterlace - [in] 去隔行的算法类型 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXEnableDeinterlace(device_handle device, unsigned deinterlace); + +/* +描述: + 使能去噪功能 +参数: + device - [in] 设备句柄 + denoise - [in] 去噪的算法类型 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXEnableDenoise(device_handle device, unsigned denoise); + +/* +描述: + 使能伪彩功能 +参数: + device - [in] 设备句柄 + szPColorTemplateFile - [in] 伪彩的模板文件。NULL - 停止使用伪彩 + pcolorDepth - [in] 伪彩的色深。此参数保留。 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXEnablePColor(device_handle device, TCHAR* szPColorTemplateFile, unsigned pcolorDepth); + +unsigned __stdcall DXConvertYUVtoRGB(device_handle device, void* pYUVBuf, + void* pRGBBuf, + long lImgWidth, + long lImgHeight, + BOOL bInverted, + BOOL bInvertColor); + +#endif // __DXMEDIACAP_2011__ diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/SV4000E.h b/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/SV4000E.h new file mode 100644 index 0000000..24f75f6 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/SV4000E.h @@ -0,0 +1,17 @@ + +#ifndef __SV4000E_H_2011__ +#define __SV4000E_H_2011__ + +#include "..\SV2000E\dataAcq.h" +//#include "..\SV2000E\DXMediaCap.h" +//#include "..\SV2000E\datastru.h" + +// __DXMEDIACAP_2011__ +unsigned __stdcall DXConvertYUVtoRGB(device_handle device, void* pYUVBuf, + void* pRGBBuf, + long lImgWidth, + long lImgHeight, + BOOL bInverted, + BOOL bInvertColor); + +#endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/dataAcq.h b/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/dataAcq.h new file mode 100644 index 0000000..857c65a --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/dataAcq.h @@ -0,0 +1,307 @@ + +#ifndef __DATA_ACQ_2011__ +#define __DATA_ACQ_2011__ + +#include + +#include "DXMediaCap.h" + +/* +描述: + 获取指定区域的原始视频帧数据到缓冲区 +参数: + device - [in] 设备句柄 + buffer - [in] 指向缓冲区。NULL - 后续参数返回相应的数据,比如,所需缓冲区的大小、颜色空间、视频尺寸 + bufferLen - [in] 指向的缓冲区的大小(单位:字节) + gotBufferLen - [out] 实际获取的数据的大小(单位:字节) + colorSpace - [out] 获取的原始数据的色彩空间类型 + width - [out] 获取的原始数据的像素宽度 + height - [out] 获取的原始数据的像素高度 + bytesWidth - [out] 获取的原始数据的字节宽度 + rect - [in] 指定获取数据的区域 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXGetFrameBuffer(device_handle device, unsigned char* buffer, unsigned bufferLen, unsigned* gotBufferLen = NULL, + unsigned* colorSpace = NULL, unsigned* width = NULL, unsigned* height = NULL, unsigned* bytesWidth = NULL, + PRECT rect = NULL); + +/* +描述: + 保存原始视频帧数据到 BMP文件 +参数: + szFileName - [in] BMP文件路径 + buffer - [in] 指向缓冲区 + bufferLen - [in] 指向的缓冲区的大小(单位:字节) + colorSpace - [in] 获取的原始数据的色彩空间类型 + width - [in] 获取的原始数据的像素宽度 + height - [in] 获取的原始数据的像素高度 + bytesWidth - [in] 获取的原始数据的字节宽度 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSaveBMPFile(TCHAR* szFileName, unsigned char* buffer, unsigned bufferLen, + unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth); + +/* +描述: + 保存原始视频帧数据到 JPG文件 +参数: + szFileName - [in] JPG文件路径 + buffer - [in] 指向缓冲区 + bufferLen - [in] 指向的缓冲区的大小(单位:字节) + colorSpace - [in] 获取的原始数据的色彩空间类型 + width - [in] 获取的原始数据的像素宽度 + height - [in] 获取的原始数据的像素高度 + bytesWidth - [in] 获取的原始数据的字节宽度 + quality - [in] JPG文件的画面质量 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSaveJPGFile(TCHAR* szFileName, unsigned char* buffer, unsigned bufferLen, + unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, unsigned quality); + +/* +描述: + 直接抓取原始视频帧数据到 BMP文件 +参数: + device - [in] 设备句柄 + szFileName - [in] BMP文件路径 + rect - [in] 指定获取数据的区域 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSnapToBMPFile(device_handle device, TCHAR* szFileName, PRECT rect = NULL); + +/* +描述: + 直接抓取原始视频帧数据到 BMP文件 +参数: + device - [in] 设备句柄 + szFileName - [in] BMP文件路径 + buffer - [in] 指向缓冲区 + bufferLen - [in] 指向的缓冲区的大小(单位:字节) + colorSpace - [in] 获取的原始数据的色彩空间类型 + width - [in] 获取的原始数据的像素宽度 + height - [in] 获取的原始数据的像素高度 + bytesWidth - [in] 获取的原始数据的字节宽度 + rect - [in] 指定获取数据的区域 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSnapToJPGFile(device_handle device, TCHAR* szFileName, unsigned quality, PRECT rect = NULL); + +/* +描述: + 原始视频数据回调的函数原型 +参数: + buffer - [in] 缓冲区指针 + colorSpace - [in] 获取的原始数据的色彩空间类型 + width - [in] 获取的原始数据的像素宽度 + height - [in] 获取的原始数据的像素高度 + bytesWidth - [in] 获取的原始数据的字节宽度 + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +typedef unsigned (__stdcall *fnRawVideoCallback)(unsigned char* buffer, unsigned colorSpace, + unsigned width, unsigned height, unsigned bytesWidth, void* context); + +/* +描述: + 设置原始视频数据回调的函数 +参数: + device - [in] 设备句柄 + fn - [in] 回调函数指针,NULL - 停止回调 + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetRawVideoCallback(device_handle device, fnRawVideoCallback fn, void* context); + +/* +描述: + 开始原始视频数据回调的函数 +参数: + device - [in] 设备句柄 + fn - [in] 回调函数指针,NULL - 停止回调 + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXStartRawVideoCallback(device_handle device, fnRawVideoCallback fn, void* context); + +/* +描述: + 停止原始视频数据回调的函数 +参数: + device - [in] 设备句柄 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXStopRawVideoCallback(device_handle device); + +/* +描述: + 原始音频数据回调的函数原型 +参数: + buffer - [in] 缓冲区指针 + bufferLen - [in] 指向的缓冲区的大小(单位:字节) + wfx - [in] 音频数据格式 + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +typedef unsigned (__stdcall *fnRawAudioCallback)(unsigned char* buffer, unsigned bufferLen, WAVEFORMATEX* wfx, void* context); + +/* +描述: + 设置原始音频数据回调的函数 +参数: + device - [in] 设备句柄 + fn - [in] 回调函数指针,NULL - 停止回调 + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetRawAudioCallback(device_handle device, fnRawAudioCallback fn, void* context); + + +/* +描述: + 原始视频数据叠加回调的函数原型 +参数: + hdc - [in] 视频叠加的HDC + width - [in] 能够叠加的宽度(单位:像素) + height - [in] 能够叠加的高度(单位:像素) + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +typedef unsigned (__stdcall *fnOSDCallback)(HDC hdc, unsigned width, unsigned height, void* context); + +/* +描述: + 设置视频数据叠加回调的函数 +参数: + device - [in] 设备句柄 + fn - [in] 回调函数指针,NULL - 停止回调 + context - [in] 回调函数的上下文 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetOSDCallback(device_handle device, fnOSDCallback fn, void* context); + +enum {osd_text, osd_time, osd_image}; +#define MAX_OSD_TEXT_LEN 16 +/* +描述: + 设置原始视频帧数据的OSD +参数: + device - [in] 设备句柄 + osdType - [in] OSD的类型 + x - [in] 指定OSD的左上角横坐标 + x - [in] 指定OSD的左上角竖坐标 + osdData - [in] OSD的数据,NULL - 取消OSD + osdType = osd_text,最大MAX_OSD_TEXT_LEN个字符 + osdType = osd_time,指定时间格式 + osdType = osd_image,指定图片路径 + pointSize - [in] 字体大小 + faceName - [in] 字体名称 + color - [in] 针对 osd_text, osd_time 两种类型的OSD的前景色,默认值:白色(RGB(255, 255, 255)) + bgcolor - [in] OSD的背景色,默认值:黑色(RGB(0, 0, 0)) + opaque - [in] OSD的背景色是否不透明,默认值:是。当选择透明时,则以 bgcolor 进行透明处理 + alpha - [in] alpha运算值。取值[0 ~ 255],0 - OSD透明,255 - OSD不透明,中间值 - OSD与视频数据进行alpha运算 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXSetOSD(device_handle device, unsigned osdType, int x, int y, char* osdData, int pointSize = 120, LPCTSTR faceName = TEXT("Arial"), + COLORREF color = RGB(255, 255, 255), COLORREF bgcolor = RGB(0, 0, 0), BOOL opaque = TRUE, + unsigned char alpha = 255); + +/* +描述: + 启用/禁用原始视频帧数据的OSD +参数: + device - [in] 设备句柄 + osdType - [in] OSD的类型 + enable - [in] TRUE - 启用OSD,FALSE - 禁用OSD +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXEnableOSD(device_handle device, unsigned osdType, BOOL enable); + +/* +描述: + 由图片缓冲创建预览对象 +参数: + imgbuffer - [in] 图片缓冲区 + buffersize - [in] 图片缓冲区的大小(单位:字节) + colorspace - [in] 图片缓冲的数据的色彩空间 + width - [in] 图片的宽度(单位:像素) + height - [in] 图片的高度(单位:像素) + err - [out] 返回错误代码 +返回值: + 成功则返回图像句柄,否则返回 NULL。可通过 err 获得错误代码 +// */ +image_handle __stdcall DXCreateBufferImg(unsigned char* imgbuffer, unsigned buffersize, + unsigned colorspace, unsigned width, unsigned height, + unsigned* err); + +/* +描述: + 由图片文件创建预览对象 +参数: + szImgFile - [in] 图片文件全路径 + err - [out] 返回错误代码 +返回值: + 成功则返回图像句柄,否则返回 NULL。可通过 err 获得错误代码 +// */ +image_handle __stdcall DXCreateFileImg(TCHAR* szImgFile, unsigned* err); + +/* +描述: + 由更新预览对象到指定的窗体的相应区域 +参数: + img - [in] 预览对象 + hPrevWnd - [in] 预览的窗体 + rect - [in] 预览的区域 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXUpdateImg(image_handle img, HWND hPrevWnd, RECT* rect); + +/* +描述: + 删除预览对象 +参数: + img - [in] 预览对象 +返回值: + 无 +// */ +void __stdcall DXDestroyImg(image_handle img); + +/* +描述: + 翻转视频 +参数: + device - [in] 设备句柄 + flip - [in] TRUE - 启用翻转,FALSE - 禁用翻转 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXFlipVideo(device_handle device, BOOL flip); + +/* +描述: + 镜像视频 +参数: + device - [in] 设备句柄 + mirror - [in] TRUE - 启用镜像,FALSE - 禁用镜像 +返回值: + 0 - 成功;失败则返回错误代码 +// */ +unsigned __stdcall DXMirrorVideo(device_handle device, BOOL mirror); + + +#endif // __DATA_ACQ_2011__ \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/datastru.h b/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/datastru.h new file mode 100644 index 0000000..c470ac4 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Videocard/SV4000E/datastru.h @@ -0,0 +1,90 @@ +/******************************************************************** + created: 2011/08/05 + created: 5:8:2011 9:31 + filename: .\libDXCap\datastru.h + file path: .\libDXCap + file base: datastru + file ext: h + author: 34973832@qq.com + + purpose: +*********************************************************************/ + +#ifndef __LIBDXCAP_DATASTRU__20110805__ +#define __LIBDXCAP_DATASTRU__20110805__ + +typedef void* device_handle; +typedef void* image_handle; + +// 运行状态 +enum {state_stopped, state_paused, state_running}; + +// 去隔行模式 +enum {di_none, di_weave, di_blend, di_bob}; + +// 降噪模式 +enum {dn_none, dn_b}; + +// 视频颜色空间 +enum {cs_rgb24, cs_rgb32, cs_yuy2}; + +// 设备属性页 +enum {attr_video, attr_audio, attr_encode}; + +// 设备信息 +#define MAX_DEVICE_NAME 128 +typedef struct _device_tag +{ + unsigned idx; // 过滤器在枚举过程中的序号 + TCHAR deviceName[MAX_DEVICE_NAME]; // 过滤器的名称 +} DEVICE_TAG, *PDEVICE_TAG; + +// 录像通知 +EXTERN_C const IID IID_ISaveNotify; +/* +// {BAE74021-AFEC-4336-8497-658ED4432F65} +DEFINE_GUID(IID_ISaveNotify, + 0xbae74021, 0xafec, 0x4336, 0x84, 0x97, 0x65, 0x8e, 0xd4, 0x43, 0x2f, 0x65); + // */ +class ISaveNotify : public IUnknown// 录像的事件通知 +{ +public: + virtual HRESULT foo() = 0; +}; + +// isp接口 +//EXTERN_C const IID IID_IispTask; +/* +/// {BC7DE54C-F483-4768-9CBA-3228D81600CD} +DEFINE_GUID(IID_IispTask, + 0xbc7de54c, 0xf483, 0x4768, 0x9c, 0xba, 0x32, 0x28, 0xd8, 0x16, 0x0, 0xcd); + // */ + +//class IispTask : public IUnknown // 视频处理接口 +//{ +//public: +// virtual HRESULT QueryAccept(/*AM_MEDIA_TYPE**/void* mt) = 0; + +// virtual HRESULT BeginIsp() = 0; +// virtual HRESULT IspTask(/*IMediaSample**/void* pMS) = 0; +// virtual HRESULT EndIsp() = 0; +//}; +EXTERN_C const IID IID_IispTask; +class IispTask : public IUnknown +{ +public: + virtual /* [local][id] */ HRESULT STDMETHODCALLTYPE QueryAccept( + void *mt) = 0; + + virtual /* [id] */ HRESULT STDMETHODCALLTYPE BeginIsp( void) = 0; + + virtual /* [local][id] */ HRESULT STDMETHODCALLTYPE IspTask( + void *pMS) = 0; + + virtual /* [id] */ HRESULT STDMETHODCALLTYPE EndIsp( void) = 0; + +}; + + + +#endif // __LIBDXCAP_DATASTRU__20110805__ \ No newline at end of file