diff options
author | Piotr Srebrny <piotr.srebrny@qt.io> | 2022-09-20 13:28:19 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-10-17 08:24:57 +0000 |
commit | ed5c122a9e144862bb728aca2babcd226738d3c0 (patch) | |
tree | 092ba2deb13033974a6119f4e663e36e35f55d26 | |
parent | 143ca7ea976e815d34f14aa1598c741fa0302053 (diff) | |
download | qtmultimedia-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.cpp | 22 | ||||
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h | 3 | ||||
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpegvideoframeencoder.cpp | 7 |
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; |