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

📄 cvcamavi.cpp

📁 guide and some example with visualC++
💻 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 + -