Changing to new interface. [PART 15]
[xy_vsfilter.git] / src / subpic / SimpleSubPicProviderImpl.cpp
blob8e5bb8c187254e3727d2f14cca241cfdb8c86308
1 #include "stdafx.h"
2 #include "SimpleSubPicProviderImpl.h"
3 #include "SimpleSubPicWrapper.h"
4 #include "../subtitles/xy_bitmap.h"
6 //////////////////////////////////////////////////////////////////////////
7 //
8 // SimpleSubPicProvider
9 //
11 SimpleSubPicProvider::SimpleSubPicProvider( ISubPicExAllocator* pAllocator, HRESULT* phr )
12 : CUnknown(NAME("CSubPicQueueImpl"), NULL)
13 , m_pAllocator(pAllocator)
14 , m_rtNow(0)
15 , m_fps(25.0)
17 if(phr) {
18 *phr = S_OK;
21 if(!m_pAllocator) {
22 if(phr) {
23 *phr = E_FAIL;
25 return;
27 if (m_pAllocator->IsDynamicWriteOnly())
29 int o=0;
30 o = o/o;
31 throw 0;
32 exit(-1);
34 m_prefered_colortype.AddTail(MSP_AYUV_PLANAR);
35 m_prefered_colortype.AddTail(MSP_AYUV);
36 m_prefered_colortype.AddTail(MSP_XY_AUYV);
37 m_prefered_colortype.AddTail(MSP_RGBA);
40 SimpleSubPicProvider::~SimpleSubPicProvider()
45 STDMETHODIMP SimpleSubPicProvider::NonDelegatingQueryInterface( REFIID riid, void** ppv )
47 return
48 QI(ISimpleSubPicProvider)
49 __super::NonDelegatingQueryInterface(riid, ppv);
52 STDMETHODIMP SimpleSubPicProvider::SetSubPicProvider( IUnknown* subpic_provider )
54 CComQIPtr<ISubPicProviderEx2> tmp = subpic_provider;
55 if (tmp)
57 CAutoLock cAutoLock(&m_csSubPicProvider);
58 m_pSubPicProviderEx = tmp;
60 if(m_pSubPicProviderEx!=NULL && m_pAllocator!=NULL)
62 POSITION pos = m_prefered_colortype.GetHeadPosition();
63 while(pos!=NULL)
65 int color_type = m_prefered_colortype.GetNext(pos);
66 if( m_pSubPicProviderEx->IsColorTypeSupported( color_type ) &&
67 m_pAllocator->IsSpdColorTypeSupported( color_type ) )
69 m_pAllocator->SetSpdColorType(color_type);
70 break;
74 Invalidate();
76 return S_OK;
78 return E_NOTIMPL;
81 STDMETHODIMP SimpleSubPicProvider::GetSubPicProvider( IUnknown** subpic_provider )
83 if(!subpic_provider) {
84 return E_POINTER;
87 CAutoLock cAutoLock(&m_csSubPicProvider);
89 if(m_pSubPicProviderEx) {
90 *subpic_provider = m_pSubPicProviderEx;
91 (*subpic_provider)->AddRef();
94 return !!*subpic_provider ? S_OK : E_FAIL;
97 STDMETHODIMP SimpleSubPicProvider::SetFPS( double fps )
99 m_fps = fps;
101 return S_OK;
104 STDMETHODIMP SimpleSubPicProvider::SetTime( REFERENCE_TIME rtNow )
106 m_rtNow = rtNow;
108 return S_OK;
111 STDMETHODIMP SimpleSubPicProvider::Invalidate( REFERENCE_TIME rtInvalidate /*= -1*/ )
113 CAutoLock cQueueLock(&m_csLock);
115 if( m_pSubPic && m_pSubPic->GetStop() >= rtInvalidate)
117 m_pSubPic = NULL;
119 return S_OK;
122 STDMETHODIMP_(bool) SimpleSubPicProvider::LookupSubPic( REFERENCE_TIME now /*[in]*/, ISimpleSubPic** output_subpic /*[out]*/ )
124 if(output_subpic!=NULL)
126 CComPtr<ISubPicEx> temp;
127 bool result = LookupSubPicEx(now, &temp);
128 (*output_subpic = new SimpleSubPicWrapper(temp))->AddRef();
129 return result;
131 else
133 return LookupSubPicEx(now, NULL);
137 STDMETHODIMP SimpleSubPicProvider::GetStats( int& nSubPics, REFERENCE_TIME& rtNow, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop )
139 CAutoLock cAutoLock(&m_csLock);
141 nSubPics = 0;
142 rtNow = m_rtNow;
143 rtStart = rtStop = 0;
145 if(m_pSubPic)
147 nSubPics = 1;
148 rtStart = m_pSubPic->GetStart();
149 rtStop = m_pSubPic->GetStop();
152 return S_OK;
155 STDMETHODIMP SimpleSubPicProvider::GetStats( int nSubPic, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop )
157 CAutoLock cAutoLock(&m_csLock);
159 if(!m_pSubPic || nSubPic != 0)
160 return E_INVALIDARG;
162 rtStart = m_pSubPic->GetStart();
163 rtStop = m_pSubPic->GetStop();
165 return S_OK;
168 bool SimpleSubPicProvider::LookupSubPicEx(REFERENCE_TIME rtNow, ISubPicEx** ppSubPic)
170 if(!ppSubPic)
171 return(false);
173 *ppSubPic = NULL;
175 CComPtr<ISubPicEx> pSubPic;
178 CAutoLock cAutoLock(&m_csLock);
180 if(!m_pSubPic)
182 if(FAILED(m_pAllocator->AllocDynamicEx(&m_pSubPic))) {
183 return false;
187 pSubPic = m_pSubPic;
190 if(m_subpic_start <= rtNow && rtNow < m_subpic_stop)
192 (*ppSubPic = pSubPic)->AddRef();
194 else
196 CComPtr<ISubPicProviderEx2> pSubPicProvider;
197 if(SUCCEEDED(GetSubPicProviderEx(&pSubPicProvider)) && pSubPicProvider
198 && SUCCEEDED(pSubPicProvider->Lock()))
200 double fps = m_fps;
202 if(POSITION pos = pSubPicProvider->GetStartPosition(rtNow, fps))
204 REFERENCE_TIME rtStart = pSubPicProvider->GetStart(pos, fps);
205 REFERENCE_TIME rtStop = pSubPicProvider->GetStop(pos, fps);
207 if(rtStart <= rtNow && rtNow < rtStop)
209 if(SUCCEEDED(RenderTo(m_pSubPic, rtNow, rtNow+1, fps, true)))
210 (*ppSubPic = pSubPic)->AddRef();
214 pSubPicProvider->Unlock();
216 if(*ppSubPic)
218 CAutoLock cAutoLock(&m_csLock);
220 m_pSubPic = *ppSubPic;
224 return(!!*ppSubPic);
227 HRESULT SimpleSubPicProvider::GetSubPicProviderEx( ISubPicProviderEx2** pSubPicProviderEx )
229 if(!pSubPicProviderEx) {
230 return E_POINTER;
233 CAutoLock cAutoLock(&m_csSubPicProvider);
235 if(m_pSubPicProviderEx) {
236 *pSubPicProviderEx = m_pSubPicProviderEx;
237 (*pSubPicProviderEx)->AddRef();
240 return !!*pSubPicProviderEx ? S_OK : E_FAIL;
243 HRESULT SimpleSubPicProvider::RenderTo( ISubPicEx* pSubPic, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double fps, BOOL bIsAnimated )
245 HRESULT hr = E_FAIL;
247 if(!pSubPic) {
248 return hr;
251 CComPtr<ISubPicProviderEx2> pSubPicProviderEx;
252 if(FAILED(GetSubPicProviderEx(&pSubPicProviderEx)) || !pSubPicProviderEx) {
253 return hr;
256 if(FAILED(pSubPicProviderEx->Lock())) {
257 return hr;
260 SubPicDesc spd;
261 if(SUCCEEDED(pSubPic->Lock(spd)))
263 DWORD color = 0xFF000000;
264 if(SUCCEEDED(pSubPic->ClearDirtyRect(color)))
266 CAtlList<CRect> rectList;
267 CSize output_size = CSize(spd.w,spd.h);
269 CComPtr<IXySubRenderFrame> sub_render_frame;
270 hr = pSubPicProviderEx->RenderEx(&sub_render_frame, spd.type, output_size, spd.vidrect,
271 bIsAnimated ? rtStart : ((rtStart+rtStop)/2), fps);
272 if (SUCCEEDED(hr) && sub_render_frame)
274 int count = 0;
275 hr = sub_render_frame->GetBitmapCount(&count);
276 if(FAILED(hr))
278 return hr;
280 int color_space;
281 hr = sub_render_frame->GetXyColorSpace(&color_space);
282 if(FAILED(hr))
284 return hr;
286 for (int i=0;i<count;i++)
288 POINT pos;
289 SIZE size;
290 LPCVOID pixels;
291 int pitch;
292 hr = sub_render_frame->GetBitmap(i, NULL, &pos, &size, &pixels, &pitch );
293 if(FAILED(hr))
295 return hr;
297 rectList.AddTail(CRect(pos, size));
298 if (color_space==XY_CS_AYUV_PLANAR)
300 XyPlannerFormatExtra plans;
301 hr = sub_render_frame->GetBitmapExtra(i, &plans);
302 if(FAILED(hr))
304 return hr;
306 XyBitmap::BitBltPlannar(spd, pos, size, plans, pitch);
308 else
310 XyBitmap::BitBltPack(spd, pos, size, pixels, pitch);
315 POSITION pos = pSubPicProviderEx->GetStartPosition(rtStart, fps);
317 pSubPicProviderEx->GetStartStop(pos, fps, m_subpic_start, m_subpic_stop);
319 pSubPic->Unlock(&rectList);
323 pSubPicProviderEx->Unlock();
325 return hr;
328 //////////////////////////////////////////////////////////////////////////
330 // SimpleSubPicProvider2
333 SimpleSubPicProvider2::SimpleSubPicProvider2( ISubPicExAllocator* pAllocator, HRESULT* phr, const int *prefered_colortype/*=NULL*/, int prefered_colortype_num/*=0*/ )
334 : CUnknown(NAME("SimpleSubPicProvider2"), NULL)
335 , m_ex_provider(pAllocator, phr)
336 , m_old_provider(pAllocator, phr, prefered_colortype, prefered_colortype_num)
338 m_cur_provider = &m_ex_provider;
341 SimpleSubPicProvider2::~SimpleSubPicProvider2()
346 STDMETHODIMP SimpleSubPicProvider2::NonDelegatingQueryInterface( REFIID riid, void** ppv )
348 return
349 QI(ISimpleSubPicProvider)
350 __super::NonDelegatingQueryInterface(riid, ppv);
353 STDMETHODIMP SimpleSubPicProvider2::SetSubPicProvider( IUnknown* subpic_provider )
355 CComQIPtr<ISubPicProviderEx2> tmp = subpic_provider;
356 if (tmp)
358 m_cur_provider = &m_ex_provider;
360 else
362 m_cur_provider = &m_old_provider;
364 return m_cur_provider->SetSubPicProvider(subpic_provider);
367 STDMETHODIMP SimpleSubPicProvider2::GetSubPicProvider( IUnknown** subpic_provider )
369 return m_cur_provider->GetSubPicProvider(subpic_provider);
372 STDMETHODIMP SimpleSubPicProvider2::SetFPS( double fps )
374 return m_cur_provider->SetFPS(fps);
377 STDMETHODIMP SimpleSubPicProvider2::SetTime( REFERENCE_TIME rtNow )
379 return m_cur_provider->SetTime(rtNow);
382 STDMETHODIMP SimpleSubPicProvider2::Invalidate( REFERENCE_TIME rtInvalidate /*= -1*/ )
384 return m_cur_provider->Invalidate(rtInvalidate);
387 STDMETHODIMP_(bool) SimpleSubPicProvider2::LookupSubPic( REFERENCE_TIME now /*[in]*/, ISimpleSubPic** output_subpic/*[out]*/ )
389 return m_cur_provider->LookupSubPic(now, output_subpic);
392 STDMETHODIMP SimpleSubPicProvider2::GetStats( int& nSubPics, REFERENCE_TIME& rtNow, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop )
394 return m_cur_provider->GetStats(nSubPics, rtNow, rtStart, rtStop);
397 STDMETHODIMP SimpleSubPicProvider2::GetStats( int nSubPic, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop )
399 return m_cur_provider->GetStats(nSubPic, rtStart, rtStop);