summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Srebrny <piotr.srebrny@qt.io>2022-09-20 13:28:19 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-10-17 08:24:57 +0000
commited5c122a9e144862bb728aca2babcd226738d3c0 (patch)
tree092ba2deb13033974a6119f4e663e36e35f55d26
parent143ca7ea976e815d34f14aa1598c741fa0302053 (diff)
downloadqtmultimedia-ed5c122a9e144862bb728aca2babcd226738d3c0.tar.gz
Use std::array type to describe and iterate over preferred HW accel
Using std::array simplifies iterating over the array. Still returning arrays from functions is cumbersome. With adoption of C++20 to Qt we can fix that with span. Change-Id: Iadc43df8232361977dbcbe1ef000034de47cbeb5 Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> Reviewed-by: Lars Knoll <lars@knoll.priv.no> (cherry picked from commit 924500f42cf252f31631ae52d08cb99b028f90fb) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp22
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h3
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegvideoframeencoder.cpp7
3 files changed, 12 insertions, 20 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp
index 84d84ff12..e5d90239b 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp
+++ b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp
@@ -26,11 +26,7 @@ QT_BEGIN_NAMESPACE
namespace QFFmpeg {
-// HW context initialization
-
-// preferred order of HW accelerators to use
static const AVHWDeviceType preferredHardwareAccelerators[] = {
-// Linux/Unix
#if defined(Q_OS_LINUX)
AV_HWDEVICE_TYPE_VAAPI,
// AV_HWDEVICE_TYPE_DRM,
@@ -41,7 +37,6 @@ static const AVHWDeviceType preferredHardwareAccelerators[] = {
#elif defined (Q_OS_ANDROID)
AV_HWDEVICE_TYPE_MEDIACODEC,
#endif
- AV_HWDEVICE_TYPE_NONE
};
static AVBufferRef *loadHWContext(const AVHWDeviceType type)
@@ -63,20 +58,18 @@ static AVBufferRef *hardwareContextForCodec(const AVCodec *codec)
// First try our preferred accelerators. Those are the ones where we can
// set up a zero copy pipeline
- auto *preferred = preferredHardwareAccelerators;
- while (*preferred != AV_HWDEVICE_TYPE_NONE) {
+ for (auto type : preferredHardwareAccelerators) {
for (int i = 0;; ++i) {
const AVCodecHWConfig *config = avcodec_get_hw_config(codec, i);
if (!config)
break;
- if (config->device_type == *preferred) {
+ if (config->device_type == type) {
auto *hwContext = loadHWContext(config->device_type);
if (hwContext)
return hwContext;
break;
}
}
- ++preferred;
}
// Ok, let's see if we can get any HW acceleration at all. It'll still involve one buffer copy,
@@ -174,9 +167,10 @@ AVPixelFormat HWAccel::format(AVFrame *frame)
return AVPixelFormat(hwFramesContext->sw_format);
}
-const AVHWDeviceType *HWAccel::preferredDeviceTypes()
+std::pair<const AVHWDeviceType*, qsizetype> HWAccel::preferredDeviceTypes()
{
- return preferredHardwareAccelerators;
+ return { preferredHardwareAccelerators,
+ sizeof(preferredHardwareAccelerators) / sizeof(AVHWDeviceType) };
}
AVHWDeviceContext *HWAccel::hwDeviceContext() const
@@ -289,12 +283,10 @@ const AVCodec *HWAccel::hardwareEncoderForCodecId(AVCodecID id) const
std::unique_ptr<HWAccel> HWAccel::findHardwareAccelForCodecID(AVCodecID id)
{
- auto *accels = preferredHardwareAccelerators;
- while (*accels != AV_HWDEVICE_TYPE_NONE) {
- auto accel = HWAccel::create(*accels);
+ for (auto type : preferredHardwareAccelerators) {
+ auto accel = HWAccel::create(type);
if (accel && accel->hardwareEncoderForCodecId(id))
return accel;
- ++accels;
}
return {};
}
diff --git a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h
index 7186d56ab..81bb163bb 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h
+++ b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h
@@ -106,7 +106,8 @@ public:
AVHWFramesContext *hwFramesContext() const;
static AVPixelFormat format(AVFrame *frame);
- static const AVHWDeviceType *preferredDeviceTypes();
+ static std::pair<const AVHWDeviceType*, qsizetype> preferredDeviceTypes();
+
private:
HWAccel(AVBufferRef *hwDeviceContext, AVBufferRef *hwFrameContext = nullptr)
: m_hwDeviceContext(hwDeviceContext), m_hwFramesContext(hwFrameContext)
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegvideoframeencoder.cpp b/src/plugins/multimedia/ffmpeg/qffmpegvideoframeencoder.cpp
index ea2ed46d3..2a9438a00 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegvideoframeencoder.cpp
+++ b/src/plugins/multimedia/ffmpeg/qffmpegvideoframeencoder.cpp
@@ -46,10 +46,9 @@ VideoFrameEncoder::VideoFrameEncoder(const QMediaEncoderSettings &encoderSetting
auto codecID = QFFmpegMediaFormatInfo::codecIdForVideoCodec(qVideoCodec);
#ifndef QT_DISABLE_HW_ENCODING
- const auto *accels = HWAccel::preferredDeviceTypes();
- while (*accels != AV_HWDEVICE_TYPE_NONE) {
- auto accel = HWAccel::create(*accels);
- ++accels;
+ auto [preferredTypes, size] = HWAccel::preferredDeviceTypes();
+ for (qsizetype i = 0; i < size; i++) {
+ auto accel = HWAccel::create(preferredTypes[i]);
if (!accel)
continue;