aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xbmc/cores/dvdplayer/DVDMessageQueue.cpp44
-rw-r--r--xbmc/cores/dvdplayer/DVDMessageQueue.h6
-rw-r--r--xbmc/cores/dvdplayer/DVDPlayerAudio.cpp4
-rw-r--r--xbmc/cores/dvdplayer/DVDPlayerVideo.cpp3
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;