summaryrefslogtreecommitdiff
path: root/src/input/libdvdnav/dvd_reader.c
diff options
context:
space:
mode:
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;
}