Skip to content

Commit

Permalink
Merge pull request xbmc#6 from davilla/add-renderer-callback
Browse files Browse the repository at this point in the history
[droid] add renderer callback to support players that render outside gles
  • Loading branch information
davilla committed Jul 19, 2012
2 parents 05acec9 + 5ee0dfc commit f66127a
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 8 deletions.
9 changes: 9 additions & 0 deletions xbmc/cores/VideoRenderers/BaseRenderer.cpp
Expand Up @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions xbmc/cores/VideoRenderers/BaseRenderer.h
Expand Up @@ -59,6 +59,8 @@ enum ERENDERFEATURE
RENDERFEATURE_NONLINSTRETCH
};

typedef void (*RenderUpdateCallBackFn)(const void *ctx, const CRect &SrcRect, const CRect &DestRect);

struct DVDVideoPicture;

class CBaseRenderer
Expand All @@ -80,6 +82,8 @@ class CBaseRenderer
// Supported pixel formats, can be called before configure
std::vector<ERenderFormat> SupportedFormats() { return std::vector<ERenderFormat>(); }

virtual void RegisterRenderUpdateCallBack(const void *ctx, RenderUpdateCallBackFn fn);

protected:
void ChooseBestResolution(float fps);
bool FindResolutionFromOverride(float fps, float& weight, bool fallback);
Expand All @@ -98,4 +102,7 @@ class CBaseRenderer

CRect m_destRect;
CRect m_sourceRect;

const void* m_RenderUpdateCallBackCtx;
RenderUpdateCallBackFn m_RenderUpdateCallBackFn;
};
19 changes: 11 additions & 8 deletions xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -1890,5 +1894,4 @@ void CLinuxRendererGLES::AddProcessor(struct __CVBuffer *cvBufferRef)
}
#endif


#endif
1 change: 1 addition & 0 deletions xbmc/cores/VideoRenderers/LinuxRendererGLES.h
Expand Up @@ -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);

Expand Down
6 changes: 6 additions & 0 deletions xbmc/cores/VideoRenderers/RenderManager.cpp
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions xbmc/cores/VideoRenderers/RenderManager.h
Expand Up @@ -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);

Expand Down

0 comments on commit f66127a

Please sign in to comment.