[MPlayer-cvslog] r33605 - in trunk: libmpcodecs/vf.h mp_global.h stream/cache2.c

reimar subversion at mplayerhq.hu
Sun Jun 12 13:26:23 CEST 2011


Author: reimar
Date: Sun Jun 12 13:26:22 2011
New Revision: 33605

Log:
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.

Added:
   trunk/mp_global.h
Modified:
   trunk/libmpcodecs/vf.h
   trunk/stream/cache2.c

Modified: trunk/libmpcodecs/vf.h
==============================================================================
--- trunk/libmpcodecs/vf.h	Sun Jun 12 13:12:17 2011	(r33604)
+++ trunk/libmpcodecs/vf.h	Sun Jun 12 13:26:22 2011	(r33605)
@@ -114,8 +114,7 @@ typedef struct vf_seteq_s
 
 #include "vfcap.h"
 
-//FIXME this should be in a common header, but i dunno which
-#define MP_NOPTS_VALUE (-1LL<<63) //both int64_t and double should be able to represent this exactly
+#include "mp_global.h"
 
 
 // functions:

Added: trunk/mp_global.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/mp_global.h	Sun Jun 12 13:26:22 2011	(r33605)
@@ -0,0 +1,29 @@
+/*
+ * This file is part of MPlayer.
+ *
+ * MPlayer is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MPlayer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with MPlayer; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/*
+ * This header is meant for code that is needed practically everywhere:
+ * Filters, demuxers, streams, mplayer.c etc.
+ */
+#ifndef MPLAYER_MP_GLOBAL_H
+#define MPLAYER_MP_GLOBAL_H
+
+//FIXME this should be in a common header, but i dunno which
+#define MP_NOPTS_VALUE (-1LL<<63) //both int64_t and double should be able to represent this exactly
+
+#endif /* MPLAYER_MP_GLOBAL_H */

Modified: trunk/stream/cache2.c
==============================================================================
--- trunk/stream/cache2.c	Sun Jun 12 13:12:17 2011	(r33604)
+++ trunk/stream/cache2.c	Sun Jun 12 13:26:22 2011	(r33605)
@@ -65,6 +65,7 @@ static void *ThreadProc(void *s);
 
 #include "stream.h"
 #include "cache2.h"
+#include "mp_global.h"
 
 typedef struct {
   // constats:
@@ -92,6 +93,7 @@ typedef struct {
   volatile int control_res;
   volatile off_t control_new_pos;
   volatile double stream_time_length;
+  volatile double stream_time_pos;
 } cache_vars_t;
 
 static int min_fill=0;
@@ -261,17 +263,22 @@ static int cache_execute_control(cache_v
   int quit = s->control == -2;
   if (quit || !s->stream->control) {
     s->stream_time_length = 0;
+    s->stream_time_pos = MP_NOPTS_VALUE;
     s->control_new_pos = 0;
     s->control_res = STREAM_UNSUPPORTED;
     s->control = -1;
     return !quit;
   }
   if (GetTimerMS() - last > 99) {
-    double len;
+    double len, pos;
     if (s->stream->control(s->stream, STREAM_CTRL_GET_TIME_LENGTH, &len) == STREAM_OK)
       s->stream_time_length = len;
     else
       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();
   }
   if (s->control == -1) return 1;
@@ -583,11 +590,13 @@ int cache_do_control(stream_t *stream, i
       s->control_uint_arg = *(unsigned *)arg;
       s->control = cmd;
       break;
+    // the core might call these every frame, so cache them...
     case STREAM_CTRL_GET_TIME_LENGTH:
       *(double *)arg = s->stream_time_length;
       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_CURRENT_CHAPTER:
     case STREAM_CTRL_GET_ASPECT_RATIO:


More information about the MPlayer-cvslog mailing list