diff --git a/xbmc/cores/VideoPlayer/DVDMessage.h b/xbmc/cores/VideoPlayer/DVDMessage.h index 33271ffe3865b..907a34ba5b9f0 100644 --- a/xbmc/cores/VideoPlayer/DVDMessage.h +++ b/xbmc/cores/VideoPlayer/DVDMessage.h @@ -73,6 +73,7 @@ class CDVDMsg : public IDVDResourceCounted PLAYER_CHANNEL_SELECT_NUMBER, // switches to the channel with the provided channel number PLAYER_CHANNEL_SELECT, // switches to the provided channel PLAYER_STARTED, // sent whenever a sub player has finished it's first frame after open + PLAYER_AVCHANGE, // signal a change in audio or video parameters // demuxer related messages diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.cpp b/xbmc/cores/VideoPlayer/VideoPlayer.cpp index 650d952f62ab9..ea2ec18951bfc 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayer.cpp @@ -670,7 +670,7 @@ CVideoPlayer::CVideoPlayer(IPlayerCallback& callback) m_CurrentTeletext(STREAM_TELETEXT, VideoPlayer_TELETEXT), m_CurrentRadioRDS(STREAM_RADIO_RDS, VideoPlayer_RDS), m_messenger("player"), - m_renderManager(m_clock), + m_renderManager(m_clock, this), m_ready(true) { m_players_created = false; @@ -2886,6 +2886,12 @@ void CVideoPlayer::HandleMessages() if (((CDVDMsgGeneralSynchronize*)pMsg)->Wait(100, SYNCSOURCE_OWNER)) CLog::Log(LOGDEBUG, "CVideoPlayer - CDVDMsg::GENERAL_SYNCHRONIZE"); } + else if (pMsg->IsType(CDVDMsg::PLAYER_AVCHANGE)) + { + UpdateStreamInfos(); + g_dataCacheCore.SignalAudioInfoChange(); + g_dataCacheCore.SignalVideoInfoChange(); + } pMsg->Release(); } @@ -5035,6 +5041,11 @@ std::string CVideoPlayer::GetRenderVSyncState() return m_renderManager.GetVSyncState(); } +void CVideoPlayer::VideoParamsChange() +{ + m_messenger.Put(new CDVDMsg(CDVDMsg::PLAYER_AVCHANGE)); +} + // IDispResource interface void CVideoPlayer::OnLostDisplay() { diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.h b/xbmc/cores/VideoPlayer/VideoPlayer.h index 01b2bd812341c..33d8abf659395 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.h +++ b/xbmc/cores/VideoPlayer/VideoPlayer.h @@ -226,7 +226,7 @@ class CSelectionStreams void Update (CDVDInputStream* input, CDVDDemux* demuxer, std::string filename2 = ""); }; -class CVideoPlayer : public IPlayer, public CThread, public IVideoPlayer, public IDispResource +class CVideoPlayer : public IPlayer, public CThread, public IVideoPlayer, public IDispResource, public IRenderMsg { public: CVideoPlayer(IPlayerCallback& callback); @@ -302,7 +302,6 @@ class CVideoPlayer : public IPlayer, public CThread, public IVideoPlayer, public virtual int GetSourceBitrate(); virtual bool GetStreamDetails(CStreamDetails &details); virtual void GetAudioStreamInfo(int index, SPlayerAudioStreamInfo &info); - virtual void UpdateStreamInfos(); virtual std::string GetPlayerState(); virtual bool SetPlayerState(const std::string& state); @@ -361,6 +360,7 @@ class CVideoPlayer : public IPlayer, public CThread, public IVideoPlayer, public virtual void OnStartup(); virtual void OnExit(); virtual void Process(); + virtual void VideoParamsChange() override; void CreatePlayers(); void DestroyPlayers(); @@ -435,6 +435,7 @@ class CVideoPlayer : public IPlayer, public CThread, public IVideoPlayer, public void UpdateApplication(double timeout); void UpdatePlayState(double timeout); + void UpdateStreamInfos(); double m_UpdateApplication; diff --git a/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp b/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp index 825d822c88176..48c27ff3371de 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp @@ -28,7 +28,6 @@ #include "utils/MathUtils.h" #include "cores/AudioEngine/AEFactory.h" #include "cores/AudioEngine/Utils/AEUtil.h" -#include "cores/DataCacheCore.h" #ifdef TARGET_RASPBERRY_PI #include "linux/RBP.h" #endif @@ -162,7 +161,7 @@ void CVideoPlayerAudio::OpenStream(CDVDStreamInfo &hints, CDVDAudioCodec* codec) m_maxspeedadjust = 5.0; - g_dataCacheCore.SignalAudioInfoChange(); + m_messageParent.Put(new CDVDMsg(CDVDMsg::PLAYER_AVCHANGE)); m_syncState = IDVDStreamPlayer::SYNC_STARTING; } @@ -451,7 +450,7 @@ void CVideoPlayerAudio::Process() m_streaminfo.channels = audioframe.format.m_channelLayout.Count(); - g_dataCacheCore.SignalAudioInfoChange(); + m_messageParent.Put(new CDVDMsg(CDVDMsg::PLAYER_AVCHANGE)); } // Zero out the frame data if we are supposed to silence the audio diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp index 8bb27e474a28a..e28c625ea2919 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp @@ -33,7 +33,6 @@ #include "settings/MediaSettings.h" #include "settings/Settings.h" #include "guilib/GUIFontManager.h" -#include "cores/DataCacheCore.h" #if defined(HAS_GL) #include "LinuxRendererGL.h" @@ -117,7 +116,7 @@ static std::string GetRenderFormatName(ERenderFormat format) unsigned int CRenderManager::m_nextCaptureId = 0; -CRenderManager::CRenderManager(CDVDClock &clock) : m_dvdClock(clock) +CRenderManager::CRenderManager(CDVDClock &clock, IRenderMsg *player) : m_dvdClock(clock) { m_pRenderer = nullptr; m_renderState = STATE_UNCONFIGURED; @@ -137,6 +136,7 @@ CRenderManager::CRenderManager(CDVDClock &clock) : m_dvdClock(clock) m_format = RENDER_FMT_NONE; m_renderedOverlay = false; m_captureWaitCounter = 0; + m_playerPort = player; } CRenderManager::~CRenderManager() @@ -901,7 +901,7 @@ void CRenderManager::SetViewMode(int iViewMode) CSingleLock lock(m_statelock); if (m_pRenderer) m_pRenderer->SetViewMode(iViewMode); - g_dataCacheCore.SignalVideoInfoChange(); + m_playerPort->VideoParamsChange(); } void CRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0LL*/, double pts /* = 0 */, int source /*= -1*/, EFIELDSYNC sync /*= FS_NONE*/) @@ -1155,8 +1155,8 @@ void CRenderManager::UpdateResolution() UpdateDisplayLatency(); } m_bTriggerUpdateResolution = false; + m_playerPort->VideoParamsChange(); } - g_dataCacheCore.SignalVideoInfoChange(); } } diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h index 2a2375eea8b76..b982c6c5ccf20 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h @@ -49,11 +49,19 @@ class CMMALRenderer; class CLinuxRenderer; class CLinuxRendererGL; class CLinuxRendererGLES; +class CRenderManager; + +class IRenderMsg +{ + friend CRenderManager; +protected: + virtual void VideoParamsChange() = 0; +}; class CRenderManager { public: - CRenderManager(CDVDClock &clock); + CRenderManager(CDVDClock &clock, IRenderMsg *player); ~CRenderManager(); // Functions called from render thread @@ -239,6 +247,7 @@ class CRenderManager CEvent m_flushEvent; double m_clock_framefinish; CDVDClock &m_dvdClock; + IRenderMsg *m_playerPort; void RenderCapture(CRenderCapture* capture); void RemoveCaptures();