📄 cvcamavi.cpp
字号:
/*M/////////////////////////////////////////////////////////////////////////////////////////// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.//// By downloading, copying, installing or using the software you agree to this license.// If you do not agree to this license, do not download, install,// copy or use the software.////// Intel License Agreement// For Open Source Computer Vision Library//// Copyright (C) 2000, Intel Corporation, all rights reserved.// Third party copyrights are property of their respective owners.//// Redistribution and use in source and binary forms, with or without modification,// are permitted provided that the following conditions are met://// * Redistribution's of source code must retain the above copyright notice,// this list of conditions and the following disclaimer.//// * Redistribution's in binary form must reproduce the above copyright notice,// this list of conditions and the following disclaimer in the documentation// and/or other materials provided with the distribution.//// * The name of Intel Corporation may not be used to endorse or promote products// derived from this software without specific prior written permission.//// This software is provided by the copyright holders and contributors "as is" and// any express or implied warranties, including, but not limited to, the implied// warranties of merchantability and fitness for a particular purpose are disclaimed.// In no event shall the Intel Corporation or contributors be liable for any direct,// indirect, incidental, special, exemplary, or consequential damages// (including, but not limited to, procurement of substitute goods or services;// loss of use, data, or profits; or business interruption) however caused// and on any theory of liability, whether in contract, strict liability,// or tort (including negligence or otherwise) arising in any way out of// the use of this software, even if advised of the possibility of such damage.////M*/#define WM_GRAPHNOTIFY WM_USER+13#include <objbase.h>#include <streams.h>#include "iProxyTrans.h"#include "ProxyTransuids.h"#include "highgui.h"#include "cvcamavi.h"IPin* get_pin( IBaseFilter* pFilter, PIN_DIRECTION dir );HWND _cvcamCreateWindow();const int FRAMES_FORMAT = 0;const int TIME_FORMAT = 1;cvcamSourceFile::cvcamSourceFile(const char* file , void (*callback)(void*) ):Iusecom(),m_pGraph(NULL),m_pMediaControl(NULL),m_pEvent(NULL),m_pVideoWindow(NULL),m_pPin(NULL),m_pBasicVideo(NULL),m_pSFilter(NULL),m_pProxyTrans(NULL),m_pSourceOut(NULL),m_pProxyIn(NULL),m_pProxyOut(NULL),m_pEnumPins(NULL),m_pProxyBase(NULL),m_file(),m_pcallback(NULL),m_width(0),m_height(0),IsValid(true),m_hr(),m_hWnd(NULL),m_pMediaSeeking(NULL){ try { //Get the file if (file) { m_file = file; } else { char path[256]; memset(path,0,256); OPENFILENAME fn; fn.lStructSize = sizeof(OPENFILENAME); fn.hwndOwner = NULL; fn.lpstrFilter = NULL; fn.lpstrFile = path; fn.nMaxFile = 256; fn.lpstrFileTitle = NULL; fn.lpstrInitialDir = NULL; fn.lpstrTitle = NULL; fn.Flags = NULL; fn.lpstrDefExt = "avi"; fn.hInstance = DLLhinst; fn.lpfnHook = NULL; fn.lpstrCustomFilter = NULL; fn.lCustData = NULL; if(!GetOpenFileName(&fn)) throw 1; m_file = path; }//else after if(file) // Create the filter graph manager and query for interfaces. CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGraph); // Build the graph. wchar_t wpath[256]; mbstowcs(wpath, m_file.c_str(), strlen(m_file.c_str())+1); m_hr = m_pGraph->AddSourceFilter(wpath,L"source",&m_pSFilter); // Create a proxy transform filter if(FAILED(CoCreateInstance(CLSID_ProxyTransform, NULL, CLSCTX_INPROC_SERVER, IID_IProxyTransform, (void**)&m_pProxyTrans))) { throw 1; } //set callback m_hr = m_pProxyTrans->set_transform((void(__cdecl*)(void*))m_pcallback, 0); //Get Source output pin m_hr = m_pSFilter->EnumPins(&m_pEnumPins); unsigned long fetched(0); m_hr = m_pEnumPins->Next(1,&m_pSourceOut,&fetched); if(!fetched) throw 1 ; m_pEnumPins = NULL; //Put ProxyTrans into graph m_hr = m_pProxyTrans->QueryInterface(IID_IBaseFilter,(void**)&m_pProxyBase); m_hr = m_pGraph->AddFilter(m_pProxyBase.value(),L"proxy"); //Get ProxyTrans Pins m_pProxyIn = get_pin( m_pProxyBase.value(), PINDIR_INPUT ); m_pProxyOut= get_pin( m_pProxyBase.value(), PINDIR_OUTPUT ); m_hr = m_pGraph->Connect(m_pSourceOut.value(),m_pProxyIn.value()); m_hr = m_pGraph->Render(m_pProxyOut.value()); //Gain additional interfaces m_hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl); m_hr = m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent); m_hr = m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&m_pVideoWindow); m_hr = m_pGraph->QueryInterface(IID_IMediaSeeking, (void**)&m_pMediaSeeking); if(!m_pMediaControl.is_valid() ||!m_pEvent.is_valid() ||!m_pVideoWindow.is_valid()) throw 1; }//trycatch (...) { IsValid = false; return;}//catch}//cvcamSourceFile()bool cvcamSourceFile::IsRunning(){ long evCode; HRESULT hr = m_pEvent->WaitForCompletion(0, &evCode); if(SUCCEEDED(hr)) { if(!evCode) return true; } return false;}HRESULT cvcamSourceFile::SetWindow(const HWND window){ if(IsRunning()) return E_FAIL; m_hWnd = window; if (!m_hWnd) { m_hWnd = _cvcamCreateWindow(); } return S_OK; }HRESULT cvcamSourceFile::Start(){ try { if (IsRunning()) { return NOERROR; } //Set up the window m_hr = m_pVideoWindow->put_Owner((OAHWND)m_hWnd); long flags; m_hr = m_pEvent->SetNotifyWindow((OAHWND)m_hWnd, WM_GRAPHNOTIFY, 0); m_hr = m_pEvent->SetNotifyFlags(0x00); m_hr = m_pEvent->CancelDefaultHandling(EC_COMPLETE); m_hr = m_pVideoWindow->get_WindowStyle(&flags); m_hr = m_pVideoWindow->put_WindowStyle(flags & (~WS_CAPTION) | WS_CHILD); m_hr = m_pVideoWindow->put_MessageDrain((OAHWND)m_hWnd); // Get the rectangle dimensions and resize the client window m_hr = m_pGraph->QueryInterface(IID_IBasicVideo,(void**)&m_pBasicVideo); long left, top, w, h; m_pBasicVideo->GetSourcePosition(&left, &top,&w,&h); m_pBasicVideo->SetDestinationPosition(0, 0, m_width?m_width:w, m_height?m_height:h); m_pVideoWindow->SetWindowPosition(0,0,m_width?m_width:w,m_height?m_height:h); const char* name = cvGetWindowName(m_hWnd); cvResizeWindow(name, m_width?m_width:w, m_height?m_height:h); // Run the graph. m_hr = m_pMediaControl->Run(); return S_OK; }//try catch(HrExeption exp) { return exp.hr; }//catch}HRESULT cvcamSourceFile::Stop(){ if( m_pMediaControl.is_valid() ) { OAFilterState fs; m_pMediaControl->GetState(0,&fs); if(fs == State_Stopped) return NOERROR; m_pMediaControl->StopWhenReady(); if(m_pVideoWindow.is_valid() ) { m_pVideoWindow->put_Visible(OAFALSE); m_pVideoWindow->put_Owner(NULL); m_pVideoWindow->put_MessageDrain(0); } } return S_OK;}HRESULT cvcamSourceFile::Pause(){ if( m_pMediaControl.is_valid() ) { OAFilterState fs; m_pMediaControl->GetState(0,&fs); if(fs == State_Stopped) return S_OK; m_pMediaControl->Pause(); } return S_OK;}HRESULT cvcamSourceFile::Resume(){ if( m_pMediaControl.is_valid() ) { OAFilterState fs; m_pMediaControl->GetState(0,&fs); if(fs == State_Stopped) return S_OK; m_pMediaControl->Run(); } return S_OK;}HRESULT cvcamSourceFile::SetCallBack(void (__cdecl *callback)(void *)){ if(IsRunning()) return E_FAIL; m_pcallback = callback; m_pProxyTrans->set_transform((void(__cdecl*)(void*))m_pcallback, 0); return S_OK;}HRESULT cvcamSourceFile::SetHeight(const int height){ m_height = height; return S_OK;}HRESULT cvcamSourceFile::SetWidth(const int width){ m_width = width; return S_OK;}HRESULT cvcamSourceFile::WaitForCompletion(){ long evCode; return m_pEvent->WaitForCompletion(INFINITE, &evCode);}HRESULT cvcamSourceFile::SetTimeFormat(const int format){ if (format == FRAMES_FORMAT) { return m_pMediaSeeking->SetTimeFormat(&TIME_FORMAT_FRAME ); }else if (format == TIME_FORMAT) { return m_pMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME); }else return E_FAIL;}HRESULT cvcamSourceFile::GetDuration(LONGLONG *pDuration){ return m_pMediaSeeking->GetDuration(pDuration);}HRESULT cvcamSourceFile::GetCurrentPosition(LONGLONG *pCurrent){ return m_pMediaSeeking->GetCurrentPosition(pCurrent);}HRESULT cvcamSourceFile::SetPosition(LONGLONG *pCurrent){ return m_pMediaSeeking->SetPositions(pCurrent,AM_SEEKING_AbsolutePositioning,NULL, AM_SEEKING_NoPositioning);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -