From 3db7b73bd93e1d41a8bfdb65df0c8201a3da8a29 Mon Sep 17 00:00:00 2001 From: arpi Date: Mon, 17 Dec 2001 16:55:40 +0000 Subject: [PATCH] initial precaching git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3563 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/cache2.c | 31 +++++++++++++++++++++++++------ libmpdemux/stream.h | 2 +- libmpdemux/test.c | 2 +- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/libmpdemux/cache2.c b/libmpdemux/cache2.c index 82358901a8..09170f8073 100644 --- a/libmpdemux/cache2.c +++ b/libmpdemux/cache2.c @@ -8,6 +8,7 @@ #define READ_USLEEP_TIME 10000 #define FILL_USLEEP_TIME 50000 +#define PREFILL_USLEEP_TIME 200000 #include #include @@ -31,6 +32,7 @@ typedef struct { int sector_size; // size of a single sector (2048/2324) int back_size; // we should keep back_size amount of old bytes for backward seek int fill_limit; // we should fill buffer only if space>=fill_limit + int prefill; // we should fill min prefill bytes if cache gets empty // filler's pointers: int eof; off_t min_filepos; // buffer contain only a part of the file, from min-max pos @@ -183,6 +185,7 @@ cache_vars_t* cache_init(int size,int sector){ s->buffer=shmem_alloc(s->buffer_size); s->fill_limit=8*sector; s->back_size=size/2; + s->prefill=size/20; // default: 5% return s; } @@ -191,15 +194,31 @@ static void exit_sighandler(int x){ exit(0); } -void stream_enable_cache(stream_t *s,int size){ - int ss=(s->type==STREAMTYPE_VCD)?VCD_SECTOR_DATA:STREAM_BUFFER_SIZE; - s->cache_data=cache_init(size,ss); - ((cache_vars_t*)s->cache_data)->stream=s; // callback - if((s->cache_pid=fork())) return; // parent exits +void stream_enable_cache(stream_t *stream,int size,float prefill_init,float prefill){ + int ss=(stream->type==STREAMTYPE_VCD)?VCD_SECTOR_DATA:STREAM_BUFFER_SIZE; + int min=prefill_init*size; + cache_vars_t* s=cache_init(size,ss); + stream->cache_data=s; + s->stream=stream; // callback + s->prefill=size*prefill; + + if((stream->cache_pid=fork())){ + // wait until cache is filled at least prefill_init % + while(s->read_fileposmin_filepos || s->max_filepos-s->read_fileposmax_filepos-s->read_filepos)/(float)(s->buffer_size), + s->max_filepos-s->read_filepos + ); + if(s->eof) break; // file is smaller than prefill size + usleep(PREFILL_USLEEP_TIME); + } + return; // parent exits + } + // cache thread mainloop: signal(SIGTERM,exit_sighandler); // kill while(1){ - if(!cache_fill(s->cache_data)){ + if(!cache_fill(s)){ usleep(FILL_USLEEP_TIME); // idle } // cache_stats(s->cache_data); diff --git a/libmpdemux/stream.h b/libmpdemux/stream.h index 13541689e5..3af906337a 100644 --- a/libmpdemux/stream.h +++ b/libmpdemux/stream.h @@ -42,7 +42,7 @@ typedef struct { } stream_t; #ifdef USE_STREAM_CACHE -void stream_enable_cache(stream_t *s,int size); +void stream_enable_cache(stream_t *stream,int size,float prefill_init,float prefill); #else // no cache #define cache_stream_fill_buffer(x) stream_fill_buffer(x) diff --git a/libmpdemux/test.c b/libmpdemux/test.c index e20c9d47c6..8e6d375d3e 100644 --- a/libmpdemux/test.c +++ b/libmpdemux/test.c @@ -46,7 +46,7 @@ int file_format=DEMUXER_TYPE_UNKNOWN; printf("success: format: %d data: 0x%X - 0x%X\n",file_format, (int)(stream->start_pos),(int)(stream->end_pos)); - stream_enable_cache(stream,2048*1024); + stream_enable_cache(stream,2048*1024,0,0); demuxer=demux_open(stream,file_format,-1,-1,-1); if(!demuxer){