diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2017-01-31 19:27:37 +0100 |
---|---|---|
committer | Rainer Hochecker <fernetmenta@online.de> | 2017-02-16 12:59:40 +0100 |
commit | 0cc06143bdf5c4df9d72608298b8822e1133a5e2 (patch) | |
tree | 89d57e48ccd6c43fc2fc1397dc571bc57eb5904f | |
parent | a1bf5b14cd87b92d7a79128c14a230ea18f28a92 (diff) |
VideoPlayer: VideoReferenceClock to the right place
-rw-r--r-- | cmake/treedata/common/video.txt | 1 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/CMakeLists.txt | 6 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDClock.cpp | 2 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/VideoReferenceClock.cpp (renamed from xbmc/video/VideoReferenceClock.cpp) | 73 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/VideoReferenceClock.h (renamed from xbmc/video/VideoReferenceClock.h) | 5 | ||||
-rw-r--r-- | xbmc/platform/darwin/ios/XBMCController.mm | 1 | ||||
-rw-r--r-- | xbmc/video/CMakeLists.txt | 2 | ||||
-rw-r--r-- | xbmc/video/videosync/CMakeLists.txt | 50 | ||||
-rw-r--r-- | xbmc/video/videosync/VideoSyncAML.cpp | 110 | ||||
-rw-r--r-- | xbmc/video/videosync/VideoSyncAML.h | 41 | ||||
-rw-r--r-- | xbmc/windowing/CMakeLists.txt | 3 | ||||
-rw-r--r-- | xbmc/windowing/VideoSync.h (renamed from xbmc/video/videosync/VideoSync.h) | 6 | ||||
-rw-r--r-- | xbmc/windowing/WinSystem.h | 5 | ||||
-rw-r--r-- | xbmc/windowing/X11/CMakeLists.txt | 4 | ||||
-rw-r--r-- | xbmc/windowing/X11/VideoSyncDRM.cpp (renamed from xbmc/video/videosync/VideoSyncDRM.cpp) | 2 | ||||
-rw-r--r-- | xbmc/windowing/X11/VideoSyncDRM.h (renamed from xbmc/video/videosync/VideoSyncDRM.h) | 7 | ||||
-rw-r--r-- | xbmc/windowing/X11/VideoSyncGLX.cpp (renamed from xbmc/video/videosync/VideoSyncGLX.cpp) | 2 | ||||
-rw-r--r-- | xbmc/windowing/X11/VideoSyncGLX.h (renamed from xbmc/video/videosync/VideoSyncGLX.h) | 4 | ||||
-rw-r--r-- | xbmc/windowing/X11/WinSystemX11.cpp | 4 | ||||
-rw-r--r-- | xbmc/windowing/X11/WinSystemX11GLContext.cpp | 19 | ||||
-rw-r--r-- | xbmc/windowing/X11/WinSystemX11GLContext.h | 3 | ||||
-rw-r--r-- | xbmc/windowing/egl/VideoSyncAndroid.cpp (renamed from xbmc/video/videosync/VideoSyncAndroid.cpp) | 0 | ||||
-rw-r--r-- | xbmc/windowing/egl/VideoSyncAndroid.h (renamed from xbmc/video/videosync/VideoSyncAndroid.h) | 0 | ||||
-rw-r--r-- | xbmc/windowing/egl/VideoSyncIMX.cpp (renamed from xbmc/video/videosync/VideoSyncIMX.cpp) | 0 | ||||
-rw-r--r-- | xbmc/windowing/egl/VideoSyncIMX.h (renamed from xbmc/video/videosync/VideoSyncIMX.h) | 0 | ||||
-rw-r--r-- | xbmc/windowing/egl/VideoSyncPi.cpp (renamed from xbmc/video/videosync/VideoSyncPi.cpp) | 0 | ||||
-rw-r--r-- | xbmc/windowing/egl/VideoSyncPi.h (renamed from xbmc/video/videosync/VideoSyncPi.h) | 0 | ||||
-rw-r--r-- | xbmc/windowing/osx/CMakeLists.txt | 12 | ||||
-rw-r--r-- | xbmc/windowing/osx/VideoSyncIos.cpp (renamed from xbmc/video/videosync/VideoSyncIos.cpp) | 2 | ||||
-rw-r--r-- | xbmc/windowing/osx/VideoSyncIos.h (renamed from xbmc/video/videosync/VideoSyncIos.h) | 4 | ||||
-rw-r--r-- | xbmc/windowing/osx/VideoSyncOsx.cpp (renamed from xbmc/video/videosync/VideoSyncOsx.cpp) | 3 | ||||
-rw-r--r-- | xbmc/windowing/osx/VideoSyncOsx.h (renamed from xbmc/video/videosync/VideoSyncOsx.h) | 6 | ||||
-rw-r--r-- | xbmc/windowing/osx/WinSystemIOS.h | 2 | ||||
-rw-r--r-- | xbmc/windowing/osx/WinSystemIOS.mm | 13 | ||||
-rw-r--r-- | xbmc/windowing/osx/WinSystemOSX.h | 3 | ||||
-rw-r--r-- | xbmc/windowing/osx/WinSystemOSX.mm | 9 | ||||
-rw-r--r-- | xbmc/windowing/windows/VideoSyncD3D.cpp (renamed from xbmc/video/videosync/VideoSyncD3D.cpp) | 0 | ||||
-rw-r--r-- | xbmc/windowing/windows/VideoSyncD3D.h (renamed from xbmc/video/videosync/VideoSyncD3D.h) | 0 |
38 files changed, 91 insertions, 313 deletions
diff --git a/cmake/treedata/common/video.txt b/cmake/treedata/common/video.txt index e7855a0809..acfb33bf57 100644 --- a/cmake/treedata/common/video.txt +++ b/cmake/treedata/common/video.txt @@ -1,5 +1,4 @@ xbmc/video video xbmc/video/dialogs video/dialogs xbmc/video/jobs video/jobs -xbmc/video/videosync video/sync xbmc/video/windows video/windows diff --git a/xbmc/cores/VideoPlayer/CMakeLists.txt b/xbmc/cores/VideoPlayer/CMakeLists.txt index 00d0232922..4ceff1b890 100644 --- a/xbmc/cores/VideoPlayer/CMakeLists.txt +++ b/xbmc/cores/VideoPlayer/CMakeLists.txt @@ -13,7 +13,8 @@ set(SOURCES DVDAudio.cpp VideoPlayerRadioRDS.cpp VideoPlayerSubtitle.cpp VideoPlayerTeletext.cpp - VideoPlayerVideo.cpp) + VideoPlayerVideo.cpp + VideoReferenceClock.cpp) set(HEADERS DVDAudio.h DVDClock.h @@ -32,6 +33,7 @@ set(HEADERS DVDAudio.h VideoPlayerRadioRDS.h VideoPlayerSubtitle.h VideoPlayerTeletext.h - VideoPlayerVideo.h) + VideoPlayerVideo.h + VideoReferenceClock.h) core_add_library(VideoPlayer) diff --git a/xbmc/cores/VideoPlayer/DVDClock.cpp b/xbmc/cores/VideoPlayer/DVDClock.cpp index f4ae45d816..4cf90d546e 100644 --- a/xbmc/cores/VideoPlayer/DVDClock.cpp +++ b/xbmc/cores/VideoPlayer/DVDClock.cpp @@ -19,7 +19,7 @@ */ #include "DVDClock.h" -#include "video/VideoReferenceClock.h" +#include "VideoReferenceClock.h" #include <math.h> #include "utils/MathUtils.h" #include "threads/SingleLock.h" diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/cores/VideoPlayer/VideoReferenceClock.cpp index 2d85839d23..0dd7ea9b87 100644 --- a/xbmc/video/VideoReferenceClock.cpp +++ b/xbmc/cores/VideoPlayer/VideoReferenceClock.cpp @@ -24,39 +24,9 @@ #include "utils/TimeUtils.h" #include "threads/SingleLock.h" #include "guilib/GraphicContext.h" -#include "video/videosync/VideoSync.h" #include "settings/Settings.h" - -#if defined(HAS_GLX) -#include "video/videosync/VideoSyncGLX.h" -#endif -#if defined(HAVE_X11) -#include "video/videosync/VideoSyncDRM.h" +#include "windowing/VideoSync.h" #include "windowing/WindowingFactory.h" -#elif defined(TARGET_RASPBERRY_PI) -#include "video/videosync/VideoSyncPi.h" -#elif defined(HAS_IMXVPU) -#include "video/videosync/VideoSyncIMX.h" -#endif -#if defined(TARGET_WINDOWS) -#include "video/videosync/VideoSyncD3D.h" -#endif -#if defined(TARGET_DARWIN_OSX) -#include "video/videosync/VideoSyncOsx.h" -#endif -#if defined(TARGET_DARWIN_IOS) -#include "video/videosync/VideoSyncIos.h" -#endif -#if defined(TARGET_ANDROID) -#include "video/videosync/VideoSyncAndroid.h" -#endif -#if defined(HAS_LIBAMCODEC) -#include "video/videosync/VideoSyncAML.h" -#endif - -#ifdef TARGET_POSIX -#include "linux/XTimeUtils.h" -#endif CVideoReferenceClock::CVideoReferenceClock() : CThread("RefClock") { @@ -73,8 +43,6 @@ CVideoReferenceClock::CVideoReferenceClock() : CThread("RefClock") m_MissedVblanks = 0; m_VblankTime = 0; - m_pVideoSync = nullptr; - Start(); } @@ -90,12 +58,13 @@ void CVideoReferenceClock::Start() Create(); } -void CVideoReferenceClock::CBUpdateClock(int NrVBlanks, uint64_t time, CVideoReferenceClock *clock) +void CVideoReferenceClock::CBUpdateClock(int NrVBlanks, uint64_t time, void *clock) { { - CSingleLock lock(clock->m_CritSection); - clock->m_VblankTime = time; - clock->UpdateClock(NrVBlanks, true); + CVideoReferenceClock *refClock = static_cast<CVideoReferenceClock*>(clock); + CSingleLock lock(refClock->m_CritSection); + refClock->m_VblankTime = time; + refClock->UpdateClock(NrVBlanks, true); } } @@ -106,32 +75,7 @@ void CVideoReferenceClock::Process() while(!m_bStop) { - //set up the vblank clock -#if defined(HAVE_X11) - std::string gpuvendor = g_Windowing.GetRenderVendor(); - std::transform(gpuvendor.begin(), gpuvendor.end(), gpuvendor.begin(), ::tolower); - if ((gpuvendor.compare(0, 5, "intel") == 0 || - gpuvendor.compare(0, 5, "x.org") == 0)) // AMD - m_pVideoSync = new CVideoSyncDRM(this); -#if defined(HAS_GLX) - else - m_pVideoSync = new CVideoSyncGLX(this); -#endif -#elif defined(TARGET_WINDOWS) - m_pVideoSync = new CVideoSyncD3D(this); -#elif defined(TARGET_DARWIN_OSX) - m_pVideoSync = new CVideoSyncOsx(this); -#elif defined(TARGET_DARWIN_IOS) - m_pVideoSync = new CVideoSyncIos(this); -#elif defined(TARGET_RASPBERRY_PI) - m_pVideoSync = new CVideoSyncPi(this); -#elif defined(HAS_IMXVPU) - m_pVideoSync = new CVideoSyncIMX(this); -#elif defined(TARGET_ANDROID) - m_pVideoSync = new CVideoSyncAndroid(this); -#elif defined(HAS_LIBAMCODEC) - m_pVideoSync = new CVideoSyncAML(this); -#endif + m_pVideoSync = g_Windowing.GetVideoSync(this); if (m_pVideoSync) { @@ -173,8 +117,7 @@ void CVideoReferenceClock::Process() if (m_pVideoSync) { m_pVideoSync->Cleanup(); - delete m_pVideoSync; - m_pVideoSync = nullptr; + m_pVideoSync.reset(); } if (!SetupSuccess) diff --git a/xbmc/video/VideoReferenceClock.h b/xbmc/cores/VideoPlayer/VideoReferenceClock.h index 659e4269a2..00f58bf7ec 100644 --- a/xbmc/video/VideoReferenceClock.h +++ b/xbmc/cores/VideoPlayer/VideoReferenceClock.h @@ -21,6 +21,7 @@ #include "threads/Thread.h" #include "threads/CriticalSection.h" +#include <memory> class CVideoSync; @@ -43,7 +44,7 @@ class CVideoReferenceClock : public CThread void UpdateClock(int NrVBlanks, bool CheckMissed); double UpdateInterval() const; int64_t TimeOfNextVblank() const; - static void CBUpdateClock(int NrVBlanks, uint64_t time, CVideoReferenceClock *clock); + static void CBUpdateClock(int NrVBlanks, uint64_t time, void *clock); int64_t m_CurrTime; //the current time of the clock when using vblank as clock source int64_t m_LastIntTime; //last interpolated clock value, to make sure the clock doesn't go backwards @@ -60,5 +61,5 @@ class CVideoReferenceClock : public CThread CCriticalSection m_CritSection; - CVideoSync *m_pVideoSync; + std::unique_ptr<CVideoSync> m_pVideoSync; }; diff --git a/xbmc/platform/darwin/ios/XBMCController.mm b/xbmc/platform/darwin/ios/XBMCController.mm index 380537e944..2d6b85fe56 100644 --- a/xbmc/platform/darwin/ios/XBMCController.mm +++ b/xbmc/platform/darwin/ios/XBMCController.mm @@ -37,7 +37,6 @@ #include "guilib/GUIControl.h" #include "input/Key.h" #include "windowing/WindowingFactory.h" -#include "video/VideoReferenceClock.h" #include "utils/log.h" #include "utils/TimeUtils.h" #include "Util.h" diff --git a/xbmc/video/CMakeLists.txt b/xbmc/video/CMakeLists.txt index 9842fce0aa..c3ee3d7554 100644 --- a/xbmc/video/CMakeLists.txt +++ b/xbmc/video/CMakeLists.txt @@ -9,7 +9,6 @@ set(SOURCES Bookmark.cpp VideoInfoScanner.cpp VideoInfoTag.cpp VideoLibraryQueue.cpp - VideoReferenceClock.cpp VideoThumbLoader.cpp ViewModeSettings.cpp) @@ -26,7 +25,6 @@ set(HEADERS Bookmark.h VideoInfoScanner.h VideoInfoTag.h VideoLibraryQueue.h - VideoReferenceClock.h VideoThumbLoader.h) core_add_library(video) diff --git a/xbmc/video/videosync/CMakeLists.txt b/xbmc/video/videosync/CMakeLists.txt deleted file mode 100644 index 177c656ea6..0000000000 --- a/xbmc/video/videosync/CMakeLists.txt +++ /dev/null @@ -1,50 +0,0 @@ -set(HEADERS VideoSync.h) - -if(OPENGL_FOUND) - list(APPEND SOURCES VideoSyncGLX.cpp) - list(APPEND HEADERS VideoSyncGLX.h) -endif() - -if(X_FOUND) - list(APPEND SOURCES VideoSyncDRM.cpp) - list(APPEND HEADERS VideoSyncDRM.h) -endif() - -if(CORE_SYSTEM_NAME STREQUAL windows) - list(APPEND SOURCES VideoSyncD3D.cpp) - list(APPEND HEADERS VideoSyncD3D.h) -endif() - -if(CORE_SYSTEM_NAME STREQUAL rbpi) - list(APPEND SOURCES VideoSyncPi.cpp) - list(APPEND HEADERS VideoSyncPi.h) -endif() - -if(CORE_SYSTEM_NAME STREQUAL osx) - list(APPEND SOURCES VideoSyncOsx.cpp) - list(APPEND HEADERS VideoSyncOsx.h) -endif() - -if(CORE_SYSTEM_NAME STREQUAL ios) - list(APPEND SOURCES VideoSyncIos.cpp) - list(APPEND HEADERS VideoSyncIos.h) -endif() - -if(CORE_SYSTEM_NAME STREQUAL android) - list(APPEND SOURCES VideoSyncAndroid.cpp) - list(APPEND HEADERS VideoSyncAndroid.h) -endif() - -if(IMX_FOUND) - list(APPEND SOURCES VideoSyncIMX.cpp) - list(APPEND HEADERS VideoSyncIMX.h) -endif() - -if(AML_FOUND) - list(APPEND SOURCES VideoSyncAML.cpp) - list(APPEND HEADERS VideoSyncAML.h) -endif() - -if(SOURCES AND HEADERS) - core_add_library(video_sync) -endif() diff --git a/xbmc/video/videosync/VideoSyncAML.cpp b/xbmc/video/videosync/VideoSyncAML.cpp deleted file mode 100644 index cd8559e94d..0000000000 --- a/xbmc/video/videosync/VideoSyncAML.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2017 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#include "system.h" - -#if defined(HAS_LIBAMCODEC) - -#include "video/videosync/VideoSyncAML.h" -#include "guilib/GraphicContext.h" -#include "windowing/WindowingFactory.h" -#include "utils/TimeUtils.h" -#include "utils/log.h" -#include "threads/Thread.h" -#include <sys/poll.h> - -#include <chrono> -#include <thread> - -extern CEvent g_aml_sync_event; - -CVideoSyncAML::CVideoSyncAML(CVideoReferenceClock *clock) -: CVideoSync(clock) -, m_abort(false) -{ -} - -CVideoSyncAML::~CVideoSyncAML() -{ -} - -bool CVideoSyncAML::Setup(PUPDATECLOCK func) -{ - UpdateClock = func; - - m_abort = false; - - g_Windowing.Register(this); - CLog::Log(LOGDEBUG, "CVideoReferenceClock: setting up AML"); - - return true; -} - -void CVideoSyncAML::Run(std::atomic<bool>& stop) -{ - // We use the wall clock for timout handling (no AML h/w, startup) - std::chrono::time_point<std::chrono::system_clock> now(std::chrono::system_clock::now()); - unsigned int waittime (3000 / m_fps); - uint64_t numVBlanks (0); - - while (!stop && !m_abort) - { - int countVSyncs(1); - if( !g_aml_sync_event.WaitMSec(waittime)) - { - std::chrono::milliseconds elapsed(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - now).count()); - uint64_t curVBlanks = (m_fps * elapsed.count()) / 1000; - int64_t lastVBlankTime((curVBlanks * 1000) / m_fps); - if (elapsed.count() > lastVBlankTime) - { - lastVBlankTime = (++curVBlanks * 1000) / m_fps; - std::this_thread::sleep_for(std::chrono::milliseconds(lastVBlankTime - elapsed.count())); - } - countVSyncs = curVBlanks - numVBlanks; - numVBlanks = curVBlanks; - } - else - ++numVBlanks; - - uint64_t now = CurrentHostCounter(); - - UpdateClock(countVSyncs, now, m_refClock); - } -} - -void CVideoSyncAML::Cleanup() -{ - CLog::Log(LOGDEBUG, "CVideoReferenceClock: cleaning up AML"); - g_Windowing.Unregister(this); -} - -float CVideoSyncAML::GetFps() -{ - m_fps = g_graphicsContext.GetFPS(); - CLog::Log(LOGDEBUG, "CVideoReferenceClock: fps: %.3f", m_fps); - return m_fps; -} - -void CVideoSyncAML::OnResetDisplay() -{ - m_abort = true; -} - -#endif diff --git a/xbmc/video/videosync/VideoSyncAML.h b/xbmc/video/videosync/VideoSyncAML.h deleted file mode 100644 index f12230ea90..0000000000 --- a/xbmc/video/videosync/VideoSyncAML.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -/* - * Copyright (C) 2017 Team XBMC - * http://xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/>. - * - */ - -#if defined(HAS_LIBAMCODEC) - -#include "video/videosync/VideoSync.h" -#include "guilib/DispResource.h" - -class CVideoSyncAML : public CVideoSync, IDispResource -{ -public: - CVideoSyncAML(CVideoReferenceClock *clock); - virtual ~CVideoSyncAML(); - virtual bool Setup(PUPDATECLOCK func); - virtual void Run(std::atomic<bool>& stop); - virtual void Cleanup(); - virtual float GetFps(); - virtual void OnResetDisplay(); -private: - volatile bool m_abort; -}; - -#endif diff --git a/xbmc/windowing/CMakeLists.txt b/xbmc/windowing/CMakeLists.txt index 0e0cf87a1e..b8924a3104 100644 --- a/xbmc/windowing/CMakeLists.txt +++ b/xbmc/windowing/CMakeLists.txt @@ -4,7 +4,8 @@ set(SOURCES WinEvents.cpp set(HEADERS WindowingFactory.h WinEvents.h WinSystem.h - XBMC_events.h) + XBMC_events.h + VideoSync.h) if (NOT MIR_FOUND) if(SDL_FOUND AND NOT X_FOUND) diff --git a/xbmc/video/videosync/VideoSync.h b/xbmc/windowing/VideoSync.h index a430cb029f..8db21957ca 100644 --- a/xbmc/video/videosync/VideoSync.h +++ b/xbmc/windowing/VideoSync.h @@ -21,12 +21,12 @@ #include <atomic> class CVideoReferenceClock; -typedef void (*PUPDATECLOCK)(int NrVBlanks, uint64_t time, CVideoReferenceClock *clock); +typedef void (*PUPDATECLOCK)(int NrVBlanks, uint64_t time, void *clock); class CVideoSync { public: - CVideoSync(CVideoReferenceClock *clock) { m_refClock = clock; }; + CVideoSync(void *clock) { m_refClock = clock; }; virtual ~CVideoSync() {}; virtual bool Setup(PUPDATECLOCK func) = 0; virtual void Run(std::atomic<bool>& stop) = 0; @@ -36,5 +36,5 @@ public: protected: PUPDATECLOCK UpdateClock; float m_fps; - CVideoReferenceClock *m_refClock; + void *m_refClock; }; diff --git a/xbmc/windowing/WinSystem.h b/xbmc/windowing/WinSystem.h index d67a2a9298..95676b4358 100644 --- a/xbmc/windowing/WinSystem.h +++ b/xbmc/windowing/WinSystem.h @@ -21,8 +21,10 @@ #ifndef WINDOW_SYSTEM_BASE_H #define WINDOW_SYSTEM_BASE_H +#include "VideoSync.h" #include "WinEvents.h" #include "guilib/Resolution.h" +#include <memory> #include <vector> typedef enum _WindowSystemType @@ -84,6 +86,9 @@ public: virtual bool Hide() { return false; } virtual bool Show(bool raise = true) { return false; } + // videosync + virtual std::unique_ptr<CVideoSync> GetVideoSync(void *clock) { return nullptr; } + // notifications virtual void OnMove(int x, int y) {} diff --git a/xbmc/windowing/X11/CMakeLists.txt b/xbmc/windowing/X11/CMakeLists.txt index 6d2527d563..902dea50a4 100644 --- a/xbmc/windowing/X11/CMakeLists.txt +++ b/xbmc/windowing/X11/CMakeLists.txt @@ -6,6 +6,8 @@ if (X_FOUND) WinSystemX11GLContext.cpp WinSystemX11GLESContext.cpp XRandR.cpp + VideoSyncGLX.cpp + VideoSyncDRM.cpp WinSystemX11.cpp) set(HEADERS GLContext.h @@ -14,6 +16,8 @@ if (X_FOUND) WinSystemX11GLContext.h WinSystemX11GLESContext.h XRandR.h + VideoSyncGLX.h + VideoSyncDRM.h WinSystemX11.h) core_add_library(windowing_X11) diff --git a/xbmc/video/videosync/VideoSyncDRM.cpp b/xbmc/windowing/X11/VideoSyncDRM.cpp index c86a7b771d..f31b349124 100644 --- a/xbmc/video/videosync/VideoSyncDRM.cpp +++ b/xbmc/windowing/X11/VideoSyncDRM.cpp @@ -22,7 +22,7 @@ #if defined(HAVE_X11) -#include "video/videosync/VideoSyncDRM.h" +#include "VideoSyncDRM.h" #include "xf86drm.h" #include <sys/poll.h> #include <sys/time.h> diff --git a/xbmc/video/videosync/VideoSyncDRM.h b/xbmc/windowing/X11/VideoSyncDRM.h index b6807171f3..3f41cc25ee 100644 --- a/xbmc/video/videosync/VideoSyncDRM.h +++ b/xbmc/windowing/X11/VideoSyncDRM.h @@ -19,15 +19,13 @@ * */ -#if defined(HAVE_X11) - -#include "video/videosync/VideoSync.h" +#include "windowing/VideoSync.h" #include "guilib/DispResource.h" class CVideoSyncDRM : public CVideoSync, IDispResource { public: - CVideoSyncDRM(CVideoReferenceClock *clock) : CVideoSync(clock) {}; + CVideoSyncDRM(void *clock) : CVideoSync(clock) {}; virtual bool Setup(PUPDATECLOCK func); virtual void Run(std::atomic<bool>& stop); virtual void Cleanup(); @@ -45,4 +43,3 @@ private: }; }; -#endif diff --git a/xbmc/video/videosync/VideoSyncGLX.cpp b/xbmc/windowing/X11/VideoSyncGLX.cpp index fd28e007e3..a0da423254 100644 --- a/xbmc/video/videosync/VideoSyncGLX.cpp +++ b/xbmc/windowing/X11/VideoSyncGLX.cpp @@ -22,7 +22,7 @@ #if defined(HAS_GLX) -#include "video/videosync/VideoSyncGLX.h" +#include "VideoSyncGLX.h" #include <sstream> #include <X11/extensions/Xrandr.h> #include "windowing/WindowingFactory.h" diff --git a/xbmc/video/videosync/VideoSyncGLX.h b/xbmc/windowing/X11/VideoSyncGLX.h index 7d23c47f03..eb390d6a84 100644 --- a/xbmc/video/videosync/VideoSyncGLX.h +++ b/xbmc/windowing/X11/VideoSyncGLX.h @@ -21,7 +21,7 @@ #if defined(HAS_GLX) -#include "video/videosync/VideoSync.h" +#include "windowing/VideoSync.h" #include "system_gl.h" #include <X11/X.h> #include <X11/Xlib.h> @@ -32,7 +32,7 @@ class CVideoSyncGLX : public CVideoSync, IDispResource { public: - CVideoSyncGLX(CVideoReferenceClock *clock) : CVideoSync(clock) {}; + CVideoSyncGLX(void *clock) : CVideoSync(clock) {}; virtual bool Setup(PUPDATECLOCK func); virtual void Run(std::atomic<bool>& stop); virtual void Cleanup(); diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp index 291bbf6420..ff7abe675d 100644 --- a/xbmc/windowing/X11/WinSystemX11.cpp +++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -20,8 +20,6 @@ #include "system.h" -#if defined(HAVE_X11) - #include "WinSystemX11.h" #include "ServiceBroker.h" #include "settings/DisplaySettings.h" @@ -1071,4 +1069,4 @@ void CWinSystemX11::UpdateCrtc() g_graphicsContext.SetFPS(fps); } -#endif + diff --git a/xbmc/windowing/X11/WinSystemX11GLContext.cpp b/xbmc/windowing/X11/WinSystemX11GLContext.cpp index 33c5858b8b..c776dbdf96 100644 --- a/xbmc/windowing/X11/WinSystemX11GLContext.cpp +++ b/xbmc/windowing/X11/WinSystemX11GLContext.cpp @@ -19,7 +19,7 @@ */ #include "system.h" -#if defined(HAVE_X11) && defined(HAS_GL) +#if defined(HAS_GL) #include <X11/Xlib.h> #include <X11/Xutil.h> @@ -34,6 +34,8 @@ #include "threads/SingleLock.h" #include <vector> #include "Application.h" +#include "VideoSyncDRM.h" +#include "VideoSyncGLX.h" CWinSystemX11GLContext::CWinSystemX11GLContext() { @@ -219,4 +221,19 @@ bool CWinSystemX11GLContext::RefreshGLContext(bool force) return ret; } +std::unique_ptr<CVideoSync> CWinSystemX11GLContext::GetVideoSync(void *clock) +{ + std::unique_ptr<CVideoSync> pVSync; + + if (dynamic_cast<CGLContextEGL*>(m_pGLContext)) + { + pVSync.reset(new CVideoSyncDRM(clock)); + } + else if (dynamic_cast<CGLContextGLX*>(m_pGLContext)) + { + pVSync.reset(new CVideoSyncGLX(clock)); + } + return pVSync; +} + #endif diff --git a/xbmc/windowing/X11/WinSystemX11GLContext.h b/xbmc/windowing/X11/WinSystemX11GLContext.h index 4e0ca8c62e..b4e7f390d9 100644 --- a/xbmc/windowing/X11/WinSystemX11GLContext.h +++ b/xbmc/windowing/X11/WinSystemX11GLContext.h @@ -43,6 +43,9 @@ public: bool IsExtSupported(const char* extension) override; + // videosync + virtual std::unique_ptr<CVideoSync> GetVideoSync(void *clock) override; + GLXWindow GetWindow() const; GLXContext GetGlxContext() const; EGLDisplay GetEGLDisplay() const; diff --git a/xbmc/video/videosync/VideoSyncAndroid.cpp b/xbmc/windowing/egl/VideoSyncAndroid.cpp index 71d7906267..71d7906267 100644 --- a/xbmc/video/videosync/VideoSyncAndroid.cpp +++ b/xbmc/windowing/egl/VideoSyncAndroid.cpp diff --git a/xbmc/video/videosync/VideoSyncAndroid.h b/xbmc/windowing/egl/VideoSyncAndroid.h index 803df561b2..803df561b2 100644 --- a/xbmc/video/videosync/VideoSyncAndroid.h +++ b/xbmc/windowing/egl/VideoSyncAndroid.h diff --git a/xbmc/video/videosync/VideoSyncIMX.cpp b/xbmc/windowing/egl/VideoSyncIMX.cpp index fa7c27c4e5..fa7c27c4e5 100644 --- a/xbmc/video/videosync/VideoSyncIMX.cpp +++ b/xbmc/windowing/egl/VideoSyncIMX.cpp diff --git a/xbmc/video/videosync/VideoSyncIMX.h b/xbmc/windowing/egl/VideoSyncIMX.h index 7220ac60ba..7220ac60ba 100644 --- a/xbmc/video/videosync/VideoSyncIMX.h +++ b/xbmc/windowing/egl/VideoSyncIMX.h diff --git a/xbmc/video/videosync/VideoSyncPi.cpp b/xbmc/windowing/egl/VideoSyncPi.cpp index 0b512d3b0b..0b512d3b0b 100644 --- a/xbmc/video/videosync/VideoSyncPi.cpp +++ b/xbmc/windowing/egl/VideoSyncPi.cpp diff --git a/xbmc/video/videosync/VideoSyncPi.h b/xbmc/windowing/egl/VideoSyncPi.h index c7c3d12c71..c7c3d12c71 100644 --- a/xbmc/video/videosync/VideoSyncPi.h +++ b/xbmc/windowing/egl/VideoSyncPi.h diff --git a/xbmc/windowing/osx/CMakeLists.txt b/xbmc/windowing/osx/CMakeLists.txt index a007c38df2..0191ddefb5 100644 --- a/xbmc/windowing/osx/CMakeLists.txt +++ b/xbmc/windowing/osx/CMakeLists.txt @@ -1,17 +1,21 @@ if(CORE_SYSTEM_NAME STREQUAL osx) set(SOURCES WinEventsOSX.mm WinSystemOSX.mm - WinSystemOSXGL.mm) + WinSystemOSXGL.mm + VideoSyncOsx.cpp) set(HEADERS WinEventsOSX.h WinSystemOSX.h - WinSystemOSXGL.h) + WinSystemOSXGL.h + VideoSyncOsx.h) endif() if(CORE_SYSTEM_NAME STREQUAL ios) set(SOURCES WinEventsIOS.mm - WinSystemIOS.mm) + WinSystemIOS.mm + VideoSyncIos.cpp) set(HEADERS WinEventsIOS.h - WinSystemIOS.h) + WinSystemIOS.h + VideoSyncIos.h) endif() core_add_library(windowing_osx) diff --git a/xbmc/video/videosync/VideoSyncIos.cpp b/xbmc/windowing/osx/VideoSyncIos.cpp index 026dd7ed91..ac23993dd8 100644 --- a/xbmc/video/videosync/VideoSyncIos.cpp +++ b/xbmc/windowing/osx/VideoSyncIos.cpp @@ -24,7 +24,7 @@ #include "utils/log.h" #include "VideoSyncIos.h" #include "utils/MathUtils.h" -#include "video/VideoReferenceClock.h" +#include "cores/VideoPlayer/VideoReferenceClock.h" #include "guilib/GraphicContext.h" #include "windowing/WindowingFactory.h" #include "utils/TimeUtils.h" diff --git a/xbmc/video/videosync/VideoSyncIos.h b/xbmc/windowing/osx/VideoSyncIos.h index bf336b80dd..6d129eb63d 100644 --- a/xbmc/video/videosync/VideoSyncIos.h +++ b/xbmc/windowing/osx/VideoSyncIos.h @@ -20,13 +20,13 @@ */ #if defined(TARGET_DARWIN_IOS) -#include "VideoSync.h" +#include "windowing/VideoSync.h" #include "guilib/DispResource.h" class CVideoSyncIos : public CVideoSync, IDispResource { public: - CVideoSyncIos(CVideoReferenceClock *clock) : CVideoSync(clock), m_LastVBlankTime(0), m_abort(false){} + CVideoSyncIos(void *clock) : CVideoSync(clock), m_LastVBlankTime(0), m_abort(false){} // CVideoSync interface virtual bool Setup(PUPDATECLOCK func) override; diff --git a/xbmc/video/videosync/VideoSyncOsx.cpp b/xbmc/windowing/osx/VideoSyncOsx.cpp index f6320c49b3..9ea7145b33 100644 --- a/xbmc/video/videosync/VideoSyncOsx.cpp +++ b/xbmc/windowing/osx/VideoSyncOsx.cpp @@ -20,11 +20,9 @@ #include "system.h" -#if defined(TARGET_DARWIN_OSX) #include "utils/log.h" #include "VideoSyncOsx.h" #include "utils/MathUtils.h" -#include "video/VideoReferenceClock.h" #include "guilib/GraphicContext.h" #include "utils/TimeUtils.h" #include "windowing/WindowingFactory.h" @@ -159,4 +157,3 @@ void CVideoSyncOsx::DeinitDisplayLink() Cocoa_CVDisplayLinkRelease(); } -#endif//TARGET_DARWIN_OSX diff --git a/xbmc/video/videosync/VideoSyncOsx.h b/xbmc/windowing/osx/VideoSyncOsx.h index 1a2eedcd7e..276c9085a5 100644 --- a/xbmc/video/videosync/VideoSyncOsx.h +++ b/xbmc/windowing/osx/VideoSyncOsx.h @@ -19,8 +19,7 @@ * */ -#if defined(TARGET_DARWIN_OSX) -#include "VideoSync.h" +#include "windowing/VideoSync.h" #include "guilib/DispResource.h" #include "threads/Event.h" @@ -28,7 +27,7 @@ class CVideoSyncOsx : public CVideoSync, IDispResource { public: - CVideoSyncOsx(CVideoReferenceClock *clock) : + CVideoSyncOsx(void *clock) : CVideoSync(clock), m_LastVBlankTime(0), m_displayLost(false), @@ -58,4 +57,3 @@ private: CEvent m_lostEvent; }; -#endif// TARGET_DARWIN_OSX diff --git a/xbmc/windowing/osx/WinSystemIOS.h b/xbmc/windowing/osx/WinSystemIOS.h index 7ecdf672a7..2ee5645b22 100644 --- a/xbmc/windowing/osx/WinSystemIOS.h +++ b/xbmc/windowing/osx/WinSystemIOS.h @@ -72,6 +72,8 @@ public: virtual int GetNumScreens(); virtual int GetCurrentScreen(); + virtual std::unique_ptr<CVideoSync> GetVideoSync(void *clock) override; + bool InitDisplayLink(CVideoSyncIos *syncImpl); void DeinitDisplayLink(void); void OnAppFocusChange(bool focus); diff --git a/xbmc/windowing/osx/WinSystemIOS.mm b/xbmc/windowing/osx/WinSystemIOS.mm index a2e74332a4..84f1770185 100644 --- a/xbmc/windowing/osx/WinSystemIOS.mm +++ b/xbmc/windowing/osx/WinSystemIOS.mm @@ -18,7 +18,6 @@ * */ -#if defined(TARGET_DARWIN_IOS) //hack around problem with xbmc's typedef int BOOL // and obj-c's typedef unsigned char BOOL #define BOOL XBMC_BOOL @@ -26,7 +25,8 @@ #undef BOOL #ifdef HAS_EGL -#define BOOL XBMC_BOOL +#define BOOL XBMC_BOOL +#include "VideoSyncIos.h" #include "WinSystemIOS.h" #include "utils/log.h" #include "filesystem/SpecialProtocol.h" @@ -37,7 +37,7 @@ #include "utils/StringUtils.h" #include "guilib/DispResource.h" #include "threads/SingleLock.h" -#include "video/videosync/VideoSyncIos.h" +#include "VideoSyncIos.h" #include <vector> #undef BOOL @@ -485,6 +485,11 @@ void* CWinSystemIOS::GetEAGLContextObj() return [g_xbmcController getEAGLContextObj]; } -#endif +std::unique_ptr<CVideoSync> CWinSystemIOS::GetVideoSync(void *clock) +{ + std::unique_ptr<CVideoSync> pVSync(new CVideoSyncIos(clock)); + return pVSync; +} #endif + diff --git a/xbmc/windowing/osx/WinSystemOSX.h b/xbmc/windowing/osx/WinSystemOSX.h index c46e27b41e..fe37b26b68 100644 --- a/xbmc/windowing/osx/WinSystemOSX.h +++ b/xbmc/windowing/osx/WinSystemOSX.h @@ -74,6 +74,8 @@ public: virtual int GetNumScreens(); virtual int GetCurrentScreen(); virtual double GetCurrentRefreshrate() { return m_refreshRate; } + + virtual std::unique_ptr<CVideoSync> GetVideoSync(void *clock) override; void WindowChangedScreen(); @@ -88,6 +90,7 @@ public: std::string GetClipboardText(void); + protected: void HandlePossibleRefreshrateChange(); void* CreateWindowedContext(void* shareCtx); diff --git a/xbmc/windowing/osx/WinSystemOSX.mm b/xbmc/windowing/osx/WinSystemOSX.mm index 752e8655a8..365bb0badb 100644 --- a/xbmc/windowing/osx/WinSystemOSX.mm +++ b/xbmc/windowing/osx/WinSystemOSX.mm @@ -18,13 +18,12 @@ * */ -#if defined(TARGET_DARWIN_OSX) - //hack around problem with xbmc's typedef int BOOL // and obj-c's typedef unsigned char BOOL #define BOOL XBMC_BOOL #include "WinSystemOSX.h" #include "WinEventsOSX.h" +#include "VideoSyncOsx.h" #include "Application.h" #include "ServiceBroker.h" #include "messaging/ApplicationMessenger.h" @@ -1798,4 +1797,8 @@ std::string CWinSystemOSX::GetClipboardText(void) return utf8_text; } -#endif +std::unique_ptr<CVideoSync> CWinSystemOSX::GetVideoSync(void *clock) +{ + std::unique_ptr<CVideoSync> pVSync(new CVideoSyncOsx(clock)); + return pVSync; +} diff --git a/xbmc/video/videosync/VideoSyncD3D.cpp b/xbmc/windowing/windows/VideoSyncD3D.cpp index e48b91e121..e48b91e121 100644 --- a/xbmc/video/videosync/VideoSyncD3D.cpp +++ b/xbmc/windowing/windows/VideoSyncD3D.cpp diff --git a/xbmc/video/videosync/VideoSyncD3D.h b/xbmc/windowing/windows/VideoSyncD3D.h index 486b6206f6..486b6206f6 100644 --- a/xbmc/video/videosync/VideoSyncD3D.h +++ b/xbmc/windowing/windows/VideoSyncD3D.h |