summaryrefslogtreecommitdiff
path: root/src/input/libdvdnav/dvd_reader.c
diff options
context:
space:
mode:
authorDarren Salt <linux@youmustbejoking.demon.co.uk>2008-03-18 00:55:31 +0000
committerDarren Salt <linux@youmustbejoking.demon.co.uk>2008-03-18 00:55:31 +0000
commit9a0b055e96c2f68b46787a17cb3c314f6cefc95d (patch)
tree917f18d962ae7c4dee0aab36c11347bd294ab40d /src/input/libdvdnav/dvd_reader.c
parentcdec7f82959eb05d1c3e4632af9d1e54bcc4c3bb (diff)
parent431033df2571df5bdd1ec1253cf04921b6d01368 (diff)
downloadxine-lib-9a0b055e96c2f68b46787a17cb3c314f6cefc95d.tar.gz
xine-lib-9a0b055e96c2f68b46787a17cb3c314f6cefc95d.tar.bz2
Merge from 1.1.
Diffstat (limited to 'src/input/libdvdnav/dvd_reader.c')
-rw-r--r--src/input/libdvdnav/dvd_reader.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/input/libdvdnav/dvd_reader.c b/src/input/libdvdnav/dvd_reader.c
index c15a5c3f5..4144b9133 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;
}