BufferFilter.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once
  22. #include <atlbase.h>
  23. [uuid("63EF0035-3FFE-4c41-9230-4346E028BE20")]
  24. interface IBufferFilter : public IUnknown
  25. {
  26. STDMETHOD(SetBuffers) (int nBuffers) = 0;
  27. STDMETHOD_(int, GetBuffers) () = 0;
  28. STDMETHOD_(int, GetFreeBuffers) () = 0;
  29. STDMETHOD(SetPriority) (DWORD dwPriority = THREAD_PRIORITY_NORMAL) = 0;
  30. };
  31. [uuid("DA2B3D77-2F29-4fd2-AC99-DEE4A8A13BF0")]
  32. class CBufferFilter : public CTransformFilter, public IBufferFilter
  33. {
  34. int m_nSamplesToBuffer;
  35. public:
  36. CBufferFilter(LPUNKNOWN lpunk, HRESULT* phr);
  37. virtual ~CBufferFilter();
  38. DECLARE_IUNKNOWN
  39.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  40. // IBufferFilter
  41. STDMETHODIMP SetBuffers(int nBuffers);
  42. STDMETHODIMP_(int) GetBuffers();
  43. STDMETHODIMP_(int) GetFreeBuffers();
  44. STDMETHODIMP SetPriority(DWORD dwPriority = THREAD_PRIORITY_NORMAL);
  45. HRESULT Receive(IMediaSample* pSample);
  46. HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
  47.     HRESULT CheckInputType(const CMediaType* mtIn);
  48.     HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
  49.     HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
  50.     HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
  51. HRESULT StopStreaming();
  52. };
  53. class CBufferFilterOutputPin : public CTransformOutputPin
  54. {
  55. class CBufferFilterOutputQueue : public COutputQueue
  56. {
  57. public:
  58. CBufferFilterOutputQueue(IPin* pInputPin, HRESULT* phr,
  59. DWORD dwPriority = THREAD_PRIORITY_NORMAL,
  60. BOOL bAuto = FALSE, BOOL bQueue = TRUE,
  61. LONG lBatchSize = 1, BOOL bBatchExact = FALSE,
  62. LONG lListSize = DEFAULTCACHE,
  63. bool bFlushingOpt = false)
  64. : COutputQueue(pInputPin, phr, bAuto, bQueue, lBatchSize, bBatchExact, lListSize, dwPriority, bFlushingOpt)
  65. {
  66. }
  67. int GetQueueCount()
  68. {
  69. return m_List ? m_List->GetCount() : -1;
  70. }
  71. bool SetPriority(DWORD dwPriority)
  72. {
  73. return m_hThread ? !!::SetThreadPriority(m_hThread, dwPriority) : false;
  74. }
  75. };
  76. public:
  77. CBufferFilterOutputPin(CTransformFilter* pFilter, HRESULT* phr);
  78. CAutoPtr<CBufferFilterOutputQueue> m_pOutputQueue;
  79. HRESULT Active();
  80.     HRESULT Inactive();
  81. HRESULT Deliver(IMediaSample* pMediaSample);
  82.     HRESULT DeliverEndOfStream();
  83.     HRESULT DeliverBeginFlush();
  84. HRESULT DeliverEndFlush();
  85.     HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  86. };