Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

VideoPlayer: smooth motion #12805

Merged
merged 1 commit into from
Sep 17, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class CBaseRenderer
// Render info, can be called before configure
virtual CRenderInfo GetRenderInfo() { return CRenderInfo(); }
virtual void Update() = 0;
virtual void RenderUpdate(int index, bool clear, unsigned int flags, unsigned int alpha) = 0;
virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) = 0;
virtual bool RenderCapture(CRenderCapture* capture) = 0;
virtual bool ConfigChanged(const VideoPicture &picture) = 0;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -912,18 +912,18 @@ void CMMALRenderer::Update()
ManageRenderArea();
}

void CMMALRenderer::RenderUpdate(int source, bool clear, unsigned int flags, unsigned int alpha)
void CMMALRenderer::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha)
{
CSingleLock lock(m_sharedSection);
CMMALBuffer *omvb = nullptr;

if (!m_bConfigured)
{
CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - not configured: clear:%d flags:%x alpha:%d source:%d", CLASSNAME, __func__, clear, flags, alpha, source);
CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - not configured: clear:%d flags:%x alpha:%d source:%d", CLASSNAME, __func__, clear, flags, alpha, index);
goto exit;
}

omvb = m_buffers[source];
omvb = m_buffers[index];

if (g_graphicsContext.GetStereoView() != RENDER_STEREO_VIEW_RIGHT)
{
Expand All @@ -935,7 +935,7 @@ void CMMALRenderer::RenderUpdate(int source, bool clear, unsigned int flags, uns
// we only want to upload frames once
if (omvb && omvb->m_rendered)
{
CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - MMAL: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x skipping", CLASSNAME, __func__, clear, flags, alpha, source, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags);
CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - MMAL: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x skipping", CLASSNAME, __func__, clear, flags, alpha, index, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags);
SetVideoRect(m_cachedSourceRect, m_cachedDestRect);
goto exit;
}
Expand All @@ -944,23 +944,23 @@ void CMMALRenderer::RenderUpdate(int source, bool clear, unsigned int flags, uns
{
// dummy buffer from omxplayer
if (VERBOSE && g_advancedSettings.CanLogComponent(LOGVIDEO))
CLog::Log(LOGDEBUG, "%s::%s - OMX: clear:%d flags:%x alpha:%d source:%d omvb:%p", CLASSNAME, __func__, clear, flags, alpha, source, omvb);
CLog::Log(LOGDEBUG, "%s::%s - OMX: clear:%d flags:%x alpha:%d source:%d omvb:%p", CLASSNAME, __func__, clear, flags, alpha, index, omvb);
}
else if (omvb && omvb->mmal_buffer)
{
if (flags & RENDER_FLAG_TOP)
omvb->mmal_buffer->flags |= MMAL_BUFFER_HEADER_VIDEO_FLAG_INTERLACED | MMAL_BUFFER_HEADER_VIDEO_FLAG_TOP_FIELD_FIRST;
else if (flags & RENDER_FLAG_BOT)
omvb->mmal_buffer->flags |= MMAL_BUFFER_HEADER_VIDEO_FLAG_INTERLACED;
CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - MMAL: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x len:%d data:%p enc:%.4s", CLASSNAME, __func__, clear, flags, alpha, source, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags, omvb->mmal_buffer->length, omvb->mmal_buffer->data, (char *)&omvb->Encoding());
CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - MMAL: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x len:%d data:%p enc:%.4s", CLASSNAME, __func__, clear, flags, alpha, index, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags, omvb->mmal_buffer->length, omvb->mmal_buffer->data, (char *)&omvb->Encoding());
assert(omvb->mmal_buffer && omvb->mmal_buffer->data && omvb->mmal_buffer->length);
omvb->Acquire();
omvb->m_rendered = true;
assert(omvb->mmal_buffer->user_data == omvb);
mmal_queue_put(m_queue_process, omvb->mmal_buffer);
}
else
CLog::Log(LOGDEBUG, "%s::%s - MMAL: No buffer to update clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p", CLASSNAME, __func__, clear, flags, alpha, source, omvb, omvb ? omvb->mmal_buffer : nullptr);
CLog::Log(LOGDEBUG, "%s::%s - MMAL: No buffer to update clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p", CLASSNAME, __func__, clear, flags, alpha, index, omvb, omvb ? omvb->mmal_buffer : nullptr);

exit:
lock.Leave();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ class CMMALRenderer : public CBaseRenderer, public CThread, public IRunnable
virtual bool Supports(ERENDERFEATURE feature) override;
virtual bool Supports(ESCALINGMETHOD method) override;

virtual void RenderUpdate(int source, bool clear, unsigned int flags, unsigned int alpha) override;
virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override;

virtual void SetVideoRect(const CRect& SrcRect, const CRect& DestRect);
virtual bool IsGuiLayer() override { return false; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ void CRendererAML::Reset()
}
}

void CRendererAML::RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha)
void CRendererAML::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha)
{
ManageRenderArea();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class CRendererAML : public CBaseRenderer
virtual void UnInit() override {};
virtual void Reset() override;
virtual void Update() override {};
virtual void RenderUpdate(int index, bool clear, unsigned int flags, unsigned int alpha) override;
virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override;
virtual bool SupportsMultiPassRendering()override { return false; };

// Player functions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ void CRendererMediaCodecSurface::Reset()
{
}

void CRendererMediaCodecSurface::RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha)
void CRendererMediaCodecSurface::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha)
{
CXBMCApp::get()->WaitVSync(100);
ManageRenderArea();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class CRendererMediaCodecSurface : public CBaseRenderer
virtual void UnInit() override {};
virtual void Reset() override;
virtual void Update() override {};
virtual void RenderUpdate(int index, bool clear, unsigned int flags, unsigned int alpha) override;
virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override;
virtual bool SupportsMultiPassRendering() override { return false; };

// Player functions
Expand Down
44 changes: 14 additions & 30 deletions xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ CLinuxRendererGL::CLinuxRendererGL()
m_fbo.width = 0.0;
m_fbo.height = 0.0;
m_NumYV12Buffers = 0;
m_iLastRenderBuffer = 0;
m_bConfigured = false;
m_bValidated = false;
m_clearColour = 0.0f;
Expand Down Expand Up @@ -260,8 +259,6 @@ bool CLinuxRendererGL::Configure(const VideoPicture &picture, float fps, unsigne
// frame is loaded after every call to Configure().
m_bValidated = false;

m_iLastRenderBuffer = -1;

m_nonLinStretch = false;
m_nonLinStretchGui = false;
m_pixelRatio = 1.0;
Expand Down Expand Up @@ -494,10 +491,12 @@ void CLinuxRendererGL::Update()
ValidateRenderTarget();
}

void CLinuxRendererGL::RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha)
void CLinuxRendererGL::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha)
{
m_iLastRenderBuffer = m_iYV12RenderBuffer;
m_iYV12RenderBuffer = index;
if (index2 >= 0)
m_iYV12RenderBuffer = index2;
else
m_iYV12RenderBuffer = index;

if (!ValidateRenderer())
{
Expand All @@ -518,7 +517,7 @@ void CLinuxRendererGL::RenderUpdate(int index, bool clear, DWORD flags, DWORD al
ClearBackBuffer();
}

if (alpha<255)
if (alpha < 255)
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Expand All @@ -530,31 +529,16 @@ void CLinuxRendererGL::RenderUpdate(int index, bool clear, DWORD flags, DWORD al
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}

if(flags & RENDER_FLAG_WEAVE)
{
int top_index = index;
int bot_index = index;
if (!Render(flags, m_iYV12RenderBuffer) && clear)
ClearBackBuffer();

if((flags & RENDER_FLAG_FIELD0) && m_iLastRenderBuffer > -1)
{
if(flags & RENDER_FLAG_TOP)
bot_index = m_iLastRenderBuffer;
else
top_index = m_iLastRenderBuffer;
}

glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(stipple_weave);
Render((flags & ~RENDER_FLAG_FIELDMASK) | RENDER_FLAG_TOP, top_index);
glPolygonStipple(stipple_weave+4);
Render((flags & ~RENDER_FLAG_FIELDMASK) | RENDER_FLAG_BOT, bot_index);
glDisable(GL_POLYGON_STIPPLE);

}
else
if (index2 >= 0)
{
if (!Render(flags, index) && clear)
ClearBackBuffer();
m_iYV12RenderBuffer = index;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
Render(flags, m_iYV12RenderBuffer);
}

VerifyGLState();
Expand Down
3 changes: 1 addition & 2 deletions xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ class CLinuxRendererGL : public CBaseRenderer
void Flush() override;
void SetBufferSize(int numBuffers) override { m_NumYV12Buffers = numBuffers; }
void ReleaseBuffer(int idx) override;
void RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha) override;
void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override;
void Update() override;
bool RenderCapture(CRenderCapture* capture) override;
CRenderInfo GetRenderInfo() override;
Expand Down Expand Up @@ -175,7 +175,6 @@ class CLinuxRendererGL : public CBaseRenderer

int m_iYV12RenderBuffer;
int m_NumYV12Buffers;
int m_iLastRenderBuffer;

bool m_bConfigured;
bool m_bValidated;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ void CLinuxRendererGLES::Update()
ValidateRenderTarget();
}

void CLinuxRendererGLES::RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha)
void CLinuxRendererGLES::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha)
{
m_iYV12RenderBuffer = index;

Expand Down
2 changes: 1 addition & 1 deletion xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ class CLinuxRendererGLES : public CBaseRenderer
virtual void SetBufferSize(int numBuffers) override { m_NumYV12Buffers = numBuffers; }
virtual bool IsGuiLayer() override;
virtual void ReleaseBuffer(int idx) override;
virtual void RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha) override;
virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override;
virtual void Update() override;
virtual bool RenderCapture(CRenderCapture* capture) override;
virtual CRenderInfo GetRenderInfo() override;
Expand Down
1 change: 0 additions & 1 deletion xbmc/cores/VideoPlayer/VideoRenderers/RenderFlags.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@

#define RENDER_FLAG_FIELD0 0x80
#define RENDER_FLAG_FIELD1 0x100
#define RENDER_FLAG_WEAVE 0x200

// #define RENDER_FLAG_LAST 0x40

Expand Down
Loading