changeset 366:5b8539cacebf src

workaround wrong filesize indicated in the UDF; patch by unknown author posted by Alexander Roalter it
author nicodvb
date Tue, 27 May 2008 21:53:10 +0000
parents b19a644148a9
children 1274107d0eac
files dvdread/dvd_reader.c dvdread/dvd_reader.h dvdread/ifo_read.c
diffstat 3 files changed, 29 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/dvdread/dvd_reader.c	Thu May 22 20:29:08 2008 +0000
+++ b/dvdread/dvd_reader.c	Tue May 27 21:53:10 2008 +0000
@@ -1042,6 +1042,28 @@
     return offset;
 }
 
+int DVDFileSeekForce(dvd_file_t *dvd_file, int offset, int force_size)
+{
+    /* Check arguments. */
+    if( dvd_file == NULL || offset <= 0 )
+        return -1;
+
+    if( dvd_file->dvd->isImageFile ) {
+        if( force_size < 0 )
+            force_size = (offset - 1) / DVD_VIDEO_LB_LEN + 1;
+        if( dvd_file->filesize < force_size ) {
+            dvd_file->filesize = force_size;
+            fprintf(stderr, "libdvdread: Ignored size of file indicated in UDF.\n");
+        }
+    }
+
+    if( offset > dvd_file->filesize * DVD_VIDEO_LB_LEN )
+        return -1;
+
+    dvd_file->seek_pos = (uint32_t) offset;
+    return offset;
+}
+
 ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
 {
     unsigned char *secbuf_base, *secbuf;
@@ -1082,7 +1104,7 @@
     memcpy( data, &(secbuf[ seek_byte ]), byte_size );
     free( secbuf_base );
 
-    dvd_file->seek_pos += byte_size;
+    DVDFileSeekForce(dvd_file, dvd_file->seek_pos + byte_size, -1);
     return byte_size;
 }
 
--- a/dvdread/dvd_reader.h	Thu May 22 20:29:08 2008 +0000
+++ b/dvdread/dvd_reader.h	Tue May 27 21:53:10 2008 +0000
@@ -229,6 +229,8 @@
 int DVDUDFVolumeInfo( dvd_reader_t *, char *, unsigned int,
 		      unsigned char *, unsigned int );
 
+int DVDFileSeekForce( dvd_file_t *, int offset, int force_size);
+
 /**
  * Get the ISO9660 VolumeIdentifier and VolumeSetIdentifier
  *
--- a/dvdread/ifo_read.c	Thu May 22 20:29:08 2008 +0000
+++ b/dvdread/ifo_read.c	Tue May 27 21:53:10 2008 +0000
@@ -89,6 +89,9 @@
 static void ifoFree_PGC_COMMAND_TBL(pgc_command_tbl_t *cmd_tbl);
 static void ifoFree_PGCIT_internal(pgcit_t *pgcit);
 
+static inline int DVDFileSeekForce_( dvd_file_t *dvd_file, uint32_t offset, int force_size ) {
+  return (DVDFileSeekForce(dvd_file, (int)offset, force_size) == (int)offset);
+}
 
 static inline int DVDFileSeek_( dvd_file_t *dvd_file, uint32_t offset ) {
   return (DVDFileSeek(dvd_file, (int)offset) == (int)offset);
@@ -1689,7 +1692,7 @@
   unsigned int i;
   int info_length;
 
-  if(!DVDFileSeek_(ifofile->file, sector * DVD_BLOCK_LEN))
+  if(!DVDFileSeekForce_(ifofile->file, sector * DVD_BLOCK_LEN, sector))
     return 0;
 
   if(!(DVDReadBytes(ifofile->file, vobu_admap, VOBU_ADMAP_SIZE)))