DUMP.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.
//
//--------------------------------------------------------------------------;

class CDumpInputPin;
class CDump;
class CDumpFilter;

#define BYTES_PER_LINE 20
#define FIRST_HALF_LINE " %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x"
#define SECOND_HALF_LINE " %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x"


// Main filter object

class CDumpFilter : public CBaseFilter
{
CDump * const m_pDump;

public:

// Constructor
CDumpFilter(CDump *pDump,
LPUNKNOWN pUnk,
CCritSec *pLock,
HRESULT *phr);

// Pin enumeration
CBasePin * GetPin(int n);
int GetPinCount();

// Open and close the file as necessary
STDMETHODIMP Run(REFERENCE_TIME tStart);
STDMETHODIMP Pause();
STDMETHODIMP Stop();
};


// Pin object

class CDumpInputPin : public CRenderedInputPin
{
CDump * const m_pDump; // Main renderer object
CCritSec * const m_pReceiveLock; // Sample critical section
REFERENCE_TIME m_tLast; // Last sample receive time

public:

CDumpInputPin(CDump *pDump,
LPUNKNOWN pUnk,
CBaseFilter *pFilter,
CCritSec *pLock,
CCritSec *pReceiveLock,
HRESULT *phr);

// Do something with this media sample
STDMETHODIMP Receive(IMediaSample *pSample);
STDMETHODIMP EndOfStream(void);
STDMETHODIMP ReceiveCanBlock();
HRESULT WriteStringInfo(IMediaSample *pSample);

// Check if the pin can support this specific proposed type and format
HRESULT CheckMediaType(const CMediaType *);

// Break connection
HRESULT BreakConnect();

// Track NewSegment
STDMETHODIMP NewSegment(REFERENCE_TIME tStart,
REFERENCE_TIME tStop,
double dRate);
};


// CDump object which has filter and pin members

class CDump : public CUnknown, public IFileSinkFilter
{
friend class CDumpFilter;
friend class CDumpInputPin;

CDumpFilter *m_pFilter; // Methods for filter interfaces
CDumpInputPin *m_pPin; // A simple rendered input pin
CCritSec m_Lock; // Main renderer critical section
CCritSec m_ReceiveLock; // Sublock for received samples
CPosPassThru *m_pPosition; // Renderer position controls
HANDLE m_hFile; // Handle to file for dumping
LPOLESTR m_pFileName; // The filename where we dump to

public:

DECLARE_IUNKNOWN

CDump(LPUNKNOWN pUnk, HRESULT *phr);
~CDump();

static CUnknown * WINAPI CreateInstance(LPUNKNOWN punk, HRESULT *phr);

// Write data streams to a file
void WriteString(TCHAR *pString);
HRESULT Write(PBYTE pbData,LONG lData);

// Implements the IFileSinkFilter interface
STDMETHODIMP SetFileName(LPCOLESTR pszFileName,const AM_MEDIA_TYPE *pmt);
STDMETHODIMP GetCurFile(LPOLESTR * ppszFileName,AM_MEDIA_TYPE *pmt);

private:

// Overriden to say what interfaces we support where
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);

// Open and write to the file
HRESULT OpenFile();
HRESULT CloseFile();
};