summaryrefslogtreecommitdiff
path: root/src/input/libdvdnav/dvd_reader.c
diff options
context:
space:
mode:
authorJames Courtier-Dutton <jcdutton@users.sourceforge.net>2003-04-29 21:55:46 +0000
committerJames Courtier-Dutton <jcdutton@users.sourceforge.net>2003-04-29 21:55:46 +0000
commitc226b5c184993b4dc09816e4da08a533b656f934 (patch)
tree548c51ffe6a46b5ee36aad927cd6fe9ded7b24fa /src/input/libdvdnav/dvd_reader.c
parenta1684eb4fdb2a9d9812d994f3a39904b15267905 (diff)
downloadxine-lib-c226b5c184993b4dc09816e4da08a533b656f934.tar.gz
xine-lib-c226b5c184993b4dc09816e4da08a533b656f934.tar.bz2
Update from libdvdnav
CVS patchset: 4712 CVS date: 2003/04/29 21:55:46
Diffstat (limited to 'src/input/libdvdnav/dvd_reader.c')
-rw-r--r--src/input/libdvdnav/dvd_reader.c46
1 files changed, 27 insertions, 19 deletions
diff --git a/src/input/libdvdnav/dvd_reader.c b/src/input/libdvdnav/dvd_reader.c
index fa9df2a34..8424e0740 100644
--- a/src/input/libdvdnav/dvd_reader.c
+++ b/src/input/libdvdnav/dvd_reader.c
@@ -314,29 +314,30 @@ dvd_reader_t *DVDOpen( const char *path )
#ifdef _MSC_VER
-#ifdef WIN32_CSS
/* Try to open libdvdcss or fall back to standard functions */
have_css = dvdinput_setup();
return DVDOpenImageFile( path, have_css );
-#else
- /* Under Win32, we only try to open image files */
- return DVDOpenImageFile( path, DVDInputSetup() );
-#endif
#else
+ /* Try to open libdvdcss or fall back to standard functions */
+ have_css = dvdinput_setup();
+
ret = stat( path, &fileinfo );
if( ret < 0 ) {
+
+ /* maybe "host:port" url? try opening it with acCeSS library */
+ if( strchr(path,':') ) {
+ return DVDOpenImageFile( path, have_css );
+ }
+
/* If we can't stat the file, give up */
fprintf( stderr, "libdvdread: Can't stat %s\n", path );
perror("");
return 0;
}
- /* Try to open libdvdcss or fall back to standard functions */
- have_css = dvdinput_setup();
-
/* First check if this is a block/char device or a file*/
if( S_ISBLK( fileinfo.st_mode ) ||
S_ISCHR( fileinfo.st_mode ) ||
@@ -953,7 +954,7 @@ int32_t DVDFileSeek( dvd_file_t *dvd_file, int32_t offset )
ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
{
- unsigned char *secbuf;
+ unsigned char *secbuf_base, *secbuf;
unsigned int numsec, seek_sector, seek_byte;
int ret;
@@ -967,8 +968,9 @@ ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
numsec = ( ( seek_byte + byte_size ) / DVD_VIDEO_LB_LEN ) +
( ( ( seek_byte + byte_size ) % DVD_VIDEO_LB_LEN ) ? 1 : 0 );
- secbuf = (unsigned char *) malloc( numsec * DVD_VIDEO_LB_LEN );
- if( !secbuf ) {
+ secbuf_base = (unsigned char *) malloc( numsec * DVD_VIDEO_LB_LEN + 2048 );
+ secbuf = (unsigned char *)(((int)secbuf_base & ~2047) + 2048);
+ if( !secbuf_base ) {
fprintf( stderr, "libdvdread: Can't allocate memory "
"for file read!\n" );
return 0;
@@ -983,12 +985,12 @@ ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
}
if( ret != (int) numsec ) {
- free( secbuf );
+ free( secbuf_base );
return ret < 0 ? ret : 0;
}
memcpy( data, &(secbuf[ seek_byte ]), byte_size );
- free( secbuf );
+ free( secbuf_base );
dvd_file->seek_pos += byte_size;
return byte_size;
@@ -1020,9 +1022,10 @@ int DVDDiscID( dvd_reader_t *dvd, unsigned char *discid )
if( dvd_file != NULL ) {
ssize_t bytes_read;
size_t file_size = dvd_file->filesize * DVD_VIDEO_LB_LEN;
- char *buffer = malloc( file_size );
+ char *buffer_base = malloc( file_size + 2048 );
+ char *buffer = (unsigned char *)(((int)buffer_base & ~2047) + 2048);
- if( buffer == NULL ) {
+ if( buffer_base == NULL ) {
fprintf( stderr, "libdvdread: DVDDiscId, failed to "
"allocate memory for file read!\n" );
return -1;
@@ -1032,13 +1035,14 @@ int DVDDiscID( dvd_reader_t *dvd, unsigned char *discid )
fprintf( stderr, "libdvdread: DVDDiscId read returned %d bytes"
", wanted %d\n", bytes_read, file_size );
DVDCloseFile( dvd_file );
+ free( buffer_base );
return -1;
}
md5_process_bytes( buffer, file_size, &ctx );
DVDCloseFile( dvd_file );
- free( buffer );
+ free( buffer_base );
}
}
md5_finish_ctx( &ctx, discid );
@@ -1051,7 +1055,7 @@ int DVDISOVolumeInfo( dvd_reader_t *dvd,
char *volid, unsigned int volid_size,
unsigned char *volsetid, unsigned int volsetid_size )
{
- unsigned char *buffer;
+ unsigned char *buffer, *buffer_base;
int ret;
/* Check arguments. */
@@ -1063,8 +1067,10 @@ int DVDISOVolumeInfo( dvd_reader_t *dvd,
return -1;
}
- buffer = malloc( DVD_VIDEO_LB_LEN );
- if( buffer == NULL ) {
+ buffer_base = malloc( DVD_VIDEO_LB_LEN + 2048 );
+ buffer = (unsigned char *)(((int)buffer_base & ~2047) + 2048);
+
+ if( buffer_base == NULL ) {
fprintf( stderr, "libdvdread: DVDISOVolumeInfo, failed to "
"allocate memory for file read!\n" );
return -1;
@@ -1074,6 +1080,7 @@ int DVDISOVolumeInfo( dvd_reader_t *dvd,
if( ret != 1 ) {
fprintf( stderr, "libdvdread: DVDISOVolumeInfo, failed to "
"read ISO9660 Primary Volume Descriptor!\n" );
+ free( buffer_base );
return -1;
}
@@ -1099,6 +1106,7 @@ int DVDISOVolumeInfo( dvd_reader_t *dvd,
}
memcpy(volsetid, &buffer[190], volsetid_size);
}
+ free( buffer_base );
return 0;
}