123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- //------------------------------------------------------------------------------
- // 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__
|