From 5ee0dfcc19ac814abb3ff03c44d908f8de27cb69 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 f74693d836..0576c6be5f 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.cpp +++ b/xbmc/cores/VideoRenderers/BaseRenderer.cpp @@ -38,12 +38,21 @@ CBaseRenderer::CBaseRenderer() m_sourceHeight = 480; m_resolution = RES_DESKTOP; m_fps = 0.0f; + + 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 b6d607e399..ef5e832607 100644 --- a/xbmc/cores/VideoRenderers/BaseRenderer.h +++ b/xbmc/cores/VideoRenderers/BaseRenderer.h @@ -59,6 +59,8 @@ enum ERENDERFEATURE RENDERFEATURE_NONLINSTRETCH }; +typedef void (*RenderUpdateCallBackFn)(const void *ctx, const CRect &SrcRect, const CRect &DestRect); + struct DVDVideoPicture; class CBaseRenderer @@ -80,6 +82,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); @@ -98,4 +102,7 @@ class CBaseRenderer CRect m_destRect; 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 2ccd5a8b86..331c08c33a 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp @@ -186,6 +186,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; } @@ -397,14 +401,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); @@ -720,6 +722,8 @@ void CLinuxRendererGLES::UnInit() m_bValidated = false; m_bImageReady = false; m_bConfigured = false; + m_RenderUpdateCallBackFn = NULL; + m_RenderUpdateCallBackCtx = NULL; } void CLinuxRendererGLES::Render(DWORD flags, int index) @@ -1890,5 +1894,4 @@ void CLinuxRendererGLES::AddProcessor(struct __CVBuffer *cvBufferRef) } #endif - #endif diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h index 9d6d417d90..9f60171179 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h +++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h @@ -157,6 +157,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 5ed6082a6e..31a6196fba 100644 --- a/xbmc/cores/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoRenderers/RenderManager.cpp @@ -647,6 +647,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 8605eed520..a169a5f94c 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);