diff options
author | diego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-11-18 00:33:01 +0000 |
---|---|---|
committer | diego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-11-18 00:33:01 +0000 |
commit | 8cf4397274d9f5cf35f1961d154ebb811f4f0f2f (patch) | |
tree | a1f3c9c8a20486295a018a3f82b688c1dc562ddd /libdvdread | |
parent | 2f67bb7b34ce9e81b62c16c849cf4cd48753c1df (diff) | |
download | mpv-8cf4397274d9f5cf35f1961d154ebb811f4f0f2f.tar.bz2 mpv-8cf4397274d9f5cf35f1961d154ebb811f4f0f2f.tar.xz |
Rename libdvdread to dvdread. We really only include only the dvdread
subdirectory of libdvdread. This will also allow getting rid of some
local modifications.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@20997 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libdvdread')
-rw-r--r-- | libdvdread/Makefile | 53 | ||||
-rw-r--r-- | libdvdread/bswap.h | 146 | ||||
-rw-r--r-- | libdvdread/dvd_input.c | 353 | ||||
-rw-r--r-- | libdvdread/dvd_input.h | 47 | ||||
-rw-r--r-- | libdvdread/dvd_reader.c | 1149 | ||||
-rw-r--r-- | libdvdread/dvd_reader.h | 265 | ||||
-rw-r--r-- | libdvdread/dvd_udf.c | 1002 | ||||
-rw-r--r-- | libdvdread/dvd_udf.h | 59 | ||||
-rw-r--r-- | libdvdread/dvdread_internal.h | 8 | ||||
-rw-r--r-- | libdvdread/ifo_print.c | 1152 | ||||
-rw-r--r-- | libdvdread/ifo_print.h | 63 | ||||
-rw-r--r-- | libdvdread/ifo_read.c | 2022 | ||||
-rw-r--r-- | libdvdread/ifo_read.h | 231 | ||||
-rw-r--r-- | libdvdread/ifo_types.h | 937 | ||||
-rw-r--r-- | libdvdread/libdvdread_changes.diff | 778 | ||||
-rw-r--r-- | libdvdread/md5.c | 417 | ||||
-rw-r--r-- | libdvdread/md5.h | 161 | ||||
-rw-r--r-- | libdvdread/nav_print.c | 279 | ||||
-rw-r--r-- | libdvdread/nav_print.h | 54 | ||||
-rw-r--r-- | libdvdread/nav_read.c | 204 | ||||
-rw-r--r-- | libdvdread/nav_read.h | 55 | ||||
-rw-r--r-- | libdvdread/nav_types.h | 311 |
22 files changed, 0 insertions, 9746 deletions
diff --git a/libdvdread/Makefile b/libdvdread/Makefile deleted file mode 100644 index 3db80769b5..0000000000 --- a/libdvdread/Makefile +++ /dev/null @@ -1,53 +0,0 @@ - -ifneq ($(wildcard ../config.mak),) -include ../config.mak -endif - -SRCS = dvd_input.c \ - dvd_reader.c \ - dvd_udf.c \ - ifo_print.c \ - ifo_read.c \ - nav_print.c \ - nav_read.c \ - md5.c \ - -OBJS = $(SRCS:.c=.o) - -LIB=libdvdread - -.SUFFIXES: .c .o - -CFLAGS= -I.. $(OPTFLAGS) -D__USE_UNIX98 -D_GNU_SOURCE -DSTDC_HEADERS \ - -DHAVE_LIMITS_H -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 - -ifeq ($(DVDCSS_INTERNAL),yes) -CFLAGS += -I../libdvdcss -DHAVE_DVDCSS_DVDCSS_H -endif - -.c.o: - $(CC) $(CFLAGS) -c -o $@ $< - -all: $(LIB).a - -$(LIB).a: $(OBJS) - $(AR) rc $(LIB).a $(OBJS) - $(RANLIB) $(LIB).a - -clean: - rm -f *.o *.a *~ *.so - -distclean: clean - rm -f .depend - -dep: depend - -depend: - $(CC) -MM $(CFLAGS) $(SRCS) 1>.depend - -# -# include dependency files if they exist -# -ifneq ($(wildcard .depend),) -include .depend -endif diff --git a/libdvdread/bswap.h b/libdvdread/bswap.h deleted file mode 100644 index a30061b323..0000000000 --- a/libdvdread/bswap.h +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef BSWAP_H_INCLUDED -#define BSWAP_H_INCLUDED - -/* - * Copyright (C) 2000, 2001 Billy Biggs <vektor@dumbterm.net>, - * Håkan Hjort <d95hjort@dtek.chalmers.se> - * - * Modified for use with MPlayer, changes contained in libdvdread_changes.diff. - * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/ - * $Id$ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include <config.h> - -#if defined(WORDS_BIGENDIAN) -/* All bigendian systems are fine, just ignore the swaps. */ -#define B2N_16(x) (void)(x) -#define B2N_32(x) (void)(x) -#define B2N_64(x) (void)(x) - -#else - -/* For __FreeBSD_version */ -#if defined(HAVE_SYS_PARAM_H) -#include <sys/param.h> -#endif - -#if defined(__linux__) -#include <byteswap.h> -#define B2N_16(x) x = bswap_16(x) -#define B2N_32(x) x = bswap_32(x) -#define B2N_64(x) x = bswap_64(x) - -#elif defined(__NetBSD__) -#include <sys/endian.h> -#define B2N_16(x) BE16TOH(x) -#define B2N_32(x) BE32TOH(x) -#define B2N_64(x) BE64TOH(x) - -#elif defined(__OpenBSD__) -#include <sys/endian.h> -#define B2N_16(x) x = swap16(x) -#define B2N_32(x) x = swap32(x) -#define B2N_64(x) x = swap64(x) - -#elif defined(__FreeBSD__) && __FreeBSD_version >= 470000 -#include <sys/endian.h> -#define B2N_16(x) x = be16toh(x) -#define B2N_32(x) x = be32toh(x) -#define B2N_64(x) x = be64toh(x) - -#elif defined(__DragonFly__) -#include <sys/endian.h> -#define B2N_16(x) x = be16toh(x) -#define B2N_32(x) x = be32toh(x) -#define B2N_64(x) x = be64toh(x) - -#elif defined(ARCH_X86) -inline static unsigned short bswap_16(unsigned short x) -{ - __asm("xchgb %b0,%h0" : - "=q" (x) : - "0" (x)); - return x; -} -#define B2N_16(x) x = bswap_16(x) - -inline static unsigned int bswap_32(unsigned int x) -{ - __asm( -#if __CPU__ > 386 - "bswap %0": - "=r" (x) : -#else - "xchgb %b0,%h0\n" - " rorl $16,%0\n" - " xchgb %b0,%h0": - "=q" (x) : -#endif - "0" (x)); - return x; -} -#define B2N_32(x) x = bswap_32(x) - -inline static unsigned long long int bswap_64(unsigned long long int x) -{ - register union { __extension__ uint64_t __ll; - uint32_t __l[2]; } __x; - asm("xchgl %0,%1": - "=r"(__x.__l[0]),"=r"(__x.__l[1]): - "0"(bswap_32((unsigned long)x)),"1"(bswap_32((unsigned long)(x>>32)))); - return __x.__ll; -} -#define B2N_64(x) x = bswap_64(x) - -/* This is a slow but portable implementation, it has multiple evaluation - * problems so beware. - * Old FreeBSD's and Solaris don't have <byteswap.h> or any other such - * functionality! - */ - -#elif defined(__FreeBSD__) || defined(__sun) || defined(__bsdi__) || defined(__CYGWIN__) -#define B2N_16(x) \ - x = ((((x) & 0xff00) >> 8) | \ - (((x) & 0x00ff) << 8)) -#define B2N_32(x) \ - x = ((((x) & 0xff000000) >> 24) | \ - (((x) & 0x00ff0000) >> 8) | \ - (((x) & 0x0000ff00) << 8) | \ - (((x) & 0x000000ff) << 24)) -#define B2N_64(x) \ - x = ((((x) & 0xff00000000000000) >> 56) | \ - (((x) & 0x00ff000000000000) >> 40) | \ - (((x) & 0x0000ff0000000000) >> 24) | \ - (((x) & 0x000000ff00000000) >> 8) | \ - (((x) & 0x00000000ff000000) << 8) | \ - (((x) & 0x0000000000ff0000) << 24) | \ - (((x) & 0x000000000000ff00) << 40) | \ - (((x) & 0x00000000000000ff) << 56)) - -#else - -/* If there isn't a header provided with your system with this functionality - * add the relevant || define( ) to the portable implementation above. - */ -#error "You need to add endian swap macros for you're system" - -#endif - -#endif /* WORDS_BIGENDIAN */ - -#endif /* BSWAP_H_INCLUDED */ diff --git a/libdvdread/dvd_input.c b/libdvdread/dvd_input.c deleted file mode 100644 index 8478970a6d..0000000000 --- a/libdvdread/dvd_input.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright (C) 2002 Samuel Hocevar <sam@zoy.org>, - * Håkan Hjort <d95hjort@dtek.chalmers.se> - * - * Modified for use with MPlayer, changes contained in libdvdread_changes.diff. - * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/ - * $Id$ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. - */ - -#include "config.h" - -#include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include <unistd.h> - -#include "dvd_reader.h" -#include "dvd_input.h" - -/* The function pointers that is the exported interface of this file. */ -dvd_input_t (*dvdinput_open) (const char *); -int (*dvdinput_close) (dvd_input_t); -int (*dvdinput_seek) (dvd_input_t, int); -int (*dvdinput_title) (dvd_input_t, int); -int (*dvdinput_read) (dvd_input_t, void *, int, int); -char * (*dvdinput_error) (dvd_input_t); - -#ifdef HAVE_DVDCSS_DVDCSS_H -/* linking to libdvdcss */ -#include "dvdcss/dvdcss.h" -#define DVDcss_open(a) dvdcss_open((char*)(a)) -#define DVDcss_close dvdcss_close -#define DVDcss_seek dvdcss_seek -#define DVDcss_title dvdcss_title -#define DVDcss_read dvdcss_read -#define DVDcss_error dvdcss_error -#else -/* dlopening libdvdcss */ -#include <dlfcn.h> -typedef struct dvdcss_s *dvdcss_handle; -static dvdcss_handle (*DVDcss_open) (const char *); -static int (*DVDcss_close) (dvdcss_handle); -static int (*DVDcss_seek) (dvdcss_handle, int, int); -static int (*DVDcss_title) (dvdcss_handle, int); -static int (*DVDcss_read) (dvdcss_handle, void *, int, int); -static char * (*DVDcss_error) (dvdcss_handle); -#endif - -/* The DVDinput handle, add stuff here for new input methods. */ -struct dvd_input_s { - /* libdvdcss handle */ - dvdcss_handle dvdcss; - - /* dummy file input */ - int fd; -}; - - -/** - * initialize and open a DVD device or file. - */ -static dvd_input_t css_open(const char *target) -{ - dvd_input_t dev; - - /* Allocate the handle structure */ - dev = (dvd_input_t) malloc(sizeof(struct dvd_input_s)); - if(dev == NULL) { - fprintf(stderr, "libdvdread: Could not allocate memory.\n"); - return NULL; - } - - /* Really open it with libdvdcss */ - dev->dvdcss = DVDcss_open(target); - if(dev->dvdcss == 0) { - fprintf(stderr, "libdvdread: Could not open %s with libdvdcss.\n", target); - free(dev); - return NULL; - } - - return dev; -} - -/** - * return the last error message - */ -static char *css_error(dvd_input_t dev) -{ - return DVDcss_error(dev->dvdcss); -} - -/** - * seek into the device. - */ -static int css_seek(dvd_input_t dev, int blocks) -{ - /* DVDINPUT_NOFLAGS should match the DVDCSS_NOFLAGS value. */ - return DVDcss_seek(dev->dvdcss, blocks, DVDINPUT_NOFLAGS); -} - -/** - * set the block for the begining of a new title (key). - */ -static int css_title(dvd_input_t dev, int block) -{ - return DVDcss_title(dev->dvdcss, block); -} - -/** - * read data from the device. - */ -static int css_read(dvd_input_t dev, void *buffer, int blocks, int flags) -{ - return DVDcss_read(dev->dvdcss, buffer, blocks, flags); -} - -/** - * close the DVD device and clean up the library. - */ -static int css_close(dvd_input_t dev) -{ - int ret; - - ret = DVDcss_close(dev->dvdcss); - - if(ret < 0) - return ret; - - free(dev); - - return 0; -} - - - - - - -/** - * initialize and open a DVD device or file. - */ -static dvd_input_t file_open(const char *target) -{ - dvd_input_t dev; - - /* Allocate the library structure */ - dev = (dvd_input_t) malloc(sizeof(struct dvd_input_s)); - if(dev == NULL) { - fprintf(stderr, "libdvdread: Could not allocate memory.\n"); - return NULL; - } - - /* Open the device */ - dev->fd = open(target, O_RDONLY); - if(dev->fd < 0) { - perror("libdvdread: Could not open input"); - free(dev); - return NULL; - } - - return dev; -} - -/** - * return the last error message - */ -static char *file_error(dvd_input_t dev) -{ - /* use strerror(errno)? */ - return (char *)"unknown error"; -} - -/** - * seek into the device. - */ -static int file_seek(dvd_input_t dev, int blocks) -{ - off_t pos; - - pos = lseek(dev->fd, (off_t)blocks * (off_t)DVD_VIDEO_LB_LEN, SEEK_SET); - if(pos < 0) { - return pos; - } - /* assert pos % DVD_VIDEO_LB_LEN == 0 */ - return (int) (pos / DVD_VIDEO_LB_LEN); -} - -/** - * set the block for the begining of a new title (key). - */ -static int file_title(dvd_input_t dev, int block) -{ - return -1; -} - -/** - * read data from the device. - */ -static int file_read(dvd_input_t dev, void *buffer, int blocks, int flags) -{ - size_t len; - ssize_t ret; - - len = (size_t)blocks * DVD_VIDEO_LB_LEN; - - while(len > 0) { - - ret = read(dev->fd, buffer, len); - - if(ret < 0) { - /* One of the reads failed, too bad. We won't even bother - * returning the reads that went ok, and as in the posix spec - * the file postition is left unspecified after a failure. */ - return ret; - } - - if(ret == 0) { - /* Nothing more to read. Return the whole blocks, if any, that we got. - and adjust the file possition back to the previous block boundary. */ - size_t bytes = (size_t)blocks * DVD_VIDEO_LB_LEN - len; - off_t over_read = -(bytes % DVD_VIDEO_LB_LEN); - /*off_t pos =*/ lseek(dev->fd, over_read, SEEK_CUR); - /* should have pos % 2048 == 0 */ - return (int) (bytes / DVD_VIDEO_LB_LEN); - } - - len -= ret; - } - - return blocks; -} - -/** - * close the DVD device and clean up. - */ -static int file_close(dvd_input_t dev) -{ - int ret; - - ret = close(dev->fd); - - if(ret < 0) - return ret; - - free(dev); - - return 0; -} - - -/** - * Setup read functions with either libdvdcss or minimal DVD access. - */ -int dvdinput_setup(void) -{ - void *dvdcss_library = NULL; - char **dvdcss_version = NULL; - -#ifdef HAVE_DVDCSS_DVDCSS_H - /* linking to libdvdcss */ - dvdcss_library = &dvdcss_library; /* Give it some value != NULL */ - /* the DVDcss_* functions have been #defined at the top */ - dvdcss_version = &dvdcss_interface_2; - -#else - /* dlopening libdvdcss */ - dvdcss_library = dlopen("libdvdcss.so.2", RTLD_LAZY); - - if(dvdcss_library != NULL) { -#if defined(__OpenBSD__) && !defined(__ELF__) -#define U_S "_" -#else -#define U_S -#endif - DVDcss_open = (dvdcss_handle (*)(const char*)) - dlsym(dvdcss_library, U_S "dvdcss_open"); - DVDcss_close = (int (*)(dvdcss_handle)) - dlsym(dvdcss_library, U_S "dvdcss_close"); - DVDcss_title = (int (*)(dvdcss_handle, int)) - dlsym(dvdcss_library, U_S "dvdcss_title"); - DVDcss_seek = (int (*)(dvdcss_handle, int, int)) - dlsym(dvdcss_library, U_S "dvdcss_seek"); - DVDcss_read = (int (*)(dvdcss_handle, void*, int, int)) - dlsym(dvdcss_library, U_S "dvdcss_read"); - DVDcss_error = (char* (*)(dvdcss_handle)) - dlsym(dvdcss_library, U_S "dvdcss_error"); - - dvdcss_version = (char **)dlsym(dvdcss_library, U_S "dvdcss_interface_2"); - - if(dlsym(dvdcss_library, U_S "dvdcss_crack")) { - fprintf(stderr, - "libdvdread: Old (pre-0.0.2) version of libdvdcss found.\n" - "libdvdread: You should get the latest version from " - "http://www.videolan.org/\n" ); - dlclose(dvdcss_library); - dvdcss_library = NULL; - } else if(!DVDcss_open || !DVDcss_close || !DVDcss_title || !DVDcss_seek - || !DVDcss_read || !DVDcss_error || !dvdcss_version) { - fprintf(stderr, "libdvdread: Missing symbols in libdvdcss.so.2, " - "this shouldn't happen !\n"); - dlclose(dvdcss_library); - } - } -#endif /* HAVE_DVDCSS_DVDCSS_H */ - - if(dvdcss_library != NULL) { - /* - char *psz_method = getenv( "DVDCSS_METHOD" ); - char *psz_verbose = getenv( "DVDCSS_VERBOSE" ); - fprintf(stderr, "DVDCSS_METHOD %s\n", psz_method); - fprintf(stderr, "DVDCSS_VERBOSE %s\n", psz_verbose); - */ - /* - fprintf(stderr, "libdvdread: Using libdvdcss version %s for DVD access\n", - *dvdcss_version); - */ - - /* libdvdcss wrapper functions */ - dvdinput_open = css_open; - dvdinput_close = css_close; - dvdinput_seek = css_seek; - dvdinput_title = css_title; - dvdinput_read = css_read; - dvdinput_error = css_error; - return 1; - - } else { - fprintf(stderr, "libdvdread: Encrypted DVD support unavailable.\n"); - - /* libdvdcss replacement functions */ - dvdinput_open = file_open; - dvdinput_close = file_close; - dvdinput_seek = file_seek; - dvdinput_title = file_title; - dvdinput_read = file_read; - dvdinput_error = file_error; - return 0; - } -} diff --git a/libdvdread/dvd_input.h b/libdvdread/dvd_input.h deleted file mode 100644 index e9e84917ea..0000000000 --- a/libdvdread/dvd_input.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef DVD_INPUT_H_INCLUDED -#define DVD_INPUT_H_INCLUDED - -/* - * Copyright (C) 2001, 2002 Samuel Hocevar <sam@zoy.org>, - * Håkan Hjort <d95hjort@dtek.chalmers.se> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. - */ - -/** - * Defines and flags. Make sure they fit the libdvdcss API! - */ -#define DVDINPUT_NOFLAGS 0 - -#define DVDINPUT_READ_DECRYPT (1 << 0) - -typedef struct dvd_input_s *dvd_input_t; - -/** - * Pointers which will be filled either the input methods functions. - */ -extern dvd_input_t (*dvdinput_open) (const char *); -extern int (*dvdinput_close) (dvd_input_t); -extern int (*dvdinput_seek) (dvd_input_t, int); -extern int (*dvdinput_title) (dvd_input_t, int); -extern int (*dvdinput_read) (dvd_input_t, void *, int, int); -extern char * (*dvdinput_error) (dvd_input_t); - -/** - * Setup function accessed by dvd_reader.c. Returns 1 if there is CSS support. - */ -int dvdinput_setup(void); - -#endif /* DVD_INPUT_H_INCLUDED */ diff --git a/libdvdread/dvd_reader.c b/libdvdread/dvd_reader.c deleted file mode 100644 index d944696c15..0000000000 --- a/libdvdread/dvd_reader.c +++ /dev/null @@ -1,1149 +0,0 @@ -/* - * Copyright (C) 2001, 2002, 2003 Billy Biggs <vektor@dumbterm.net>, - * Håkan Hjort <d95hjort@dtek.chalmers.se>, - * Björn Englund <d4bjorn@dtek.chalmers.se> - * - * Modified for use with MPlayer, changes contained in libdvdread_changes.diff. - * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/ - * $Id$ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. - */ - -#include "config.h" - -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/time.h> /* For the timing of dvdcss_title crack. */ -#include <fcntl.h> -#include <stdlib.h> -#include <stdio.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> -#include <limits.h> -#include <dirent.h> - -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__bsdi__)|| defined(__DARWIN__) || defined(__DragonFly__) -#define SYS_BSD 1 -#endif - -#if defined(__sun) -#include <sys/mnttab.h> -#elif defined(hpux) -#include </usr/conf/h/mnttab.h> -#elif defined(SYS_BSD) -#include <fstab.h> -#elif defined(__linux__) || defined(__CYGWIN__) -#include <mntent.h> -#endif - -#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION <= 3) && (__MINGW32_MINOR_VERSION < 10) -#include <sys/timeb.h> -static void gettimeofday(struct timeval* t,void* timezone){ - struct timeb timebuffer; - ftime( &timebuffer ); - t->tv_sec=timebuffer.time; - t->tv_usec=1000*timebuffer.millitm; -} -#endif - -#include "dvd_udf.h" -#include "dvd_input.h" -#include "dvd_reader.h" -#include "md5.h" - -#define DEFAULT_UDF_CACHE_LEVEL 0 - -struct dvd_reader_s { - /* Basic information. */ - int isImageFile; - - /* Hack for keeping track of the css status. - * 0: no css, 1: perhaps (need init of keys), 2: have done init */ - int css_state; - int css_title; /* Last title that we have called dvdinpute_title for. */ - - /* Information required for an image file. */ - dvd_input_t dev; - - /* Information required for a directory path drive. */ - char *path_root; - - /* Filesystem cache */ - int udfcache_level; /* 0 - turned off, 1 - on */ - void *udfcache; -}; - -struct dvd_file_s { - /* Basic information. */ - dvd_reader_t *dvd; - - /* Hack for selecting the right css title. */ - int css_title; - - /* Information required for an image file. */ - uint32_t lb_start; - uint32_t seek_pos; - - /* Information required for a directory path drive. */ - size_t title_sizes[ 9 ]; - dvd_input_t title_devs[ 9 ]; - - /* Calculated at open-time, size in blocks. */ - ssize_t filesize; -}; - -/** - * Set the level of caching on udf - * level = 0 (no caching) - * level = 1 (caching filesystem info) - */ -int DVDUDFCacheLevel(dvd_reader_t *device, int level) -{ - struct dvd_reader_s *dev = (struct dvd_reader_s *)device; - - if(level > 0) { - level = 1; - } else if(level < 0) { - return dev->udfcache_level; - } - - dev->udfcache_level = level; - - return level; -} - -void *GetUDFCacheHandle(dvd_reader_t *device) -{ - struct dvd_reader_s *dev = (struct dvd_reader_s *)device; - - return dev->udfcache; -} - -void SetUDFCacheHandle(dvd_reader_t *device, void *cache) -{ - struct dvd_reader_s *dev = (struct dvd_reader_s *)device; - - dev->udfcache = cache; -} - - - -/* Loop over all titles and call dvdcss_title to crack the keys. */ -static int initAllCSSKeys( dvd_reader_t *dvd ) -{ - struct timeval all_s, all_e; - struct timeval t_s, t_e; - char filename[ MAX_UDF_FILE_NAME_LEN ]; - uint32_t start, len; - int title; - - char *nokeys_str = getenv("DVDREAD_NOKEYS"); - if(nokeys_str != NULL) - return 0; - - fprintf( stderr, "\n" ); - fprintf( stderr, "libdvdread: Attempting to retrieve all CSS keys\n" ); - fprintf( stderr, "libdvdread: This can take a _long_ time, " - "please be patient\n\n" ); - - gettimeofday(&all_s, NULL); - - for( title = 0; title < 100; title++ ) { - gettimeofday( &t_s, NULL ); - if( title == 0 ) { - sprintf( filename, "/VIDEO_TS/VIDEO_TS.VOB" ); - } else { - sprintf( filename, "/VIDEO_TS/VTS_%02d_%d.VOB", title, 0 ); - } - start = UDFFindFile( dvd, filename, &len ); - if( start != 0 && len != 0 ) { - /* Perform CSS key cracking for this title. */ - fprintf( stderr, "libdvdread: Get key for %s at 0x%08x\n", - filename, start ); - if( dvdinput_title( dvd->dev, (int)start ) < 0 ) { - fprintf( stderr, "libdvdread: Error cracking CSS key for %s (0x%08x)\n", filename, start); - } - gettimeofday( &t_e, NULL ); - fprintf( stderr, "libdvdread: Elapsed time %ld\n", - (long int) t_e.tv_sec - t_s.tv_sec ); - } - - if( title == 0 ) continue; - - gettimeofday( &t_s, NULL ); - sprintf( filename, "/VIDEO_TS/VTS_%02d_%d.VOB", title, 1 ); - start = UDFFindFile( dvd, filename, &len ); - if( start == 0 || len == 0 ) break; - - /* Perform CSS key cracking for this title. */ - fprintf( stderr, "libdvdread: Get key for %s at 0x%08x\n", - filename, start ); - if( dvdinput_title( dvd->dev, (int)start ) < 0 ) { - fprintf( stderr, "libdvdread: Error cracking CSS key for %s (0x%08x)!!\n", filename, start); - } - gettimeofday( &t_e, NULL ); - fprintf( stderr, "libdvdread: Elapsed time %ld\n", - (long int) t_e.tv_sec - t_s.tv_sec ); - } - title--; - - fprintf( stderr, "libdvdread: Found %d VTS's\n", title ); - gettimeofday(&all_e, NULL); - fprintf( stderr, "libdvdread: Elapsed time %ld\n", - (long int) all_e.tv_sec - all_s.tv_sec ); - - return 0; -} - - - -/** - * Open a DVD image or block device file. - */ -static dvd_reader_t *DVDOpenImageFile( const char *location, int have_css ) -{ - dvd_reader_t *dvd; - dvd_input_t dev; - - dev = dvdinput_open( location ); - if( !dev ) { - fprintf( stderr, "libdvdread: Can't open %s for reading\n", location ); - return 0; - } - - dvd = (dvd_reader_t *) malloc( sizeof( dvd_reader_t ) ); - if( !dvd ) return 0; - dvd->isImageFile = 1; - dvd->dev = dev; - dvd->path_root = 0; - - dvd->udfcache_level = DEFAULT_UDF_CACHE_LEVEL; - dvd->udfcache = NULL; - - if( have_css ) { - /* Only if DVDCSS_METHOD = title, a bit if it's disc or if - * DVDCSS_METHOD = key but region missmatch. Unfortunaly we - * don't have that information. */ - - dvd->css_state = 1; /* Need key init. */ - } - dvd->css_title = 0; - - return dvd; -} - -static dvd_reader_t *DVDOpenPath( const char *path_root ) -{ - dvd_reader_t *dvd; - - dvd = (dvd_reader_t *) malloc( sizeof( dvd_reader_t ) ); - if( !dvd ) return 0; - dvd->isImageFile = 0; - dvd->dev = 0; - dvd->path_root = strdup( path_root ); - - dvd->udfcache_level = DEFAULT_UDF_CACHE_LEVEL; - dvd->udfcache = NULL; - - dvd->css_state = 0; /* Only used in the UDF path */ - dvd->css_title = 0; /* Only matters in the UDF path */ - - return dvd; -} - -#if defined(__sun) -/* /dev/rdsk/c0t6d0s0 (link to /devices/...) - /vol/dev/rdsk/c0t6d0/?? - /vol/rdsk/<name> */ -static char *sun_block2char( const char *path ) -{ - char *new_path; - - /* Must contain "/dsk/" */ - if( !strstr( path, "/dsk/" ) ) return (char *) strdup( path ); - - /* Replace "/dsk/" with "/rdsk/" */ - new_path = malloc( strlen(path) + 2 ); - strcpy( new_path, path ); - strcpy( strstr( new_path, "/dsk/" ), "" ); - strcat( new_path, "/rdsk/" ); - strcat( new_path, strstr( path, "/dsk/" ) + strlen( "/dsk/" ) ); - - return new_path; -} -#endif - -#if defined(SYS_BSD) -/* FreeBSD /dev/(r)(a)cd0c (a is for atapi), recomended to _not_ use r - OpenBSD /dev/rcd0c, it needs to be the raw device - NetBSD /dev/rcd0[d|c|..] d for x86, c (for non x86), perhaps others - Darwin /dev/rdisk0, it needs to be the raw device - BSD/OS /dev/sr0c (if not mounted) or /dev/rsr0c ('c' any letter will do) */ -static char *bsd_block2char( const char *path ) -#if defined(__FreeBSD__) -{ - return (char *) strdup( path ); -} -#else -{ - char *new_path; - - /* If it doesn't start with "/dev/" or does start with "/dev/r" exit */ - if( strncmp( path, "/dev/", 5 ) || !strncmp( path, "/dev/r", 6 ) ) - return (char *) strdup( path ); - - /* Replace "/dev/" with "/dev/r" */ - new_path = malloc( strlen(path) + 2 ); - strcpy( new_path, "/dev/r" ); - strcat( new_path, path + strlen( "/dev/" ) ); - - return new_path; -} -#endif /* __FreeBSD__ */ -#endif - - |