/* * Copyright (C) 2003-2006 Gabest * http://www.gabest.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This Program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Make; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * http://www.gnu.org/copyleft/gpl.html * */ #pragma once #include #include "DirectVobSub.h" #include "BaseVideoFilter/BaseVideoFilter.h" #include "subtitles/VobSubFile.h" #include "subtitles/RTS.h" #include "subtitles/SSF.h" typedef struct { HWND hSystrayWnd; IFilterGraph* graph; IDirectVobSub* dvs; bool fRunOnce, fShowIcon; } SystrayIconData; /* This is for graphedit */ [uuid("93A22E7A-5091-45ef-BA61-6DA26156A5D0")] class CDirectVobSubFilter : public CBaseVideoFilter , public CDirectVobSub , public ISpecifyPropertyPages , public IAMStreamSelect , public CAMThread { friend class CTextInputPin; CCritSec m_csQueueLock; CComPtr m_pSubPicQueue; void InitSubPicQueue(); SubPicDesc m_spd; bool AdjustFrameSize(CSize& s); protected: void GetOutputSize(int& w, int& h, int& arx, int& ary); HRESULT Transform(IMediaSample* pIn); public: CDirectVobSubFilter(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid = __uuidof(CDirectVobSubFilter)); virtual ~CDirectVobSubFilter(); DECLARE_IUNKNOWN; STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv); // CBaseFilter CBasePin* GetPin(int n); int GetPinCount(); STDMETHODIMP JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName); STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo); // CTransformFilter HRESULT SetMediaType(PIN_DIRECTION dir, const CMediaType* pMediaType), CheckConnect(PIN_DIRECTION dir, IPin* pPin), CompleteConnect(PIN_DIRECTION dir, IPin* pReceivePin), BreakConnect(PIN_DIRECTION dir), StartStreaming(), StopStreaming(), NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate); CAtlArray m_pTextInput; // IDirectVobSub STDMETHODIMP put_FileName(WCHAR* fn); STDMETHODIMP get_LanguageCount(int* nLangs); STDMETHODIMP get_LanguageName(int iLanguage, WCHAR** ppName); STDMETHODIMP put_SelectedLanguage(int iSelected); STDMETHODIMP put_HideSubtitles(bool fHideSubtitles); STDMETHODIMP put_PreBuffering(bool fDoPreBuffering); STDMETHODIMP put_Placement(bool fOverridePlacement, int xperc, int yperc); STDMETHODIMP put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fPolygonize); STDMETHODIMP put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer); STDMETHODIMP put_SubtitleTiming(int delay, int speedmul, int speeddiv); STDMETHODIMP get_MediaFPS(bool* fEnabled, double* fps); STDMETHODIMP put_MediaFPS(bool fEnabled, double fps); STDMETHODIMP get_ZoomRect(NORMALIZEDRECT* rect); STDMETHODIMP put_ZoomRect(NORMALIZEDRECT* rect); STDMETHODIMP HasConfigDialog(int iSelected); STDMETHODIMP ShowConfigDialog(int iSelected, HWND hWndParent); // IDirectVobSub2 STDMETHODIMP put_TextSettings(STSStyle* pDefStyle); // ISpecifyPropertyPages STDMETHODIMP GetPages(CAUUID* pPages); // IAMStreamSelect STDMETHODIMP Count(DWORD* pcStreams); STDMETHODIMP Enable(long lIndex, DWORD dwFlags); STDMETHODIMP Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk); // CPersistStream STDMETHODIMP GetClassID(CLSID* pClsid); protected: HRESULT ChangeMediaType(int iPosition); HDC m_hdc; HBITMAP m_hbm; HFONT m_hfont; void PrintMessages(BYTE* pOut); /* ResX2 */ CAutoVectorPtr m_pTempPicBuff; HRESULT Copy(BYTE* pSub, BYTE* pIn, CSize sub, CSize in, int bpp, const GUID& subtype, DWORD black); // segment start time, absolute time CRefTime m_tPrev; REFERENCE_TIME CalcCurrentTime(); double m_fps; // 3.x- versions of microsoft's mpeg4 codec output flipped image bool m_fMSMpeg4Fix; // DivxPlus puts our picture upside-down on the tv bool m_fDivxPlusFix; // don't set the "hide subtitles" stream until we are finished with loading bool m_fLoading; bool Open(); int FindPreferedLanguage(bool fHideToo = true); void UpdatePreferedLanguages(CString lang); CCritSec m_csSubLock; CInterfaceList m_pSubStreams; DWORD_PTR m_nSubtitleId; void UpdateSubtitle(bool fApplyDefStyle = true); void SetSubtitle(ISubStream* pSubStream, bool fApplyDefStyle = true); void InvalidateSubtitle(REFERENCE_TIME rtInvalidate = -1, DWORD_PTR nSubtitleId = -1); // the text input pin is using these void AddSubStream(ISubStream* pSubStream); void RemoveSubStream(ISubStream* pSubStream); void Post_EC_OLE_EVENT(CString str, DWORD_PTR nSubtitleId = -1); private: class CFileReloaderData { public: ATL::CEvent EndThreadEvent, RefreshEvent; CAtlList files; CAtlArray mtime; } m_frd; void SetupFRD(CStringArray& paths, CAtlArray& handles); DWORD ThreadProc(); private: HANDLE m_hSystrayThread; SystrayIconData m_tbid; }; /* The "auto-loading" version */ [uuid("9852A670-F845-491b-9BE6-EBD841B8A613")] class CDirectVobSubFilter2 : public CDirectVobSubFilter { bool ShouldWeAutoload(IFilterGraph* pGraph); void GetRidOfInternalScriptRenderer(); public: CDirectVobSubFilter2(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid = __uuidof(CDirectVobSubFilter2)); HRESULT CheckConnect(PIN_DIRECTION dir, IPin* pPin); STDMETHODIMP JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName); HRESULT CheckInputType(const CMediaType* mtIn); };