TextPassThruFilter.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 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. #include "stdafx.h"
  22. #include <windows.h>
  23. #include <commdlg.h>
  24. #include "mplayerc.h"
  25. #include "mainfrm.h"
  26. #include "TextPassThruFilter.h"
  27. #include "......includemoreuuids.h"
  28. #include "....DSUtilDSUtil.h"
  29. #include "....subtitlesSubtitleInputPin.h"
  30. //
  31. // CTextPassThruInputPin
  32. //
  33. class CTextPassThruInputPin : public CSubtitleInputPin
  34. {
  35. CTextPassThruFilter* m_pTPTFilter;
  36. CComPtr<ISubStream> m_pSubStreamOld;
  37. protected:
  38. void AddSubStream(ISubStream* pSubStream)
  39. {
  40. if(m_pSubStreamOld)
  41. {
  42. if(pSubStream) m_pTPTFilter->m_pMainFrame->ReplaceSubtitle(m_pSubStreamOld, pSubStream);
  43. m_pSubStreamOld = NULL;
  44. }
  45. }
  46. void RemoveSubStream(ISubStream* pSubStream)
  47. {
  48. m_pSubStreamOld = pSubStream;
  49. }
  50. void InvalidateSubtitle(REFERENCE_TIME rtStart, ISubStream* pSubStream)
  51. {
  52. m_pTPTFilter->m_pMainFrame->InvalidateSubtitle((DWORD_PTR)pSubStream, rtStart);
  53. }
  54. public:
  55.     CTextPassThruInputPin(CTextPassThruFilter* pTPTFilter, CCritSec* pLock, CCritSec* pSubLock, HRESULT* phr);
  56. STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  57. STDMETHODIMP Receive(IMediaSample* pSample);
  58.     STDMETHODIMP EndOfStream();
  59.     STDMETHODIMP BeginFlush();
  60.     STDMETHODIMP EndFlush();
  61. };
  62. //
  63. // CTextPassThruOutputPin
  64. //
  65. class CTextPassThruOutputPin : public CBaseOutputPin
  66. {
  67. CTextPassThruFilter* m_pTPTFilter;
  68. public:
  69.     CTextPassThruOutputPin(CTextPassThruFilter* pTPTFilter, CCritSec* pLock, HRESULT* phr);
  70.     HRESULT CheckMediaType(const CMediaType* mtOut);
  71. HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
  72. HRESULT GetMediaType(int iPosition, CMediaType* pmt);
  73. STDMETHODIMP Notify(IBaseFilter* pSender, Quality q) {return S_OK;}
  74. };
  75. ///////////
  76. CTextPassThruInputPin::CTextPassThruInputPin(CTextPassThruFilter* pTPTFilter, CCritSec* pLock, CCritSec* pSubLock, HRESULT* phr)
  77. : CSubtitleInputPin(pTPTFilter, pLock, pSubLock, phr)
  78. , m_pTPTFilter(pTPTFilter)
  79. {
  80. }
  81. STDMETHODIMP CTextPassThruInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
  82. {
  83. HRESULT hr = __super::NewSegment(tStart, tStop, dRate);
  84. if(FAILED(hr)) return hr;
  85. return m_pTPTFilter->m_pOutput->DeliverNewSegment(tStart, tStop, dRate);
  86. }
  87. STDMETHODIMP CTextPassThruInputPin::Receive(IMediaSample* pSample)
  88. {
  89. HRESULT hr = __super::Receive(pSample);
  90. if(FAILED(hr)) return hr;
  91. return m_pTPTFilter->m_pOutput->Deliver(pSample);
  92. }
  93. STDMETHODIMP CTextPassThruInputPin::EndOfStream()
  94. {
  95. HRESULT hr = __super::EndOfStream();
  96. if(FAILED(hr)) return hr;
  97. return m_pTPTFilter->m_pOutput->DeliverEndOfStream();
  98. }
  99. STDMETHODIMP CTextPassThruInputPin::BeginFlush()
  100. {
  101. HRESULT hr = __super::BeginFlush();
  102. if(FAILED(hr)) return hr;
  103. return m_pTPTFilter->m_pOutput->DeliverBeginFlush();
  104. }
  105. STDMETHODIMP CTextPassThruInputPin::EndFlush()
  106. {
  107. HRESULT hr = __super::EndFlush();
  108. if(FAILED(hr)) return hr;
  109. return m_pTPTFilter->m_pOutput->DeliverEndFlush();
  110. }
  111. //
  112. CTextPassThruOutputPin::CTextPassThruOutputPin(CTextPassThruFilter* pTPTFilter, CCritSec* pLock, HRESULT* phr)
  113. : CBaseOutputPin(NAME(""), pTPTFilter, pLock, phr, L"Out")
  114. , m_pTPTFilter(pTPTFilter)
  115. {
  116. }
  117. HRESULT CTextPassThruOutputPin::CheckMediaType(const CMediaType* mtOut)
  118. {
  119. CMediaType mt;
  120. return S_OK == m_pTPTFilter->m_pInput->ConnectionMediaType(&mt) && mt == *mtOut
  121. ? S_OK 
  122. : E_FAIL;
  123. }
  124. HRESULT CTextPassThruOutputPin::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
  125. {
  126. if(m_pTPTFilter->m_pInput->IsConnected() == FALSE)
  127. return E_UNEXPECTED;
  128. CComPtr<IMemAllocator> pAllocatorIn;
  129. m_pTPTFilter->m_pInput->GetAllocator(&pAllocatorIn);
  130. if(!pAllocatorIn) return E_UNEXPECTED;
  131. pAllocatorIn->GetProperties(pProperties);
  132. HRESULT hr;
  133. ALLOCATOR_PROPERTIES Actual;
  134. if(FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) 
  135. return hr;
  136. return(pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
  137. ? E_FAIL
  138. : NOERROR);
  139. }
  140. HRESULT CTextPassThruOutputPin::GetMediaType(int iPosition, CMediaType* pmt)
  141. {
  142. if(m_pTPTFilter->m_pInput->IsConnected() == FALSE)
  143. return E_UNEXPECTED;
  144. if(iPosition < 0) return E_INVALIDARG;
  145. if(iPosition > 0) return VFW_S_NO_MORE_ITEMS;
  146. m_pTPTFilter->m_pInput->ConnectionMediaType(pmt);
  147. return S_OK;
  148. }
  149. //
  150. // CTextPassThruFilter
  151. //
  152. CTextPassThruFilter::CTextPassThruFilter(CMainFrame* pMainFrame) 
  153. : CBaseFilter(NAME("CTextPassThruFilter"), NULL, this, __uuidof(this))
  154. , m_pMainFrame(pMainFrame)
  155. {
  156. HRESULT hr;
  157. m_pInput = new CTextPassThruInputPin(this, this, &m_pMainFrame->m_csSubLock, &hr);
  158. m_pOutput = new CTextPassThruOutputPin(this, this, &hr);
  159. }
  160. CTextPassThruFilter::~CTextPassThruFilter()
  161. {
  162. delete m_pInput; m_pInput = NULL;
  163. delete m_pOutput; m_pOutput = NULL;
  164. }
  165. STDMETHODIMP CTextPassThruFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
  166. {
  167. if(m_pInput && riid == __uuidof(ISubStream))
  168. {
  169. if(CComPtr<ISubStream> pSubStream = m_pInput->GetSubStream())
  170. {
  171. *ppv = pSubStream.Detach();
  172. return S_OK;
  173. }
  174. }
  175. return __super::NonDelegatingQueryInterface(riid, ppv);
  176. }
  177. int CTextPassThruFilter::GetPinCount()
  178. {
  179. return 2;
  180. }
  181. CBasePin* CTextPassThruFilter::GetPin(int n)
  182. {
  183. if(n == 0) return m_pInput;
  184. else if(n == 1) return m_pOutput;
  185. return NULL;
  186. }
  187. /*
  188. void CTextPassThruFilter::SetName()
  189. {
  190. CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pRTS;
  191. CAutoLock cAutoLock(&m_pMainFrame->m_csSubLock);
  192. if(CComQIPtr<IPropertyBag> pPB = m_pTPTInput->GetConnected())
  193. {
  194. CComVariant var;
  195. if(SUCCEEDED(pPB->Read(L"LANGUAGE", &var, NULL)))
  196. {
  197. pRTS->m_name = CString(var.bstrVal) + _T(" (embeded)");
  198. }
  199. }
  200. if(pRTS->m_name.IsEmpty())
  201. {
  202. CPinInfo pi;
  203. m_pTPTInput->GetConnected()->QueryPinInfo(&pi);
  204. pRTS->m_name = CString(CStringW(pi.achName)) + _T(" (embeded)");
  205. }
  206. }
  207. */