From 3a8b168fbc32ee8bc4c65de359fa9586bf78ed25 Mon Sep 17 00:00:00 2001 From: xy Date: Tue, 3 Jul 2012 22:25:09 +0800 Subject: [PATCH] Changing to new interface. [PART 16] --- .../transform/vsfilter/DirectVobSubFilter.cpp | 15 +- src/filters/transform/vsfilter/plugins.cpp | 44 ++-- src/subpic/SimpleSubPicProviderImpl.cpp | 271 ++++++++++++--------- src/subpic/SimpleSubPicProviderImpl.h | 27 +- src/subpic/SimpleSubpicImpl.cpp | 13 +- 5 files changed, 201 insertions(+), 169 deletions(-) diff --git a/src/filters/transform/vsfilter/DirectVobSubFilter.cpp b/src/filters/transform/vsfilter/DirectVobSubFilter.cpp index 7acb311..93eaca0 100644 --- a/src/filters/transform/vsfilter/DirectVobSubFilter.cpp +++ b/src/filters/transform/vsfilter/DirectVobSubFilter.cpp @@ -738,27 +738,16 @@ void CDirectVobSubFilter::InitSubPicQueue() m_pTempPicBuff.Allocate(m_spd.pitch*m_spd.h); m_spd.bits = (void*)m_pTempPicBuff; - //CComPtr pSubPicAllocator = new CMemSubPicAllocator(m_spd.type, CSize(m_w, m_h)); - CPooledSubPicAllocator *pooled_subpic_allocator = new CPooledSubPicAllocator(m_spd.type, CSize(m_w, m_h), MAX_SUBPIC_QUEUE_LENGTH + 1); - if(pooled_subpic_allocator ==NULL) - { - //fix me: log error - } - CSize video(bihIn.biWidth, bihIn.biHeight), window = video; if(AdjustFrameSize(window)) video += video; ASSERT(window == CSize(m_w, m_h)); - - pooled_subpic_allocator->SetCurSize(window); - pooled_subpic_allocator->SetCurVidRect(CRect(CPoint((window.cx - video.cx)/2, (window.cy - video.cy)/2), video)); - - CComPtr pSubPicAllocator = pooled_subpic_allocator; + CRect video_rect(CPoint((window.cx - video.cx)/2, (window.cy - video.cy)/2), video); HRESULT hr = S_OK; //m_pSubPicQueue = m_fDoPreBuffering // ? (ISubPicQueue*)new CSubPicQueue(MAX_SUBPIC_QUEUE_LENGTH, pSubPicAllocator, &hr) // : (ISubPicQueue*)new CSubPicQueueNoThread(pSubPicAllocator, &hr); - m_simple_provider = new SimpleSubPicProvider2(pSubPicAllocator, &hr); + m_simple_provider = new SimpleSubPicProvider2(m_spd.type, CSize(m_w, m_h), window, video_rect, &hr); if(FAILED(hr)) m_simple_provider = NULL; diff --git a/src/filters/transform/vsfilter/plugins.cpp b/src/filters/transform/vsfilter/plugins.cpp index 02553cf..4fd9b04 100644 --- a/src/filters/transform/vsfilter/plugins.cpp +++ b/src/filters/transform/vsfilter/plugins.cpp @@ -160,10 +160,10 @@ public: ColorConvTable::SetDefaultConvType(yuv_matrix, yuv_range); } - bool Render(SubPicDesc& dst, REFERENCE_TIME rt, float fps) - { - if(!m_pSubPicProvider) - return(false); + bool Render(SubPicDesc& dst, REFERENCE_TIME rt, float fps) + { + if(!m_pSubPicProvider) + return(false); if(!m_fLazyInit) { @@ -171,25 +171,23 @@ public: SetYuvMatrix(dst); } - CSize size(dst.w, dst.h); + CSize size(dst.w, dst.h); - if(!m_simple_provider) - { - CComPtr pAllocator = new CPooledSubPicAllocator(dst.type, size, 2); - - HRESULT hr; - if(!(m_simple_provider = new SimpleSubPicProvider2(pAllocator, &hr)) || FAILED(hr)) - { - m_simple_provider = NULL; - return(false); - } - } + if(!m_simple_provider) + { + HRESULT hr; + if(!(m_simple_provider = new SimpleSubPicProvider2(dst.type, size, size, CRect(CPoint(0,0), size), &hr)) || FAILED(hr)) + { + m_simple_provider = NULL; + return(false); + } + } - if(m_SubPicProviderId != (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider) - { - m_simple_provider->SetSubPicProvider(m_pSubPicProvider); - m_SubPicProviderId = (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider; - } + if(m_SubPicProviderId != (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider) + { + m_simple_provider->SetSubPicProvider(m_pSubPicProvider); + m_SubPicProviderId = (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider; + } CComPtr pSubPic; if(!m_simple_provider->LookupSubPic(rt, &pSubPic)) @@ -199,8 +197,8 @@ public: dst.h = -dst.h; pSubPic->AlphaBlt(&dst); - return(true); - } + return(true); + } DWORD ThreadProc() { diff --git a/src/subpic/SimpleSubPicProviderImpl.cpp b/src/subpic/SimpleSubPicProviderImpl.cpp index 8e5bb8c..dece10b 100644 --- a/src/subpic/SimpleSubPicProviderImpl.cpp +++ b/src/subpic/SimpleSubPicProviderImpl.cpp @@ -2,15 +2,20 @@ #include "SimpleSubPicProviderImpl.h" #include "SimpleSubPicWrapper.h" #include "../subtitles/xy_bitmap.h" +#include "SimpleSubpicImpl.h" +#include "PooledSubPic.h" ////////////////////////////////////////////////////////////////////////// // // SimpleSubPicProvider // -SimpleSubPicProvider::SimpleSubPicProvider( ISubPicExAllocator* pAllocator, HRESULT* phr ) + +SimpleSubPicProvider::SimpleSubPicProvider( int alpha_blt_dst_type, SIZE spd_size, RECT video_rect, HRESULT* phr ) : CUnknown(NAME("CSubPicQueueImpl"), NULL) - , m_pAllocator(pAllocator) + , m_alpha_blt_dst_type(alpha_blt_dst_type) + , m_spd_size(spd_size) + , m_video_rect(video_rect) , m_rtNow(0) , m_fps(25.0) { @@ -18,19 +23,6 @@ SimpleSubPicProvider::SimpleSubPicProvider( ISubPicExAllocator* pAllocator, HRES *phr = S_OK; } - if(!m_pAllocator) { - if(phr) { - *phr = E_FAIL; - } - return; - } - if (m_pAllocator->IsDynamicWriteOnly()) - { - int o=0; - o = o/o; - throw 0; - exit(-1); - } m_prefered_colortype.AddTail(MSP_AYUV_PLANAR); m_prefered_colortype.AddTail(MSP_AYUV); m_prefered_colortype.AddTail(MSP_XY_AUYV); @@ -57,16 +49,16 @@ STDMETHODIMP SimpleSubPicProvider::SetSubPicProvider( IUnknown* subpic_provider CAutoLock cAutoLock(&m_csSubPicProvider); m_pSubPicProviderEx = tmp; - if(m_pSubPicProviderEx!=NULL && m_pAllocator!=NULL) + if(m_pSubPicProviderEx!=NULL) { POSITION pos = m_prefered_colortype.GetHeadPosition(); while(pos!=NULL) { int color_type = m_prefered_colortype.GetNext(pos); if( m_pSubPicProviderEx->IsColorTypeSupported( color_type ) && - m_pAllocator->IsSpdColorTypeSupported( color_type ) ) + IsSpdColorTypeSupported( color_type ) ) { - m_pAllocator->SetSpdColorType(color_type); + m_spd_type = color_type; break; } } @@ -112,7 +104,7 @@ STDMETHODIMP SimpleSubPicProvider::Invalidate( REFERENCE_TIME rtInvalidate /*= - { CAutoLock cQueueLock(&m_csLock); - if( m_pSubPic && m_pSubPic->GetStop() >= rtInvalidate) + if( m_pSubPic && m_subpic_stop >= rtInvalidate) { m_pSubPic = NULL; } @@ -123,15 +115,16 @@ STDMETHODIMP_(bool) SimpleSubPicProvider::LookupSubPic( REFERENCE_TIME now /*[in { if(output_subpic!=NULL) { - CComPtr temp; + *output_subpic = NULL; + CComPtr temp = NULL; bool result = LookupSubPicEx(now, &temp); - (*output_subpic = new SimpleSubPicWrapper(temp))->AddRef(); + if (result && temp) + { + (*output_subpic = new SimpleSubpic(temp, m_alpha_blt_dst_type))->AddRef(); + } return result; } - else - { - return LookupSubPicEx(now, NULL); - } + return false; } STDMETHODIMP SimpleSubPicProvider::GetStats( int& nSubPics, REFERENCE_TIME& rtNow, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop ) @@ -145,8 +138,8 @@ STDMETHODIMP SimpleSubPicProvider::GetStats( int& nSubPics, REFERENCE_TIME& rtNo if(m_pSubPic) { nSubPics = 1; - rtStart = m_pSubPic->GetStart(); - rtStop = m_pSubPic->GetStop(); + rtStart = m_subpic_start; + rtStop = m_subpic_stop; } return S_OK; @@ -159,37 +152,22 @@ STDMETHODIMP SimpleSubPicProvider::GetStats( int nSubPic, REFERENCE_TIME& rtStar if(!m_pSubPic || nSubPic != 0) return E_INVALIDARG; - rtStart = m_pSubPic->GetStart(); - rtStop = m_pSubPic->GetStop(); + rtStart = m_subpic_start; + rtStop = m_subpic_stop; return S_OK; } -bool SimpleSubPicProvider::LookupSubPicEx(REFERENCE_TIME rtNow, ISubPicEx** ppSubPic) +bool SimpleSubPicProvider::LookupSubPicEx(REFERENCE_TIME rtNow, IXySubRenderFrame** sub_render_frame) { - if(!ppSubPic) + if(!sub_render_frame) return(false); - *ppSubPic = NULL; - - CComPtr pSubPic; + *sub_render_frame = NULL; + if(m_subpic_start <= rtNow && rtNow < m_subpic_stop && m_pSubPic) { - CAutoLock cAutoLock(&m_csLock); - - if(!m_pSubPic) - { - if(FAILED(m_pAllocator->AllocDynamicEx(&m_pSubPic))) { - return false; - } - } - - pSubPic = m_pSubPic; - } - - if(m_subpic_start <= rtNow && rtNow < m_subpic_stop) - { - (*ppSubPic = pSubPic)->AddRef(); + (*sub_render_frame = m_pSubPic)->AddRef(); } else { @@ -206,22 +184,21 @@ bool SimpleSubPicProvider::LookupSubPicEx(REFERENCE_TIME rtNow, ISubPicEx** ppSu if(rtStart <= rtNow && rtNow < rtStop) { - if(SUCCEEDED(RenderTo(m_pSubPic, rtNow, rtNow+1, fps, true))) - (*ppSubPic = pSubPic)->AddRef(); + RenderTo(sub_render_frame, rtNow, rtNow+1, fps, true); } } pSubPicProvider->Unlock(); - if(*ppSubPic) + if(*sub_render_frame) { CAutoLock cAutoLock(&m_csLock); - m_pSubPic = *ppSubPic; + m_pSubPic = *sub_render_frame; } } } - return(!!*ppSubPic); + return(!!*sub_render_frame); } HRESULT SimpleSubPicProvider::GetSubPicProviderEx( ISubPicProviderEx2** pSubPicProviderEx ) @@ -240,7 +217,7 @@ HRESULT SimpleSubPicProvider::GetSubPicProviderEx( ISubPicProviderEx2** pSubPicP return !!*pSubPicProviderEx ? S_OK : E_FAIL; } -HRESULT SimpleSubPicProvider::RenderTo( ISubPicEx* pSubPic, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double fps, BOOL bIsAnimated ) +HRESULT SimpleSubPicProvider::RenderTo( IXySubRenderFrame** pSubPic, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double fps, BOOL bIsAnimated ) { HRESULT hr = E_FAIL; @@ -257,90 +234,69 @@ HRESULT SimpleSubPicProvider::RenderTo( ISubPicEx* pSubPic, REFERENCE_TIME rtSta return hr; } - SubPicDesc spd; - if(SUCCEEDED(pSubPic->Lock(spd))) - { - DWORD color = 0xFF000000; - if(SUCCEEDED(pSubPic->ClearDirtyRect(color))) - { - CAtlList rectList; - CSize output_size = CSize(spd.w,spd.h); + CAtlList rectList; - CComPtr sub_render_frame; - hr = pSubPicProviderEx->RenderEx(&sub_render_frame, spd.type, output_size, spd.vidrect, - bIsAnimated ? rtStart : ((rtStart+rtStop)/2), fps); - if (SUCCEEDED(hr) && sub_render_frame) - { - int count = 0; - hr = sub_render_frame->GetBitmapCount(&count); - if(FAILED(hr)) - { - return hr; - } - int color_space; - hr = sub_render_frame->GetXyColorSpace(&color_space); - if(FAILED(hr)) - { - return hr; - } - for (int i=0;iGetBitmap(i, NULL, &pos, &size, &pixels, &pitch ); - if(FAILED(hr)) - { - return hr; - } - rectList.AddTail(CRect(pos, size)); - if (color_space==XY_CS_AYUV_PLANAR) - { - XyPlannerFormatExtra plans; - hr = sub_render_frame->GetBitmapExtra(i, &plans); - if(FAILED(hr)) - { - return hr; - } - XyBitmap::BitBltPlannar(spd, pos, size, plans, pitch); - } - else - { - XyBitmap::BitBltPack(spd, pos, size, pixels, pitch); - } - } - } + CComPtr sub_render_frame; + hr = pSubPicProviderEx->RenderEx(pSubPic, m_spd_type, m_spd_size, m_video_rect, + bIsAnimated ? rtStart : ((rtStart+rtStop)/2), fps); - POSITION pos = pSubPicProviderEx->GetStartPosition(rtStart, fps); + POSITION pos = pSubPicProviderEx->GetStartPosition(rtStart, fps); - pSubPicProviderEx->GetStartStop(pos, fps, m_subpic_start, m_subpic_stop); - - pSubPic->Unlock(&rectList); - } - } + pSubPicProviderEx->GetStartStop(pos, fps, m_subpic_start, m_subpic_stop); pSubPicProviderEx->Unlock(); return hr; } +bool SimpleSubPicProvider::IsSpdColorTypeSupported( int type ) +{ + if( (type==MSP_RGBA) + || + (type==MSP_XY_AUYV && m_alpha_blt_dst_type == MSP_YUY2) + || + (type==MSP_AYUV && m_alpha_blt_dst_type == MSP_AYUV)//ToDo: fix me MSP_AYUV + || + (type==MSP_AYUV_PLANAR && (m_alpha_blt_dst_type == MSP_IYUV || + m_alpha_blt_dst_type == MSP_YV12 || + m_alpha_blt_dst_type == MSP_P010 || + m_alpha_blt_dst_type == MSP_P016 || + m_alpha_blt_dst_type == MSP_NV12 || + m_alpha_blt_dst_type == MSP_NV21)) ) + { + return true; + } + return false; +} + ////////////////////////////////////////////////////////////////////////// // // SimpleSubPicProvider2 // -SimpleSubPicProvider2::SimpleSubPicProvider2( ISubPicExAllocator* pAllocator, HRESULT* phr, const int *prefered_colortype/*=NULL*/, int prefered_colortype_num/*=0*/ ) +SimpleSubPicProvider2::SimpleSubPicProvider2( int alpha_blt_dst_type, SIZE max_size, SIZE cur_size, RECT video_rect, + HRESULT* phr) : CUnknown(NAME("SimpleSubPicProvider2"), NULL) - , m_ex_provider(pAllocator, phr) - , m_old_provider(pAllocator, phr, prefered_colortype, prefered_colortype_num) + , m_alpha_blt_dst_type(alpha_blt_dst_type) + , m_max_size(max_size) + , m_cur_size(cur_size) + , m_video_rect(video_rect) + , m_now(0) + , m_fps(25.0) { - m_cur_provider = &m_ex_provider; + if (phr) + { + *phr=S_OK; + } + m_ex_provider = NULL; + m_old_provider = NULL; + m_cur_provider = NULL; } SimpleSubPicProvider2::~SimpleSubPicProvider2() { - + delete m_ex_provider; + delete m_old_provider; } STDMETHODIMP SimpleSubPicProvider2::NonDelegatingQueryInterface( REFIID riid, void** ppv ) @@ -352,49 +308,122 @@ STDMETHODIMP SimpleSubPicProvider2::NonDelegatingQueryInterface( REFIID riid, vo STDMETHODIMP SimpleSubPicProvider2::SetSubPicProvider( IUnknown* subpic_provider ) { + const int MAX_SUBPIC_QUEUE_LENGTH = 1; + HRESULT hr; CComQIPtr tmp = subpic_provider; if (tmp) { - m_cur_provider = &m_ex_provider; + m_cur_provider = NULL; + delete m_old_provider; + m_old_provider = NULL; + if (!m_ex_provider) + { + m_ex_provider = new SimpleSubPicProvider(m_alpha_blt_dst_type, m_cur_size, m_video_rect, &hr); + m_ex_provider->SetFPS(m_fps); + m_ex_provider->SetTime(m_now); + } + if (m_ex_provider==NULL) + { + ASSERT(m_ex_provider!=NULL); + return E_FAIL; + } + m_cur_provider = m_ex_provider; } else { - m_cur_provider = &m_old_provider; + m_cur_provider = NULL; + delete m_ex_provider; + m_ex_provider = NULL; + if (!m_old_provider) + { + CComPtr pSubPicAllocator = new CPooledSubPicAllocator(m_alpha_blt_dst_type, + m_max_size, MAX_SUBPIC_QUEUE_LENGTH + 1); + ASSERT(pSubPicAllocator); + pSubPicAllocator->SetCurSize(m_cur_size); + pSubPicAllocator->SetCurVidRect(m_video_rect); + m_old_provider = new CSubPicQueueNoThread(pSubPicAllocator, &hr); + m_old_provider->SetFPS(m_fps); + m_old_provider->SetTime(m_now); + if (FAILED(hr) || m_old_provider==NULL) + { + ASSERT(SUCCEEDED(hr)); + return hr; + } + } + m_cur_provider = m_old_provider; } return m_cur_provider->SetSubPicProvider(subpic_provider); } STDMETHODIMP SimpleSubPicProvider2::GetSubPicProvider( IUnknown** subpic_provider ) { + ASSERT(m_cur_provider); + if (!m_cur_provider) + { + return S_FALSE; + } return m_cur_provider->GetSubPicProvider(subpic_provider); } STDMETHODIMP SimpleSubPicProvider2::SetFPS( double fps ) { + m_fps = fps; + ASSERT(m_cur_provider); + if (!m_cur_provider) + { + return S_FALSE; + } return m_cur_provider->SetFPS(fps); } STDMETHODIMP SimpleSubPicProvider2::SetTime( REFERENCE_TIME rtNow ) { + m_now = rtNow; + ASSERT(m_cur_provider); + if (!m_cur_provider) + { + return S_FALSE; + } return m_cur_provider->SetTime(rtNow); } STDMETHODIMP SimpleSubPicProvider2::Invalidate( REFERENCE_TIME rtInvalidate /*= -1*/ ) { + //ASSERT(m_cur_provider); + if (!m_cur_provider) + { + return S_FALSE; + } return m_cur_provider->Invalidate(rtInvalidate); } STDMETHODIMP_(bool) SimpleSubPicProvider2::LookupSubPic( REFERENCE_TIME now /*[in]*/, ISimpleSubPic** output_subpic/*[out]*/ ) { + ASSERT(m_cur_provider); + if (!m_cur_provider) + { + return false; + } return m_cur_provider->LookupSubPic(now, output_subpic); } STDMETHODIMP SimpleSubPicProvider2::GetStats( int& nSubPics, REFERENCE_TIME& rtNow, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop ) { + nSubPics = 0; + ASSERT(m_cur_provider); + if (!m_cur_provider) + { + return S_FALSE; + } return m_cur_provider->GetStats(nSubPics, rtNow, rtStart, rtStop); } STDMETHODIMP SimpleSubPicProvider2::GetStats( int nSubPic, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop ) { + ASSERT(m_cur_provider); + if (!m_cur_provider) + { + return S_FALSE; + } return m_cur_provider->GetStats(nSubPic, rtStart, rtStop); } diff --git a/src/subpic/SimpleSubPicProviderImpl.h b/src/subpic/SimpleSubPicProviderImpl.h index 0e745e9..2f1478b 100644 --- a/src/subpic/SimpleSubPicProviderImpl.h +++ b/src/subpic/SimpleSubPicProviderImpl.h @@ -11,15 +11,16 @@ class SimpleSubPicProvider: public CUnknown, public ISimpleSubPicProvider { public: - SimpleSubPicProvider(ISubPicExAllocator* pAllocator, HRESULT* phr); + SimpleSubPicProvider(int alpha_blt_dst_type, SIZE spd_size, RECT video_rect, HRESULT* phr=NULL); virtual ~SimpleSubPicProvider(); DECLARE_IUNKNOWN; STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv); - bool LookupSubPicEx(REFERENCE_TIME rtNow, ISubPicEx** ppSubPic); + bool LookupSubPicEx(REFERENCE_TIME rtNow, IXySubRenderFrame** sub_render_frame); HRESULT GetSubPicProviderEx(ISubPicProviderEx2** pSubPicProviderEx); - HRESULT RenderTo(ISubPicEx* pSubPic, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double fps, BOOL bIsAnimated); + HRESULT RenderTo(IXySubRenderFrame** pSubPic, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double fps, BOOL bIsAnimated); + bool IsSpdColorTypeSupported(int type); public: // ISimpleSubPicProvider @@ -40,6 +41,10 @@ private: CAtlList m_prefered_colortype; protected: + int m_alpha_blt_dst_type; + SIZE m_spd_size; + RECT m_video_rect; + int m_spd_type; double m_fps; REFERENCE_TIME m_rtNow; @@ -47,7 +52,7 @@ protected: CCritSec m_csLock; REFERENCE_TIME m_subpic_start,m_subpic_stop; - CComPtr m_pSubPic; + CComPtr m_pSubPic; }; ////////////////////////////////////////////////////////////////////////// @@ -58,7 +63,7 @@ protected: class SimpleSubPicProvider2: public CUnknown, public ISimpleSubPicProvider { public: - SimpleSubPicProvider2(ISubPicExAllocator* pAllocator, HRESULT* phr, const int *prefered_colortype=NULL, int prefered_colortype_num=0); + SimpleSubPicProvider2(int alpha_blt_dst_type, SIZE max_size, SIZE cur_size, RECT video_rect, HRESULT* phr=NULL); virtual ~SimpleSubPicProvider2(); DECLARE_IUNKNOWN; @@ -82,7 +87,15 @@ public: STDMETHODIMP GetStats(int nSubPic, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop); protected: + int m_alpha_blt_dst_type; + SIZE m_max_size; + SIZE m_cur_size; + RECT m_video_rect; + + double m_fps; + REFERENCE_TIME m_now; + ISimpleSubPicProvider *m_cur_provider; - SimpleSubPicProvider m_ex_provider; - CSubPicQueueNoThread m_old_provider; + SimpleSubPicProvider *m_ex_provider; + CSubPicQueueNoThread *m_old_provider; }; diff --git a/src/subpic/SimpleSubpicImpl.cpp b/src/subpic/SimpleSubpicImpl.cpp index d387685..f08af2b 100644 --- a/src/subpic/SimpleSubpicImpl.cpp +++ b/src/subpic/SimpleSubpicImpl.cpp @@ -135,7 +135,7 @@ HRESULT SimpleSubpic::AlphaBltAnv12_Nv12( SubPicDesc* target, const Bitmap& src const BYTE* sa = reinterpret_cast(src.extra.plans[A]); const BYTE* sy = reinterpret_cast(src.extra.plans[Y]); const BYTE* s_uv = reinterpret_cast(src.extra.plans[UV]); - return CMemSubPic::AlphaBltAnv12_P010(sa, sy, s_uv, src.pitch, d, dUV, dst.pitch, w, h); + return CMemSubPic::AlphaBltAnv12_Nv12(sa, sy, s_uv, src.pitch, d, dUV, dst.pitch, w, h); } HRESULT SimpleSubpic::AlphaBlt( SubPicDesc* target, const Bitmap& src ) @@ -505,11 +505,13 @@ void SimpleSubpic::SubsampleAndInterlace( int index, Bitmap*bitmap, bool u_first ASSERT(bitmap!=NULL); //fix me: check alignment and log error int w = bitmap->size.cx, h = bitmap->size.cy; + ASSERT(h%2==0); const BYTE* u_start = reinterpret_cast(bitmap->extra.plans[2]); const BYTE* v_start = reinterpret_cast(bitmap->extra.plans[3]); - BYTE* dst = reinterpret_cast(xy_malloc(bitmap->pitch*h, (bitmap->pos.x*4)&15)); + BYTE* dst = reinterpret_cast(xy_malloc(bitmap->pitch*h/2, bitmap->pos.x&15)); m_buffers.GetAt(index) = dst; + bitmap->extra.plans[2] = dst; if(!u_first) { @@ -522,10 +524,12 @@ void SimpleSubpic::SubsampleAndInterlace( int index, Bitmap*bitmap, bool u_first //Walkarround for alignment if ( ((bitmap->pitch | (int)u_start | (int)v_start)&15) == 0 ) { - ASSERT(w%16==0); for (int i=0;ipitch); + int w16 = w&~15; + hleft_vmid_subsample_and_interlace_2_line_sse2(dst, u_start, v_start, w16, bitmap->pitch); + ASSERT(w>0); + hleft_vmid_subsample_and_interlace_2_line_c(dst+w16, u_start+w16, v_start+w16, w&15, bitmap->pitch, -1); u_start += 2*bitmap->pitch; v_start += 2*bitmap->pitch; dst += bitmap->pitch; @@ -541,5 +545,4 @@ void SimpleSubpic::SubsampleAndInterlace( int index, Bitmap*bitmap, bool u_first dst += bitmap->pitch; } } - bitmap->extra.plans[2] = dst; } -- 2.11.4.GIT