diff --git a/app/app.pro b/app/app.pro index 09b2128a..717f9522 100644 --- a/app/app.pro +++ b/app/app.pro @@ -182,6 +182,7 @@ ffmpeg { SOURCES += \ streaming/video/ffmpeg.cpp \ streaming/video/ffmpeg-renderers/sdlvid.cpp \ + streaming/video/ffmpeg-renderers/cuda.cpp \ streaming/video/ffmpeg-renderers/pacer/pacer.cpp \ streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp @@ -189,6 +190,7 @@ ffmpeg { streaming/video/ffmpeg.h \ streaming/video/ffmpeg-renderers/renderer.h \ streaming/video/ffmpeg-renderers/sdlvid.h \ + streaming/video/ffmpeg-renderers/cuda.h \ streaming/video/ffmpeg-renderers/pacer/pacer.h \ streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h } diff --git a/app/streaming/video/ffmpeg-renderers/cuda.cpp b/app/streaming/video/ffmpeg-renderers/cuda.cpp new file mode 100644 index 00000000..f9849ef8 --- /dev/null +++ b/app/streaming/video/ffmpeg-renderers/cuda.cpp @@ -0,0 +1,57 @@ +#include "cuda.h" + +CUDARenderer::CUDARenderer() + : m_HwContext(nullptr) +{ + +} + +CUDARenderer::~CUDARenderer() +{ + if (m_HwContext != nullptr) { + av_buffer_unref(&m_HwContext); + } +} + +bool CUDARenderer::initialize(PDECODER_PARAMETERS) +{ + int err; + + err = av_hwdevice_ctx_create(&m_HwContext, AV_HWDEVICE_TYPE_CUDA, nullptr, nullptr, 0); + if (err != 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "av_hwdevice_ctx_create(CUDA) failed: %d", + err); + return false; + } + + return true; +} + +bool CUDARenderer::prepareDecoderContext(AVCodecContext* context) +{ + context->hw_device_ctx = av_buffer_ref(m_HwContext); + + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, + "Using CUDA accelerated decoder"); + + return true; +} + +void CUDARenderer::renderFrame(AVFrame*) +{ + // We only support indirect rendering + SDL_assert(false); +} + +bool CUDARenderer::needsTestFrame() +{ + return true; +} + +bool CUDARenderer::isDirectRenderingSupported() +{ + // We only support rendering via SDL read-back + return false; +} + diff --git a/app/streaming/video/ffmpeg-renderers/cuda.h b/app/streaming/video/ffmpeg-renderers/cuda.h new file mode 100644 index 00000000..431fa70a --- /dev/null +++ b/app/streaming/video/ffmpeg-renderers/cuda.h @@ -0,0 +1,18 @@ +#pragma once + +#include "renderer.h" + +class CUDARenderer : public IFFmpegRenderer { +public: + CUDARenderer(); + virtual ~CUDARenderer() override; + virtual bool initialize(PDECODER_PARAMETERS) override; + virtual bool prepareDecoderContext(AVCodecContext* context) override; + virtual void renderFrame(AVFrame* frame) override; + virtual bool needsTestFrame() override; + virtual bool isDirectRenderingSupported() override; + +private: + AVBufferRef* m_HwContext; +}; +