#include "videodecoder.hpp" #include #ifdef ZHAVE_VIDEO #include "nvidiaplayer.hpp" #endif #ifdef ZHAVE_FFMPEG #include "vaapiplayer.hpp" #endif namespace ZShell::wallpaper { VideoDecoder::~VideoDecoder() = default; void VideoDecoder::setReadyCallback(std::function callback) { m_readyCb = std::move(callback); } void VideoDecoder::setFrameCallback(std::function callback) { m_frameCb = std::move(callback); } uint32_t VideoDecoder::textureId() const { return m_texY; } uint32_t VideoDecoder::chromaTextureId() const { return m_texUV; } int VideoDecoder::colorMatrix() const { return m_matrix; } int VideoDecoder::colorRange() const { return m_range; } QSize VideoDecoder::frameSize() const { return m_size; } namespace { VideoBackend backendFromEnvironment() { if (qEnvironmentVariableIsSet("ZBAR_WALLPAPER_VAAPI")) return VideoBackend::Vaapi; if (qEnvironmentVariableIsSet("ZBAR_WALLPAPER_NVIDIA")) return VideoBackend::Nvidia; return VideoBackend::Auto; } VideoBackend selectBackend(VideoBackend hint) { if (hint == VideoBackend::None) return VideoBackend::None; if (hint == VideoBackend::Auto) hint = backendFromEnvironment(); if (hint == VideoBackend::Nvidia) { #ifdef ZHAVE_VIDEO if (NvidiaPlayer::available()) return VideoBackend::Nvidia; #endif return VideoBackend::None; } if (hint == VideoBackend::Vaapi) { #ifdef ZHAVE_FFMPEG if (VaapiPlayer::available()) return VideoBackend::Vaapi; #endif return VideoBackend::None; } #ifdef ZHAVE_VIDEO if (NvidiaPlayer::available()) return VideoBackend::Nvidia; #endif #ifdef ZHAVE_FFMPEG if (VaapiPlayer::available()) return VideoBackend::Vaapi; #endif return VideoBackend::None; } } // namespace std::unique_ptr createVideoDecoder( EGLDisplay display, VideoBackend hint) { switch (selectBackend(hint)) { #ifdef ZHAVE_VIDEO case VideoBackend::Nvidia: return std::make_unique(display); #endif #ifdef ZHAVE_FFMPEG case VideoBackend::Vaapi: return std::make_unique(display); #endif case VideoBackend::Auto: case VideoBackend::None: break; } return nullptr; } const char* resolveBackendName(VideoBackend hint) { switch (selectBackend(hint)) { case VideoBackend::Nvidia: return "nvidia"; case VideoBackend::Vaapi: return "vaapi"; case VideoBackend::Auto: case VideoBackend::None: break; } return "mpv"; } } // namespace ZShell::wallpaper