cache: allow STREAM_CTRL_GET_CURRENT_TIME with cache

Change code to allow STREAM_CTRL_GET_CURRENT_TIME with cache enabled.
Due to that time being from what is currently read into the cache it
is unfortunately somewhat inaccurate and unsmooth, however for streams
that do have stream timestamps it is till a lot better than going by
the demuxer alone.
In particular it fixes bug #1081, when starting a DVD with -chapter
following seeks would be relative to the start of the DVD instead
of the current position.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@33605 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
reimar 2011-06-12 11:26:22 +00:00 committed by Uoti Urpala
parent 9f6ba7a63d
commit cfe1af72af
1 changed files with 12 additions and 3 deletions

View File

@ -64,6 +64,7 @@ static void *ThreadProc(void *s);
#include "stream.h" #include "stream.h"
#include "cache2.h" #include "cache2.h"
#include "mpcommon.h"
typedef struct { typedef struct {
// constats: // constats:
@ -91,6 +92,7 @@ typedef struct {
volatile int control_res; volatile int control_res;
volatile off_t control_new_pos; volatile off_t control_new_pos;
volatile double stream_time_length; volatile double stream_time_length;
volatile double stream_time_pos;
} cache_vars_t; } cache_vars_t;
static int min_fill=0; static int min_fill=0;
@ -260,17 +262,22 @@ static int cache_execute_control(cache_vars_t *s) {
int quit = s->control == -2; int quit = s->control == -2;
if (quit || !s->stream->control) { if (quit || !s->stream->control) {
s->stream_time_length = 0; s->stream_time_length = 0;
s->stream_time_pos = MP_NOPTS_VALUE;
s->control_new_pos = 0; s->control_new_pos = 0;
s->control_res = STREAM_UNSUPPORTED; s->control_res = STREAM_UNSUPPORTED;
s->control = -1; s->control = -1;
return !quit; return !quit;
} }
if (GetTimerMS() - last > 99) { if (GetTimerMS() - last > 99) {
double len; double len, pos;
if (s->stream->control(s->stream, STREAM_CTRL_GET_TIME_LENGTH, &len) == STREAM_OK) if (s->stream->control(s->stream, STREAM_CTRL_GET_TIME_LENGTH, &len) == STREAM_OK)
s->stream_time_length = len; s->stream_time_length = len;
else else
s->stream_time_length = 0; s->stream_time_length = 0;
if (s->stream->control(s->stream, STREAM_CTRL_GET_CURRENT_TIME, &pos) == STREAM_OK)
s->stream_time_pos = pos;
else
s->stream_time_pos = MP_NOPTS_VALUE;
last = GetTimerMS(); last = GetTimerMS();
} }
if (s->control == -1) return 1; if (s->control == -1) return 1;
@ -581,11 +588,13 @@ int cache_do_control(stream_t *stream, int cmd, void *arg) {
s->control_uint_arg = *(unsigned *)arg; s->control_uint_arg = *(unsigned *)arg;
s->control = cmd; s->control = cmd;
break; break;
// the core might call these every frame, so cache them...
case STREAM_CTRL_GET_TIME_LENGTH: case STREAM_CTRL_GET_TIME_LENGTH:
*(double *)arg = s->stream_time_length; *(double *)arg = s->stream_time_length;
return s->stream_time_length ? STREAM_OK : STREAM_UNSUPPORTED; return s->stream_time_length ? STREAM_OK : STREAM_UNSUPPORTED;
// the core might call this every frame, but it is too slow for this... case STREAM_CTRL_GET_CURRENT_TIME:
// case STREAM_CTRL_GET_CURRENT_TIME: *(double *)arg = s->stream_time_pos;
return s->stream_time_pos != MP_NOPTS_VALUE ? STREAM_OK : STREAM_UNSUPPORTED;
case STREAM_CTRL_GET_NUM_CHAPTERS: case STREAM_CTRL_GET_NUM_CHAPTERS:
case STREAM_CTRL_GET_CURRENT_CHAPTER: case STREAM_CTRL_GET_CURRENT_CHAPTER:
case STREAM_CTRL_GET_ASPECT_RATIO: case STREAM_CTRL_GET_ASPECT_RATIO: