diff options
-rw-r--r-- | xbmc/cores/dvdplayer/DVDMessageQueue.cpp | 44 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDMessageQueue.h | 6 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDPlayerAudio.cpp | 4 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 3 |
4 files changed, 50 insertions, 7 deletions
diff --git a/xbmc/cores/dvdplayer/DVDMessageQueue.cpp b/xbmc/cores/dvdplayer/DVDMessageQueue.cpp index 79f0f4b689..22f30f0feb 100644 --- a/xbmc/cores/dvdplayer/DVDMessageQueue.cpp +++ b/xbmc/cores/dvdplayer/DVDMessageQueue.cpp @@ -23,6 +23,8 @@ #include "DVDDemuxers/DVDDemuxUtils.h" #include "utils/log.h" #include "SingleLock.h" +#include "DVDClock.h" +#include "MathUtils.h" using namespace std; @@ -35,6 +37,9 @@ CDVDMessageQueue::CDVDMessageQueue(const string &owner) m_bCaching = false; m_bEmptied = true; + m_TimeBack = DVD_NOPTS_VALUE; + m_TimeFront = DVD_NOPTS_VALUE; + m_TimeSize = 1.0 / 4.0; /* 4 seconds */ m_hEvent = CreateEvent(NULL, true, false, NULL); } @@ -52,6 +57,8 @@ void CDVDMessageQueue::Init() m_bAbortRequest = false; m_bEmptied = true; m_bInitialized = true; + m_TimeBack = DVD_NOPTS_VALUE; + m_TimeFront = DVD_NOPTS_VALUE; } void CDVDMessageQueue::Flush(CDVDMsg::Message type) @@ -72,6 +79,8 @@ void CDVDMessageQueue::Flush(CDVDMsg::Message type) if (type == CDVDMsg::DEMUXER_PACKET || type == CDVDMsg::NONE) { m_iDataSize = 0; + m_TimeBack = DVD_NOPTS_VALUE; + m_TimeFront = DVD_NOPTS_VALUE; m_bEmptied = true; } } @@ -129,8 +138,15 @@ MsgQueueReturnCode CDVDMessageQueue::Put(CDVDMsg* pMsg, int priority) if (pMsg->IsType(CDVDMsg::DEMUXER_PACKET)) { - CDVDMsgDemuxerPacket* pMsgDemuxerPacket = (CDVDMsgDemuxerPacket*)pMsg; - m_iDataSize += pMsgDemuxerPacket->GetPacketSize(); + DemuxPacket* packet = ((CDVDMsgDemuxerPacket*)item.pMsg)->GetPacket(); + if(packet) + { + m_iDataSize += packet->iSize; + if (packet->dts != DVD_NOPTS_VALUE) + m_TimeFront = packet->dts; + else if(packet->pts != DVD_NOPTS_VALUE) + m_TimeFront = packet->pts; + } } SetEvent(m_hEvent); // inform waiter for new packet @@ -160,8 +176,16 @@ MsgQueueReturnCode CDVDMessageQueue::Get(CDVDMsg** pMsg, unsigned int iTimeoutIn if (item.pMsg->IsType(CDVDMsg::DEMUXER_PACKET)) { - CDVDMsgDemuxerPacket* pMsgDemuxerPacket = (CDVDMsgDemuxerPacket*)item.pMsg; - m_iDataSize -= pMsgDemuxerPacket->GetPacketSize(); + DemuxPacket* packet = ((CDVDMsgDemuxerPacket*)item.pMsg)->GetPacket(); + if(packet) + { + m_iDataSize -= packet->iSize; + if (packet->dts != DVD_NOPTS_VALUE) + m_TimeBack = packet->dts; + else if(packet->pts != DVD_NOPTS_VALUE) + m_TimeBack = packet->pts; + } + if(m_iDataSize == 0) { if(!m_bEmptied && m_owner != "teletext") // Prevent log flooding @@ -230,5 +254,15 @@ void CDVDMessageQueue::WaitUntilEmpty() int CDVDMessageQueue::GetLevel() const { - return std::min(100, 100 * m_iDataSize / m_iMaxDataSize); + if(m_iDataSize > m_iMaxDataSize) + return 100; + if(m_iDataSize == 0) + return 0; + + if(m_TimeBack == DVD_NOPTS_VALUE + || m_TimeFront == DVD_NOPTS_VALUE + || m_TimeFront <= m_TimeBack) + return min(100, 100 * m_iDataSize / m_iMaxDataSize); + + return min(100, MathUtils::round_int(100.0 * m_TimeSize * (m_TimeFront - m_TimeBack) / DVD_TIME_BASE )); }
\ No newline at end of file diff --git a/xbmc/cores/dvdplayer/DVDMessageQueue.h b/xbmc/cores/dvdplayer/DVDMessageQueue.h index 7802c3c76e..87313ba4c1 100644 --- a/xbmc/cores/dvdplayer/DVDMessageQueue.h +++ b/xbmc/cores/dvdplayer/DVDMessageQueue.h @@ -75,8 +75,10 @@ public: int GetLevel() const; void SetMaxDataSize(int iMaxDataSize) { m_iMaxDataSize = iMaxDataSize; } + void SetMaxTimeSize(double sec) { m_TimeSize = 0.5 / std::max(1.0, sec); } int GetMaxDataSize() const { return m_iMaxDataSize; } bool IsInited() const { return m_bInitialized; } + private: HANDLE m_hEvent; @@ -87,6 +89,10 @@ private: bool m_bCaching; int m_iDataSize; + double m_TimeFront; + double m_TimeBack; + double m_TimeSize; + int m_iMaxDataSize; bool m_bEmptied; std::string m_owner; diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp index b156b3cfb8..abb4b4b0d2 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp @@ -141,7 +141,8 @@ CDVDPlayerAudio::CDVDPlayerAudio(CDVDClock* pClock) m_freq = CurrentHostFrequency(); InitializeCriticalSection(&m_critCodecSection); - m_messageQueue.SetMaxDataSize(30 * 16 * 1024); + m_messageQueue.SetMaxDataSize(1024 * 1024); + m_messageQueue.SetMaxTimeSize(4.0); g_dvdPerformanceCounter.EnableAudioQueue(&m_messageQueue); } @@ -527,6 +528,7 @@ void CDVDPlayerAudio::Process() m_dvdAudio.Destroy(); if(!m_dvdAudio.Create(audioframe, m_streaminfo.codec)) CLog::Log(LOGERROR, "%s - failed to create audio renderer", __FUNCTION__); + m_messageQueue.SetMaxTimeSize(4.0 - m_dvdAudio.GetCacheTotal()); } if( result & DECODE_FLAG_DROP ) diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp index ef92856983..528f0c3b34 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -123,7 +123,8 @@ CDVDPlayerVideo::CDVDPlayerVideo( CDVDClock* pClock m_fForcedAspectRatio = 0; m_iNrOfPicturesNotToSkip = 0; InitializeCriticalSection(&m_critCodecSection); - m_messageQueue.SetMaxDataSize(40 * 256 * 1024); + m_messageQueue.SetMaxDataSize(8 * 1024 * 1024); + m_messageQueue.SetMaxTimeSize(4.0); g_dvdPerformanceCounter.EnableVideoQueue(&m_messageQueue); m_iCurrentPts = DVD_NOPTS_VALUE; |