From e2f5d13ac472c338e77e5a0cb74c88f7063a7a7e Mon Sep 17 00:00:00 2001 From: Damien Fouilleul Date: Fri, 6 Jan 2006 12:31:19 +0000 Subject: [PATCH] dvdnav.patch: changed code that read DVD title to use dvdread APIs, so that WIN32 and non-unix platforms can also read it dvdnav.c: add DVD title to meta information --- extras/contrib/src/Patches/dvdnav.patch | 59 +++++++++++++++++++++++++ modules/access/dvdnav.c | 16 +++++++ 2 files changed, 75 insertions(+) diff --git a/extras/contrib/src/Patches/dvdnav.patch b/extras/contrib/src/Patches/dvdnav.patch index 0f3698f4ed..38037f381f 100644 --- a/extras/contrib/src/Patches/dvdnav.patch +++ b/extras/contrib/src/Patches/dvdnav.patch @@ -271,6 +271,65 @@ diff -ur libdvdnav/src/vm/vm.c libdvdnav.new/src/vm/vm.c #endif /* _MSC_VER */ /* +@@ -126,24 +130,25 @@ + } + #endif + ++#include ++ + static void dvd_read_name(char *name, const char *device) { + /* Because we are compiling with _FILE_OFFSET_BITS=64 + * all off_t are 64bit. + */ + off_t off; +- int fd, i; ++ dvd_input_t fd; int i; + uint8_t data[DVD_VIDEO_LB_LEN]; + + /* Read DVD name */ +- fd = open(device, O_RDONLY); ++ fd = dvdinput_open(device); + if (fd > 0) { +- 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 )) { ++ off = dvdinput_seek( fd, 16 ); ++ if( off == 16 ) { ++ off = dvdinput_read( fd, data, 1, DVDINPUT_NOFLAGS ); ++ if (off == 1 ) { + fprintf(MSG_OUT, "libdvdnav: DVD Title: "); +- for(i=25; i < 73; i++ ) { ++ for(i=40; i < 73; i++ ) { + if((data[i] == 0)) break; + if((data[i] > 32) && (data[i] < 127)) { + fprintf(MSG_OUT, "%c", data[i]); +@@ -151,10 +156,12 @@ + fprintf(MSG_OUT, " "); + } + } +- strncpy(name, &data[25], 48); +- name[48] = 0; ++ strncpy(name, &data[40], 32); ++ i=31; ++ while( (i >= 0) && (name[i] <= ' ')) --i; ++ name[i+1] = '\0'; + fprintf(MSG_OUT, "\nlibdvdnav: DVD Serial Number: "); +- for(i=73; i < 89; i++ ) { ++ for(i=813; i < 829; i++ ) { + if((data[i] == 0)) break; + if((data[i] > 32) && (data[i] < 127)) { + fprintf(MSG_OUT, "%c", data[i]); +@@ -178,7 +185,7 @@ + } else { + fprintf(MSG_OUT, "libdvdnav: Can't seek to block %u\n", 32 ); + } +- close(fd); ++ dvdinput_close(fd); + } else { + fprintf(MSG_OUT, "NAME OPEN FAILED\n"); + } --- libdvdnav/misc/dvdnav-config.in 2003-04-27 02:26:17.000000000 +0100 +++ libdvdnav.new/misc/dvdnav-config.in 2005-12-02 09:29:48.265625000 +0000 @@ -76,5 +76,5 @@ diff --git a/modules/access/dvdnav.c b/modules/access/dvdnav.c index a591c3342b..eea33efc5a 100644 --- a/modules/access/dvdnav.c +++ b/modules/access/dvdnav.c @@ -536,6 +536,22 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) *pi64 = (int64_t)var_GetInteger( p_demux, "dvdnav-caching" ) *1000; return VLC_SUCCESS; + case DEMUX_GET_META: + { + const char *title_name = NULL; + + dvdnav_get_title_string(p_sys->dvdnav, &title_name); + if( (NULL != title_name) && ('\0' != title_name[0]) ) + { + vlc_meta_t **pp_meta = (vlc_meta_t**)va_arg( args, vlc_meta_t** ); + vlc_meta_t *meta; + *pp_meta = meta = vlc_meta_New(); + vlc_meta_Add( meta, VLC_META_TITLE, title_name ); + return VLC_SUCCESS; + } + return VLC_EGENERIC; + } + /* TODO implement others */ default: return VLC_EGENERIC; -- 2.39.2