1
0
mirror of https://github.com/libretro/Lakka-LibreELEC.git synced 2024-11-24 23:06:18 +00:00
Lakka-LibreELEC/projects/Samsung/patches/kodi/kodi-0002-LOCAL-changes-for-Odroid-XU3-XU4.patch
2022-08-21 12:36:05 +00:00

265 lines
9.5 KiB
Diff

From eb476ae718b8433402547bad0e3fa2ba69e1c1ee Mon Sep 17 00:00:00 2001
From: Christian Hewitt <christianshewitt@gmail.com>
Date: Fri, 24 Jun 2022 18:04:13 +0000
Subject: [PATCH 2/2] LOCAL: changes for Odroid XU3/XU4
---
cmake/modules/FindGBM.cmake | 12 ++--
system/settings/linux.xml | 2 +-
.../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 66 +++++++++++++++++--
.../DVDCodecs/Video/DVDVideoCodecFFmpeg.h | 1 +
xbmc/windowing/Resolution.cpp | 2 +
xbmc/windowing/gbm/GBMUtils.cpp | 28 ++++----
xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp | 2 +-
xbmc/windowing/gbm/drm/DRMUtils.cpp | 2 +-
8 files changed, 90 insertions(+), 25 deletions(-)
diff --git a/cmake/modules/FindGBM.cmake b/cmake/modules/FindGBM.cmake
index 37a26a7bc4..53cc04663e 100644
--- a/cmake/modules/FindGBM.cmake
+++ b/cmake/modules/FindGBM.cmake
@@ -51,12 +51,12 @@ if(GBM_FOUND)
set(GBM_LIBRARIES ${GBM_LIBRARY})
set(GBM_INCLUDE_DIRS ${GBM_INCLUDE_DIR})
set(GBM_DEFINITIONS -DHAVE_GBM=1)
- if(GBM_HAS_BO_MAP)
- list(APPEND GBM_DEFINITIONS -DHAS_GBM_BO_MAP=1)
- endif()
- if(GBM_HAS_MODIFIERS)
- list(APPEND GBM_DEFINITIONS -DHAS_GBM_MODIFIERS=1)
- endif()
+ #if(GBM_HAS_BO_MAP)
+ # list(APPEND GBM_DEFINITIONS -DHAS_GBM_BO_MAP=1)
+ #endif()
+ #if(GBM_HAS_MODIFIERS)
+ # list(APPEND GBM_DEFINITIONS -DHAS_GBM_MODIFIERS=1)
+ #endif()
if(NOT TARGET GBM::GBM)
add_library(GBM::GBM UNKNOWN IMPORTED)
set_target_properties(GBM::GBM PROPERTIES
diff --git a/system/settings/linux.xml b/system/settings/linux.xml
index 531974f3f4..6244ef7515 100644
--- a/system/settings/linux.xml
+++ b/system/settings/linux.xml
@@ -177,7 +177,7 @@
</dependency>
</dependencies>
<level>3</level>
- <default>true</default>
+ <default>false</default>
<control type="toggle" />
</setting>
<setting id="videoplayer.useprimerenderer" type="integer" label="13462" help="13463">
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
index a7dc0890e8..ad8c41dcf0 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
@@ -42,6 +42,16 @@ extern "C" {
#define RINT lrint
#endif
+/* define the FFMPEG codecs to use */
+#define MPEG2TS_FFMPEG_CODEC "mpeg2_v4l2m2m"
+#define H263_FFMPEG_CODEC "h263_v4l2m2m"
+#define H264_FFMPEG_CODEC "h264_v4l2m2m"
+#define MPEG4_FFMPEG_CODEC "mpeg4_v4l2m2m"
+#define MPEG1_FFMPEG_CODEC "mpeg1_v4l2m2m"
+#define MPEG2_FFMPEG_CODEC "mpeg2_v4l2m2m"
+#define VC1_FFMPEG_CODEC "vc1_v4l2m2m"
+#define VP8_FFMPEG_CODEC "vp8_v4l2m2m"
+
enum DecoderState
{
STATE_NONE,
@@ -346,6 +356,41 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options
pCodec = avcodec_find_decoder_by_name("av1");
if (!pCodec)
+ if(!m_useSoftDecoder)
+ {
+ switch(hints.codec)
+ {
+ case AV_CODEC_ID_MPEG4:
+ pCodec = avcodec_find_decoder_by_name(MPEG4_FFMPEG_CODEC);
+ break;
+ case AV_CODEC_ID_MPEG2TS:
+ pCodec = avcodec_find_decoder_by_name(MPEG2TS_FFMPEG_CODEC);
+ break;
+ case AV_CODEC_ID_H263:
+ pCodec = avcodec_find_decoder_by_name(H263_FFMPEG_CODEC);
+ break;
+ case AV_CODEC_ID_H264:
+ pCodec = avcodec_find_decoder_by_name(H264_FFMPEG_CODEC);
+ break;
+ case AV_CODEC_ID_MPEG1VIDEO:
+ pCodec = avcodec_find_decoder_by_name(MPEG1_FFMPEG_CODEC);
+ break;
+ case AV_CODEC_ID_MPEG2VIDEO:
+ pCodec = avcodec_find_decoder_by_name(MPEG2_FFMPEG_CODEC);
+ break;
+ case AV_CODEC_ID_VC1:
+ pCodec = avcodec_find_decoder_by_name(VC1_FFMPEG_CODEC);
+ break;
+ case AV_CODEC_ID_VP8:
+ pCodec = avcodec_find_decoder_by_name(VP8_FFMPEG_CODEC);
+ break;
+ default:
+ pCodec = avcodec_find_decoder(hints.codec);
+ break;
+ }
+ }
+
+ if(pCodec == NULL)
pCodec = avcodec_find_decoder(hints.codec);
if(pCodec == NULL)
@@ -446,7 +491,7 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options
}
UpdateName();
- const char* pixFmtName = av_get_pix_fmt_name(m_pCodecContext->pix_fmt);
+ const char* pixFmtName = av_get_pix_fmt_name(GetFormat(m_pCodecContext, &m_pCodecContext->pix_fmt));
m_processInfo.SetVideoDimensions(m_pCodecContext->coded_width, m_pCodecContext->coded_height);
m_processInfo.SetVideoPixelFormat(pixFmtName ? pixFmtName : "");
@@ -529,15 +574,22 @@ void CDVDVideoCodecFFmpeg::SetFilters()
void CDVDVideoCodecFFmpeg::UpdateName()
{
+ bool isHW = false;
if(m_pCodecContext->codec->name)
+ {
m_name = std::string("ff-") + m_pCodecContext->codec->name;
+ if(strstr(m_pCodecContext->codec->name, "v4l2m2m") != NULL)
+ isHW = true;
+ }
else
m_name = "ffmpeg";
if(m_pHardware)
+ {
m_name += "-" + m_pHardware->Name();
-
- m_processInfo.SetVideoDecoderName(m_name, m_pHardware ? true : false);
+ isHW = true;
+ }
+ m_processInfo.SetVideoDecoderName(m_name, isHW ? true : false);
CLog::Log(LOGDEBUG, "CDVDVideoCodecFFmpeg - Updated codec: {}", m_name);
}
@@ -784,8 +836,14 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecFFmpeg::GetPicture(VideoPicture* pVideoPi
if (m_pDecodedFrame->interlaced_frame)
m_interlaced = true;
else
+ {
m_interlaced = false;
-
+ if (m_useSoftDecoder)
+ {
+ m_useSoftDecoder = false;
+ return VC_REOPEN;
+ }
+ }
if (!m_processInfo.GetVideoInterlaced() && m_interlaced)
m_processInfo.SetVideoInterlaced(m_interlaced);
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h
index 86c83cd1a0..a5552d3350 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h
@@ -95,6 +95,7 @@ protected:
bool m_requestSkipDeint = false;
int m_codecControlFlags = 0;
bool m_interlaced = false;
+ bool m_useSoftDecoder = true;
double m_DAR = 1.0;
CDVDStreamInfo m_hints;
CDVDCodecOptions m_options;
diff --git a/xbmc/windowing/Resolution.cpp b/xbmc/windowing/Resolution.cpp
index 4dcd2480ff..78e37add98 100644
--- a/xbmc/windowing/Resolution.cpp
+++ b/xbmc/windowing/Resolution.cpp
@@ -70,6 +70,8 @@ float RESOLUTION_INFO::DisplayRatio() const
RESOLUTION CResolutionUtils::ChooseBestResolution(float fps, int width, int height, bool is3D)
{
+ fps = static_cast<float>(std::round(fps));
+
RESOLUTION res = CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution();
float weight;
diff --git a/xbmc/windowing/gbm/GBMUtils.cpp b/xbmc/windowing/gbm/GBMUtils.cpp
index 5267c93c8f..bc0a9b1c96 100644
--- a/xbmc/windowing/gbm/GBMUtils.cpp
+++ b/xbmc/windowing/gbm/GBMUtils.cpp
@@ -74,24 +74,28 @@ CGBMUtils::CGBMDevice::CGBMSurface::CGBMSurface(gbm_surface* surface) : m_surfac
{
}
+#define MAX_SURFACE_BUFFERS 3
CGBMUtils::CGBMDevice::CGBMSurface::CGBMSurfaceBuffer* CGBMUtils::CGBMDevice::CGBMSurface::
LockFrontBuffer()
{
- m_buffers.emplace(std::make_unique<CGBMSurfaceBuffer>(m_surface));
-
- if (!static_cast<bool>(gbm_surface_has_free_buffers(m_surface)))
+ /* Fix for ODROID XU4, gbm_surface_has_free_buffers doesn't seem to report if there
+ * are no buffers available instead GEM buffers are running out, so we manually empty
+ * the buffers here for a maximum of three
+ */
+ std::call_once(
+ flag, [this]() { CLog::Log(LOGDEBUG, "CGBMUtils - using {} buffers", MAX_SURFACE_BUFFERS); });
+
+ if (m_buffers.size() >= MAX_SURFACE_BUFFERS)
{
- /*
- * We want to use call_once here because we want it to be logged the first time that
- * we have to release buffers. This means that the maximum amount of buffers had been reached.
- * For mesa this should be 4 buffers but it may vary across other implementations.
- */
- std::call_once(
- flag, [this]() { CLog::Log(LOGDEBUG, "CGBMUtils - using {} buffers", m_buffers.size()); });
-
- m_buffers.pop();
+ while (!m_buffers.empty())
+ {
+ m_buffers.front();
+ m_buffers.pop();
+ }
}
+ m_buffers.emplace(std::make_unique<CGBMSurfaceBuffer>(m_surface));
+
return m_buffers.back().get();
}
diff --git a/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp b/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp
index 83a59413f7..dbddbbbd55 100644
--- a/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp
+++ b/xbmc/windowing/gbm/WinSystemGbmEGLContext.cpp
@@ -23,7 +23,7 @@ bool CWinSystemGbmEGLContext::InitWindowSystemEGL(EGLint renderableType, EGLint
return false;
}
- if (!m_eglContext.CreatePlatformDisplay(m_GBM->GetDevice()->Get(), m_GBM->GetDevice()->Get()))
+ if (!m_eglContext.CreatePlatformDisplay(m_GBM->GetDevice()->Get(), reinterpret_cast<EGLNativeDisplayType>(m_GBM->GetDevice()->Get())))
{
return false;
}
diff --git a/xbmc/windowing/gbm/drm/DRMUtils.cpp b/xbmc/windowing/gbm/drm/DRMUtils.cpp
index b424dffe80..9924756b7a 100644
--- a/xbmc/windowing/gbm/drm/DRMUtils.cpp
+++ b/xbmc/windowing/gbm/drm/DRMUtils.cpp
@@ -189,7 +189,7 @@ bool CDRMUtils::FindPlanes()
auto videoPlane = std::find_if(m_planes.begin(), m_planes.end(), [&i](auto& plane) {
if (plane->GetPossibleCrtcs() & (1 << i))
{
- return plane->SupportsFormat(DRM_FORMAT_NV12);
+ return (plane->SupportsFormat(DRM_FORMAT_NV12) || plane->SupportsFormat(DRM_FORMAT_XRGB8888));
}
return false;
});
--
2.17.1