filter.h
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:8k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * filter.h : DirectShow access module for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2002 VideoLAN
  5.  * $Id: filter.h 8694 2004-09-12 18:00:02Z gbazin $
  6.  *
  7.  * Author: Gildas Bazin <gbazin@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <string>
  27. #include <list>
  28. #include <deque>
  29. using namespace std;
  30. #ifndef _MSC_VER
  31. #   include <wtypes.h>
  32. #   include <unknwn.h>
  33. #   include <ole2.h>
  34. #   include <limits.h>
  35. #   define _WINGDI_ 1
  36. #   define AM_NOVTABLE
  37. #   define _OBJBASE_H_
  38. #   undef _X86_
  39. #   define _I64_MAX LONG_LONG_MAX
  40. #   define LONGLONG long long
  41. #endif
  42. #include <dshow.h>
  43. extern const GUID MEDIASUBTYPE_I420;
  44. extern const GUID MEDIASUBTYPE_PREVIEW_VIDEO;
  45. typedef struct VLCMediaSample
  46. {
  47.     IMediaSample *p_sample;
  48.     mtime_t i_timestamp;
  49. } VLCMediaSample;
  50. class CaptureFilter;
  51. void WINAPI FreeMediaType( AM_MEDIA_TYPE& mt );
  52. HRESULT WINAPI CopyMediaType( AM_MEDIA_TYPE *pmtTarget,
  53.                               const AM_MEDIA_TYPE *pmtSource );
  54. int GetFourCCFromMediaType(const AM_MEDIA_TYPE &media_type);
  55. /****************************************************************************
  56.  * Declaration of our dummy directshow filter pin class
  57.  ****************************************************************************/
  58. class CapturePin: public IPin, public IMemInputPin
  59. {
  60.     friend class CaptureEnumMediaTypes;
  61.     vlc_object_t *p_input;
  62.     access_sys_t *p_sys;
  63.     CaptureFilter  *p_filter;
  64.     IPin *p_connected_pin;
  65.     AM_MEDIA_TYPE *media_types;
  66.     size_t media_type_count;
  67.     AM_MEDIA_TYPE cx_media_type;
  68.     deque<VLCMediaSample> samples_queue;
  69.     long i_ref;
  70.   public:
  71.     CapturePin( vlc_object_t *_p_input, access_sys_t *p_sys,
  72.                 CaptureFilter *_p_filter,
  73.                 AM_MEDIA_TYPE *mt, size_t mt_count );
  74.     virtual ~CapturePin();
  75.     /* IUnknown methods */
  76.     STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
  77.     STDMETHODIMP_(ULONG) AddRef();
  78.     STDMETHODIMP_(ULONG) Release();
  79.     /* IPin methods */
  80.     STDMETHODIMP Connect( IPin * pReceivePin, const AM_MEDIA_TYPE *pmt );
  81.     STDMETHODIMP ReceiveConnection( IPin * pConnector,
  82.                                     const AM_MEDIA_TYPE *pmt );
  83.     STDMETHODIMP Disconnect();
  84.     STDMETHODIMP ConnectedTo( IPin **pPin );
  85.     STDMETHODIMP ConnectionMediaType( AM_MEDIA_TYPE *pmt );
  86.     STDMETHODIMP QueryPinInfo( PIN_INFO * pInfo );
  87.     STDMETHODIMP QueryDirection( PIN_DIRECTION * pPinDir );
  88.     STDMETHODIMP QueryId( LPWSTR * Id );
  89.     STDMETHODIMP QueryAccept( const AM_MEDIA_TYPE *pmt );
  90.     STDMETHODIMP EnumMediaTypes( IEnumMediaTypes **ppEnum );
  91.     STDMETHODIMP QueryInternalConnections( IPin* *apPin, ULONG *nPin );
  92.     STDMETHODIMP EndOfStream( void );
  93.     STDMETHODIMP BeginFlush( void );
  94.     STDMETHODIMP EndFlush( void );
  95.     STDMETHODIMP NewSegment( REFERENCE_TIME tStart, REFERENCE_TIME tStop,
  96.                              double dRate );
  97.     /* IMemInputPin methods */
  98.     STDMETHODIMP GetAllocator( IMemAllocator **ppAllocator );
  99.     STDMETHODIMP NotifyAllocator(  IMemAllocator *pAllocator, BOOL bReadOnly );
  100.     STDMETHODIMP GetAllocatorRequirements( ALLOCATOR_PROPERTIES *pProps );
  101.     STDMETHODIMP Receive( IMediaSample *pSample );
  102.     STDMETHODIMP ReceiveMultiple( IMediaSample **pSamples, long nSamples,
  103.                                   long *nSamplesProcessed );
  104.     STDMETHODIMP ReceiveCanBlock( void );
  105.     /* Custom methods */
  106.     HRESULT CustomGetSample( VLCMediaSample * );
  107.     AM_MEDIA_TYPE &CustomGetMediaType();
  108. };
  109. /****************************************************************************
  110.  * Declaration of our dummy directshow filter class
  111.  ****************************************************************************/
  112. class CaptureFilter : public IBaseFilter
  113. {
  114.     friend class CapturePin;
  115.     vlc_object_t   *p_input;
  116.     CapturePin     *p_pin;
  117.     IFilterGraph   *p_graph;
  118.     //AM_MEDIA_TYPE  media_type;
  119.     FILTER_STATE   state;
  120.     long i_ref;
  121.   public:
  122.     CaptureFilter( vlc_object_t *_p_input, access_sys_t *p_sys,
  123.                    AM_MEDIA_TYPE *mt, size_t mt_count );
  124.     virtual ~CaptureFilter();
  125.     /* IUnknown methods */
  126.     STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
  127.     STDMETHODIMP_(ULONG) AddRef();
  128.     STDMETHODIMP_(ULONG) Release();
  129.     /* IPersist method */
  130.     STDMETHODIMP GetClassID(CLSID *pClsID);
  131.     /* IMediaFilter methods */
  132.     STDMETHODIMP GetState(DWORD dwMSecs, FILTER_STATE *State);
  133.     STDMETHODIMP SetSyncSource(IReferenceClock *pClock);
  134.     STDMETHODIMP GetSyncSource(IReferenceClock **pClock);
  135.     STDMETHODIMP Stop();
  136.     STDMETHODIMP Pause();
  137.     STDMETHODIMP Run(REFERENCE_TIME tStart);
  138.     /* IBaseFilter methods */
  139.     STDMETHODIMP EnumPins( IEnumPins ** ppEnum );
  140.     STDMETHODIMP FindPin( LPCWSTR Id, IPin ** ppPin );
  141.     STDMETHODIMP QueryFilterInfo( FILTER_INFO * pInfo );
  142.     STDMETHODIMP JoinFilterGraph( IFilterGraph * pGraph, LPCWSTR pName );
  143.     STDMETHODIMP QueryVendorInfo( LPWSTR* pVendorInfo );
  144.     /* Custom methods */
  145.     CapturePin *CustomGetPin();
  146. };
  147. /****************************************************************************
  148.  * Declaration of our dummy directshow enumpins class
  149.  ****************************************************************************/
  150. class CaptureEnumPins : public IEnumPins
  151. {
  152.     vlc_object_t *p_input;
  153.     CaptureFilter  *p_filter;
  154.     int i_position;
  155.     long i_ref;
  156. public:
  157.     CaptureEnumPins( vlc_object_t *_p_input, CaptureFilter *_p_filter,
  158.                      CaptureEnumPins *pEnumPins );
  159.     virtual ~CaptureEnumPins();
  160.     // IUnknown
  161.     STDMETHODIMP QueryInterface( REFIID riid, void **ppv );
  162.     STDMETHODIMP_(ULONG) AddRef();
  163.     STDMETHODIMP_(ULONG) Release();
  164.     // IEnumPins
  165.     STDMETHODIMP Next( ULONG cPins, IPin ** ppPins, ULONG * pcFetched );
  166.     STDMETHODIMP Skip( ULONG cPins );
  167.     STDMETHODIMP Reset();
  168.     STDMETHODIMP Clone( IEnumPins **ppEnum );
  169. };
  170. /****************************************************************************
  171.  * Declaration of our dummy directshow enummediatypes class
  172.  ****************************************************************************/
  173. class CaptureEnumMediaTypes : public IEnumMediaTypes
  174. {
  175.     vlc_object_t *p_input;
  176.     CapturePin     *p_pin;
  177.     AM_MEDIA_TYPE cx_media_type;
  178.     size_t i_position;
  179.     long i_ref;
  180. public:
  181.     CaptureEnumMediaTypes( vlc_object_t *_p_input, CapturePin *_p_pin,
  182.                            CaptureEnumMediaTypes *pEnumMediaTypes );
  183.     virtual ~CaptureEnumMediaTypes();
  184.     // IUnknown
  185.     STDMETHODIMP QueryInterface( REFIID riid, void **ppv );
  186.     STDMETHODIMP_(ULONG) AddRef();
  187.     STDMETHODIMP_(ULONG) Release();
  188.     // IEnumMediaTypes
  189.     STDMETHODIMP Next( ULONG cMediaTypes, AM_MEDIA_TYPE ** ppMediaTypes,
  190.                        ULONG * pcFetched );
  191.     STDMETHODIMP Skip( ULONG cMediaTypes );
  192.     STDMETHODIMP Reset();
  193.     STDMETHODIMP Clone( IEnumMediaTypes **ppEnum );
  194. };