Files
z-bar-qt/Plugins/ZShell/Wallpaper/nvidiaplayer.hpp
T

79 lines
1.6 KiB
C++

#pragma once
#ifdef ZHAVE_VIDEO
#include "videodecoder.hpp"
#include <EGL/egl.h>
#include <cuda.h>
#include <atomic>
#include <mutex>
#include <thread>
#include <QSize>
#include <QString>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/buffer.h>
#include <libavutil/frame.h>
#include <libavutil/hwcontext.h>
#include <libavutil/hwcontext_cuda.h>
#include <libavutil/pixfmt.h>
#include <libavutil/pixdesc.h>
}
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<bool> m_threadRunning{false};
std::atomic<uint32_t> 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