2 #include "SimpleSubPicProviderImpl.h"
3 #include "SimpleSubPicWrapper.h"
4 #include "../subtitles/xy_bitmap.h"
6 //////////////////////////////////////////////////////////////////////////
8 // SimpleSubPicProvider
11 SimpleSubPicProvider::SimpleSubPicProvider( ISubPicExAllocator
* pAllocator
, HRESULT
* phr
)
12 : CUnknown(NAME("CSubPicQueueImpl"), NULL
)
13 , m_pAllocator(pAllocator
)
27 if (m_pAllocator
->IsDynamicWriteOnly())
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
)
48 QI(ISimpleSubPicProvider
)
49 __super::NonDelegatingQueryInterface(riid
, ppv
);
52 STDMETHODIMP
SimpleSubPicProvider::SetSubPicProvider( IUnknown
* subpic_provider
)
54 CComQIPtr
<ISubPicProviderEx2
> tmp
= subpic_provider
;
57 CAutoLock
cAutoLock(&m_csSubPicProvider
);
58 m_pSubPicProviderEx
= tmp
;
60 if(m_pSubPicProviderEx
!=NULL
&& m_pAllocator
!=NULL
)
62 POSITION pos
= m_prefered_colortype
.GetHeadPosition();
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
);
81 STDMETHODIMP
SimpleSubPicProvider::GetSubPicProvider( IUnknown
** subpic_provider
)
83 if(!subpic_provider
) {
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
)
104 STDMETHODIMP
SimpleSubPicProvider::SetTime( REFERENCE_TIME rtNow
)
111 STDMETHODIMP
SimpleSubPicProvider::Invalidate( REFERENCE_TIME rtInvalidate
/*= -1*/ )
113 CAutoLock
cQueueLock(&m_csLock
);
115 if( m_pSubPic
&& m_pSubPic
->GetStop() >= rtInvalidate
)
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();
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
);
143 rtStart
= rtStop
= 0;
148 rtStart
= m_pSubPic
->GetStart();
149 rtStop
= m_pSubPic
->GetStop();
155 STDMETHODIMP
SimpleSubPicProvider::GetStats( int nSubPic
, REFERENCE_TIME
& rtStart
, REFERENCE_TIME
& rtStop
)
157 CAutoLock
cAutoLock(&m_csLock
);
159 if(!m_pSubPic
|| nSubPic
!= 0)
162 rtStart
= m_pSubPic
->GetStart();
163 rtStop
= m_pSubPic
->GetStop();
168 bool SimpleSubPicProvider::LookupSubPicEx(REFERENCE_TIME rtNow
, ISubPicEx
** ppSubPic
)
175 CComPtr
<ISubPicEx
> pSubPic
;
178 CAutoLock
cAutoLock(&m_csLock
);
182 if(FAILED(m_pAllocator
->AllocDynamicEx(&m_pSubPic
))) {
190 if(m_subpic_start
<= rtNow
&& rtNow
< m_subpic_stop
)
192 (*ppSubPic
= pSubPic
)->AddRef();
196 CComPtr
<ISubPicProviderEx2
> pSubPicProvider
;
197 if(SUCCEEDED(GetSubPicProviderEx(&pSubPicProvider
)) && pSubPicProvider
198 && SUCCEEDED(pSubPicProvider
->Lock()))
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();
218 CAutoLock
cAutoLock(&m_csLock
);
220 m_pSubPic
= *ppSubPic
;
227 HRESULT
SimpleSubPicProvider::GetSubPicProviderEx( ISubPicProviderEx2
** pSubPicProviderEx
)
229 if(!pSubPicProviderEx
) {
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
)
251 CComPtr
<ISubPicProviderEx2
> pSubPicProviderEx
;
252 if(FAILED(GetSubPicProviderEx(&pSubPicProviderEx
)) || !pSubPicProviderEx
) {
256 if(FAILED(pSubPicProviderEx
->Lock())) {
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
)
275 hr
= sub_render_frame
->GetBitmapCount(&count
);
281 hr
= sub_render_frame
->GetXyColorSpace(&color_space
);
286 for (int i
=0;i
<count
;i
++)
292 hr
= sub_render_frame
->GetBitmap(i
, NULL
, &pos
, &size
, &pixels
, &pitch
);
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
);
306 XyBitmap::BitBltPlannar(spd
, pos
, size
, plans
, pitch
);
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();
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
)
349 QI(ISimpleSubPicProvider
)
350 __super::NonDelegatingQueryInterface(riid
, ppv
);
353 STDMETHODIMP
SimpleSubPicProvider2::SetSubPicProvider( IUnknown
* subpic_provider
)
355 CComQIPtr
<ISubPicProviderEx2
> tmp
= subpic_provider
;
358 m_cur_provider
= &m_ex_provider
;
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
);