# HG changeset patch # User nicodvb # Date 1211925190 0 # Node ID 5b8539cacebfbf3414d0d8d05d64f4a16ba10ffc # Parent b19a644148a92764b7a889bbfabd423cb31f4759 workaround wrong filesize indicated in the UDF; patch by unknown author posted by Alexander Roalter it diff -r b19a644148a9 -r 5b8539cacebf dvdread/dvd_reader.c --- 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; } diff -r b19a644148a9 -r 5b8539cacebf dvdread/dvd_reader.h --- 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 * diff -r b19a644148a9 -r 5b8539cacebf dvdread/ifo_read.c --- 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)))