aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVoyager1 <voyager@xbmc.org>2013-08-01 13:20:10 -0700
committerVoyager1 <voyager@xbmc.org>2013-08-01 13:20:10 -0700
commit8836adacbbad2260efba802edeb1074ab4257475 (patch)
tree9319af146a1fc5e899308531f44b86f7c0d2748a
parentf2757569ff24ba46e88639faad8a7f5830978510 (diff)
parentdfa455c7c4a69dbc02ff1a19aebbafb5b68a3ffe (diff)
Merge pull request #2966 from Voyager1/uniquedvdid-use-libdvdnav
Uniquedvdid use libdvdnav
-rw-r--r--lib/libdvd/libdvdnav/src/vm/vm.c4
-rw-r--r--lib/libdvd/patches/libdvdnav_reenable_serialstring.diff28
-rw-r--r--xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp18
-rw-r--r--xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.h4
-rw-r--r--xbmc/cores/dvdplayer/DVDInputStreams/DllDvdNav.h10
-rw-r--r--xbmc/storage/MediaManager.cpp119
-rw-r--r--xbmc/storage/MediaManager.h1
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;