?? cvcamavi.cpp
字號(hào):
/*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 <cvstreams.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;
}//try
catch (...)
{
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);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -