Aegisub/vsfilter/DirectVobSubFilter.h

197 lines
6.0 KiB
C++

/*
* 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 <atlsync.h>
#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<ISubPicQueue> 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<CTextInputPin*> 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<BYTE> 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<ISubStream> 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<CString> files;
CAtlArray<CTime> mtime;
} m_frd;
void SetupFRD(CStringArray& paths, CAtlArray<HANDLE>& 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);
};