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

多媒体编程

开发平台:

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 <atlcoll.h>
  23. #include <afxtempl.h>
  24. #include "libmad-0.15.0bmsvc++mad.h"
  25. #include "a52dec-0.7.4vc++inttypes.h"
  26. #include "a52dec-0.7.4includea52.h"
  27. #include "dtsdec-0.0.1includedts.h"
  28. // #include "faad2includeneaacdec.h" // conflicts with dxtrans.h
  29. #include "......decssDeCSSInputPin.h"
  30. #include "IMpaDecFilter.h"
  31. struct aac_state_t
  32. {
  33. void* h; // NeAACDecHandle h;
  34. DWORD freq;
  35. BYTE channels;
  36. aac_state_t();
  37. ~aac_state_t();
  38. bool open();
  39. void close();
  40. bool init(CMediaType& mt);
  41. };
  42. struct ps2_state_t
  43. {
  44. bool sync;
  45. double a[2], b[2];
  46. struct ps2_state_t() {reset();}
  47. void reset() {sync = false; a[0] = a[1] = b[0] = b[1] = 0;}
  48. };
  49. [uuid("3D446B6F-71DE-4437-BE15-8CE47174340F")]
  50. class CMpaDecFilter : public CTransformFilter, public IMpaDecFilter
  51. {
  52. protected:
  53. CCritSec m_csReceive;
  54. a52_state_t* m_a52_state;
  55. dts_state_t* m_dts_state;
  56. aac_state_t m_aac_state;
  57. mad_stream m_stream;
  58. mad_frame m_frame;
  59. mad_synth m_synth;
  60. ps2_state_t m_ps2_state;
  61. CArray<BYTE> m_buff;
  62. REFERENCE_TIME m_rtStart;
  63. bool m_fDiscontinuity;
  64. float m_sample_max;
  65. HRESULT ProcessLPCM();
  66. HRESULT ProcessAC3();
  67. HRESULT ProcessDTS();
  68. HRESULT ProcessAAC();
  69. HRESULT ProcessPS2PCM();
  70. HRESULT ProcessPS2ADPCM();
  71. HRESULT ProcessMPA();
  72. HRESULT GetDeliveryBuffer(IMediaSample** pSample, BYTE** pData);
  73. HRESULT Deliver(CArray<float>& pBuff, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask = 0);
  74. HRESULT Deliver(BYTE* pBuff, int size, int bit_rate, BYTE type);
  75. HRESULT ReconnectOutput(int nSamples, CMediaType& mt);
  76. CMediaType CreateMediaType(SampleFormat sf, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask = 0);
  77. CMediaType CreateMediaTypeSPDIF();
  78. protected:
  79. CCritSec m_csProps;
  80. SampleFormat m_iSampleFormat;
  81. bool m_fNormalize;
  82. int m_iSpeakerConfig[etlast];
  83. bool m_fDynamicRangeControl[etlast];
  84. float m_boost;
  85. public:
  86. CMpaDecFilter(LPUNKNOWN lpunk, HRESULT* phr);
  87. virtual ~CMpaDecFilter();
  88. DECLARE_IUNKNOWN
  89.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  90.     HRESULT EndOfStream();
  91. HRESULT BeginFlush();
  92. HRESULT EndFlush();
  93.     HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  94.     HRESULT Receive(IMediaSample* pIn);
  95.     HRESULT CheckInputType(const CMediaType* mtIn);
  96.     HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
  97.     HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
  98.     HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
  99. HRESULT StartStreaming();
  100. HRESULT StopStreaming();
  101. // IMpaDecFilter
  102. STDMETHODIMP SetSampleFormat(SampleFormat sf);
  103. STDMETHODIMP_(SampleFormat) GetSampleFormat();
  104. STDMETHODIMP SetNormalize(bool fNormalize);
  105. STDMETHODIMP_(bool) GetNormalize();
  106. STDMETHODIMP SetSpeakerConfig(enctype et, int sc);
  107. STDMETHODIMP_(int) GetSpeakerConfig(enctype et);
  108. STDMETHODIMP SetDynamicRangeControl(enctype et, bool fDRC);
  109. STDMETHODIMP_(bool) GetDynamicRangeControl(enctype et);
  110. STDMETHODIMP SetBoost(float boost);
  111. STDMETHODIMP_(float) GetBoost();
  112. };
  113. class CMpaDecInputPin : public CDeCSSInputPin
  114. {
  115. public:
  116.     CMpaDecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName);
  117. };