Skip to content

Commit

Permalink
Merge pull request #19126 from thexai/debug-osd
Browse files Browse the repository at this point in the history
[Windows] Add video, HDR metadata, shader and swapchain infos to debug info OSD
  • Loading branch information
thexai committed Apr 9, 2021
2 parents 8dfbce1 + 6320141 commit 3888019
Show file tree
Hide file tree
Showing 26 changed files with 365 additions and 34 deletions.
1 change: 1 addition & 0 deletions system/keymaps/keyboard.xml
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,7 @@
<i>Info</i>
<o>PlayerProcessInfo</o>
<o mod="ctrl,shift">PlayerDebug</o>
<o mod="alt">PlayerDebugVideo</o>
<z>AspectRatio</z>
<zoom>AspectRatio</zoom>
<t>ShowSubtitles</t>
Expand Down
2 changes: 2 additions & 0 deletions xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodec.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ struct VideoPicture
bool hasLightMetadata = false;
AVContentLightMetadata lightMetadata;

AVPixelFormat pixelFormat; //< source pixel format

unsigned int iWidth;
unsigned int iHeight;
unsigned int iDisplayWidth; //< width of the picture without black bars
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -969,6 +969,8 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(VideoPicture* pVideoPicture)
pVideoPicture->iFlags |= DVP_FLAG_DROPPED;
}

pVideoPicture->pixelFormat = m_pCodecContext->sw_pix_fmt;

pVideoPicture->chroma_position = m_pCodecContext->chroma_sample_location;
pVideoPicture->color_primaries = m_pCodecContext->color_primaries == AVCOL_PRI_UNSPECIFIED ? m_hints.colorPrimaries : m_pCodecContext->color_primaries;
pVideoPicture->color_transfer = m_pCodecContext->color_trc == AVCOL_TRC_UNSPECIFIED ? m_hints.colorTransferCharacteristic : m_pCodecContext->color_trc;
Expand Down
3 changes: 3 additions & 0 deletions xbmc/cores/VideoPlayer/VideoPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4348,6 +4348,9 @@ bool CVideoPlayer::OnAction(const CAction &action)
case ACTION_PLAYER_DEBUG:
m_renderManager.ToggleDebug();
break;
case ACTION_PLAYER_DEBUG_VIDEO:
m_renderManager.ToggleDebugVideo();
break;

case ACTION_PLAYER_PROCESS_INFO:
if (CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() != WINDOW_DIALOG_PLAYER_PROCESS_INFO)
Expand Down
4 changes: 4 additions & 0 deletions xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#pragma once

#include "DebugInfo.h"
#include "RenderInfo.h"
#include "VideoShaders/ShaderFormats.h"
#include "cores/IPlayer.h"
Expand Down Expand Up @@ -92,6 +93,9 @@ class CBaseRenderer

void SetVideoSettings(const CVideoSettings &settings);

// Gets debug info from render buffer
virtual DEBUG_INFO_VIDEO GetDebugInfo(int idx) { return {}; };

protected:
void CalcNormalRenderRect(float offsetX, float offsetY, float width, float height,
float inputFrameRatio, float zoomAmount, float verticalShift);
Expand Down
1 change: 1 addition & 0 deletions xbmc/cores/VideoPlayer/VideoRenderers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ set(SOURCES BaseRenderer.cpp

set(HEADERS BaseRenderer.h
ColorManager.h
DebugInfo.h
OverlayRenderer.h
OverlayRendererGUI.h
OverlayRendererUtil.h
Expand Down
33 changes: 33 additions & 0 deletions xbmc/cores/VideoPlayer/VideoRenderers/DebugInfo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright (C) 2005-2021 Team Kodi
* This file is part of Kodi - https://kodi.tv
*
* SPDX-License-Identifier: GPL-2.0-or-later
* See LICENSES/README.md for more information.
*/

#pragma once

#include <string>

struct DEBUG_INFO_PLAYER
{
std::string audio;
std::string video;
std::string player;
std::string vsync;
};

struct DEBUG_INFO_VIDEO
{
std::string videoSource;
std::string metaPrim;
std::string metaLight;
std::string shader;
};

struct DEBUG_INFO_RENDER
{
std::string renderFlags;
std::string videoOutput;
};
88 changes: 72 additions & 16 deletions xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ using namespace OVERLAY;

CDebugRenderer::CDebugRenderer()
{
for (int i=0; i<4; i++)
for (int i = 0; i < 6; i++)
{
m_overlay[i] = nullptr;
m_strDebug[i] = " ";
Expand All @@ -33,50 +33,105 @@ CDebugRenderer::~CDebugRenderer()
}
}

void CDebugRenderer::SetInfo(std::string &info1, std::string &info2, std::string &info3, std::string &info4)
void CDebugRenderer::SetInfo(DEBUG_INFO_PLAYER& info)
{
m_overlayRenderer.Release(0);

if (info1 != m_strDebug[0])
if (info.audio != m_strDebug[0])
{
m_strDebug[0] = info1;
m_strDebug[0] = info.audio;
if (m_overlay[0])
m_overlay[0]->Release();
m_overlay[0] = new CDVDOverlayText();
m_overlay[0]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[0]));
}
if (info2 != m_strDebug[1])
if (info.video != m_strDebug[1])
{
m_strDebug[1] = info2;
m_strDebug[1] = info.video;
if (m_overlay[1])
m_overlay[1]->Release();
m_overlay[1] = new CDVDOverlayText();
m_overlay[1]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[1]));
}
if (info3 != m_strDebug[2])
if (info.player != m_strDebug[2])
{
m_strDebug[2] = info3;
m_strDebug[2] = info.player;
if (m_overlay[2])
m_overlay[2]->Release();
m_overlay[2] = new CDVDOverlayText();
m_overlay[2]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[2]));
}
if (info4 != m_strDebug[3])
if (info.vsync != m_strDebug[3])
{
m_strDebug[3] = info4;
m_strDebug[3] = info.vsync;
if (m_overlay[3])
m_overlay[3]->Release();
m_overlay[3] = new CDVDOverlayText();
m_overlay[3]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[3]));
}

m_overlayRenderer.AddOverlay(m_overlay[0], 0, 0);
m_overlayRenderer.AddOverlay(m_overlay[1], 0, 0);
m_overlayRenderer.AddOverlay(m_overlay[2], 0, 0);
m_overlayRenderer.AddOverlay(m_overlay[3], 0, 0);
for (int i = 0; i < 4; i++)
m_overlayRenderer.AddOverlay(m_overlay[i], 0, 0);
}

void CDebugRenderer::Render(CRect &src, CRect &dst, CRect &view)
void CDebugRenderer::SetInfo(DEBUG_INFO_VIDEO& video, DEBUG_INFO_RENDER& render)
{
m_overlayRenderer.Release(0);

if (video.videoSource != m_strDebug[0])
{
m_strDebug[0] = video.videoSource;
if (m_overlay[0])
m_overlay[0]->Release();
m_overlay[0] = new CDVDOverlayText();
m_overlay[0]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[0]));
}
if (video.metaPrim != m_strDebug[1])
{
m_strDebug[1] = video.metaPrim;
if (m_overlay[1])
m_overlay[1]->Release();
m_overlay[1] = new CDVDOverlayText();
m_overlay[1]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[1]));
}
if (video.metaLight != m_strDebug[2])
{
m_strDebug[2] = video.metaLight;
if (m_overlay[2])
m_overlay[2]->Release();
m_overlay[2] = new CDVDOverlayText();
m_overlay[2]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[2]));
}
if (video.shader != m_strDebug[3])
{
m_strDebug[3] = video.shader;
if (m_overlay[3])
m_overlay[3]->Release();
m_overlay[3] = new CDVDOverlayText();
m_overlay[3]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[3]));
}
if (render.renderFlags != m_strDebug[4])
{
m_strDebug[4] = render.renderFlags;
if (m_overlay[4])
m_overlay[4]->Release();
m_overlay[4] = new CDVDOverlayText();
m_overlay[4]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[4]));
}
if (render.videoOutput != m_strDebug[5])
{
m_strDebug[5] = render.videoOutput;
if (m_overlay[5])
m_overlay[5]->Release();
m_overlay[5] = new CDVDOverlayText();
m_overlay[5]->AddElement(new CDVDOverlayText::CElementText(m_strDebug[5]));
}

for (int i = 0; i < 6; i++)
m_overlayRenderer.AddOverlay(m_overlay[i], 0, 0);
}

void CDebugRenderer::Render(CRect& src, CRect& dst, CRect& view)
{
m_overlayRenderer.SetVideoRect(src, dst, view);
m_overlayRenderer.Render(0);
Expand Down Expand Up @@ -110,7 +165,8 @@ void CDebugRenderer::CRenderer::Render(int idx)

COverlayText *text = dynamic_cast<COverlayText*>(o);
if (text)
text->PrepareRender("arial.ttf", 1, 100, 16, 0, m_font, m_fontBorder, UTILS::COLOR::NONE, m_rv);
text->PrepareRender("arial.ttf", 1, 100, 15, 0, m_font, m_fontBorder, UTILS::COLOR::NONE,
m_rv);

RESOLUTION_INFO res = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution());

Expand Down
10 changes: 6 additions & 4 deletions xbmc/cores/VideoPlayer/VideoRenderers/DebugRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#pragma once

#include "DebugInfo.h"
#include "OverlayRenderer.h"

#include <string>
Expand All @@ -19,8 +20,9 @@ class CDebugRenderer
public:
CDebugRenderer();
virtual ~CDebugRenderer();
void SetInfo(std::string &info1, std::string &info2, std::string &info3, std::string &info4);
void Render(CRect &src, CRect &dst, CRect &view);
void SetInfo(DEBUG_INFO_PLAYER& info);
void SetInfo(DEBUG_INFO_VIDEO& video, DEBUG_INFO_RENDER& render);
void Render(CRect& src, CRect& dst, CRect& view);
void Flush();

protected:
Expand All @@ -32,7 +34,7 @@ class CDebugRenderer
void Render(int idx) override;
};

std::string m_strDebug[4];
CDVDOverlayText *m_overlay[4];
std::string m_strDebug[6];
CDVDOverlayText* m_overlay[6];
CRenderer m_overlayRenderer;
};
43 changes: 31 additions & 12 deletions xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -720,22 +720,33 @@ void CRenderManager::Render(bool clear, DWORD flags, DWORD alpha, bool gui)

if (m_renderDebug)
{
std::string audio, video, player, vsync;

m_playerPort->GetDebugInfo(audio, video, player);
if (m_renderDebugVideo)
{
DEBUG_INFO_VIDEO video = m_pRenderer->GetDebugInfo(m_presentsource);
DEBUG_INFO_RENDER render = CServiceBroker::GetWinSystem()->GetDebugInfo();

double refreshrate, clockspeed;
int missedvblanks;
vsync = StringUtils::Format("VSyncOff: %.1f latency: %.3f ", m_clockSync.m_syncOffset / 1000, DVD_TIME_TO_MSEC(m_displayLatency) / 1000.0f);
if (m_dvdClock.GetClockInfo(missedvblanks, clockspeed, refreshrate))
m_debugRenderer.SetInfo(video, render);
}
else
{
vsync += StringUtils::Format("VSync: refresh:%.3f missed:%i speed:%.3f%%",
refreshrate,
missedvblanks,
clockspeed * 100);
DEBUG_INFO_PLAYER info;

m_playerPort->GetDebugInfo(info.audio, info.video, info.player);

double refreshrate, clockspeed;
int missedvblanks;
info.vsync =
StringUtils::Format("VSyncOff: %.1f latency: %.3f ", m_clockSync.m_syncOffset / 1000,
DVD_TIME_TO_MSEC(m_displayLatency) / 1000.0f);
if (m_dvdClock.GetClockInfo(missedvblanks, clockspeed, refreshrate))
{
info.vsync += StringUtils::Format("VSync: refresh:%.3f missed:%i speed:%.3f%%",
refreshrate, missedvblanks, clockspeed * 100);
}

m_debugRenderer.SetInfo(info);
}

m_debugRenderer.SetInfo(audio, video, player, vsync);
m_debugRenderer.Render(src, dst, view);

m_debugTimer.Set(1000);
Expand Down Expand Up @@ -894,6 +905,14 @@ void CRenderManager::ToggleDebug()
{
m_renderDebug = !m_renderDebug;
m_debugTimer.SetExpired();
m_renderDebugVideo = false;
}

void CRenderManager::ToggleDebugVideo()
{
m_renderDebug = !m_renderDebug;
m_debugTimer.SetExpired();
m_renderDebugVideo = true;
}

bool CRenderManager::AddVideoPicture(const VideoPicture& picture, volatile std::atomic_bool& bStop, EINTERLACEMETHOD deintMethod, bool wait)
Expand Down
2 changes: 2 additions & 0 deletions xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ class CRenderManager
bool Flush(bool wait, bool saveBuffers);
bool IsConfigured() const;
void ToggleDebug();
void ToggleDebugVideo();

unsigned int AllocRenderCapture();
void ReleaseRenderCapture(unsigned int captureId);
Expand Down Expand Up @@ -141,6 +142,7 @@ class CRenderManager
bool m_bRenderGUI = true;
bool m_renderedOverlay = false;
bool m_renderDebug = false;
bool m_renderDebugVideo = false;
XbmcThreads::EndTime m_debugTimer;
std::atomic_bool m_showVideo = {false};

Expand Down

0 comments on commit 3888019

Please sign in to comment.