3#include <QtCore/qglobal.h>
5#if defined(Q_OS_WIN) && (defined(QGC_HAS_GST_D3D11_GPU_PATH) || defined(QGC_HAS_GST_D3D12_GPU_PATH))
7#include <QtCore/QLoggingCategory>
9#include <QtMultimedia/QVideoFrame>
10#include <QtMultimedia/QVideoFrameFormat>
11#include <private/qhwvideobuffer_p.h>
12#include <private/qvideotexturehelper_p.h>
28namespace GstD3DVideoBufferCommon {
30constexpr int kMaxPlanes = 4;
34struct MapDiagnostics {
35 std::atomic<quint64> mapFailureCount{0};
36 std::atomic<bool> loggedFirstSuccess{
false};
40 std::atomic<bool> loggedNullSample{
false};
41 std::atomic<bool> loggedBadBackend{
false};
42 std::atomic<bool> loggedNullBuffer{
false};
43 std::atomic<bool> loggedNonD3DMemory{
false};
44 std::atomic<bool> loggedNullResource{
false};
45 std::atomic<bool> loggedTextureCreateFail{
false};
49 std::atomic<bool> loggedDeviceMismatch{
false};
52inline QVideoFrameTexturesUPtr fail(MapDiagnostics &d)
54 d.mapFailureCount.fetch_add(1, std::memory_order_relaxed);
58inline quint64 takeMapFailureCount(MapDiagnostics &d)
60 return d.mapFailureCount.exchange(0, std::memory_order_relaxed);
63inline quint64 peekMapFailureCount(MapDiagnostics &d)
65 return d.mapFailureCount.load(std::memory_order_relaxed);
71template<
class HandleT>
72class FrameTextures final :
public QVideoFrameTextures
75 FrameTextures(QRhi *rhi, QSize size, QVideoFrameFormat::PixelFormat pixelFormat,
76 std::array<HandleT *, kMaxPlanes> handles,
int count)
80 const auto *desc = QVideoTextureHelper::textureDescription(pixelFormat);
82 for (
int i = 0; i < _count; ++i) {
83 const QSize planeSize = desc->rhiPlaneSize(size, i, rhi);
84 _textures[i].reset(rhi->newTexture(desc->rhiTextureFormat(i, rhi), planeSize, 1, {}));
85 if (_textures[i] && !_textures[i]->createFrom({
reinterpret_cast<quint64
>(handles[i]), 0})) {
91 ~FrameTextures()
override
93 for (
int i = 0; i < _count; ++i) {
94 if (_handles[i]) _handles[i]->Release();
98 QRhiTexture *texture(uint plane)
const override
100 return (
int(plane) < _count) ? _textures[plane].get() :
nullptr;
105 std::array<HandleT *, kMaxPlanes> _handles;
106 std::unique_ptr<QRhiTexture> _textures[kMaxPlanes];
113#define QGC_D3D_WARN_ONCE(LOGCAT, FLAG, ...) \
115 if (!(FLAG).exchange(true, std::memory_order_relaxed)) { \
116 qCWarning(LOGCAT) << __VA_ARGS__; \