apply mplayer-specific patches

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7034 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
arpi 2002-08-16 22:50:22 +00:00
parent a695955bd2
commit b1187223a3
19 changed files with 94 additions and 195 deletions

View File

@ -20,8 +20,6 @@
* 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)
@ -48,13 +46,51 @@
#define B2N_32(x) x = swap32(x)
#define B2N_64(x) x = swap64(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.
* FreeBSD and Solaris don't have <byteswap.h> or any other such
* functionality!
*/
#elif defined(__FreeBSD__) || defined(__sun) || defined(__bsdi__)
#elif defined(__FreeBSD__) || defined(__sun) || defined(__bsdi__) || defined(__CYGWIN__)
#define B2N_16(x) \
x = ((((x) & 0xff00) >> 8) | \
(((x) & 0x00ff) << 8))

View File

@ -42,7 +42,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include "dvdcss/dvdcss.h"
#include "dvdcss.h"
#include "common.h"
#include "css.h"

View File

@ -45,7 +45,7 @@
# include <sys/uio.h> /* struct iovec */
#endif
#include "dvdcss/dvdcss.h"
#include "dvdcss.h"
#include "common.h"
#include "css.h"

View File

@ -21,13 +21,11 @@
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <dlfcn.h>
#include "dvd_reader.h"
#include "dvd_input.h"
/* For libdvdcss */
typedef struct dvdcss_s *dvdcss_handle;
#include "dvdcss.h"
dvdcss_handle (*DVDcss_open) (const char *);
int (*DVDcss_close) (dvdcss_handle);
@ -123,176 +121,26 @@ static int css_close(dvd_input_t dev)
/**
* 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(dvd_input_t));
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 "unknown error";
}
/**
* seek into the device.
*/
static int file_seek(dvd_input_t dev, int blocks, int flags)
{
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 DVDInputSetup(void)
{
void *dvdcss_library = NULL;
char **dvdcss_version = NULL;
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_open = dvdcss_open;
DVDcss_close = dvdcss_close;
DVDcss_title = dvdcss_title;
DVDcss_seek = dvdcss_seek;
DVDcss_read = dvdcss_read;
DVDcss_error = 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);
}
}
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);
// fprintf(stderr, "libdvdread: Using libdvdcss version %s for DVD access\n",
// *dvdcss_version);
/* libdvdcss wraper functions */
DVDinput_open = css_open;
@ -303,16 +151,4 @@ int DVDInputSetup(void)
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;
}
}

View File

@ -17,6 +17,8 @@
* 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. */
@ -144,6 +146,13 @@ static int initAllCSSKeys( dvd_reader_t *dvd )
}
#ifndef HAVE_MPLAYER
#include "get_path.c"
#else
extern char * get_path( char * filename );
#endif
extern char * dvdcss_cache_dir;
/**
* Open a DVD image or block device file.
@ -152,7 +161,16 @@ static dvd_reader_t *DVDOpenImageFile( const char *location, int have_css )
{
dvd_reader_t *dvd;
dvd_input_t dev;
/* setup cache dir */
if(!dvdcss_cache_dir){
dvdcss_cache_dir=get_path( "" );
if ( dvdcss_cache_dir ) { mkdir( dvdcss_cache_dir,493 ); free( dvdcss_cache_dir ); }
dvdcss_cache_dir=get_path( "DVDKeys" );
if(dvdcss_cache_dir) mkdir( dvdcss_cache_dir,493 );
}
/* open it */
dev = DVDinput_open( location );
if( !dev ) {
fprintf( stderr, "libdvdread: Can't open %s for reading\n", location );
@ -364,6 +382,9 @@ dvd_reader_t *DVDOpen( const char *path )
}
fclose( mntfile );
}
#elif defined(WIN32)
dev_name = strdup(path);
auth_drive = DVDOpenImageFile( path, have_css );
#endif
if( !dev_name ) {
fprintf( stderr, "libdvdread: Couldn't find device name.\n" );
@ -554,8 +575,8 @@ static dvd_file_t *DVDOpenVOBUDF( dvd_reader_t *dvd, int title, int menu )
}
if( dvd->css_state == 1 /* Need key init */ ) {
initAllCSSKeys( dvd );
dvd->css_state = 2;
// initAllCSSKeys( dvd );
// dvd->css_state = 2;
}
/*
if( DVDinput_seek( dvd_file->dvd->dev,

View File

@ -30,7 +30,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//#include <assert.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>

View File

@ -61,12 +61,18 @@ typedef struct dvdcss_s* dvdcss_t;
*/
extern char * dvdcss_interface_2;
/*
* Path to CSS key cache. Default == NULL (no cache).
*/
extern char * dvdcss_cache_dir;
/*
* Exported prototypes.
*/
extern dvdcss_t dvdcss_open ( char *psz_target );
extern int dvdcss_close ( dvdcss_t );
extern int dvdcss_title ( dvdcss_t,
int i_block );
extern int dvdcss_seek ( dvdcss_t,
int i_blocks,
int i_flags );

View File

@ -25,7 +25,7 @@
#include <stdio.h>
#include "dvdcss/dvdcss.h"
#include "dvdcss.h"
#include "common.h"
#include "css.h"

View File

@ -23,7 +23,7 @@
#include <inttypes.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
//#include <assert.h>
#include "config.h" // Needed for WORDS_BIGENDIAN
#include "ifo_types.h"

View File

@ -20,8 +20,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <dvdread/ifo_types.h>
#include <dvdread/dvd_reader.h>
#include "ifo_types.h"
#include "dvd_reader.h"
#ifdef __cplusplus
extern "C" {

View File

@ -22,7 +22,7 @@
#include <unistd.h>
#include <inttypes.h>
#include <string.h>
#include <assert.h>
//#include <assert.h>
#include "dvd_reader.h"

View File

@ -20,8 +20,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <dvdread/ifo_types.h>
#include <dvdread/dvd_reader.h>
#include "ifo_types.h"
#include "dvd_reader.h"
#ifdef __cplusplus
extern "C" {

View File

@ -21,7 +21,7 @@
*/
#include <inttypes.h>
#include <dvdread/dvd_reader.h>
#include "dvd_reader.h"
#undef ATTRIBUTE_PACKED

View File

@ -97,7 +97,7 @@
# include <unistd.h>
#endif
#include "dvdcss/dvdcss.h"
#include "dvdcss.h"
#include "common.h"
#include "css.h"

View File

@ -25,7 +25,7 @@
#include <stdio.h>
#include <inttypes.h>
#include <assert.h>
//#include <assert.h>
#include "config.h" // Needed for WORDS_BIGENDIAN
#include "nav_types.h"

View File

@ -20,7 +20,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <dvdread/nav_types.h>
#include "nav_types.h"
#ifdef __cplusplus
extern "C" {

View File

@ -19,7 +19,7 @@
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <assert.h>
//#include <assert.h>
#include "config.h" // Needed for WORDS_BIGENDIAN
#include "bswap.h"

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <dvdread/nav_types.h>
#include "nav_types.h"
#ifdef __cplusplus
extern "C" {

View File

@ -30,7 +30,7 @@
*/
#include <inttypes.h>
#include <dvdread/ifo_types.h> // only dvd_time_t, vm_cmd_t and user_ops_t
#include "ifo_types.h" // only dvd_time_t, vm_cmd_t and user_ops_t
#undef ATTRIBUTE_PACKED