diff options
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStreamNavigator.cpp | 43 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDInputStreams/DllDvdNav.h | 16 |
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) |