diff options
Diffstat (limited to 'src/input/libdvdnav/read_cache.c')
-rw-r--r-- | src/input/libdvdnav/read_cache.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/input/libdvdnav/read_cache.c b/src/input/libdvdnav/read_cache.c index 1d6e68727..72ff2d801 100644 --- a/src/input/libdvdnav/read_cache.c +++ b/src/input/libdvdnav/read_cache.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: read_cache.c,v 1.1 2002/08/08 17:49:21 richwareham Exp $ + * $Id: read_cache.c,v 1.2 2002/08/19 17:17:00 mroi Exp $ * */ @@ -69,8 +69,12 @@ struct read_cache_s { #define READ_CACHE_CHUNKS 10 +/* all cache chunks must be memory aligned to allow use of raw devices */ +#define ALIGNMENT 2048 + typedef struct read_cache_chunk_s { uint8_t *cache_buffer; + uint8_t *cache_buffer_base; /* used in malloc and free for alignment */ int32_t cache_start_sector; /* -1 means cache invalid */ size_t cache_block_count; size_t cache_malloc_size; @@ -362,7 +366,7 @@ void dvdnav_read_cache_free(read_cache_t* self) { self->freeing = 1; for (i = 0; i < READ_CACHE_CHUNKS; i++) if (self->chunk[i].cache_buffer && self->chunk[i].usage_count == 0) { - free(self->chunk[i].cache_buffer); + free(self->chunk[i].cache_buffer_base); self->chunk[i].cache_buffer = NULL; } pthread_mutex_unlock(&self->lock); @@ -432,8 +436,10 @@ void dvdnav_pre_cache_blocks(read_cache_t *self, int sector, size_t block_count) (use == -1 || self->chunk[use].cache_malloc_size < self->chunk[i].cache_malloc_size)) use = i; if (use >= 0) { - self->chunk[use].cache_buffer = realloc(self->chunk[use].cache_buffer, - block_count * DVD_VIDEO_LB_LEN); + self->chunk[use].cache_buffer_base = realloc(self->chunk[use].cache_buffer_base, + block_count * DVD_VIDEO_LB_LEN + ALIGNMENT); + self->chunk[use].cache_buffer = + (uint8_t *)(((int)self->chunk[use].cache_buffer_base & ~(ALIGNMENT - 1)) + ALIGNMENT); dprintf("pre_cache DVD read realloc happened\n"); self->chunk[use].cache_malloc_size = block_count; } else { @@ -448,7 +454,10 @@ void dvdnav_pre_cache_blocks(read_cache_t *self, int sector, size_t block_count) * Some DVDs I have seen venture to 450 blocks. * This is so that fewer realloc's happen if at all. */ - self->chunk[i].cache_buffer = malloc((block_count > 500 ? block_count : 500) * DVD_VIDEO_LB_LEN); + self->chunk[i].cache_buffer_base = + malloc((block_count > 500 ? block_count : 500) * DVD_VIDEO_LB_LEN + ALIGNMENT); + self->chunk[i].cache_buffer = + (uint8_t *)(((int)self->chunk[i].cache_buffer_base & ~(ALIGNMENT - 1)) + ALIGNMENT); self->chunk[i].cache_malloc_size = block_count > 500 ? block_count : 500; dprintf("pre_cache DVD read malloc %d blocks\n", (block_count > 500 ? block_count : 500 )); |