changeset 3562:e84d6c8ff59b

initial precaching
author arpi
date Mon, 17 Dec 2001 16:55:40 +0000
parents 40060e4770f3
children 3d73514ddefc
files libmpdemux/cache2.c libmpdemux/stream.h libmpdemux/test.c
diffstat 3 files changed, 27 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/cache2.c	Mon Dec 17 16:51:34 2001 +0000
+++ b/libmpdemux/cache2.c	Mon Dec 17 16:55:40 2001 +0000
@@ -8,6 +8,7 @@
 
 #define READ_USLEEP_TIME 10000
 #define FILL_USLEEP_TIME 50000
+#define PREFILL_USLEEP_TIME 200000
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -31,6 +32,7 @@
   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 @@
   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 @@
   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_filepos<s->min_filepos || s->max_filepos-s->read_filepos<min){
+	mp_msg(MSGT_CACHE,MSGL_STATUS,"\rCache fill: %5.2f%% (%d bytes)    ",
+	    (float)(s->max_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);
--- a/libmpdemux/stream.h	Mon Dec 17 16:51:34 2001 +0000
+++ b/libmpdemux/stream.h	Mon Dec 17 16:55:40 2001 +0000
@@ -42,7 +42,7 @@
 } 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)
--- a/libmpdemux/test.c	Mon Dec 17 16:51:34 2001 +0000
+++ b/libmpdemux/test.c	Mon Dec 17 16:55:40 2001 +0000
@@ -46,7 +46,7 @@
 
   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){