Mercurial > libdvdnav.hg
diff dvdread/dvd_reader.c @ 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 | eea1e72ea1dd |
children |
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; }