C++ / fmt (pull_request) Failing after 6s
C++ / build (pull_request) Failing after 10s
C++ / clang-tidy (pull_request) Failing after 11s
JS/TS / fmt (pull_request) Successful in 10s
JS/TS / lint (pull_request) Successful in 8s
Python / static (pull_request) Failing after 32s
Rust / build (pull_request) Successful in 52s
Python / verify (pull_request) Failing after 1m23s
Rust / fmt (pull_request) Successful in 51s
Rust / clippy (pull_request) Successful in 1m2s
79 lines
1.6 KiB
C++
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
|