From bdfcf94f2e839d3e87dc35e00495ffa573253c12 Mon Sep 17 00:00:00 2001 From: Michael Roitzsch Date: Mon, 19 Aug 2002 17:21:00 +0000 Subject: align reads in memory to allow use of raw devices CVS patchset: 2484 CVS date: 2002/08/19 17:21:00 --- src/input/libdvdread/diff_against_cvs.patch | 80 +++++++++++++++++++++++++++++ src/input/libdvdread/dvd_reader.c | 9 ++-- src/input/libdvdread/dvd_udf.c | 14 +++-- 3 files changed, 95 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/input/libdvdread/diff_against_cvs.patch b/src/input/libdvdread/diff_against_cvs.patch index 44ebbe4a6..237f6753c 100644 --- a/src/input/libdvdread/diff_against_cvs.patch +++ b/src/input/libdvdread/diff_against_cvs.patch @@ -120,3 +120,83 @@ #undef ATTRIBUTE_PACKED +--- src/input/libdvdread/dvd_reader.c Sun May 19 17:48:41 2002 ++++ src/input/libdvdread/dvd_reader.c Mon Aug 19 18:09:46 2002 +@@ -857,7 +857,7 @@ + + ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size ) + { +- unsigned char *secbuf; ++ unsigned char *secbuf_base, *secbuf; + unsigned int numsec, seek_sector, seek_byte; + int ret; + +@@ -865,7 +865,8 @@ + seek_byte = dvd_file->seek_pos % DVD_VIDEO_LB_LEN; + + numsec = ( ( seek_byte + byte_size ) / DVD_VIDEO_LB_LEN ) + 1; +- secbuf = (unsigned char *) malloc( numsec * DVD_VIDEO_LB_LEN ); ++ secbuf_base = (unsigned char *) malloc( numsec * DVD_VIDEO_LB_LEN + 2048 ); ++ secbuf = (unsigned char *)(((int)secbuf_base & ~2047) + 2048); + if( !secbuf ) { + fprintf( stderr, "libdvdread: Can't allocate memory " + "for file read!\n" ); +@@ -881,12 +882,12 @@ + } + + if( ret != (int) numsec ) { +- free( secbuf ); ++ free( secbuf_base ); + return ret < 0 ? ret : 0; + } + + memcpy( data, &(secbuf[ seek_byte ]), byte_size ); +- free( secbuf ); ++ free( secbuf_base ); + + dvd_file->seek_pos += byte_size; + return byte_size; +--- src/input/libdvdread/dvd_udf.c Mon May 6 22:16:31 2002 ++++ src/input/libdvdread/dvd_udf.c Mon Aug 19 18:11:32 2002 +@@ -264,7 +264,8 @@ + static int UDFMapICB( dvd_reader_t *device, struct AD ICB, uint8_t *FileType, + struct Partition *partition, struct AD *File ) + { +- uint8_t LogBlock[DVD_VIDEO_LB_LEN]; ++ uint8_t LogBlock_base[DVD_VIDEO_LB_LEN + 2048]; ++ uint8_t *LogBlock = (uint8_t *)(((int)LogBlock_base & ~2047) + 2048); + uint32_t lbnum; + uint16_t TagID; + +@@ -296,7 +297,8 @@ + struct Partition *partition, struct AD *FileICB ) + { + char filename[ MAX_UDF_FILE_NAME_LEN ]; +- uint8_t directory[ 2 * DVD_VIDEO_LB_LEN ]; ++ uint8_t directory_base[ 2 * DVD_VIDEO_LB_LEN + 2048]; ++ uint8_t *directory = (uint8_t *)(((int)directory_base & ~2047) + 2048); + uint32_t lbnum; + uint16_t TagID; + uint8_t filechar; +@@ -342,7 +344,10 @@ + static int UDFFindPartition( dvd_reader_t *device, int partnum, + struct Partition *part ) + { +- uint8_t LogBlock[ DVD_VIDEO_LB_LEN ], Anchor[ DVD_VIDEO_LB_LEN ]; ++ uint8_t LogBlock_base[ DVD_VIDEO_LB_LEN + 2048 ]; ++ uint8_t *LogBlock = (uint8_t *)(((int)LogBlock_base & ~2047) + 2048); ++ uint8_t Anchor_base[ DVD_VIDEO_LB_LEN + 2048 ]; ++ uint8_t *Anchor = (uint8_t *)(((int)Anchor_base & ~2047) + 2048); + uint32_t lbnum, MVDS_location, MVDS_length; + uint16_t TagID; + uint32_t lastsector; +@@ -434,7 +439,8 @@ + uint32_t UDFFindFile( dvd_reader_t *device, char *filename, + uint32_t *filesize ) + { +- uint8_t LogBlock[ DVD_VIDEO_LB_LEN ]; ++ uint8_t LogBlock_base[ DVD_VIDEO_LB_LEN + 2048 ]; ++ uint8_t *LogBlock = (uint8_t *)(((int)LogBlock_base & ~2047) + 2048); + uint32_t lbnum; + uint16_t TagID; + struct Partition partition; diff --git a/src/input/libdvdread/dvd_reader.c b/src/input/libdvdread/dvd_reader.c index b296a49de..0ec6fb24d 100644 --- a/src/input/libdvdread/dvd_reader.c +++ b/src/input/libdvdread/dvd_reader.c @@ -857,7 +857,7 @@ int32_t DVDFileSeek( dvd_file_t *dvd_file, int32_t offset ) ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size ) { - unsigned char *secbuf; + unsigned char *secbuf_base, *secbuf; unsigned int numsec, seek_sector, seek_byte; int ret; @@ -865,7 +865,8 @@ ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size ) seek_byte = dvd_file->seek_pos % DVD_VIDEO_LB_LEN; numsec = ( ( seek_byte + byte_size ) / DVD_VIDEO_LB_LEN ) + 1; - secbuf = (unsigned char *) malloc( numsec * DVD_VIDEO_LB_LEN ); + secbuf_base = (unsigned char *) malloc( numsec * DVD_VIDEO_LB_LEN + 2048 ); + secbuf = (unsigned char *)(((int)secbuf_base & ~2047) + 2048); if( !secbuf ) { fprintf( stderr, "libdvdread: Can't allocate memory " "for file read!\n" ); @@ -881,12 +882,12 @@ ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size ) } if( ret != (int) numsec ) { - free( secbuf ); + free( secbuf_base ); return ret < 0 ? ret : 0; } memcpy( data, &(secbuf[ seek_byte ]), byte_size ); - free( secbuf ); + free( secbuf_base ); dvd_file->seek_pos += byte_size; return byte_size; diff --git a/src/input/libdvdread/dvd_udf.c b/src/input/libdvdread/dvd_udf.c index 1cd2a0d2f..996fc87cc 100644 --- a/src/input/libdvdread/dvd_udf.c +++ b/src/input/libdvdread/dvd_udf.c @@ -264,7 +264,8 @@ static int UDFFileIdentifier( uint8_t *data, uint8_t *FileCharacteristics, static int UDFMapICB( dvd_reader_t *device, struct AD ICB, uint8_t *FileType, struct Partition *partition, struct AD *File ) { - uint8_t LogBlock[DVD_VIDEO_LB_LEN]; + uint8_t LogBlock_base[DVD_VIDEO_LB_LEN + 2048]; + uint8_t *LogBlock = (uint8_t *)(((int)LogBlock_base & ~2047) + 2048); uint32_t lbnum; uint16_t TagID; @@ -296,7 +297,8 @@ static int UDFScanDir( dvd_reader_t *device, struct AD Dir, char *FileName, struct Partition *partition, struct AD *FileICB ) { char filename[ MAX_UDF_FILE_NAME_LEN ]; - uint8_t directory[ 2 * DVD_VIDEO_LB_LEN ]; + uint8_t directory_base[ 2 * DVD_VIDEO_LB_LEN + 2048]; + uint8_t *directory = (uint8_t *)(((int)directory_base & ~2047) + 2048); uint32_t lbnum; uint16_t TagID; uint8_t filechar; @@ -342,7 +344,10 @@ static int UDFScanDir( dvd_reader_t *device, struct AD Dir, char *FileName, static int UDFFindPartition( dvd_reader_t *device, int partnum, struct Partition *part ) { - uint8_t LogBlock[ DVD_VIDEO_LB_LEN ], Anchor[ DVD_VIDEO_LB_LEN ]; + uint8_t LogBlock_base[ DVD_VIDEO_LB_LEN + 2048 ]; + uint8_t *LogBlock = (uint8_t *)(((int)LogBlock_base & ~2047) + 2048); + uint8_t Anchor_base[ DVD_VIDEO_LB_LEN + 2048 ]; + uint8_t *Anchor = (uint8_t *)(((int)Anchor_base & ~2047) + 2048); uint32_t lbnum, MVDS_location, MVDS_length; uint16_t TagID; uint32_t lastsector; @@ -434,7 +439,8 @@ static int UDFFindPartition( dvd_reader_t *device, int partnum, uint32_t UDFFindFile( dvd_reader_t *device, char *filename, uint32_t *filesize ) { - uint8_t LogBlock[ DVD_VIDEO_LB_LEN ]; + uint8_t LogBlock_base[ DVD_VIDEO_LB_LEN + 2048 ]; + uint8_t *LogBlock = (uint8_t *)(((int)LogBlock_base & ~2047) + 2048); uint32_t lbnum; uint16_t TagID; struct Partition partition; -- cgit v1.2.3