diff options
author | Voyager1 <voyager@xbmc.org> | 2013-08-01 13:20:10 -0700 |
---|---|---|
committer | Voyager1 <voyager@xbmc.org> | 2013-08-01 13:20:10 -0700 |
commit | 8836adacbbad2260efba802edeb1074ab4257475 (patch) | |
tree | 9319af146a1fc5e899308531f44b86f7c0d2748a | |
parent | f2757569ff24ba46e88639faad8a7f5830978510 (diff) | |
parent | dfa455c7c4a69dbc02ff1a19aebbafb5b68a3ffe (diff) |
Merge pull request #2966 from Voyager1/uniquedvdid-use-libdvdnav
Uniquedvdid use libdvdnav
-rw-r--r-- | lib/libdvd/libdvdnav/src/vm/vm.c | 4 | ||||
-rw-r--r-- | lib/libdvd/patches/libdvdnav_reenable_serialstring.diff | 28 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp | 18 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h | 4 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDInputStreams/DllDvdNav.h | 10 | ||||
-rw-r--r-- | xbmc/storage/MediaManager.cpp | 119 | ||||
-rw-r--r-- | xbmc/storage/MediaManager.h | 1 |
7 files changed, 94 insertions, 90 deletions
diff --git a/lib/libdvd/libdvdnav/src/vm/vm.c b/lib/libdvd/libdvdnav/src/vm/vm.c index aea50f397c..a14e6750af 100644 --- a/lib/libdvd/libdvdnav/src/vm/vm.c +++ b/lib/libdvd/libdvdnav/src/vm/vm.c @@ -176,7 +176,6 @@ static void dvd_read_name(char *name, char *serial, const char *device) { off = lseek( fd, 32 * (off_t) DVD_VIDEO_LB_LEN, SEEK_SET ); if( off == ( 32 * (off_t) DVD_VIDEO_LB_LEN ) ) { off = read( fd, data, DVD_VIDEO_LB_LEN ); - close(fd); if (off == ( (off_t) DVD_VIDEO_LB_LEN )) { fprintf(MSG_OUT, "libdvdnav: DVD Title: "); for(i=25; i < 73; i++ ) { @@ -399,14 +398,13 @@ int vm_reset(vm_t *vm, const char *dvdroot) { /* return 0; Not really used for now.. */ } /* ifoRead_TXTDT_MGI(vmgi); Not implemented yet */ + dvd_read_name(vm->dvd_name, vm->dvd_serial, dvdroot); #ifdef _XBMC if(DVDUDFVolumeInfo(vm->dvd, vm->dvd_name, sizeof(vm->dvd_name), NULL, 0)) if(DVDISOVolumeInfo(vm->dvd, vm->dvd_name, sizeof(vm->dvd_name), NULL, 0)) strcpy(vm->dvd_name, ""); fprintf(MSG_OUT, "libdvdnav: vm: DVD Title: %s\n", vm->dvd_name); -#else - dvd_read_name(vm->dvd_name, vm->dvd_serial, dvdroot); #endif vm->map = remap_loadmap(vm->dvd_name); } diff --git a/lib/libdvd/patches/libdvdnav_reenable_serialstring.diff b/lib/libdvd/patches/libdvdnav_reenable_serialstring.diff new file mode 100644 index 0000000000..80b2fd912f --- /dev/null +++ b/lib/libdvd/patches/libdvdnav_reenable_serialstring.diff @@ -0,0 +1,28 @@ +diff --git a/libdvdnav/src/vm/vm.c b/libdvdnav/src/vm/vm.c +index aea50f3..a14e675 100644 +--- a/libdvdnav/src/vm/vm.c ++++ b/libdvdnav/src/vm/vm.c +@@ -176,7 +176,6 @@ static void dvd_read_name(char *name, char *serial, const char *device) { + off = lseek( fd, 32 * (off_t) DVD_VIDEO_LB_LEN, SEEK_SET ); + if( off == ( 32 * (off_t) DVD_VIDEO_LB_LEN ) ) { + off = read( fd, data, DVD_VIDEO_LB_LEN ); +- close(fd); + if (off == ( (off_t) DVD_VIDEO_LB_LEN )) { + fprintf(MSG_OUT, "libdvdnav: DVD Title: "); + for(i=25; i < 73; i++ ) { +@@ -399,14 +398,13 @@ int vm_reset(vm_t *vm, const char *dvdroot) { + /* return 0; Not really used for now.. */ + } + /* ifoRead_TXTDT_MGI(vmgi); Not implemented yet */ ++ dvd_read_name(vm->dvd_name, vm->dvd_serial, dvdroot); + #ifdef _XBMC + if(DVDUDFVolumeInfo(vm->dvd, vm->dvd_name, sizeof(vm->dvd_name), NULL, 0)) + if(DVDISOVolumeInfo(vm->dvd, vm->dvd_name, sizeof(vm->dvd_name), NULL, 0)) + strcpy(vm->dvd_name, ""); + + fprintf(MSG_OUT, "libdvdnav: vm: DVD Title: %s\n", vm->dvd_name); +-#else +- dvd_read_name(vm->dvd_name, vm->dvd_serial, dvdroot); + #endif + vm->map = remap_loadmap(vm->dvd_name); + } diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp index b22c565f80..1b78a09c0a 100644 --- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp +++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp @@ -1412,3 +1412,21 @@ int CDVDInputStreamNavigator::ConvertSubtitleStreamId_ExternalToXBMC(int id) return 0; } } + +bool CDVDInputStreamNavigator::GetDVDTitleString(std::string& titleStr) +{ + if (!m_dvdnav) return false; + const char* str = NULL; + m_dll.dvdnav_get_title_string(m_dvdnav, &str); + titleStr.assign(str); + return true; +} + +bool CDVDInputStreamNavigator::GetDVDSerialString(std::string& serialStr) +{ + if (!m_dvdnav) return false; + const char* str = NULL; + m_dll.dvdnav_get_serial_string(m_dvdnav, &str); + serialStr.assign(str); + return true; +} diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h index 1813a37aaf..7e447dbcf5 100644 --- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h +++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h @@ -137,6 +137,10 @@ public: bool SeekTime(int iTimeInMsec); //seek within current pg(c) double GetTimeStampCorrection() { return (double)(m_iVobUnitCorrection * 1000) / 90; } + + bool GetDVDTitleString(std::string& titleStr); + bool GetDVDSerialString(std::string& serialStr); + protected: int ProcessBlock(uint8_t* buffer, int* read); diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DllDvdNav.h b/xbmc/cores/dvdplayer/DVDInputStreams/DllDvdNav.h index 899306f304..1998967518 100644 --- a/xbmc/cores/dvdplayer/DVDInputStreams/DllDvdNav.h +++ b/xbmc/cores/dvdplayer/DVDInputStreams/DllDvdNav.h @@ -108,6 +108,8 @@ public: virtual dvdnav_status_t dvdnav_get_angle_info(dvdnav_t *self, int32_t *current_angle,int32_t *number_of_angles)=0; virtual dvdnav_status_t dvdnav_mouse_activate(dvdnav_t *self, pci_t *pci, int32_t x, int32_t y)=0; virtual dvdnav_status_t dvdnav_mouse_select(dvdnav_t *self, pci_t *pci, int32_t x, int32_t y)=0; + virtual dvdnav_status_t dvdnav_get_title_string(dvdnav_t *self, const char **title_str)=0; + virtual dvdnav_status_t dvdnav_get_serial_string(dvdnav_t *self, const char **serial_str)=0; }; #if (defined USE_STATIC_LIBDVDNAV) @@ -237,6 +239,10 @@ public: { return ::dvdnav_mouse_activate(self, pci, x, y); } virtual dvdnav_status_t dvdnav_mouse_select(dvdnav_t *self, pci_t *pci, int32_t x, int32_t y) { return ::dvdnav_mouse_select(self, pci, x, y); } + virtual dvdnav_status_t dvdnav_get_title_string(dvdnav_t *self, const char **title_str) + { return ::dvdnav_get_title_string(self, title_str); } + virtual dvdnav_status_t dvdnav_get_serial_string(dvdnav_t *self, const char **serial_str) + { return ::dvdnav_get_serial_string(self, serial_str); } // DLL faking. virtual bool ResolveExports() { return true; } @@ -311,6 +317,8 @@ class DllDvdNav : public DllDynamic, DllDvdNavInterface DEFINE_METHOD3(dvdnav_status_t, dvdnav_get_angle_info, (dvdnav_t *p1, int32_t *p2,int32_t *p3)) DEFINE_METHOD4(dvdnav_status_t, dvdnav_mouse_activate, (dvdnav_t *p1, pci_t *p2, int32_t p3, int32_t p4)) DEFINE_METHOD4(dvdnav_status_t, dvdnav_mouse_select, (dvdnav_t *p1, pci_t *p2, int32_t p3, int32_t p4)) + DEFINE_METHOD2(dvdnav_status_t, dvdnav_get_title_string, (dvdnav_t *p1, const char **p2)) + DEFINE_METHOD2(dvdnav_status_t, dvdnav_get_serial_string, (dvdnav_t *p1, const char **p2)) BEGIN_METHOD_RESOLVE() RESOLVE_METHOD(dvdnav_open) RESOLVE_METHOD(dvdnav_close) @@ -373,6 +381,8 @@ class DllDvdNav : public DllDynamic, DllDvdNavInterface RESOLVE_METHOD(dvdnav_get_angle_info) RESOLVE_METHOD(dvdnav_mouse_activate) RESOLVE_METHOD(dvdnav_mouse_select) + RESOLVE_METHOD(dvdnav_get_title_string) + RESOLVE_METHOD(dvdnav_get_serial_string) END_METHOD_RESOLVE() }; diff --git a/xbmc/storage/MediaManager.cpp b/xbmc/storage/MediaManager.cpp index bb4c1141dc..b022a3ae9a 100644 --- a/xbmc/storage/MediaManager.cpp +++ b/xbmc/storage/MediaManager.cpp @@ -50,7 +50,8 @@ #include "filesystem/File.h" #include "filesystem/DirectoryFactory.h" #include "filesystem/Directory.h" -#include "utils/Crc32.h" + +#include "cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h" #if defined(TARGET_DARWIN) #include "osx/DarwinStorageProvider.h" @@ -496,109 +497,55 @@ CStdString CMediaManager::GetDiskLabel(const CStdString& devicePath) CStdString CMediaManager::GetDiskUniqueId(const CStdString& devicePath) { - CStdString strDevice = devicePath; - - if (strDevice.IsEmpty()) // if no value passed, use the current default disc path. - strDevice = GetDiscPath(); // in case of non-Windows we must obtain the disc path + CStdString mediaPath; -#ifdef TARGET_WINDOWS - if (!m_bhasoptical) + CCdInfo* pInfo = g_mediaManager.GetCdInfo(devicePath); + if (pInfo == NULL) return ""; - strDevice = TranslateDevicePath(strDevice); - URIUtils::AddSlashAtEnd(strDevice); -#endif - CStdString strDrive = g_mediaManager.TranslateDevicePath(strDevice); + if (mediaPath.IsEmpty() && pInfo->IsAudio(1)) + mediaPath = "cdda://local/"; -#ifndef TARGET_WINDOWS + if (mediaPath.IsEmpty() && (pInfo->IsISOUDF(1) || pInfo->IsISOHFS(1) || pInfo->IsIso9660(1) || pInfo->IsIso9660Interactive(1))) + mediaPath = "iso9660://"; + + if (mediaPath.IsEmpty()) + mediaPath = devicePath; + +#ifdef TARGET_WINDOWS + if (mediaPath.IsEmpty() || mediaPath.CompareNoCase("iso9660://") == 0) { - CSingleLock waitLock(m_muAutoSource); - CCdInfo* pInfo = g_mediaManager.GetCdInfo(); - if ( pInfo ) - { - if (pInfo->IsISOUDF(1) || pInfo->IsISOHFS(1) || pInfo->IsIso9660(1) || pInfo->IsIso9660Interactive(1)) - strDrive = "iso9660://"; - else - strDrive = "D:\\"; - } - else - { - CLog::Log(LOGERROR, "GetDiskUniqueId: Failed getting CD info"); - return ""; - } + mediaPath = g_mediaManager.TranslateDevicePath(""); + URIUtils::AddSlashAtEnd(mediaPath); } #endif - CStdString pathVideoTS = URIUtils::AddFileToFolder(strDrive, "VIDEO_TS"); - if(! CDirectory::Exists(pathVideoTS) ) + // Try finding VIDEO_TS/VIDEO_TS.IFO - this indicates a DVD disc is inserted + CStdString pathVideoTS = URIUtils::AddFileToFolder(mediaPath, "VIDEO_TS"); + if(!CFile::Exists(URIUtils::AddFileToFolder(pathVideoTS, "VIDEO_TS.IFO"))) return ""; // return empty + // correct the filename if needed + if (pathVideoTS.Left(6).CompareNoCase("dvd://") == 0 || pathVideoTS.Left(10).CompareNoCase("iso9660://") == 0) + pathVideoTS = g_mediaManager.TranslateDevicePath(""); + CLog::Log(LOGDEBUG, "GetDiskUniqueId: Trying to retrieve ID for path %s", pathVideoTS.c_str()); uint32_t dvdcrc = 0; CStdString strID; - if (HashDVD(pathVideoTS, dvdcrc)) - { - strID.Format("removable://%s_%08x", GetDiskLabel(devicePath), dvdcrc); - CLog::Log(LOGDEBUG, "GetDiskUniqueId: Got ID %s for DVD disk", strID.c_str()); - } - - return strID; -} - -bool CMediaManager::HashDVD(const CStdString& dvdpath, uint32_t& crc) -{ - CFileItemList vecItemsTS; - bool success = false; + CDVDInputStreamNavigator dvdNavigator(NULL); + dvdNavigator.Open(pathVideoTS, ""); + CStdString labelString; + dvdNavigator.GetDVDTitleString(labelString); + CStdString serialString; + dvdNavigator.GetDVDSerialString(serialString); - // first try to open the VIDEO_TS folder of the DVD - if (!CDirectory::GetDirectory( dvdpath, vecItemsTS, ".ifo" )) - { - CLog::Log(LOGERROR, "%s - Cannot open dvd VIDEO_TS folder -- ABORTING", __FUNCTION__); - return false; - } + strID.Format("removable://%s_%s", labelString.c_str(), serialString.c_str()); + CLog::Log(LOGDEBUG, "GetDiskUniqueId: Got ID %s for DVD disk", strID.c_str()); - Crc32 crc32; - bool dataRead = false; - - vecItemsTS.Sort(SORT_METHOD_FILE, SortOrderAscending); - for (int i = 0; i < vecItemsTS.Size(); i++) - { - CFileItemPtr videoTSItem = vecItemsTS[i]; - success = true; - - // get the file name for logging purposes - CStdString fileName = URIUtils::GetFileName(videoTSItem->GetPath()); - CLog::Log(LOGDEBUG, "%s - Adding file content for dvd file: %s", __FUNCTION__, fileName.c_str()); - CFile file; - if(!file.Open(videoTSItem->GetPath())) - { - CLog::Log(LOGERROR, "%s - Cannot open dvd file: %s -- ABORTING", __FUNCTION__, fileName.c_str()); - return false; - } - int res; - char buf[2048]; - while( (res = file.Read(buf, sizeof(buf))) > 0) - { - dataRead = true; - crc32.Compute(buf, res); - } - file.Close(); - } - - if (!dataRead) - { - CLog::Log(LOGERROR, "%s - Did not read any data from the IFO files -- ABORTING", __FUNCTION__); - return false; - } - - // put result back in reference parameter - crc = (uint32_t) crc32; - - return success; + return strID; } - CStdString CMediaManager::GetDiscPath() { #ifdef TARGET_WINDOWS diff --git a/xbmc/storage/MediaManager.h b/xbmc/storage/MediaManager.h index 18ca46a022..ddab4d1980 100644 --- a/xbmc/storage/MediaManager.h +++ b/xbmc/storage/MediaManager.h @@ -104,7 +104,6 @@ protected: CCriticalSection m_muAutoSource, m_CritSecStorageProvider; #ifdef HAS_DVD_DRIVE std::map<CStdString,CCdInfo*> m_mapCdInfo; - bool HashDVD(const CStdString& dvdpath, uint32_t& crc); #endif bool m_bhasoptical; CStdString m_strFirstAvailDrive; |