X-Git-Url: https://git.pterodactylus.net/?p=overlay.git;a=blobdiff_plain;f=media-libs%2Flibdvdread%2Ffiles%2Flibdvdread-4.1.3-media-protect.patch;fp=media-libs%2Flibdvdread%2Ffiles%2Flibdvdread-4.1.3-media-protect.patch;h=4132c1425b7d1275cc064079ad775c5022a06a9d;hp=0000000000000000000000000000000000000000;hb=986d1706ac9bec09d2a959d020bce11542a00b03;hpb=2257da61af1af5662845a990ecef8026ee0455e3 diff --git a/media-libs/libdvdread/files/libdvdread-4.1.3-media-protect.patch b/media-libs/libdvdread/files/libdvdread-4.1.3-media-protect.patch new file mode 100644 index 0000000..4132c14 --- /dev/null +++ b/media-libs/libdvdread/files/libdvdread-4.1.3-media-protect.patch @@ -0,0 +1,125 @@ +diff -Nur libdvdread-4.1.3_p1168-orig/src/dvd_input.c libdvdread-4.1.3_p1168/src/dvd_input.c +--- libdvdread-4.1.3_p1168-orig/src/dvd_input.c 2009-03-09 18:41:50.000000000 +0100 ++++ libdvdread-4.1.3_p1168/src/dvd_input.c 2010-08-16 01:52:24.000000000 +0200 +@@ -332,6 +332,8 @@ + } + #endif /* HAVE_DVDCSS_DVDCSS_H */ + ++ fprintf(stderr, "libdvdread patched to play DVDs with DVD-Movie-Protect\n"); ++ + if(dvdcss_library != NULL) { + /* + char *psz_method = getenv( "DVDCSS_METHOD" ); +diff -Nur libdvdread-4.1.3_p1168-orig/src/dvd_udf.c libdvdread-4.1.3_p1168/src/dvd_udf.c +--- libdvdread-4.1.3_p1168-orig/src/dvd_udf.c 2009-03-09 18:41:50.000000000 +0100 ++++ libdvdread-4.1.3_p1168/src/dvd_udf.c 2010-08-16 01:53:03.000000000 +0200 +@@ -38,10 +38,16 @@ + #include + #include + #include ++#ifndef __WIN32__ ++#include ++#endif + + #include "dvdread/dvd_reader.h" + #include "dvdread/dvd_udf.h" + ++#include "dvdread/ifo_types.h" ++#include "dvdread/ifo_read.h" ++ + /* Private but located in/shared with dvd_reader.c */ + extern int UDFReadBlocksRaw( dvd_reader_t *device, uint32_t lb_number, + size_t block_count, unsigned char *data, +@@ -784,7 +790,7 @@ + return part->valid; + } + +-uint32_t UDFFindFile( dvd_reader_t *device, char *filename, ++static uint32_t UDFFindFileReal( dvd_reader_t *device, char *filename, + uint32_t *filesize ) + { + uint8_t LogBlock_base[ DVD_VIDEO_LB_LEN + 2048 ]; +@@ -863,6 +869,83 @@ + return partition.Start + File.Location; + } + ++/** ++ * Get the offset from the ifo files to allow playback of DVDs ++ * with a deliberately broken UDF file system (aka DVD-Movie-Protect). ++ * When the file is not an IFO or VOB, it calls the real UDF routine. ++ */ ++uint32_t UDFFindFile( dvd_reader_t *device, char *filename, ++ uint32_t *filesize ) ++{ ++#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; ++ ++ uint32_t tmp_filesize; ++ uint32_t offset = UDFFindFileReal(device, "/VIDEO_TS/VIDEO_TS.IFO", &tmp_filesize); ++ ++ int i; ++ for (i=0; itt_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) { ++ ifoClose(ifo_handle); ++ return 0; ++ } ++ offset += ifo_handle->vtsi_mat->vtsm_vobs; ++ break; ++ case 1: ++ if (0 == ifo_handle->vtsi_mat->vtstt_vobs) { ++ ifoClose(ifo_handle); ++ 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; ++ } ++ } ++ ++ return UDFFindFileReal( device, filename, filesize); ++} + + + /**