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

📄 render.cpp

📁 microsoft vision source code
💻 CPP
字号:
//==========================================================================;
//
//  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
//  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
//  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
//  PURPOSE.
//
//  Copyright (c) 1992 - 2000  Microsoft Corporation.  All Rights Reserved.
//
//--------------------------------------------------------------------------;

//
// A renderer that passes the captured image buffers to the application.
//
//
//
// Files
//
// Render.cpp             Main implementation of the Renderer filter
// Render.def             What APIs the DLL will import and export
// Render.h               Class definition of the derived renderer
// Render.rc              Version information for the sample DLL
// Renduids.h             CLSID for the Render filter
// Itrnsfer.h             ITransfer Interface declaration for callback support
//
// Base classes used
//
// CBaseFilter          Base filter class supporting IMediaFilter
// CRenderedInputPin    An input pin attached to a renderer
// CUnknown             Handle IUnknown for our IFileSinkFilter
// CPosPassThru         Passes seeking interfaces upstream
// CCritSec             Helper class that wraps a critical section
//
//

#include <windows.h>
#include <commdlg.h>

// Need to add <DirectShow Media SDK>\Classes\Base to the include path
// so that we can include Streams.h.
#include <streams.h>

#include <initguid.h>
#include <renduids.h>
#include <itrnsfer.h>
#include "render.h"


//LATER - Set this in sync with the VisDSCamera's callback function.
typedef HRESULT (STDAPICALLTYPE *T_PfnFrameCallback) (void *, void *);

// Setup data

const AMOVIESETUP_MEDIATYPE sudPinTypes =
{
    &MEDIATYPE_NULL,            // Major type
    &MEDIASUBTYPE_NULL          // Minor type
};

const AMOVIESETUP_PIN sudPins =
{
    L"Input",                   // Pin string name
    FALSE,                      // Is it rendered
    FALSE,                      // Is it an output
    FALSE,                      // Allowed none
    FALSE,                      // Likewise many
    &CLSID_NULL,                // Connects to filter
    L"Output",                  // Connects to pin
    1,                          // Number of types
    &sudPinTypes                // Pin information
};

const AMOVIESETUP_FILTER sudRender =
{
#ifdef _DEBUG
    &CLSID_RenderDB,                // Filter CLSID
    L"RenderDB",                    // String name
#else // _DEBUG
    &CLSID_Render,                // Filter CLSID
    L"Render",                    // String name
#endif // _DEBUG
    MERIT_DO_NOT_USE,           // Filter merit
    1,                          // Number pins
    &sudPins                    // Pin details
};


//
//  Object creation stuff
//
CFactoryTemplate g_Templates[]= {
#ifdef _DEBUG
    L"RenderDB", &CLSID_RenderDB, CRender::CreateInstance, NULL, &sudRender
#else // _DEBUG
    L"Render", &CLSID_Render, CRender::CreateInstance, NULL, &sudRender
#endif // _DEBUG
};
int g_cTemplates = 1;


// Constructor

CRenderFilter::CRenderFilter(CRender *pRender,
                         LPUNKNOWN pUnk,
                         CCritSec *pLock,
                         HRESULT *phr) :
#ifdef _DEBUG
    CBaseFilter(NAME("CRenderFilter"), pUnk, pLock, CLSID_RenderDB),
#else // _DEBUG
    CBaseFilter(NAME("CRenderFilter"), pUnk, pLock, CLSID_Render),
#endif // _DEBUG
    m_pRender(pRender)
{
}


//
// GetPin
//
CBasePin * CRenderFilter::GetPin(int n)
{
    if (n == 0) {
        return m_pRender->m_pPin;
    } else {
        return NULL;
    }
}


//
// GetPinCount
//
int CRenderFilter::GetPinCount()
{
    return 1;
}


//
//  Definition of CRenderInputPin
//
CRenderInputPin::CRenderInputPin(CRender *pRender,
                             LPUNKNOWN pUnk,
                             CBaseFilter *pFilter,
                             CCritSec *pLock,
                             CCritSec *pReceiveLock,
                             HRESULT *phr) :

    CRenderedInputPin(NAME("CRenderInputPin"),
                  pFilter,                   // Filter
                  pLock,                     // Locking
                  phr,                       // Return code
                  L"Input"),                 // Pin name
    m_pReceiveLock(pReceiveLock),
    m_pRender(pRender)
{
}


//
// CheckMediaType
//
// Check if the pin can support this specific proposed type and format
//
HRESULT CRenderInputPin::CheckMediaType(const CMediaType *)
{
    return S_OK;
}


//
// ReceiveCanBlock
//
// We don't hold up source threads on Receive
//
STDMETHODIMP CRenderInputPin::ReceiveCanBlock()
{
    return S_FALSE;
}


//
// Receive
//
// Do something with this media sample
//
STDMETHODIMP CRenderInputPin::Receive(IMediaSample *pSample)
{
    CAutoLock lock(m_pReceiveLock);

    // Call the app's callback with the pointer to the Media Sample

    return ((T_PfnFrameCallback)m_pRender->m_pfnCallback)(m_pRender->m_cbParam, pSample);
}


//
//  CRender class
//
CRender::CRender(LPUNKNOWN pUnk, HRESULT *phr) :
    CUnknown(NAME("CRender"), pUnk),
    m_pFilter(NULL),
    m_pPin(NULL),
    m_pfnCallback(0),
    m_cbParam(0)
{
    m_pFilter = new CRenderFilter(this, GetOwner(), &m_Lock, phr);
    if (m_pFilter == NULL) {
        *phr = E_OUTOFMEMORY;
        return;
    }

    m_pPin = new CRenderInputPin(this,GetOwner(),
                               m_pFilter,
                               &m_Lock,
                               &m_ReceiveLock,
                               phr);
    if (m_pPin == NULL) {
        *phr = E_OUTOFMEMORY;
        return;
    }
}

HRESULT CRender::SetFrameCallback(void * cbParam, void * pfnCallback)
{
    CAutoLock lock(&m_Lock);
    m_pfnCallback = pfnCallback;
    m_cbParam = cbParam;
    return NOERROR;
}


// Destructor

CRender::~CRender()
{
    delete m_pPin;
    delete m_pFilter;
}


//
// CreateInstance
//
// Provide the way for COM to create a Render filter
//
CUnknown * WINAPI CRender::CreateInstance(LPUNKNOWN punk, HRESULT *phr)
{
    CRender *pNewObject = new CRender(punk, phr);
    if (pNewObject == NULL) {
        *phr = E_OUTOFMEMORY;
    }
    return pNewObject;

} // CreateInstance


//
// NonDelegatingQueryInterface
//
// Override this to say what interfaces we support where
//
STDMETHODIMP CRender::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
{
    CheckPointer(ppv,E_POINTER);
    CAutoLock lock(&m_Lock);

    // Do we have this interface

    if (riid == IID_ITransfer) {
        return GetInterface((ITransfer *) this, ppv);
    } else if (riid == IID_IBaseFilter || riid == IID_IMediaFilter || riid == IID_IPersist) {
	return m_pFilter->NonDelegatingQueryInterface(riid, ppv);
    }  else {
	return CUnknown::NonDelegatingQueryInterface(riid, ppv);
    }

} // NonDelegatingQueryInterface



//
// DllRegisterSever
//
// Handle the registration of this filter
//
STDAPI DllRegisterServer()
{
    return AMovieDllRegisterServer2( TRUE );

} // DllRegisterServer


//
// DllUnregisterServer
//
STDAPI DllUnregisterServer()
{
    return AMovieDllRegisterServer2( FALSE );

} // DllUnregisterServer

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -