aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStreamNavigator.cpp43
-rw-r--r--xbmc/cores/VideoPlayer/DVDInputStreams/DllDvdNav.h16
2 files changed, 57 insertions, 2 deletions
diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStreamNavigator.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStreamNavigator.cpp
index 145fa79f88..95fa8c5e89 100644
--- a/xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStreamNavigator.cpp
+++ b/xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStreamNavigator.cpp
@@ -65,6 +65,7 @@ constexpr int DVD_AUDIO_LANG_EXT_DIRECTORSCOMMENTS2 = 4;
static int dvd_inputstreamnavigator_cb_seek(void * p_stream, uint64_t i_pos);
static int dvd_inputstreamnavigator_cb_read(void * p_stream, void * buffer, int i_read);
static int dvd_inputstreamnavigator_cb_readv(void * p_stream, void * p_iovec, int i_blocks);
+static void dvd_logger(void* priv, dvdnav_logger_level_t level, const char* fmt, va_list va);
CDVDInputStreamNavigator::CDVDInputStreamNavigator(IVideoPlayer* player, const CFileItem& fileitem)
: CDVDInputStream(DVDSTREAM_TYPE_DVD, fileitem), m_pstream(nullptr)
@@ -134,20 +135,34 @@ bool CDVDInputStreamNavigator::Open()
free(strDVDFile);
#endif
+#if DVDNAV_VERSION >= 60100
+ dvdnav_logger_cb loggerCallback;
+ loggerCallback.pf_log = dvd_logger;
+#endif
+
// open up the DVD device
if (m_item.IsDiscImage())
{
// if dvd image file (ISO or alike) open using libdvdnav stream callback functions
m_pstream.reset(new CDVDInputStreamFile(m_item, XFILE::READ_TRUNCATED | XFILE::READ_BITRATE | XFILE::READ_CHUNKED));
+#if DVDNAV_VERSION >= 60100
+ if (!m_pstream->Open() || m_dll.dvdnav_open_stream2(&m_dvdnav, m_pstream.get(), &loggerCallback,
+ &m_dvdnav_stream_cb) != DVDNAV_STATUS_OK)
+#else
if (!m_pstream->Open() || m_dll.dvdnav_open_stream(&m_dvdnav, m_pstream.get(), &m_dvdnav_stream_cb) != DVDNAV_STATUS_OK)
+#endif
{
CLog::Log(LOGERROR, "Error opening image file or Error on dvdnav_open_stream");
Close();
return false;
}
}
- else
- if (m_dll.dvdnav_open(&m_dvdnav, path.c_str()) != DVDNAV_STATUS_OK)
+#if DVDNAV_VERSION >= 60100
+ else if (m_dll.dvdnav_open2(&m_dvdnav, nullptr, &loggerCallback, path.c_str()) !=
+ DVDNAV_STATUS_OK)
+#else
+ else if (m_dll.dvdnav_open(&m_dvdnav, path.c_str()) != DVDNAV_STATUS_OK)
+#endif
{
CLog::Log(LOGERROR, "Error on dvdnav_open");
Close();
@@ -1482,6 +1497,30 @@ int dvd_inputstreamnavigator_cb_read(void * p_stream, void * buffer, int i_read)
return i_ret;
}
+void dvd_logger(void* priv, dvdnav_logger_level_t level, const char* fmt, va_list va)
+{
+ const std::string message = StringUtils::FormatV(fmt, va);
+ auto logLevel = LOGDEBUG;
+ switch (level)
+ {
+ case DVDNAV_LOGGER_LEVEL_INFO:
+ logLevel = LOGINFO;
+ break;
+ case DVDNAV_LOGGER_LEVEL_ERROR:
+ logLevel = LOGERROR;
+ break;
+ case DVDNAV_LOGGER_LEVEL_WARN:
+ logLevel = LOGWARNING;
+ break;
+ case DVDNAV_LOGGER_LEVEL_DEBUG:
+ logLevel = LOGDEBUG;
+ break;
+ default:
+ break;
+ };
+ CLog::Log(logLevel, "Libdvd: {}", message);
+}
+
int dvd_inputstreamnavigator_cb_readv(void * p_stream, void * p_iovec, int i_blocks)
{
// NOTE/TODO: this vectored read callback somehow doesn't seem to be called by libdvdnav.
diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/DllDvdNav.h b/xbmc/cores/VideoPlayer/DVDInputStreams/DllDvdNav.h
index 7979eb9290..498ba0aea3 100644
--- a/xbmc/cores/VideoPlayer/DVDInputStreams/DllDvdNav.h
+++ b/xbmc/cores/VideoPlayer/DVDInputStreams/DllDvdNav.h
@@ -35,7 +35,15 @@ class DllDvdNavInterface
public:
virtual ~DllDvdNavInterface() = default;
virtual dvdnav_status_t dvdnav_open(dvdnav_t **dest, const char *path)=0;
+ virtual dvdnav_status_t dvdnav_open2(dvdnav_t** dest,
+ void*,
+ const dvdnav_logger_cb*,
+ const char* path) = 0;
virtual dvdnav_status_t dvdnav_open_stream(dvdnav_t **dest, void *stream, dvdnav_stream_cb *stream_cb) = 0;
+ virtual dvdnav_status_t dvdnav_open_stream2(dvdnav_t** dest,
+ void* stream,
+ const dvdnav_logger_cb*,
+ dvdnav_stream_cb* stream_cb) = 0;
virtual dvdnav_status_t dvdnav_close(dvdnav_t *self)=0;
virtual dvdnav_status_t dvdnav_reset(dvdnav_t *self)=0;
virtual const char* dvdnav_err_to_string(dvdnav_t *self)=0;
@@ -116,7 +124,13 @@ class DllDvdNav : public DllDynamic, DllDvdNavInterface
DECLARE_DLL_WRAPPER(DllDvdNav, DLL_PATH_LIBDVDNAV)
DEFINE_METHOD2(dvdnav_status_t, dvdnav_open, (dvdnav_t **p1, const char *p2))
+ DEFINE_METHOD4(dvdnav_status_t,
+ dvdnav_open2,
+ (dvdnav_t * *p1, void* p2, const dvdnav_logger_cb* p3, const char* p4))
DEFINE_METHOD3(dvdnav_status_t, dvdnav_open_stream, (dvdnav_t **p1, void *p2, dvdnav_stream_cb *p3))
+ DEFINE_METHOD4(dvdnav_status_t,
+ dvdnav_open_stream2,
+ (dvdnav_t * *p1, void* p2, const dvdnav_logger_cb* p3, dvdnav_stream_cb* p4))
DEFINE_METHOD1(dvdnav_status_t, dvdnav_close, (dvdnav_t *p1))
DEFINE_METHOD1(dvdnav_status_t, dvdnav_reset, (dvdnav_t *p1))
DEFINE_METHOD1(const char*, dvdnav_err_to_string, (dvdnav_t *p1))
@@ -188,7 +202,9 @@ class DllDvdNav : public DllDynamic, DllDvdNavInterface
(dvdnav_t * p1, int32_t* p2, int32_t* p3, int32_t* p4))
BEGIN_METHOD_RESOLVE()
RESOLVE_METHOD(dvdnav_open)
+ RESOLVE_METHOD(dvdnav_open2)
RESOLVE_METHOD(dvdnav_open_stream)
+ RESOLVE_METHOD(dvdnav_open_stream2)
RESOLVE_METHOD(dvdnav_close)
RESOLVE_METHOD(dvdnav_reset)
RESOLVE_METHOD(dvdnav_err_to_string)