From 22647d74b94560531d00108d7d6dcb88ab240f7c Mon Sep 17 00:00:00 2001 From: davilla Date: Tue, 17 Jul 2012 21:43:38 -0400 Subject: [PATCH] [droid] add renderer callback to support players that render outside gles --- xbmc/cores/VideoRenderers/BaseRenderer.cpp | 9 +++++++++ xbmc/cores/VideoRenderers/BaseRenderer.h | 7 +++++++ .../VideoRenderers/LinuxRendererGLES.cpp | 19 +++++++++++-------- xbmc/cores/VideoRenderers/LinuxRendererGLES.h | 1 + xbmc/cores/VideoRenderers/RenderManager.cpp | 6 ++++++ xbmc/cores/VideoRenderers/RenderManager.h | 2 ++ 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.cpp b/xbmc/cores/VideoRenderers/BaseRenderer.cpp index 6fb890ef32..3fcd316110 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.cpp +++ b/xbmc/cores/VideoRenderers/BaseRenderer.cpp @@ -47,12 +47,21 @@ CBaseRenderer::CBaseRenderer() m_rotatedDestCoords[i].x = 0; m_rotatedDestCoords[i].y = 0; } + + m_RenderUpdateCallBackFn = NULL; + m_RenderUpdateCallBackCtx = NULL; } CBaseRenderer::~CBaseRenderer() { } +void CBaseRenderer::RegisterRenderUpdateCallBack(const void *ctx, RenderUpdateCallBackFn fn) +{ + m_RenderUpdateCallBackFn = fn; + m_RenderUpdateCallBackCtx = ctx; +} + void CBaseRenderer::ChooseBestResolution(float fps) { if (fps == 0.0) return; diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h index f73a50f8bb..fd5f5317c9 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.h +++ b/xbmc/cores/VideoRenderers/BaseRenderer.h @@ -60,6 +60,8 @@ enum ERENDERFEATURE RENDERFEATURE_ROTATION }; +typedef void (*RenderUpdateCallBackFn)(const void *ctx, const CRect &SrcRect, const CRect &DestRect); + struct DVDVideoPicture; class CBaseRenderer @@ -83,6 +85,8 @@ class CBaseRenderer // Supported pixel formats, can be called before configure std::vector SupportedFormats() { return std::vector(); } + virtual void RegisterRenderUpdateCallBack(const void *ctx, RenderUpdateCallBackFn fn); + protected: void ChooseBestResolution(float fps); bool FindResolutionFromOverride(float fps, float& weight, bool fallback); @@ -111,4 +115,7 @@ class CBaseRenderer CRect m_destRect; CRect m_oldDestRect; // destrect of the previous frame CRect m_sourceRect; + + const void* m_RenderUpdateCallBackCtx; + RenderUpdateCallBackFn m_RenderUpdateCallBackFn; }; diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp index a44c0b7a3f..e3fbbf3118 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp @@ -187,6 +187,10 @@ bool CLinuxRendererGLES::Configure(unsigned int width, unsigned int height, unsi m_buffers[i].image.flags = 0; m_iLastRenderBuffer = -1; + + m_RenderUpdateCallBackFn = NULL; + m_RenderUpdateCallBackCtx = NULL; + return true; } @@ -398,14 +402,12 @@ void CLinuxRendererGLES::RenderUpdate(bool clear, DWORD flags, DWORD alpha) { ManageDisplay(); ManageTextures(); - g_graphicsContext.BeginPaint(); + // if running bypass, then the player might need the src/dst rects + // for sizing video playback on a layer other than the gles layer. + if (m_RenderUpdateCallBackFn) + (*m_RenderUpdateCallBackFn)(m_RenderUpdateCallBackCtx, m_sourceRect, m_destRect); - // RENDER_BYPASS means we are rendering video - // outside the control of gles and on a different - // graphics plane that is under the gles layer. - // Clear a hole where video would appear so we do not see - // background images that have already been rendered. - g_graphicsContext.SetScissors(m_destRect); + g_graphicsContext.BeginPaint(); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -721,6 +723,8 @@ void CLinuxRendererGLES::UnInit() m_bValidated = false; m_bImageReady = false; m_bConfigured = false; + m_RenderUpdateCallBackFn = NULL; + m_RenderUpdateCallBackCtx = NULL; } inline void CLinuxRendererGLES::ReorderDrawPoints() @@ -1918,6 +1922,5 @@ void CLinuxRendererGLES::AddProcessor(struct __CVBuffer *cvBufferRef) } #endif - #endif diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h index 4312a55d9e..da801f6fed 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h @@ -158,6 +158,7 @@ class CLinuxRendererGLES : public CBaseRenderer #ifdef HAVE_VIDEOTOOLBOXDECODER virtual void AddProcessor(struct __CVBuffer *cvBufferRef); #endif + protected: virtual void Render(DWORD flags, int index); diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp index ed14ab231c..baa10d4d54 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -648,6 +648,12 @@ float CXBMCRenderManager::GetMaximumFPS() return fps; } +void CXBMCRenderManager::RegisterRenderUpdateCallBack(const void *ctx, RenderUpdateCallBackFn fn) +{ + if (m_pRenderer) + m_pRenderer->RegisterRenderUpdateCallBack(ctx, fn); +} + void CXBMCRenderManager::Render(bool clear, DWORD flags, DWORD alpha) { CSharedLock lock(m_sharedSection); diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h index 238d356a34..062fd5daf8 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.h +++ b/xbmc/cores/VideoRenderers/RenderManager.h @@ -131,6 +131,8 @@ class CXBMCRenderManager CSharedSection& GetSection() { return m_sharedSection; }; + void RegisterRenderUpdateCallBack(const void *ctx, RenderUpdateCallBackFn fn); + protected: void Render(bool clear, DWORD flags, DWORD alpha);