xbmc: add PR4296

Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
Stephan Raue 2014-03-05 00:34:58 +01:00
parent 4219b7eee9
commit b7ef576973

View File

@ -0,0 +1,100 @@
From ee4270426da6800d5ac21c50c1c7aaa94eec60c7 Mon Sep 17 00:00:00 2001
From: Voyager1 <voyager@xbmc.org>
Date: Fri, 28 Feb 2014 21:10:26 +0100
Subject: [PATCH 1/2] [DVDInputStreamNavigator] allow fallback to root menu
call if title menu call fails (like VLC)
---
xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp
index de4f3d3..2b7de16 100644
--- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp
+++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp
@@ -187,8 +187,14 @@ bool CDVDInputStreamNavigator::Open(const char* strFile, const std::string& cont
m_dll.dvdnav_get_next_cache_block(m_dvdnav,&buf_ptr,&event,&len);
m_dll.dvdnav_sector_search(m_dvdnav, 0, SEEK_SET);
+ // first try title menu
if(m_dll.dvdnav_menu_call(m_dvdnav, DVD_MENU_Title) != DVDNAV_STATUS_OK)
+ {
CLog::Log(LOGERROR,"Error on dvdnav_menu_call(Title): %s\n", m_dll.dvdnav_err_to_string(m_dvdnav));
+ // next try root menu
+ if(m_dll.dvdnav_menu_call(m_dvdnav, DVD_MENU_Root) != DVDNAV_STATUS_OK )
+ CLog::Log(LOGERROR,"Error on dvdnav_menu_call(Root): %s\n", m_dll.dvdnav_err_to_string(m_dvdnav));
+ }
}
m_bEOF = false;
--
1.8.5.5
From 65d19589e577df91bdf922081bb373dc7b517074 Mon Sep 17 00:00:00 2001
From: Voyager1 <voyager@xbmc.org>
Date: Fri, 28 Feb 2014 21:11:31 +0100
Subject: [PATCH 2/2] [DVDInputStreamNavigator] allow to return from "endless"
loop of NOPs
---
.../dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp | 12 ++++++++++++
xbmc/cores/dvdplayer/DVDPlayer.cpp | 1 +
xbmc/cores/omxplayer/OMXPlayer.cpp | 1 +
3 files changed, 14 insertions(+)
diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp
index 2b7de16..015a2ae 100644
--- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp
+++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp
@@ -239,11 +239,23 @@ int CDVDInputStreamNavigator::Read(uint8_t* buf, int buf_size)
int iBytesRead;
+ int NOPcount = 0;
while(true) {
int navresult = ProcessBlock(buf, &iBytesRead);
if (navresult == NAVRESULT_HOLD) return 0; // return 0 bytes read;
else if (navresult == NAVRESULT_ERROR) return -1;
else if (navresult == NAVRESULT_DATA) return iBytesRead;
+ else if (navresult == NAVRESULT_NOP)
+ {
+ NOPcount++;
+ if (NOPcount == 1000)
+ {
+ m_bEOF = true;
+ CLog::Log(LOGERROR,"CDVDInputStreamNavigator: Stopping playback due to infinite loop, caused by badly authored DVD navigation structure. Try enabling 'Attempt to skip introduction before DVD menu'.");
+ m_pDVDPlayer->OnDVDNavResult(NULL, DVDNAV_STOP);
+ return -1; // fail and stop playback.
+ }
+ }
}
return iBytesRead;
diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp
index b056c8b..51dca5b 100644
--- a/xbmc/cores/dvdplayer/DVDPlayer.cpp
+++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp
@@ -3560,6 +3560,7 @@ int CDVDPlayer::OnDVDNavResult(void* pData, int iMessage)
{
CLog::Log(LOGDEBUG, "DVDNAV_STOP");
m_dvd.state = DVDSTATE_NORMAL;
+ CGUIDialogKaiToast::QueueNotification(g_localizeStrings.Get(16026), g_localizeStrings.Get(16029));
}
break;
default:
diff --git a/xbmc/cores/omxplayer/OMXPlayer.cpp b/xbmc/cores/omxplayer/OMXPlayer.cpp
index a3d3928..9799a10 100644
--- a/xbmc/cores/omxplayer/OMXPlayer.cpp
+++ b/xbmc/cores/omxplayer/OMXPlayer.cpp
@@ -3831,6 +3831,7 @@ int COMXPlayer::OnDVDNavResult(void* pData, int iMessage)
{
CLog::Log(LOGDEBUG, "DVDNAV_STOP");
m_dvd.state = DVDSTATE_NORMAL;
+ CGUIDialogKaiToast::QueueNotification(g_localizeStrings.Get(16026), g_localizeStrings.Get(16029));
}
break;
default:
--
1.8.5.5