changeset 31169:ac84149bbdaf

Retry reading even if we hit eof before. This allows playing growing files even with a large cache.
author reimar
date Wed, 26 May 2010 18:23:43 +0000
parents a0e901aedb04
children c720f2bd4765
files stream/cache2.c stream/stream.c
diffstat 2 files changed, 6 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/stream/cache2.c	Wed May 26 18:01:38 2010 +0000
+++ b/stream/cache2.c	Wed May 26 18:23:43 2010 +0000
@@ -225,7 +225,7 @@
   //memcpy(&s->buffer[pos],s->stream->buffer,len); // avoid this extra copy!
   // ....
   len=stream_read(s->stream,&s->buffer[pos],space);
-  if(!len) s->eof=1;
+  s->eof= !len;
 
   s->max_filepos+=len;
   if(pos+len>=s->buffer_size){
@@ -477,7 +477,6 @@
 
 int cache_stream_fill_buffer(stream_t *s){
   int len;
-  if(s->eof){ s->buf_pos=s->buf_len=0; return 0; }
   if(!s->cache_pid) return stream_fill_buffer(s);
 
 //  cache_stats(s->cache_data);
@@ -488,6 +487,7 @@
   //printf("cache_stream_fill_buffer->read -> %d\n",len);
 
   if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; }
+  s->eof=0;
   s->buf_pos=0;
   s->buf_len=len;
   s->pos+=len;
--- a/stream/stream.c	Wed May 26 18:01:38 2010 +0000
+++ b/stream/stream.c	Wed May 26 18:23:43 2010 +0000
@@ -263,7 +263,7 @@
 
 int stream_fill_buffer(stream_t *s){
   int len;
-  if (/*s->fd == NULL ||*/ s->eof) { return 0; }
+  // we will retry even if we already reached EOF previously.
   switch(s->type){
   case STREAMTYPE_STREAM:
 #ifdef CONFIG_NETWORK
@@ -285,6 +285,9 @@
     len= s->fill_buffer ? s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE) : 0;
   }
   if(len<=0){ s->eof=1; return 0; }
+  // When reading succeeded we are obviously not at eof.
+  // This e.g. avoids issues with eof getting stuck when lavf seeks in MPEG-TS
+  s->eof=0;
   s->buf_pos=0;
   s->buf_len=len;
   s->pos+=len;