aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Rusak <lorusak@gmail.com>2023-02-07 21:04:02 -0800
committerGitHub <noreply@github.com>2023-02-07 21:04:02 -0800
commitbd9b2fae9908fac6f45ee0b87d84f8f8dc4358e8 (patch)
tree27228d8a5f127cb28db053db84f0952769270cb3
parent123f63202ceacce377987b43d69e6b454d57c946 (diff)
parent8939580d9d501ebd8adbca793f53349253678550 (diff)
Merge pull request #22657 from popcornmix/drmprime_422
DVDVideoCodecDRMPRIME: Support YUV422 and YUV444 formats
-rw-r--r--xbmc/cores/VideoPlayer/Buffers/VideoBufferPoolDMA.cpp6
-rw-r--r--xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp28
2 files changed, 29 insertions, 5 deletions
diff --git a/xbmc/cores/VideoPlayer/Buffers/VideoBufferPoolDMA.cpp b/xbmc/cores/VideoPlayer/Buffers/VideoBufferPoolDMA.cpp
index fb2dfc6c78..e6b071117e 100644
--- a/xbmc/cores/VideoPlayer/Buffers/VideoBufferPoolDMA.cpp
+++ b/xbmc/cores/VideoPlayer/Buffers/VideoBufferPoolDMA.cpp
@@ -123,6 +123,12 @@ uint32_t CVideoBufferPoolDMA::TranslateFormat(AVPixelFormat format)
case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUVJ420P:
return DRM_FORMAT_YUV420;
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUVJ422P:
+ return DRM_FORMAT_YUV422;
+ case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUVJ444P:
+ return DRM_FORMAT_YUV444;
default:
return 0;
}
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp
index 80ca60290c..9ef08763be 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp
@@ -18,6 +18,7 @@
#include "settings/lib/Setting.h"
#include "threads/SingleLock.h"
#include "utils/CPUInfo.h"
+#include "utils/StringUtils.h"
#include "utils/log.h"
#if defined(HAVE_GBM)
@@ -137,7 +138,8 @@ static bool IsSupportedHwFormat(const enum AVPixelFormat fmt)
static bool IsSupportedSwFormat(const enum AVPixelFormat fmt)
{
- return fmt == AV_PIX_FMT_YUV420P || fmt == AV_PIX_FMT_YUVJ420P;
+ return fmt == AV_PIX_FMT_YUV420P || fmt == AV_PIX_FMT_YUVJ420P || fmt == AV_PIX_FMT_YUV422P ||
+ fmt == AV_PIX_FMT_YUVJ422P || fmt == AV_PIX_FMT_YUV444P || fmt == AV_PIX_FMT_YUVJ444P;
}
static const AVCodecHWConfig* FindHWConfig(const AVCodec* codec)
@@ -201,7 +203,14 @@ enum AVPixelFormat CDVDVideoCodecDRMPRIME::GetFormat(struct AVCodecContext* avct
}
}
- CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - unsupported pixel format", __FUNCTION__);
+ std::vector<std::string> formats;
+ for (int n = 0; fmt[n] != AV_PIX_FMT_NONE; n++)
+ {
+ formats.emplace_back(av_get_pix_fmt_name(fmt[n]));
+ }
+ CLog::Log(LOGERROR, "CDVDVideoCodecDRMPRIME::{} - no supported pixel formats: {}", __FUNCTION__,
+ StringUtils::Join(formats, ", "));
+
return AV_PIX_FMT_NONE;
}
@@ -221,6 +230,14 @@ int CDVDVideoCodecDRMPRIME::GetBuffer(struct AVCodecContext* avctx, AVFrame* fra
case AV_PIX_FMT_YUVJ420P:
size = width * height * 3 / 2;
break;
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUVJ422P:
+ size = width * height * 2;
+ break;
+ case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUVJ444P:
+ size = width * height * 3;
+ break;
default:
return -1;
}
@@ -493,9 +510,10 @@ void CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture)
(static_cast<int>(lrint(pVideoPicture->iWidth / aspect_ratio))) & -3;
}
- pVideoPicture->color_range = m_pFrame->color_range == AVCOL_RANGE_JPEG ||
- m_pFrame->format == AV_PIX_FMT_YUVJ420P ||
- m_hints.colorRange == AVCOL_RANGE_JPEG;
+ pVideoPicture->color_range =
+ m_pFrame->color_range == AVCOL_RANGE_JPEG || m_pFrame->format == AV_PIX_FMT_YUVJ420P ||
+ m_pFrame->format == AV_PIX_FMT_YUVJ422P || m_pFrame->format == AV_PIX_FMT_YUVJ444P ||
+ m_hints.colorRange == AVCOL_RANGE_JPEG;
pVideoPicture->color_primaries = m_pFrame->color_primaries == AVCOL_PRI_UNSPECIFIED
? m_hints.colorPrimaries
: m_pFrame->color_primaries;