diff options
| author | Bastian Blank <waldi@debian.org> | 2008-03-02 22:48:39 +0000 |
|---|---|---|
| committer | Bastian Blank <waldi@debian.org> | 2008-03-02 22:48:39 +0000 |
| commit | 431033df2571df5bdd1ec1253cf04921b6d01368 (patch) | |
| tree | 020cd673ba4cbb87c0784f53c3ed0bcd787546e6 /src/input/libdvdnav/dvd_reader.c | |
| parent | bfcacf9ccf8331baf47a7db55017d0ca5e273080 (diff) | |
| download | xine-lib-431033df2571df5bdd1ec1253cf04921b6d01368.tar.gz xine-lib-431033df2571df5bdd1ec1253cf04921b6d01368.tar.bz2 | |
libdvdread - Uses UDF provided length as authoritative
libdvdread uses the file length provided by the UDF fs of the title set IFO
files authoritative. I got a DVD which have parts of this file mapped outside
of the provided file size and according to my memory only the offsets in the
files matters in the standard.
This patch adjusts the internal knowledge of the filesize accordingly and at
least allows mplayer to play the dvd.
(Imported from Debian libdvdread 0.9.7-8)
Diffstat (limited to 'src/input/libdvdnav/dvd_reader.c')
| -rw-r--r-- | src/input/libdvdnav/dvd_reader.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/input/libdvdnav/dvd_reader.c b/src/input/libdvdnav/dvd_reader.c index 200a1dbec..eff1977fc 100644 --- a/src/input/libdvdnav/dvd_reader.c +++ b/src/input/libdvdnav/dvd_reader.c @@ -1037,6 +1037,28 @@ int32_t DVDFileSeek( dvd_file_t *dvd_file, int32_t offset ) return offset; } +int32_t 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 UDF provided size of file.\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; @@ -1077,7 +1099,7 @@ ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size ) 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; } |
