173 lines
5.7 KiB
C++
173 lines
5.7 KiB
C++
//------------------------------------------------------------------------------
|
|
// File: Source.h
|
|
//
|
|
// Desc: DirectShow base classes - defines classes to simplify creation of
|
|
// ActiveX source filters that support continuous generation of data.
|
|
// No support is provided for IMediaControl or IMediaPosition.
|
|
//
|
|
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
//
|
|
// Derive your source filter from CSource.
|
|
// During construction either:
|
|
// Create some CSourceStream objects to manage your pins
|
|
// Provide the user with a means of doing so eg, an IPersistFile interface.
|
|
//
|
|
// CSource provides:
|
|
// IBaseFilter interface management
|
|
// IMediaFilter interface management, via CBaseFilter
|
|
// Pin counting for CBaseFilter
|
|
//
|
|
// Derive a class from CSourceStream to manage your output pin types
|
|
// Implement GetMediaType/1 to return the type you support. If you support multiple
|
|
// types then overide GetMediaType/3, CheckMediaType and GetMediaTypeCount.
|
|
// Implement Fillbuffer() to put data into one buffer.
|
|
//
|
|
// CSourceStream provides:
|
|
// IPin management via CBaseOutputPin
|
|
// Worker thread management
|
|
|
|
#ifndef __CSOURCE__
|
|
#define __CSOURCE__
|
|
|
|
class CSourceStream; // The class that will handle each pin
|
|
|
|
|
|
//
|
|
// CSource
|
|
//
|
|
// Override construction to provide a means of creating
|
|
// CSourceStream derived objects - ie a way of creating pins.
|
|
class CSource : public CBaseFilter {
|
|
public:
|
|
|
|
CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr);
|
|
CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid);
|
|
#ifdef UNICODE
|
|
CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr);
|
|
CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid);
|
|
#endif
|
|
~CSource();
|
|
|
|
int GetPinCount(void);
|
|
CBasePin *GetPin(int n);
|
|
|
|
// -- Utilities --
|
|
|
|
CCritSec* pStateLock(void) { return &m_cStateLock; } // provide our critical section
|
|
|
|
HRESULT AddPin(__in CSourceStream *);
|
|
HRESULT RemovePin(__in CSourceStream *);
|
|
|
|
STDMETHODIMP FindPin(
|
|
LPCWSTR Id,
|
|
__deref_out IPin ** ppPin
|
|
);
|
|
|
|
int FindPinNumber(__in IPin *iPin);
|
|
|
|
protected:
|
|
|
|
int m_iPins; // The number of pins on this filter. Updated by CSourceStream
|
|
// constructors & destructors.
|
|
CSourceStream **m_paStreams; // the pins on this filter.
|
|
|
|
CCritSec m_cStateLock; // Lock this to serialize function accesses to the filter state
|
|
|
|
};
|
|
|
|
|
|
//
|
|
// CSourceStream
|
|
//
|
|
// Use this class to manage a stream of data that comes from a
|
|
// pin.
|
|
// Uses a worker thread to put data on the pin.
|
|
class CSourceStream : public CAMThread, public CBaseOutputPin {
|
|
public:
|
|
|
|
CSourceStream(__in_opt LPCTSTR pObjectName,
|
|
__inout HRESULT *phr,
|
|
__inout CSource *pms,
|
|
__in_opt LPCWSTR pName);
|
|
#ifdef UNICODE
|
|
CSourceStream(__in_opt LPCSTR pObjectName,
|
|
__inout HRESULT *phr,
|
|
__inout CSource *pms,
|
|
__in_opt LPCWSTR pName);
|
|
#endif
|
|
virtual ~CSourceStream(void); // virtual destructor ensures derived class destructors are called too.
|
|
|
|
protected:
|
|
|
|
CSource *m_pFilter; // The parent of this stream
|
|
|
|
// *
|
|
// * Data Source
|
|
// *
|
|
// * The following three functions: FillBuffer, OnThreadCreate/Destroy, are
|
|
// * called from within the ThreadProc. They are used in the creation of
|
|
// * the media samples this pin will provide
|
|
// *
|
|
|
|
// Override this to provide the worker thread a means
|
|
// of processing a buffer
|
|
virtual HRESULT FillBuffer(IMediaSample *pSamp) PURE;
|
|
|
|
// Called as the thread is created/destroyed - use to perform
|
|
// jobs such as start/stop streaming mode
|
|
// If OnThreadCreate returns an error the thread will exit.
|
|
virtual HRESULT OnThreadCreate(void) {return NOERROR;};
|
|
virtual HRESULT OnThreadDestroy(void) {return NOERROR;};
|
|
virtual HRESULT OnThreadStartPlay(void) {return NOERROR;};
|
|
|
|
// *
|
|
// * Worker Thread
|
|
// *
|
|
|
|
HRESULT Active(void); // Starts up the worker thread
|
|
HRESULT Inactive(void); // Exits the worker thread.
|
|
|
|
public:
|
|
// thread commands
|
|
enum Command {CMD_INIT, CMD_PAUSE, CMD_RUN, CMD_STOP, CMD_EXIT};
|
|
HRESULT Init(void) { return CallWorker(CMD_INIT); }
|
|
HRESULT Exit(void) { return CallWorker(CMD_EXIT); }
|
|
HRESULT Run(void) { return CallWorker(CMD_RUN); }
|
|
HRESULT Pause(void) { return CallWorker(CMD_PAUSE); }
|
|
HRESULT Stop(void) { return CallWorker(CMD_STOP); }
|
|
|
|
protected:
|
|
Command GetRequest(void) { return (Command) CAMThread::GetRequest(); }
|
|
BOOL CheckRequest(Command *pCom) { return CAMThread::CheckRequest( (DWORD *) pCom); }
|
|
|
|
// override these if you want to add thread commands
|
|
virtual DWORD ThreadProc(void); // the thread function
|
|
|
|
virtual HRESULT DoBufferProcessingLoop(void); // the loop executed whilst running
|
|
|
|
|
|
// *
|
|
// * AM_MEDIA_TYPE support
|
|
// *
|
|
|
|
// If you support more than one media type then override these 2 functions
|
|
virtual HRESULT CheckMediaType(const CMediaType *pMediaType);
|
|
virtual HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType); // List pos. 0-n
|
|
|
|
// If you support only one type then override this fn.
|
|
// This will only be called by the default implementations
|
|
// of CheckMediaType and GetMediaType(int, CMediaType*)
|
|
// You must override this fn. or the above 2!
|
|
virtual HRESULT GetMediaType(__inout CMediaType *pMediaType) {return E_UNEXPECTED;}
|
|
|
|
STDMETHODIMP QueryId(
|
|
__deref_out LPWSTR * Id
|
|
);
|
|
};
|
|
|
|
#endif // __CSOURCE__
|
|
|