Mercurial > mplayer.hg
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: