summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-05-24 07:48:35 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-05-24 07:48:35 +0000
commit5560a0b358e7cda887f4b7aac96a84e3270b5c6e (patch)
treef4fdb44cb932be0bd9172f8e1cccd16cfd735122 /stream
parent05f93a0054636f00bd2a9f9eec997d42a29f14d8 (diff)
downloadmpv-5560a0b358e7cda887f4b7aac96a84e3270b5c6e.tar.bz2
mpv-5560a0b358e7cda887f4b7aac96a84e3270b5c6e.tar.xz
Add basic support for stream controls with cache enabled.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@26865 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'stream')
-rw-r--r--stream/cache2.c80
-rw-r--r--stream/cache2.h1
-rw-r--r--stream/stream.c2
-rw-r--r--stream/stream_dvd.c7
4 files changed, 83 insertions, 7 deletions
diff --git a/stream/cache2.c b/stream/cache2.c
index 84a58272df..584af1faf4 100644
--- a/stream/cache2.c
+++ b/stream/cache2.c
@@ -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 @@ typedef struct {
// 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 @@ int cache_fill(cache_vars_t* s){
}
+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 @@ static void ThreadProc( void *s ){
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 @@ int cache_stream_seek_long(stream_t *stream,off_t pos){
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;
+}
diff --git a/stream/cache2.h b/stream/cache2.h
index f61865f419..4eb201e177 100644
--- a/stream/cache2.h
+++ b/stream/cache2.h
@@ -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 */
diff --git a/stream/stream.c b/stream/stream.c
index 42ceff1934..19c7bab091 100644
--- a/stream/stream.c
+++ b/stream/stream.c
@@ -381,6 +381,8 @@ void stream_reset(stream_t *s){
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);
}
diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c
index c5a22d8089..85a0d6ba03 100644
--- a/stream/stream_dvd.c
+++ b/stream/stream_dvd.c
@@ -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 @@ static int control(stream_t *stream,int cmd,void* arg)
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 @@ static int control(stream_t *stream,int cmd,void* arg)
}
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 @@ static int control(stream_t *stream,int cmd,void* arg)
}
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 @@ static int open_s(stream_t *stream,int mode, void* opts, int* file_format) {
*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: