summaryrefslogtreecommitdiffstats
path: root/libdvdread
diff options
context:
space:
mode:
authordiego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-11-18 00:33:01 +0000
committerdiego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-11-18 00:33:01 +0000
commit8cf4397274d9f5cf35f1961d154ebb811f4f0f2f (patch)
treea1f3c9c8a20486295a018a3f82b688c1dc562ddd /libdvdread
parent2f67bb7b34ce9e81b62c16c849cf4cd48753c1df (diff)
downloadmpv-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/Makefile53
-rw-r--r--libdvdread/bswap.h146
-rw-r--r--libdvdread/dvd_input.c353
-rw-r--r--libdvdread/dvd_input.h47
-rw-r--r--libdvdread/dvd_reader.c1149
-rw-r--r--libdvdread/dvd_reader.h265
-rw-r--r--libdvdread/dvd_udf.c1002
-rw-r--r--libdvdread/dvd_udf.h59
-rw-r--r--libdvdread/dvdread_internal.h8
-rw-r--r--libdvdread/ifo_print.c1152
-rw-r--r--libdvdread/ifo_print.h63
-rw-r--r--libdvdread/ifo_read.c2022
-rw-r--r--libdvdread/ifo_read.h231
-rw-r--r--libdvdread/ifo_types.h937
-rw-r--r--libdvdread/libdvdread_changes.diff778
-rw-r--r--libdvdread/md5.c417
-rw-r--r--libdvdread/md5.h161
-rw-r--r--libdvdread/nav_print.c279
-rw-r--r--libdvdread/nav_print.h54
-rw-r--r--libdvdread/nav_read.c204
-rw-r--r--libdvdread/nav_read.h55
-rw-r--r--libdvdread/nav_types.h311
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
-
-dvd_read