diff --git a/app/app.pro b/app/app.pro index f55d9374..42588df2 100644 --- a/app/app.pro +++ b/app/app.pro @@ -116,12 +116,15 @@ ffmpeg { SOURCES += \ streaming/video/ffmpeg.cpp \ streaming/video/ffmpeg-renderers/sdl.cpp \ - streaming/video/ffmpeg-renderers/pacer/pacer.cpp + streaming/video/ffmpeg-renderers/pacer/pacer.cpp \ + streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp + HEADERS += \ streaming/video/ffmpeg.h \ streaming/video/ffmpeg-renderers/renderer.h \ - streaming/video/ffmpeg-renderers/pacer/pacer.h + streaming/video/ffmpeg-renderers/pacer/pacer.h \ + streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h } libva { message(VAAPI renderer selected) diff --git a/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp b/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp new file mode 100644 index 00000000..869dfd8d --- /dev/null +++ b/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp @@ -0,0 +1,42 @@ +#include "nullthreadedvsyncsource.h" + +NullThreadedVsyncSource::NullThreadedVsyncSource(Pacer* pacer) : + m_Pacer(pacer), + m_Thread(nullptr) +{ + SDL_AtomicSet(&m_Stopping, 0); +} + +NullThreadedVsyncSource::~NullThreadedVsyncSource() +{ + if (m_Thread != nullptr) { + SDL_AtomicSet(&m_Stopping, 1); + SDL_WaitThread(m_Thread, nullptr); + } +} + +bool NullThreadedVsyncSource::initialize(SDL_Window*) +{ + m_Thread = SDL_CreateThread(vsyncThread, "Null Vsync Thread", this); + if (m_Thread == nullptr) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Unable to create DX V-sync thread: %s", + SDL_GetError()); + return false; + } + + return true; +} + +int NullThreadedVsyncSource::vsyncThread(void* context) +{ + NullThreadedVsyncSource* me = reinterpret_cast(context); + + SDL_SetThreadPriority(SDL_THREAD_PRIORITY_HIGH); + + while (SDL_AtomicGet(&me->m_Stopping) == 0) { + me->m_Pacer->vsyncCallback(); + } + + return 0; +} diff --git a/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h b/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h new file mode 100644 index 00000000..8c9782a6 --- /dev/null +++ b/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h @@ -0,0 +1,20 @@ +#pragma once + +#include "pacer.h" + +class NullThreadedVsyncSource : public IVsyncSource +{ +public: + NullThreadedVsyncSource(Pacer* pacer); + + virtual ~NullThreadedVsyncSource(); + + virtual bool initialize(SDL_Window* window); + +private: + static int vsyncThread(void* context); + + Pacer* m_Pacer; + SDL_Thread* m_Thread; + SDL_atomic_t m_Stopping; +};