Search
j0ke.net Open Build Service
>
Projects
>
multimedia
:
SL11
>
libdvdread3
> libdvdread_udf.patch
Sign Up
|
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File libdvdread_udf.patch of Package libdvdread3
diff -ur libdvdread-0.9.7.orig/dvdread/dvd_input.c libdvdread-0.9.7/dvdread/dvd_input.c --- libdvdread-0.9.7.orig/dvdread/dvd_input.c 2005-09-19 15:43:08.000000000 +0200 +++ libdvdread-0.9.7/dvdread/dvd_input.c 2008-02-02 16:23:24.000000000 +0100 @@ -376,6 +376,9 @@ } #endif /* HAVE_DVDCSS_DVDCSS_H */ + + fprintf(stderr, "libdvdread patched to play DVDs with DVD-Movie-Protect\n"); + dvdcss_library_init = 1; if(dvdcss_library) { diff -ur libdvdread-0.9.7.orig/dvdread/dvd_udf.c libdvdread-0.9.7/dvdread/dvd_udf.c --- libdvdread-0.9.7.orig/dvdread/dvd_udf.c 2005-09-19 15:43:08.000000000 +0200 +++ libdvdread-0.9.7/dvdread/dvd_udf.c 2008-02-03 13:24:40.000000000 +0100 @@ -39,6 +39,9 @@ #include <sys/stat.h> #include <unistd.h> #include <errno.h> +#ifndef __WIN32__ +#include <fnmatch.h> +#endif #if defined(HAVE_INTTYPES_H) #include <inttypes.h> @@ -50,6 +53,9 @@ #include "dvd_udf.h" #include "dvdread_internal.h" +#include "ifo_types.h" +#include "ifo_read.h" + #ifndef EMEDIUMTYPE #define EMEDIUMTYPE ENOENT #endif @@ -965,6 +971,80 @@ uint32_t UDFFindFile( dvd_reader_t *device, char *filename, uint32_t *filesize ) { + uint32_t offset=0; + if( filesize == NULL || *filesize < 1 || *filesize > 1073741824) { + // only when filesize is invalid +#ifndef __WIN32__ + if (!fnmatch("/VIDEO_TS/VTS_[0-9][0-9]_[0-9].???", filename, FNM_PATHNAME)) { +#else + if (strlen("/VIDEO_TS/VTS_01_1.VOB") == strlen(filename) + && !strncmp(filename, "/VIDEO_TS/VTS_", strlen("/VIDEO_TS/VTS_")) ) { +#endif + size_t len = strlen(filename); + char *extension = &filename[len-3]; + if (!strcmp(extension, "IFO") || !strcmp(extension, "VOB")) { + int title = atoi(&filename[len-8]); + int part = atoi(&filename[len-5]); + + ifo_handle_t *ifo_handle = ifoOpen(device, 0); + if (0 == ifo_handle) + return 0; + + if (title > ifo_handle->tt_srpt->nr_of_srpts) { + ifoClose(ifo_handle); + return 0; + + } + + uint32_t tmp_filesize; + offset += UDFFindFile(device, "/VIDEO_TS/VIDEO_TS.IFO", &tmp_filesize); + + + int i; + for (i=0; i<ifo_handle->tt_srpt->nr_of_srpts; i++) + if (title == ifo_handle->tt_srpt->title[i].title_set_nr) + break; + + if (i == ifo_handle->tt_srpt->nr_of_srpts) { + /* not found */ + ifoClose(ifo_handle); + return 0; + } + offset += ifo_handle->tt_srpt->title[i].title_set_sector; + + ifoClose(ifo_handle); + + if (!strcmp(extension, "VOB")) { + ifo_handle = ifoOpen(device, title); + if (0 == ifo_handle) + return 0; + + switch(part) { + case 0: + if (0 == ifo_handle->vtsi_mat->vtsm_vobs) + return 0; + offset += ifo_handle->vtsi_mat->vtsm_vobs; + break; + case 1: + if (0 == ifo_handle->vtsi_mat->vtstt_vobs) + return 0; + offset += ifo_handle->vtsi_mat->vtstt_vobs; + break; + default: /* can't get other parts (also no need to) */ + offset = 0; + break; + } + + ifoClose(ifo_handle); + } + + } + + *filesize = 1000000; /* File size unknown */ + if (offset != 0) + return offset; + } + } uint8_t *LogBlock; uint32_t lbnum; uint16_t TagID;