changeset 26833:77003eb2d9a8

Add basic support for stream controls with cache enabled.
author reimar
date Sat, 24 May 2008 07:48:35 +0000
parents 6af954f69fe4
children aadfce1c25c8
files stream/cache2.c stream/cache2.h stream/stream.c stream/stream_dvd.c
diffstat 4 files changed, 83 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/stream/cache2.c	Sat May 24 07:47:11 2008 +0000
+++ b/stream/cache2.c	Sat May 24 07:48:35 2008 +0000
@@ -7,6 +7,7 @@
 #define READ_USLEEP_TIME 10000
 #define FILL_USLEEP_TIME 50000
 #define PREFILL_SLEEP_TIME 200
+#define CONTROL_SLEEP_TIME 0
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -57,6 +58,11 @@
 //  int fifo_flag;  // 1 if we should use FIFO to notice cache about buffer reads.
   // callback
   stream_t* stream;
+  volatile int control;
+  volatile unsigned control_uint_arg;
+  volatile double control_double_arg;
+  volatile int control_res;
+  volatile off_t control_new_pos;
 } cache_vars_t;
 
 static int min_fill=0;
@@ -191,6 +197,31 @@
   
 }
 
+static void cache_execute_control(cache_vars_t *s) {
+  if (s->control == -1) return;
+  switch (s->control) {
+    case STREAM_CTRL_GET_TIME_LENGTH:
+    case STREAM_CTRL_GET_CURRENT_TIME:
+    case STREAM_CTRL_SEEK_TO_TIME:
+    case STREAM_CTRL_GET_ASPECT_RATIO:
+      s->control_res = s->stream->control(s->stream, s->control, &s->control_double_arg);
+      break;
+    case STREAM_CTRL_SEEK_TO_CHAPTER:
+    case STREAM_CTRL_GET_NUM_CHAPTERS:
+    case STREAM_CTRL_GET_CURRENT_CHAPTER:
+    case STREAM_CTRL_GET_NUM_ANGLES:
+    case STREAM_CTRL_GET_ANGLE:
+    case STREAM_CTRL_SET_ANGLE:
+      s->control_res = s->stream->control(s->stream, s->control, &s->control_uint_arg);
+      break;
+    default:
+      s->control_res = STREAM_UNSUPPORTED;
+      break;
+  }
+  s->control_new_pos = s->stream->pos;
+  s->control = -1;
+}
+
 cache_vars_t* cache_init(int size,int sector){
   int num;
 #if !defined(WIN32) && !defined(__OS2__)
@@ -331,6 +362,7 @@
     if(!cache_fill((cache_vars_t*)s)){
 	 usec_sleep(FILL_USLEEP_TIME); // idle
     }
+    cache_execute_control((cache_vars_t*)s);
 //	 cache_stats(s->cache_data);
   }
 }
@@ -384,3 +416,51 @@
   mp_msg(MSGT_CACHE,MSGL_V,"cache_stream_seek: WARNING! Can't seek to 0x%"PRIX64" !\n",(int64_t)(pos+newpos));
   return 0;
 }
+
+int cache_do_control(stream_t *stream, int cmd, void *arg) {
+  cache_vars_t* s = stream->cache_data;
+  switch (cmd) {
+    case STREAM_CTRL_SEEK_TO_TIME:
+      s->control_double_arg = *(double *)arg;
+      s->control = cmd;
+      break;
+    case STREAM_CTRL_SEEK_TO_CHAPTER:
+    case STREAM_CTRL_SET_ANGLE:
+      s->control_uint_arg = *(unsigned *)arg;
+      s->control = cmd;
+      break;
+    case STREAM_CTRL_GET_NUM_CHAPTERS:
+    case STREAM_CTRL_GET_CURRENT_CHAPTER:
+// the core might call these every frame, they are too slow for this...
+//    case STREAM_CTRL_GET_TIME_LENGTH:
+//    case STREAM_CTRL_GET_CURRENT_TIME:
+    case STREAM_CTRL_GET_ASPECT_RATIO:
+    case STREAM_CTRL_GET_NUM_ANGLES:
+    case STREAM_CTRL_GET_ANGLE:
+      s->control = cmd;
+      break;
+    default:
+      return STREAM_UNSUPPORTED;
+  }
+  while (s->control != -1)
+    usec_sleep(CONTROL_SLEEP_TIME);
+  switch (cmd) {
+    case STREAM_CTRL_GET_TIME_LENGTH:
+    case STREAM_CTRL_GET_CURRENT_TIME:
+    case STREAM_CTRL_GET_ASPECT_RATIO:
+      *(double *)arg = s->control_double_arg;
+      break;
+    case STREAM_CTRL_GET_NUM_CHAPTERS:
+    case STREAM_CTRL_GET_CURRENT_CHAPTER:
+    case STREAM_CTRL_GET_NUM_ANGLES:
+    case STREAM_CTRL_GET_ANGLE:
+      *(unsigned *)arg = s->control_uint_arg;
+      break;
+    case STREAM_CTRL_SEEK_TO_CHAPTER:
+    case STREAM_CTRL_SEEK_TO_TIME:
+    case STREAM_CTRL_SET_ANGLE:
+      stream->pos = s->read_filepos = s->control_new_pos;
+      break;
+  }
+  return s->control_res;
+}
--- a/stream/cache2.h	Sat May 24 07:47:11 2008 +0000
+++ b/stream/cache2.h	Sat May 24 07:48:35 2008 +0000
@@ -4,5 +4,6 @@
 #include "stream.h"
 
 extern void cache_uninit(stream_t *s);
+int cache_do_control(stream_t *stream, int cmd, void *arg);
 
 #endif /* MPLAYER_CACHE2_H */
--- a/stream/stream.c	Sat May 24 07:47:11 2008 +0000
+++ b/stream/stream.c	Sat May 24 07:48:35 2008 +0000
@@ -381,6 +381,8 @@
 
 int stream_control(stream_t *s, int cmd, void *arg){
   if(!s->control) return STREAM_UNSUPPORTED;
+  if (s->cache_pid)
+    return cache_do_control(s, cmd, arg);
   return s->control(s, cmd, arg);
 }
 
--- a/stream/stream_dvd.c	Sat May 24 07:47:11 2008 +0000
+++ b/stream/stream_dvd.c	Sat May 24 07:48:35 2008 +0000
@@ -41,7 +41,6 @@
 #include "libmpdemux/demuxer.h"
 #include "libavutil/intreadwrite.h"
 
-extern int stream_cache_size;
 extern char* dvd_device;
 int dvd_angle=1;
 int dvd_speed=0; /* 0 => don't touch speed */
@@ -708,7 +707,6 @@
         case STREAM_CTRL_SEEK_TO_CHAPTER:
         {
             int r;
-            if(stream_cache_size > 0) return STREAM_UNSUPPORTED;
             r = seek_to_chapter(stream, d->vts_file, d->tt_srpt, d->cur_title-1, *((unsigned int *)arg));
             if(! r) return STREAM_UNSUPPORTED;
 
@@ -716,14 +714,12 @@
         }
         case STREAM_CTRL_GET_CURRENT_CHAPTER:
         {
-            if(stream_cache_size > 0) return STREAM_UNSUPPORTED;
             *((unsigned int *)arg) = dvd_chapter_from_cell(d, d->cur_title-1, d->cur_cell);
             return 1;
         }
         case STREAM_CTRL_GET_CURRENT_TIME:
         {
             double tm;
-            if(stream_cache_size > 0) return STREAM_UNSUPPORTED;
             tm = dvd_get_current_time(stream, 0);
             if(tm != -1) {
               *((double *)arg) = tm;
@@ -733,7 +729,6 @@
         }
         case STREAM_CTRL_SEEK_TO_TIME:
         {
-            if(stream_cache_size > 0) return STREAM_UNSUPPORTED;
             if(dvd_seek_to_time(stream, d->vts_file, *((double*)arg)))
               return 1;
             break;
@@ -1062,8 +1057,6 @@
     *file_format = DEMUXER_TYPE_MPEG_PS;
     mp_msg(MSGT_DVD,MSGL_V,"DVD start=%d end=%d  \n",d->cur_pack,d->cur_pgc->cell_playback[d->last_cell-1].last_sector);
     stream->priv = (void*)d;
-    if(stream_cache_size > 0)
-      mp_msg(MSGT_DVD,MSGL_INFO,"[stream_dvd] Warning! the cache is enabled. Seeking won't work correctly\n");
     return STREAM_OK;
 
 fail: