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

多媒体编程

开发平台:

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 <atlsync.h>
  23. #include "DirectVobSub.h"
  24. #include "..BaseVideoFilterBaseVideoFilter.h"
  25. #include "......subtitlesVobSubFile.h"
  26. #include "......subtitlesRTS.h"
  27. typedef struct
  28. {
  29. HWND hSystrayWnd;
  30. IFilterGraph* graph;
  31. IDirectVobSub* dvs;
  32. bool fRunOnce, fShowIcon;
  33. } SystrayIconData;
  34. /* This is for graphedit */
  35. [uuid("93A22E7A-5091-45ef-BA61-6DA26156A5D0")]
  36. class CDirectVobSubFilter
  37. : public CBaseVideoFilter
  38. , public CDirectVobSub
  39. , public ISpecifyPropertyPages
  40. , public IAMStreamSelect
  41. , public CAMThread
  42. {
  43.     friend class CTextInputPin;
  44. CCritSec m_csQueueLock;
  45. CComPtr<ISubPicQueue> m_pSubPicQueue;
  46. void InitSubPicQueue();
  47. SubPicDesc m_spd;
  48. bool AdjustFrameSize(CSize& s);
  49. protected:
  50. void GetOutputSize(int& w, int& h, int& arx, int& ary);
  51. HRESULT Transform(IMediaSample* pIn);
  52. public:
  53.     CDirectVobSubFilter(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid = __uuidof(CDirectVobSubFilter));
  54. virtual ~CDirectVobSubFilter();
  55.     DECLARE_IUNKNOWN;
  56.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  57.     // CBaseFilter
  58. CBasePin* GetPin(int n);
  59. int GetPinCount();
  60. STDMETHODIMP JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName);
  61. STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
  62.     // CTransformFilter
  63. HRESULT SetMediaType(PIN_DIRECTION dir, const CMediaType* pMediaType),
  64. CheckConnect(PIN_DIRECTION dir, IPin* pPin),
  65. CompleteConnect(PIN_DIRECTION dir, IPin* pReceivePin),
  66. BreakConnect(PIN_DIRECTION dir),
  67. StartStreaming(), 
  68. StopStreaming(),
  69. NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  70.     CArray<CTextInputPin*> m_pTextInput;
  71.     // IDirectVobSub
  72.     STDMETHODIMP put_FileName(WCHAR* fn);
  73. STDMETHODIMP get_LanguageCount(int* nLangs);
  74. STDMETHODIMP get_LanguageName(int iLanguage, WCHAR** ppName);
  75. STDMETHODIMP put_SelectedLanguage(int iSelected);
  76.     STDMETHODIMP put_HideSubtitles(bool fHideSubtitles);
  77. STDMETHODIMP put_PreBuffering(bool fDoPreBuffering);
  78.     STDMETHODIMP put_Placement(bool fOverridePlacement, int xperc, int yperc);
  79.     STDMETHODIMP put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fPolygonize);
  80.     STDMETHODIMP put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer);
  81.     STDMETHODIMP put_SubtitleTiming(int delay, int speedmul, int speeddiv);
  82.     STDMETHODIMP get_MediaFPS(bool* fEnabled, double* fps);
  83.     STDMETHODIMP put_MediaFPS(bool fEnabled, double fps);
  84.     STDMETHODIMP get_ZoomRect(NORMALIZEDRECT* rect);
  85.     STDMETHODIMP put_ZoomRect(NORMALIZEDRECT* rect);
  86. STDMETHODIMP HasConfigDialog(int iSelected);
  87. STDMETHODIMP ShowConfigDialog(int iSelected, HWND hWndParent);
  88. // IDirectVobSub2
  89. STDMETHODIMP put_TextSettings(STSStyle* pDefStyle);
  90.     // ISpecifyPropertyPages
  91.     STDMETHODIMP GetPages(CAUUID* pPages);
  92. // IAMStreamSelect
  93. STDMETHODIMP Count(DWORD* pcStreams); 
  94. STDMETHODIMP Enable(long lIndex, DWORD dwFlags); 
  95. STDMETHODIMP Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk);  
  96.     // CPersistStream
  97. STDMETHODIMP GetClassID(CLSID* pClsid);
  98. protected:
  99. HRESULT ChangeMediaType(int iPosition);
  100. HDC m_hdc;
  101. HBITMAP m_hbm;
  102. HFONT m_hfont;
  103. void PrintMessages(BYTE* pOut);
  104. /* ResX2 */
  105. CAutoVectorPtr<BYTE> m_pTempPicBuff;
  106. HRESULT Copy(BYTE* pSub, BYTE* pIn, CSize sub, CSize in, int bpp, const GUID& subtype, DWORD black);
  107. // segment start time, absolute time
  108. CRefTime m_tPrev;
  109. REFERENCE_TIME CalcCurrentTime();
  110. double m_fps;
  111. // 3.x- versions of microsoft's mpeg4 codec output flipped image
  112. bool m_fMSMpeg4Fix;
  113. // DivxPlus puts our picture upside-down on the tv
  114. bool m_fDivxPlusFix;
  115. // don't set the "hide subtitles" stream until we are finished with loading
  116. bool m_fLoading;
  117. bool Open();
  118. int FindPreferedLanguage(bool fHideToo = true);
  119. void UpdatePreferedLanguages(CString lang);
  120. CCritSec m_csSubLock;
  121. CInterfaceList<ISubStream> m_pSubStreams;
  122. DWORD_PTR m_nSubtitleId;
  123. void UpdateSubtitle(bool fApplyDefStyle = true);
  124. void SetSubtitle(ISubStream* pSubStream, bool fApplyDefStyle = true);
  125. void InvalidateSubtitle(REFERENCE_TIME rtInvalidate = -1, DWORD_PTR nSubtitleId = -1);
  126. // the text input pin is using these
  127. void AddSubStream(ISubStream* pSubStream);
  128. void RemoveSubStream(ISubStream* pSubStream);
  129. void Post_EC_OLE_EVENT(CString str, DWORD_PTR nSubtitleId = -1);
  130. private:
  131. class CFileReloaderData
  132. {
  133. public:
  134. ATL::CEvent EndThreadEvent, RefreshEvent;
  135. CList<CString> files;
  136. CArray<CTime> mtime;
  137. } m_frd;
  138. void SetupFRD(CStringArray& paths, CArray<HANDLE>& handles);
  139. DWORD ThreadProc();
  140. private:
  141. HANDLE m_hSystrayThread;
  142. SystrayIconData m_tbid;
  143. };
  144. /* The "auto-loading" version */
  145. [uuid("9852A670-F845-491b-9BE6-EBD841B8A613")]
  146. class CDirectVobSubFilter2 : public CDirectVobSubFilter
  147. {
  148. bool ShouldWeAutoload(IFilterGraph* pGraph);
  149. void GetRidOfInternalScriptRenderer();
  150. public:
  151.     CDirectVobSubFilter2(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid = __uuidof(CDirectVobSubFilter2));
  152. HRESULT CheckConnect(PIN_DIRECTION dir, IPin* pPin);
  153. STDMETHODIMP JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName);
  154.     HRESULT CheckInputType(const CMediaType* mtIn);
  155. };