diff -Naur MPlayer-1.0pre4.orig/cfg-common.h MPlayer-1.0pre4/cfg-common.h
--- MPlayer-1.0pre4.orig/cfg-common.h	2004-04-26 01:53:41.000000000 -0700
+++ MPlayer-1.0pre4/cfg-common.h	2004-07-03 03:32:15.000000000 -0700
@@ -10,8 +10,10 @@
 // ------------------------- stream options --------------------
 
 #ifdef USE_STREAM_CACHE
-	{"cache", &stream_cache_size, CONF_TYPE_INT, CONF_RANGE, 4, 65536, NULL},
+	{"cache", &stream_cache_size, CONF_TYPE_INT, CONF_RANGE, 32, 262144, NULL},
 	{"nocache", &stream_cache_size, CONF_TYPE_FLAG, 0, 1, 0, NULL},
+	{"cache-min", &stream_cache_min_percent, CONF_TYPE_FLOAT, CONF_RANGE, 0, 99, NULL},
+	{"cache-prefill", &stream_cache_prefill_percent, CONF_TYPE_FLOAT, CONF_RANGE, 0, 99, NULL},
 #else
 	{"cache", "MPlayer was compiled WITHOUT cache2 support\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL},
 #endif
diff -Naur MPlayer-1.0pre4.orig/etc/example.conf MPlayer-1.0pre4/etc/example.conf
--- MPlayer-1.0pre4.orig/etc/example.conf	2004-01-13 01:55:40.000000000 -0800
+++ MPlayer-1.0pre4/etc/example.conf	2004-07-03 03:32:15.000000000 -0700
@@ -116,6 +116,8 @@
 			# etc)
 
 cache		= 8192	# use 8Mb input cache by default
+cache-min	= 20.0  # Prefill 20% of the cache before initially playing
+cache-prefill	= 5.0   # Prefill 5% of the cache before restarting playback if it empties
 
 # slang		= en	# DVD : display english subtitles if available
 # alang		= en	# DVD : play english audio tracks if available
diff -Naur MPlayer-1.0pre4.orig/libmpdemux/cache2.c MPlayer-1.0pre4/libmpdemux/cache2.c
--- MPlayer-1.0pre4.orig/libmpdemux/cache2.c	2003-06-09 05:15:45.000000000 -0700
+++ MPlayer-1.0pre4/libmpdemux/cache2.c	2004-07-05 14:49:03.441387677 -0700
@@ -33,6 +33,8 @@
 int stream_fill_buffer(stream_t *s);
 int stream_seek_long(stream_t *s,off_t pos);
 
+extern float stream_cache_min_percent;
+extern float stream_cache_prefill_percent;
 extern int mp_input_check_interrupt(int time);
 
 typedef struct {
@@ -207,7 +209,7 @@
 #endif
   s->fill_limit=8*sector;
   s->back_size=size/2;
-  s->prefill=size/20; // default: 5%
+  s->prefill=size * stream_cache_prefill_percent / 100.0;
   return s;
 }
 
@@ -265,7 +267,26 @@
     // wait until cache is filled at least prefill_init %
     mp_msg(MSGT_CACHE,MSGL_V,"CACHE_PRE_INIT: %d [%d] %d  pre:%d  eof:%d  \n",
 	s->min_filepos,s->read_filepos,s->max_filepos,min,s->eof);
-    while(s->read_filepos<s->min_filepos || s->max_filepos-s->read_filepos<min){
+
+    // The buffer is determined to be full in cache_fill() when this condition is true:
+    // s->buffer_size - (s->max_filepos - s->read_filepos) < s->fill_limit
+    // So we need to make sure that min does not go over s->buffer_size - s->fill_limit
+    // ie this needs to be always be true:
+    //     s->buffer_size - (data_in_buffer) >= s->fill_limit
+    // ==> data_in_buffer <= s->buffer_size - s->fill_limit
+    //
+    // So we need to make sure that our min is safe with this condition or else we
+    // will wait forever for cache_fill() to get to min.
+    if (min > s->buffer_size - s->fill_limit) {
+        min = s->buffer_size - s->fill_limit;
+    }
+
+    // Keep waiting for the buffer to fill while:
+    // We still want to read more: (s->max_filepos - s->read_filepos < min) || (s->read_filepos < s->min_filepos)
+    // There is data to read in the file: (!s->eof)
+    while( (s->max_filepos - s->read_filepos < min) || 
+           (s->read_filepos < s->min_filepos)) {
+
 	mp_msg(MSGT_CACHE,MSGL_STATUS,"\rCache fill: %5.2f%% (%d bytes)    ",
 	    100.0*(float)(s->max_filepos-s->read_filepos)/(float)(s->buffer_size),
 	    s->max_filepos-s->read_filepos
diff -Naur MPlayer-1.0pre4.orig/libmpdemux/demuxer.c MPlayer-1.0pre4/libmpdemux/demuxer.c
--- MPlayer-1.0pre4.orig/libmpdemux/demuxer.c	2004-04-17 09:46:40.000000000 -0700
+++ MPlayer-1.0pre4/libmpdemux/demuxer.c	2004-07-03 03:32:15.000000000 -0700
@@ -1374,6 +1374,9 @@
 
 extern int hr_mp3_seek;
 
+extern float stream_cache_min_percent;
+extern float stream_cache_prefill_percent;
+
 demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int dvdsub_id,char* filename){
   stream_t *as = NULL,*ss = NULL;
   demuxer_t *vd,*ad = NULL,*sd = NULL;
@@ -1386,8 +1389,8 @@
       return NULL;
     }
     if(audio_stream_cache) {
-      if(!stream_enable_cache(as,audio_stream_cache*1024,audio_stream_cache*1024/5,
-			      audio_stream_cache*1024/20)) {
+      if(!stream_enable_cache(as,audio_stream_cache*1024,audio_stream_cache*1024*(stream_cache_min_percent / 100.0),
+			      audio_stream_cache*1024*(stream_cache_prefill_percent / 100.0))) {
 	free_stream(as);
 	mp_msg(MSGT_DEMUXER,MSGL_ERR,"Can't enable audio stream cache\n");
 	return NULL;
diff -Naur MPlayer-1.0pre4.orig/mencoder.c MPlayer-1.0pre4/mencoder.c
--- MPlayer-1.0pre4.orig/mencoder.c	2004-04-17 09:46:40.000000000 -0700
+++ MPlayer-1.0pre4/mencoder.c	2004-07-03 03:32:15.000000000 -0700
@@ -100,6 +100,9 @@
 int stream_cache_size=-1;
 #ifdef USE_STREAM_CACHE
 extern int cache_fill_status;
+
+float stream_cache_min_percent=20.0;
+float stream_cache_prefill_percent=5.0;
 #else
 #define cache_fill_status 0
 #endif
diff -Naur MPlayer-1.0pre4.orig/mplayer.c MPlayer-1.0pre4/mplayer.c
--- MPlayer-1.0pre4.orig/mplayer.c	2004-04-26 14:15:13.000000000 -0700
+++ MPlayer-1.0pre4/mplayer.c	2004-07-03 03:32:15.000000000 -0700
@@ -249,6 +249,9 @@
        int stream_cache_size=-1;
 #ifdef USE_STREAM_CACHE
 extern int cache_fill_status;
+
+float stream_cache_min_percent=20.0;
+float stream_cache_prefill_percent=5.0;
 #else
 #define cache_fill_status 0
 #endif
@@ -1368,7 +1371,7 @@
 #endif
 if(stream_cache_size>0){
   current_module="enable_cache";
-  if(!stream_enable_cache(stream,stream_cache_size*1024,stream_cache_size*1024/5,stream_cache_size*1024/20))
+  if(!stream_enable_cache(stream,stream_cache_size*1024,stream_cache_size*1024*(stream_cache_min_percent / 100.0),stream_cache_size*1024*(stream_cache_prefill_percent / 100.0)))
     if((eof = libmpdemux_was_interrupted(PT_NEXT_ENTRY))) goto goto_next_file;
 }