# HG changeset patch # User jcdutton # Date 1025012231 0 # Node ID 7bf97b8922b4036ba0af1c4427e79e25a01afcaa # Parent c50cb59dbb193966d7336d7ed179795f1f53ed60 Revert back to old read_cache method. Some new optimizations added to the old read_cache method, thus reducing the amount of calls to read blocks from the DVD device. diff -r c50cb59dbb19 -r 7bf97b8922b4 dvdnav.c --- a/dvdnav.c Sat Jun 15 02:10:18 2002 +0000 +++ b/dvdnav.c Tue Jun 25 13:37:11 2002 +0000 @@ -741,7 +741,8 @@ /* Perform the jump if necessary (this is always a * VOBU boundary). */ - result = DVDReadBlocks(this->file, this->vobu.vobu_start + this->vobu.vobu_next, 1, buf); + //result = DVDReadBlocks(this->file, this->vobu.vobu_start + this->vobu.vobu_next, 1, buf); + result = dvdnav_read_cache_block(this->cache, this->vobu.vobu_start + this->vobu.vobu_next, 1, buf); if(result <= 0) { printerr("Error reading NAV packet."); @@ -761,7 +762,15 @@ * This is so RSM resumes to the VOBU level and not just the CELL level. * This should be implemented with a new Public API call. */ - dvdnav_pre_cache_blocks(this->cache, this->vobu.vobu_start+1, this->vobu.vobu_length); + /* We cache one past the end of the VOBU, + * in the hope it might catch the next NAV packet as well. + * This reduces the amount of read commands sent to the DVD device. + * A cache miss will only happen for 3 reasons. + * 1) Seeking + * 2) Menu change + * 3) The next VOBU does not immeadiately follow the current one. E.g. Multi Angles, ILVU. + */ + dvdnav_pre_cache_blocks(this->cache, this->vobu.vobu_start+1, this->vobu.vobu_length+1); /* Successfully got a NAV packet */ (*event) = DVDNAV_NAV_PACKET; @@ -931,6 +940,10 @@ /* * $Log$ + * Revision 1.22 2002/06/25 13:37:11 jcdutton + * Revert back to old read_cache method. + * Some new optimizations added to the old read_cache method, thus reducing the amount of calls to read blocks from the DVD device. + * * Revision 1.21 2002/06/06 15:03:09 richwareham * Biiiiiiig change to let doxygen generate some docs for the library. Note that I'm in no way sure that the autoconf stuff plays nice. * diff -r c50cb59dbb19 -r 7bf97b8922b4 read_cache.c --- a/read_cache.c Sat Jun 15 02:10:18 2002 +0000 +++ b/read_cache.c Tue Jun 25 13:37:11 2002 +0000 @@ -30,7 +30,8 @@ #include /* Read-ahead cache structure. */ -#if _MULTITHREAD_ +#if 0 +/* #if _MULTITHREAD_ */ /* For the multithreaded cache, the cache is a ring buffer + writing * thread that continuously reads data into the buffer until it is @@ -73,16 +74,17 @@ }; #endif -#if _MULTITHREAD_ - -#define _MT_TRACE 0 +#define _MT_TRACE 1 #if _MT_TRACE -#define ddprintf(fmt, args...) fprintf(stderr, __FUNCTION__ ": " fmt, ##args); +#define dprintf(fmt, args...) fprintf(stderr, "%s: " fmt, __FUNCTION__, ##args); #else -#define sdprintf(fmt, args...) /* Nowt */ +#define dprintf(fmt, args...) /* Nowt */ #endif +#if 0 +/* #if _MULTITHREAD_ */ + void * read_cache_read_thread (void * this_gen) { int cont = 1; int32_t diff, start; @@ -387,12 +389,12 @@ return DVD_VIDEO_LB_LEN; } } - } else { - result = DVDReadBlocks( self->dvd_self->file, sector, block_count, buf); - return result; + //} else { + // result = DVDReadBlocks( self->dvd_self->file, sector, block_count, buf); + // return result; } - dprintf("DVD read cache miss! sector=%d, start=%d\n", sector, self->cache_start_sector); + dprintf("DVD read cache miss! sector=%d, start=%d, end=%d\n", sector, self->cache_start_sector, self->cache_block_count + self->cache_start_sector); result = DVDReadBlocks( self->dvd_self->file, sector, block_count, buf); return result; }