filter.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:8k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * filter.h : DirectShow access module for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2002 the VideoLAN team
  5.  * $Id: ce7e6261db1dac6a9185f2f56bb0fc5682100342 $
  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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, 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. #   ifdef _WINGDI_
  36. #      undef _WINGDI_
  37. #   endif
  38. #   define _WINGDI_ 1
  39. #   define AM_NOVTABLE
  40. #   define _OBJBASE_H_
  41. #   undef _X86_
  42. #   ifndef _I64_MAX
  43. #     define _I64_MAX LONG_LONG_MAX
  44. #   endif
  45. #   define LONGLONG long long
  46. #endif
  47. #include <dshow.h>
  48. extern const GUID MEDIASUBTYPE_I420;
  49. extern const GUID MEDIASUBTYPE_PREVIEW_VIDEO;
  50. typedef struct VLCMediaSample
  51. {
  52.     IMediaSample *p_sample;
  53.     mtime_t i_timestamp;
  54. } VLCMediaSample;
  55. class CaptureFilter;
  56. void WINAPI FreeMediaType( AM_MEDIA_TYPE& mt );
  57. HRESULT WINAPI CopyMediaType( AM_MEDIA_TYPE *pmtTarget,
  58.                               const AM_MEDIA_TYPE *pmtSource );
  59. int GetFourCCFromMediaType(const AM_MEDIA_TYPE &media_type);
  60. /****************************************************************************
  61.  * Declaration of our dummy directshow filter pin class
  62.  ****************************************************************************/
  63. class CapturePin: public IPin, public IMemInputPin
  64. {
  65.     friend class CaptureEnumMediaTypes;
  66.     vlc_object_t *p_input;
  67.     access_sys_t *p_sys;
  68.     CaptureFilter  *p_filter;
  69.     IPin *p_connected_pin;
  70.     AM_MEDIA_TYPE *media_types;
  71.     size_t media_type_count;
  72.     AM_MEDIA_TYPE cx_media_type;
  73.     deque<VLCMediaSample> samples_queue;
  74.     long i_ref;
  75.   public:
  76.     CapturePin( vlc_object_t *_p_input, access_sys_t *p_sys,
  77.                 CaptureFilter *_p_filter,
  78.                 AM_MEDIA_TYPE *mt, size_t mt_count );
  79.     virtual ~CapturePin();
  80.     /* IUnknown methods */
  81.     STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
  82.     STDMETHODIMP_(ULONG) AddRef();
  83.     STDMETHODIMP_(ULONG) Release();
  84.     /* IPin methods */
  85.     STDMETHODIMP Connect( IPin * pReceivePin, const AM_MEDIA_TYPE *pmt );
  86.     STDMETHODIMP ReceiveConnection( IPin * pConnector,
  87.                                     const AM_MEDIA_TYPE *pmt );
  88.     STDMETHODIMP Disconnect();
  89.     STDMETHODIMP ConnectedTo( IPin **pPin );
  90.     STDMETHODIMP ConnectionMediaType( AM_MEDIA_TYPE *pmt );
  91.     STDMETHODIMP QueryPinInfo( PIN_INFO * pInfo );
  92.     STDMETHODIMP QueryDirection( PIN_DIRECTION * pPinDir );
  93.     STDMETHODIMP QueryId( LPWSTR * Id );
  94.     STDMETHODIMP QueryAccept( const AM_MEDIA_TYPE *pmt );
  95.     STDMETHODIMP EnumMediaTypes( IEnumMediaTypes **ppEnum );
  96.     STDMETHODIMP QueryInternalConnections( IPin* *apPin, ULONG *nPin );
  97.     STDMETHODIMP EndOfStream( void );
  98.     STDMETHODIMP BeginFlush( void );
  99.     STDMETHODIMP EndFlush( void );
  100.     STDMETHODIMP NewSegment( REFERENCE_TIME tStart, REFERENCE_TIME tStop,
  101.                              double dRate );
  102.     /* IMemInputPin methods */
  103.     STDMETHODIMP GetAllocator( IMemAllocator **ppAllocator );
  104.     STDMETHODIMP NotifyAllocator(  IMemAllocator *pAllocator, BOOL bReadOnly );
  105.     STDMETHODIMP GetAllocatorRequirements( ALLOCATOR_PROPERTIES *pProps );
  106.     STDMETHODIMP Receive( IMediaSample *pSample );
  107.     STDMETHODIMP ReceiveMultiple( IMediaSample **pSamples, long nSamples,
  108.                                   long *nSamplesProcessed );
  109.     STDMETHODIMP ReceiveCanBlock( void );
  110.     /* Custom methods */
  111.     HRESULT CustomGetSample( VLCMediaSample * );
  112.     HRESULT CustomGetSamples( deque<VLCMediaSample> &external_queue );
  113.     AM_MEDIA_TYPE &CustomGetMediaType();
  114. };
  115. /****************************************************************************
  116.  * Declaration of our dummy directshow filter class
  117.  ****************************************************************************/
  118. class CaptureFilter : public IBaseFilter
  119. {
  120.     friend class CapturePin;
  121.     vlc_object_t   *p_input;
  122.     CapturePin     *p_pin;
  123.     IFilterGraph   *p_graph;
  124.     //AM_MEDIA_TYPE  media_type;
  125.     FILTER_STATE   state;
  126.     long i_ref;
  127.   public:
  128.     CaptureFilter( vlc_object_t *_p_input, access_sys_t *p_sys,
  129.                    AM_MEDIA_TYPE *mt, size_t mt_count );
  130.     virtual ~CaptureFilter();
  131.     /* IUnknown methods */
  132.     STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
  133.     STDMETHODIMP_(ULONG) AddRef();
  134.     STDMETHODIMP_(ULONG) Release();
  135.     /* IPersist method */
  136.     STDMETHODIMP GetClassID(CLSID *pClsID);
  137.     /* IMediaFilter methods */
  138.     STDMETHODIMP GetState(DWORD dwMSecs, FILTER_STATE *State);
  139.     STDMETHODIMP SetSyncSource(IReferenceClock *pClock);
  140.     STDMETHODIMP GetSyncSource(IReferenceClock **pClock);
  141.     STDMETHODIMP Stop();
  142.     STDMETHODIMP Pause();
  143.     STDMETHODIMP Run(REFERENCE_TIME tStart);
  144.     /* IBaseFilter methods */
  145.     STDMETHODIMP EnumPins( IEnumPins ** ppEnum );
  146.     STDMETHODIMP FindPin( LPCWSTR Id, IPin ** ppPin );
  147.     STDMETHODIMP QueryFilterInfo( FILTER_INFO * pInfo );
  148.     STDMETHODIMP JoinFilterGraph( IFilterGraph * pGraph, LPCWSTR pName );
  149.     STDMETHODIMP QueryVendorInfo( LPWSTR* pVendorInfo );
  150.     /* Custom methods */
  151.     CapturePin *CustomGetPin();
  152. };
  153. /****************************************************************************
  154.  * Declaration of our dummy directshow enumpins class
  155.  ****************************************************************************/
  156. class CaptureEnumPins : public IEnumPins
  157. {
  158.     vlc_object_t *p_input;
  159.     CaptureFilter  *p_filter;
  160.     int i_position;
  161.     long i_ref;
  162. public:
  163.     CaptureEnumPins( vlc_object_t *_p_input, CaptureFilter *_p_filter,
  164.                      CaptureEnumPins *pEnumPins );
  165.     virtual ~CaptureEnumPins();
  166.     // IUnknown
  167.     STDMETHODIMP QueryInterface( REFIID riid, void **ppv );
  168.     STDMETHODIMP_(ULONG) AddRef();
  169.     STDMETHODIMP_(ULONG) Release();
  170.     // IEnumPins
  171.     STDMETHODIMP Next( ULONG cPins, IPin ** ppPins, ULONG * pcFetched );
  172.     STDMETHODIMP Skip( ULONG cPins );
  173.     STDMETHODIMP Reset();
  174.     STDMETHODIMP Clone( IEnumPins **ppEnum );
  175. };
  176. /****************************************************************************
  177.  * Declaration of our dummy directshow enummediatypes class
  178.  ****************************************************************************/
  179. class CaptureEnumMediaTypes : public IEnumMediaTypes
  180. {
  181.     vlc_object_t *p_input;
  182.     CapturePin     *p_pin;
  183.     AM_MEDIA_TYPE cx_media_type;
  184.     size_t i_position;
  185.     long i_ref;
  186. public:
  187.     CaptureEnumMediaTypes( vlc_object_t *_p_input, CapturePin *_p_pin,
  188.                            CaptureEnumMediaTypes *pEnumMediaTypes );
  189.     virtual ~CaptureEnumMediaTypes();
  190.     // IUnknown
  191.     STDMETHODIMP QueryInterface( REFIID riid, void **ppv );
  192.     STDMETHODIMP_(ULONG) AddRef();
  193.     STDMETHODIMP_(ULONG) Release();
  194.     // IEnumMediaTypes
  195.     STDMETHODIMP Next( ULONG cMediaTypes, AM_MEDIA_TYPE ** ppMediaTypes,
  196.                        ULONG * pcFetched );
  197.     STDMETHODIMP Skip( ULONG cMediaTypes );
  198.     STDMETHODIMP Reset();
  199.     STDMETHODIMP Clone( IEnumMediaTypes **ppEnum );
  200. };