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

多媒体编程

开发平台:

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 <Videoacc.h>
  25. #include "IMpeg2DecFilter.h"
  26. #include "......decssDeCSSInputPin.h"
  27. #include "..BaseVideoFilterBaseVideoFilter.h"
  28. class CSubpicInputPin;
  29. class CClosedCaptionOutputPin;
  30. class CMpeg2Dec;
  31. [uuid("39F498AF-1A09-4275-B193-673B0BA3D478")]
  32. class CMpeg2DecFilter : public CBaseVideoFilter, public IMpeg2DecFilter
  33. {
  34. CSubpicInputPin* m_pSubpicInput;
  35. CClosedCaptionOutputPin* m_pClosedCaptionOutput;
  36. CAutoPtr<CMpeg2Dec> m_dec;
  37. REFERENCE_TIME m_AvgTimePerFrame;
  38. bool m_fWaitForKeyFrame;
  39. bool m_fFilm;
  40. struct framebuf 
  41. {
  42. int w, h, pitch;
  43. BYTE* buf[6];
  44. REFERENCE_TIME rtStart, rtStop;
  45. DWORD flags;
  46.         framebuf()
  47. {
  48. w = h = pitch = 0;
  49. memset(&buf, 0, sizeof(buf));
  50. rtStart = rtStop = 0;
  51. flags = 0;
  52. }
  53.         ~framebuf() {free();}
  54. void alloc(int w, int h, int pitch)
  55. {
  56. this->w = w; this->h = h; this->pitch = pitch;
  57. buf[0] = (BYTE*)_aligned_malloc(pitch*h, 16); buf[3] = (BYTE*)_aligned_malloc(pitch*h, 16);
  58. buf[1] = (BYTE*)_aligned_malloc(pitch*h/4, 16); buf[4] = (BYTE*)_aligned_malloc(pitch*h/4, 16);
  59. buf[2] = (BYTE*)_aligned_malloc(pitch*h/4, 16); buf[5] = (BYTE*)_aligned_malloc(pitch*h/4, 16);
  60. }
  61. void free() {for(int i = 0; i < 6; i++) {_aligned_free(buf[i]); buf[i] = NULL;}}
  62. } m_fb;
  63. AM_SimpleRateChange m_rate;
  64. protected:
  65. void InputTypeChanged();
  66. HRESULT Transform(IMediaSample* pIn);
  67. public:
  68. CMpeg2DecFilter(LPUNKNOWN lpunk, HRESULT* phr);
  69. virtual ~CMpeg2DecFilter();
  70. DECLARE_IUNKNOWN
  71.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  72. HRESULT Deliver(bool fRepeatLast);
  73. int GetPinCount();
  74. CBasePin* GetPin(int n);
  75.     HRESULT EndOfStream();
  76. HRESULT BeginFlush();
  77. HRESULT EndFlush();
  78.     HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  79. HRESULT CheckConnect(PIN_DIRECTION dir, IPin* pPin);
  80.     HRESULT CheckInputType(const CMediaType* mtIn);
  81. HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
  82. HRESULT StartStreaming();
  83. HRESULT StopStreaming();
  84. bool m_fDropFrames;
  85. HRESULT AlterQuality(Quality q);
  86. protected:
  87. CCritSec m_csProps;
  88. ditype m_di;
  89. double m_bright, m_cont, m_hue, m_sat;
  90. BYTE m_YTbl[256], m_UTbl[256*256], m_VTbl[256*256];
  91. bool m_fForcedSubs;
  92. bool m_fPlanarYUV;
  93. static void CalcBrCont(BYTE* YTbl, double bright, double cont);
  94. static void CalcHueSat(BYTE* UTbl, BYTE* VTbl, double hue, double sat);
  95. void ApplyBrContHueSat(BYTE* srcy, BYTE* srcu, BYTE* srcv, int w, int h, int pitch);
  96. public:
  97. // IMpeg2DecFilter
  98. STDMETHODIMP SetDeinterlaceMethod(ditype di);
  99. STDMETHODIMP_(ditype) GetDeinterlaceMethod();
  100. STDMETHODIMP SetBrightness(double bright);
  101. STDMETHODIMP SetContrast(double cont);
  102. STDMETHODIMP SetHue(double hue);
  103. STDMETHODIMP SetSaturation(double sat);
  104. STDMETHODIMP_(double) GetBrightness();
  105. STDMETHODIMP_(double) GetContrast();
  106. STDMETHODIMP_(double) GetHue();
  107. STDMETHODIMP_(double) GetSaturation();
  108. STDMETHODIMP EnableForcedSubtitles(bool fEnable);
  109. STDMETHODIMP_(bool) IsForcedSubtitlesEnabled();
  110. STDMETHODIMP EnablePlanarYUV(bool fEnable);
  111. STDMETHODIMP_(bool) IsPlanarYUVEnabled();
  112. };
  113. class CMpeg2DecInputPin : public CDeCSSInputPin
  114. {
  115. LONG m_CorrectTS;
  116. public:
  117.     CMpeg2DecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName);
  118. CCritSec m_csRateLock;
  119. AM_SimpleRateChange m_ratechange;
  120. // IKsPropertySet
  121.     STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength);
  122.     STDMETHODIMP Get(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength, ULONG* pBytesReturned);
  123.     STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport);
  124. };
  125. class CSubpicInputPin : public CMpeg2DecInputPin
  126. {
  127. CCritSec m_csReceive;
  128. AM_PROPERTY_COMPOSIT_ON m_spon;
  129. AM_DVD_YUV m_sppal[16];
  130. bool m_fsppal;
  131. CAutoPtr<AM_PROPERTY_SPHLI> m_sphli; // temp
  132. struct spu
  133. {
  134. bool m_fForced;
  135. REFERENCE_TIME m_rtStart, m_rtStop; 
  136. CArray<BYTE> m_pData;
  137. DWORD m_offset[2];
  138. AM_PROPERTY_SPHLI m_sphli; // parsed
  139. CAutoPtr<AM_PROPERTY_SPHLI> m_psphli; // for the menu (optional)
  140. struct spu() {memset(&m_sphli, 0, sizeof(m_sphli)); m_fForced = false; m_rtStart = m_rtStop = 0;}
  141. virtual bool Parse() = 0;
  142. virtual void Render(BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal) = 0;
  143. };
  144. struct dvdspu : public spu
  145. {
  146. bool Parse();
  147. void Render(BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal);
  148. };
  149. struct cvdspu : public spu
  150. {
  151. AM_DVD_YUV m_sppal[2][4];
  152. struct cvdspu() {memset(m_sppal, 0, sizeof(m_sppal));}
  153. bool Parse();
  154. void Render(BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal);
  155. };
  156. struct svcdspu : public spu
  157. {
  158. AM_DVD_YUV m_sppal[4];
  159. struct svcdspu() {memset(m_sppal, 0, sizeof(m_sppal));}
  160. bool Parse();
  161. void Render(BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal);
  162. };
  163. CAutoPtrList<spu> m_sps;
  164. protected:
  165. HRESULT Transform(IMediaSample* pSample);
  166. public:
  167. CSubpicInputPin(CTransformFilter* pFilter, HRESULT* phr);
  168. bool HasAnythingToRender(REFERENCE_TIME rt);
  169. void RenderSubpics(REFERENCE_TIME rt, BYTE** p, int w, int h);
  170.     HRESULT CheckMediaType(const CMediaType* mtIn);
  171. HRESULT SetMediaType(const CMediaType* mtIn);
  172. // we shouldn't pass these to the filter from this pin
  173. STDMETHODIMP EndOfStream() {return S_OK;}
  174.     STDMETHODIMP BeginFlush() {return S_OK;}
  175.     STDMETHODIMP EndFlush();
  176.     STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) {return S_OK;}
  177. // IKsPropertySet
  178.     STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength);
  179.     STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport);
  180. };
  181. class CClosedCaptionOutputPin : public CBaseOutputPin
  182. {
  183. public:
  184. CClosedCaptionOutputPin(CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  185.     HRESULT CheckMediaType(const CMediaType* mtOut);
  186. HRESULT GetMediaType(int iPosition, CMediaType* pmt);
  187.     HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
  188. CMediaType& CurrentMediaType() {return m_mt;}
  189. };