Skip to content

Commit

Permalink
winrenderer: implement flush, fixes loss of video when moving window …
Browse files Browse the repository at this point in the history
…to other screen
  • Loading branch information
FernetMenta committed Sep 27, 2014
1 parent 1ba69b4 commit b873996
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 4 deletions.
38 changes: 35 additions & 3 deletions xbmc/cores/VideoRenderers/WinRenderer.cpp
Expand Up @@ -310,6 +310,9 @@ int CWinRenderer::GetImage(YV12Image *image, int source, bool readonly)

YUVBuffer *buf = (YUVBuffer*)m_VideoBuffers[source];

if (buf->IsReadyToRender())
return -1;

image->cshift_x = 1;
image->cshift_y = 1;
image->height = m_sourceHeight;
Expand Down Expand Up @@ -483,6 +486,18 @@ void CWinRenderer::UnInit()
}
}

void CWinRenderer::Flush()
{
PreInit();
SetViewMode(CMediaSettings::Get().GetCurrentVideoSettings().m_ViewMode);
ManageDisplay();

m_bConfigured = true;

SelectRenderMethod();
UpdateRenderMethod();
}

bool CWinRenderer::CreateIntermediateRenderTarget(unsigned int width, unsigned int height)
{
// Initialize a render target for intermediate rendering
Expand Down Expand Up @@ -705,6 +720,9 @@ void CWinRenderer::Render(DWORD flags)
return;
}

if (!m_VideoBuffers[m_iYV12RenderBuffer]->IsReadyToRender())
return;

UpdateVideoFilter();

// Optimize later? we could get by with bilinear under some circumstances
Expand Down Expand Up @@ -1200,9 +1218,6 @@ bool CWinRenderer::CreateYV12Texture(int index)
buf->StartDecode();
buf->Clear();

if(index == m_iYV12RenderBuffer)
buf->StartRender();

CLog::Log(LOGDEBUG, "created video buffer %i", index);
return true;
}
Expand Down Expand Up @@ -1428,6 +1443,11 @@ void YUVBuffer::Release()

void YUVBuffer::StartRender()
{
if (!m_locked)
return;

m_locked = false;

for(unsigned i = 0; i < m_activeplanes; i++)
{
if(planes[i].texture.Get() && planes[i].rect.pBits)
Expand All @@ -1439,6 +1459,11 @@ void YUVBuffer::StartRender()

void YUVBuffer::StartDecode()
{
if (m_locked)
return;

m_locked = true;

for(unsigned i = 0; i < m_activeplanes; i++)
{
if(planes[i].texture.Get()
Expand Down Expand Up @@ -1498,4 +1523,11 @@ void YUVBuffer::Clear()
}
}

bool YUVBuffer::IsReadyToRender()
{
if (!m_locked)
return true;
return false;
}

#endif
6 changes: 5 additions & 1 deletion xbmc/cores/VideoRenderers/WinRenderer.h
Expand Up @@ -95,6 +95,7 @@ struct SVideoBuffer
virtual void StartDecode() {}; // Prepare the buffer to receive data from dvdplayer
virtual void StartRender() {}; // dvdplayer finished filling the buffer with data
virtual void Clear() {}; // clear the buffer with solid black
virtual bool IsReadyToRender() { return true; };
};

// YV12 decoder textures
Expand All @@ -106,14 +107,15 @@ struct SVideoPlane

struct YUVBuffer : SVideoBuffer
{
YUVBuffer() : m_width (0), m_height(0), m_format(RENDER_FMT_NONE), m_activeplanes(0) {}
YUVBuffer() : m_width(0), m_height(0), m_format(RENDER_FMT_NONE), m_activeplanes(0), m_locked(false) {}
~YUVBuffer();
bool Create(ERenderFormat format, unsigned int width, unsigned int height);
virtual void Release();
virtual void StartDecode();
virtual void StartRender();
virtual void Clear();
unsigned int GetActivePlanes() { return m_activeplanes; }
virtual bool IsReadyToRender();

SVideoPlane planes[MAX_PLANES];

Expand All @@ -122,6 +124,7 @@ struct YUVBuffer : SVideoBuffer
unsigned int m_height;
ERenderFormat m_format;
unsigned int m_activeplanes;
bool m_locked;
};

struct DXVABuffer : SVideoBuffer
Expand Down Expand Up @@ -156,6 +159,7 @@ class CWinRenderer : public CBaseRenderer
virtual void UnInit();
virtual void Reset(); /* resets renderer after seek for example */
virtual bool IsConfigured() { return m_bConfigured; }
virtual void Flush();

virtual std::vector<ERenderFormat> SupportedFormats() { return m_formats; }

Expand Down
3 changes: 3 additions & 0 deletions xbmc/rendering/dx/RenderSystemDX.cpp
Expand Up @@ -36,6 +36,7 @@
#include "Util.h"
#include "win32/WIN32Util.h"
#include "video/VideoReferenceClock.h"
#include "cores/VideoRenderers/RenderManager.h"
#if (D3DX_SDK_VERSION >= 42) //aug 2009 sdk and up use dxerr
#include <Dxerr.h>
#else
Expand Down Expand Up @@ -372,6 +373,8 @@ void CRenderSystemDX::OnDeviceReset()
for (vector<ID3DResource *>::iterator i = m_resources.begin(); i != m_resources.end(); i++)
(*i)->OnResetDevice();

g_renderManager.Flush();

g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_RENDERER_RESET);
}
else
Expand Down

0 comments on commit b873996

Please sign in to comment.