From b197c3b0d6bfcf3daae4a7b1cad415b1acea28f6 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Sun, 16 May 2010 14:41:00 +0000 Subject: MPEGPlayer: Add a second layer of caching to help speed up byte-wise scanning and seeking a bit. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26088 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/mpegplayer/disk_buf.h | 42 +++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 19 deletions(-) (limited to 'apps/plugins/mpegplayer/disk_buf.h') diff --git a/apps/plugins/mpegplayer/disk_buf.h b/apps/plugins/mpegplayer/disk_buf.h index e16939a92e..a5a10cfe69 100644 --- a/apps/plugins/mpegplayer/disk_buf.h +++ b/apps/plugins/mpegplayer/disk_buf.h @@ -23,6 +23,10 @@ #ifndef DISK_BUF_H #define DISK_BUF_H +#ifndef OFF_T_MAX +#define OFF_T_MAX (~(off_t)1 << (sizeof (off_t)*8 - 1)) +#endif + #define DISK_BUF_PAGE_SHIFT 15 /* 32KB cache lines */ #define DISK_BUF_PAGE_SIZE (1 << DISK_BUF_PAGE_SHIFT) #define DISK_BUF_PAGE_MASK (DISK_BUF_PAGE_SIZE-1) @@ -58,6 +62,19 @@ struct dbuf_range int pg_start; }; +#define DISK_BUF_L2_CACHE_SHIFT 6 +#define DISK_BUF_L2_CACHE_SIZE (1 << DISK_BUF_L2_CACHE_SHIFT) +#define DISK_BUF_L2_CACHE_MASK (DISK_BUF_L2_CACHE_SIZE-1) + +struct dbuf_l2_cache +{ + off_t addr; /* L2 file offset */ + size_t size; /* Real size */ + uint8_t data[DISK_BUF_L2_CACHE_SIZE*2]; /* Local data and guard */ +}; + +void dbuf_l2_init(struct dbuf_l2_cache *l2_p); + /* This object is an extension of the stream manager and handles some * playback events as well as buffering */ struct disk_buf @@ -88,20 +105,8 @@ struct disk_buf extern struct disk_buf disk_buf SHAREDBSS_ATTR; -static inline bool disk_buf_is_data_ready(struct stream_hdr *sh, - ssize_t margin) -{ - /* Data window available? */ - off_t right = sh->win_right; - - /* Margins past end-of-file can still return true */ - if (right > disk_buf.filesize - margin) - right = disk_buf.filesize - margin; - - return sh->win_left >= disk_buf.win_left && - right + margin <= disk_buf.win_right; -} - +struct stream_hdr; +bool disk_buf_is_data_ready(struct stream_hdr *sh, ssize_t margin); bool disk_buf_init(void); void disk_buf_exit(void); @@ -111,11 +116,10 @@ static inline int disk_buf_status(void) int disk_buf_open(const char *filename); void disk_buf_close(void); -ssize_t _disk_buf_getbuffer(size_t size, void **pp, void **pwrap, - size_t *sizewrap); -#define disk_buf_getbuffer(size, pp, pwrap, sizewrap) \ - _disk_buf_getbuffer((size), PUN_PTR(void **, (pp)), \ - PUN_PTR(void **, (pwrap)), (sizewrap)) +ssize_t disk_buf_getbuffer(size_t size, void **pp, void **pwrap, + size_t *sizewrap); +ssize_t disk_buf_getbuffer_l2(struct dbuf_l2_cache *l2, + size_t size, void **pp); ssize_t disk_buf_read(void *buffer, size_t size); ssize_t disk_buf_lseek(off_t offset, int whence); -- cgit v1.2.3