SAMPVID.H

//==========================================================================; 
//
// 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 - 1997 Microsoft Corporation. All Rights Reserved.
//
//--------------------------------------------------------------------------;

#ifndef __SAMPVID__
#define __SAMPVID__

DEFINE_GUID(CLSID_SampleRenderer,
0x4d4b1600, 0x33ac, 0x11cf, 0xbf, 0x30, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a);

DEFINE_GUID(CLSID_SampleQuality,
0xdb76d7f0, 0x97cc, 0x11cf, 0xa0, 0x96, 0x00, 0x80, 0x5f, 0x6c, 0xab, 0x82);

// Forward declarations

class CVideoRenderer;
class CVideoInputPin;
class CControlVideo;
class CVideoText;


// This is the video renderer window it supports IBasicVideo and IVideoWindow
// by inheriting from the CBaseControlWindow and CbaseControlVideo classes.
// Those classes leave a few PURE virtual methods that we have to override to
// complete their implementation such as the handling of source and target
// rectangles. The class also looks after creating the window with a custom
// clip region in the shape of the word ActiveX (only applies to Windows/NT)

class CVideoText : public CBaseControlWindow, public CBaseControlVideo
{
protected:

CVideoRenderer *m_pRenderer; // Owning sample renderer object
SIZE m_Size; // Size of the masking bitmap

public:

CVideoText(TCHAR *pName, // Object description
LPUNKNOWN pUnk, // Normal COM ownership
HRESULT *phr, // OLE failure code
CCritSec *pInterfaceLock, // Main critical section
CVideoRenderer *pRenderer); // Delegates locking to

virtual ~CVideoText();
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,void **ppv);

// Pure virtual methods for the IBasicVideo interface

HRESULT IsDefaultTargetRect();
HRESULT SetDefaultTargetRect();
HRESULT SetTargetRect(RECT *pTargetRect);
HRESULT GetTargetRect(RECT *pTargetRect);
HRESULT IsDefaultSourceRect();
HRESULT SetDefaultSourceRect();
HRESULT SetSourceRect(RECT *pSourceRect);
HRESULT GetSourceRect(RECT *pSourceRect);
HRESULT GetStaticImage(long *pBufferSize,long *pDIBImage);

// Prepare the window with a text region

void InitRenderer(TCHAR *pStringName);
HRESULT InitWindowRegion(TCHAR *pStringName);
HFONT CreateVideoFont();
RECT GetDefaultRect();
VIDEOINFOHEADER *GetVideoFormat();

// Overriden from CBaseWindow return our window and class styles

LPTSTR GetClassWindowStyles(DWORD *pClassStyles,
DWORD *pWindowStyles,
DWORD *pWindowStylesEx);

// Method that gets all the window messages

LRESULT OnReceiveMessage(HWND hwnd, // Window handle
UINT uMsg, // Message ID
WPARAM wParam, // First parameter
LPARAM lParam); // Other parameter
}; // CVideoText


// This class supports the renderer input pin. We have to override the base
// class input pin because we provide our own special allocator which hands
// out buffers based on GDI DIBSECTIONs. We have an extra limitation which
// is that we only connect to filters that agree to use our allocator. This
// stops us from connecting to the tee for example. The extra work required
// to use someone elses allocator and select the buffer into a bitmap and
// that into the HDC is not great but would only really confuse this sample

class CVideoInputPin : public CRendererInputPin
{
CVideoRenderer *m_pRenderer; // The renderer that owns us
CCritSec *m_pInterfaceLock; // Main filter critical section

public:

// Constructor

CVideoInputPin(
TCHAR *pObjectName, // Object string description
CVideoRenderer *pRenderer, // Used to delegate locking
CCritSec *pInterfaceLock, // Main critical section
HRESULT *phr, // OLE failure return code
LPCWSTR pPinName); // This pins identification

// Manage our DIBSECTION video allocator
STDMETHODIMP GetAllocator(IMemAllocator **ppAllocator);
STDMETHODIMP NotifyAllocator(IMemAllocator *pAllocator,BOOL bReadOnly);

}; // CVideoInputPin


// This is the COM object that represents a simple rendering filter. It
// supports IBaseFilter and IMediaFilter and a single input stream (pin)
// The classes that support these interfaces have nested scope NOTE the
// nested class objects are passed a pointer to their owning renderer
// when they are created but they should not use it during construction

class CVideoRenderer : public ISpecifyPropertyPages, public CBaseVideoRenderer
{
public:

// Constructor and destructor

static CUnknown * WINAPI CreateInstance(LPUNKNOWN, HRESULT *);
CVideoRenderer(TCHAR *pName,LPUNKNOWN pUnk,HRESULT *phr);
~CVideoRenderer();

// Implement the ISpecifyPropertyPages interface

DECLARE_IUNKNOWN
STDMETHODIMP NonDelegatingQueryInterface(REFIID, void **);
STDMETHODIMP GetPages(CAUUID *pPages);

CBasePin *GetPin(int n);

// Override these from the filter and renderer classes

void PrepareRender();
HRESULT Active();
HRESULT BreakConnect();
HRESULT CompleteConnect(IPin *pReceivePin);
HRESULT SetMediaType(const CMediaType *pmt);
HRESULT CheckMediaType(const CMediaType *pmtIn);
HRESULT CheckVideoType(const VIDEOINFO *pDisplay,const VIDEOINFO *pInput);
HRESULT UpdateFormat(VIDEOINFO *pVideoInfo);
HRESULT DoRenderSample(IMediaSample *pMediaSample);
void OnReceiveFirstSample(IMediaSample *pMediaSample);

public:

CImageAllocator m_ImageAllocator; // Our DIBSECTION allocator
CVideoInputPin m_InputPin; // IPin based interfaces
CImageDisplay m_Display; // Manages the video display type
CMediaType m_mtIn; // Source connection media type
CVideoText m_VideoText; // Does the actual video rendering
CImagePalette m_ImagePalette; // Looks after managing a palette
CDrawImage m_DrawImage; // Does the actual image drawing
SIZE m_VideoSize; // Size of the current video stream

}; // CVideoRenderer

#endif // __SAMPVID__