#pragma once #ifdef ZHAVE_VIDEO #include "videodecoder.hpp" #include #include #include #include #include #include #include extern "C" { #include #include #include #include #include #include #include #include } namespace ZShell::wallpaper { class NvidiaPlayer : public VideoDecoder { public: explicit NvidiaPlayer(EGLDisplay display); ~NvidiaPlayer() override; [[nodiscard]] static bool available(); bool start(const QString& path) override; void stop() override; bool importCurrentFrame() override; void deleteTexture() override; [[nodiscard]] const char* backendName() const override { return "nvidia"; } private: void decodeLoop(const QString& path, uint32_t generation); bool openDecoder(const QString& path); void closeDecoder(); bool ensureTextures(unsigned w, unsigned h, int compBytes); bool ensureCudaContext(); std::thread m_thread; std::atomic m_threadRunning{false}; std::atomic m_generation{0}; mutable std::mutex m_mtx; AVFrame* m_pending = nullptr; bool m_haveFrame = false; AVFrame* m_displayed = nullptr; AVFormatContext* m_fmt = nullptr; AVCodecContext* m_codec = nullptr; AVBufferRef* m_hwDeviceCtx = nullptr; int m_streamIndex = -1; CUcontext m_cuCtx = nullptr; CUgraphicsResource m_resY = nullptr; CUgraphicsResource m_resUV = nullptr; QSize m_texSize; int m_texComp = 1; }; } // namespace ZShell::wallpaper #endif // ZHAVE_VIDEO