173 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			173 lines
		
	
	
		
			5.8 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__
							 | 
						||
| 
								 | 
							
								
							 |