Merge some MPC-HC Rev.3895 code to get HdmvSub and DVBSub support.
[xy_vsfilter.git] / src / subtitles / RenderedHdmvSubtitle.cpp
blobcfab147e655739abd239de9d5e1fc7bd34499e97
1 /*
2 * $Id: RenderedHdmvSubtitle.cpp 3650 2011-08-11 12:16:46Z XhmikosR $
4 * (C) 2006-2010 see AUTHORS
6 * This file is part of mplayerc.
8 * Mplayerc is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
13 * Mplayerc is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include "stdafx.h"
25 #include "HdmvSub.h"
26 #include "DVBSub.h"
27 #include "RenderedHdmvSubtitle.h"
29 CRenderedHdmvSubtitle::CRenderedHdmvSubtitle(CCritSec* pLock, SUBTITLE_TYPE nType, const CString& name, LCID lcid)
30 : CSubPicProviderImpl(pLock), m_name(name), m_lcid(lcid)
32 switch (nType) {
33 case ST_DVB :
34 m_pSub = DNew CDVBSub();
35 if (name.IsEmpty() || (name == _T("Unknown"))) m_name = "DVB Embedded Subtitle";
36 break;
37 case ST_HDMV :
38 m_pSub = DNew CHdmvSub();
39 if (name.IsEmpty() || (name == _T("Unknown"))) m_name = "HDMV Embedded Subtitle";
40 break;
41 default :
42 ASSERT (FALSE);
43 m_pSub = NULL;
45 m_rtStart = 0;
48 CRenderedHdmvSubtitle::~CRenderedHdmvSubtitle(void)
50 delete m_pSub;
54 STDMETHODIMP CRenderedHdmvSubtitle::NonDelegatingQueryInterface(REFIID riid, void** ppv)
56 CheckPointer(ppv, E_POINTER);
57 *ppv = NULL;
59 return
60 QI(IPersist)
61 QI(ISubStream)
62 QI(ISubPicProvider)
63 __super::NonDelegatingQueryInterface(riid, ppv);
66 // ISubPicProvider
68 STDMETHODIMP_(POSITION) CRenderedHdmvSubtitle::GetStartPosition(REFERENCE_TIME rt, double fps)
70 CAutoLock cAutoLock(&m_csCritSec);
71 return m_pSub->GetStartPosition(rt - m_rtStart, fps);
74 STDMETHODIMP_(POSITION) CRenderedHdmvSubtitle::GetNext(POSITION pos)
76 CAutoLock cAutoLock(&m_csCritSec);
77 return m_pSub->GetNext (pos);
80 STDMETHODIMP_(REFERENCE_TIME) CRenderedHdmvSubtitle::GetStart(POSITION pos, double fps)
82 CAutoLock cAutoLock(&m_csCritSec);
83 return m_pSub->GetStart(pos) + m_rtStart;
86 STDMETHODIMP_(REFERENCE_TIME) CRenderedHdmvSubtitle::GetStop(POSITION pos, double fps)
88 CAutoLock cAutoLock(&m_csCritSec);
89 return m_pSub->GetStop(pos) + m_rtStart;
92 STDMETHODIMP_(bool) CRenderedHdmvSubtitle::IsAnimated(POSITION pos)
94 return false;
97 STDMETHODIMP CRenderedHdmvSubtitle::Render(SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox)
99 CAutoLock cAutoLock(&m_csCritSec);
100 m_pSub->Render (spd, rt - m_rtStart, bbox);
102 return S_OK;
105 STDMETHODIMP CRenderedHdmvSubtitle::GetTextureSize (POSITION pos, SIZE& MaxTextureSize, SIZE& VideoSize, POINT& VideoTopLeft)
107 CAutoLock cAutoLock(&m_csCritSec);
108 HRESULT hr = m_pSub->GetTextureSize(pos, MaxTextureSize, VideoSize, VideoTopLeft);
109 return hr;
112 // IPersist
114 STDMETHODIMP CRenderedHdmvSubtitle::GetClassID(CLSID* pClassID)
116 return pClassID ? *pClassID = __uuidof(this), S_OK : E_POINTER;
119 // ISubStream
121 STDMETHODIMP_(int) CRenderedHdmvSubtitle::GetStreamCount()
123 return (1);
126 STDMETHODIMP CRenderedHdmvSubtitle::GetStreamInfo(int iStream, WCHAR** ppName, LCID* pLCID)
128 if(iStream != 0) {
129 return E_INVALIDARG;
132 if(ppName) {
133 *ppName = (WCHAR*)CoTaskMemAlloc((m_name.GetLength()+1)*sizeof(WCHAR));
134 if(!(*ppName)) {
135 return E_OUTOFMEMORY;
138 wcscpy_s (*ppName, m_name.GetLength()+1, CStringW(m_name));
141 if(pLCID) {
142 *pLCID = m_lcid;
145 return S_OK;
148 STDMETHODIMP_(int) CRenderedHdmvSubtitle::GetStream()
150 return(0);
153 STDMETHODIMP CRenderedHdmvSubtitle::SetStream(int iStream)
155 return iStream == 0 ? S_OK : E_FAIL;
158 STDMETHODIMP CRenderedHdmvSubtitle::Reload()
160 return S_OK;
163 HRESULT CRenderedHdmvSubtitle::ParseSample (IMediaSample* pSample)
165 CAutoLock cAutoLock(&m_csCritSec);
166 HRESULT hr;
168 hr = m_pSub->ParseSample (pSample);
169 return hr;
172 HRESULT CRenderedHdmvSubtitle::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
174 CAutoLock cAutoLock(&m_csCritSec);
176 m_pSub->Reset();
177 m_rtStart = tStart;
178 return S_OK;