[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20435] trunk/blender/source/gameengine/ VideoTexture: BGE VideoTexture: VideoFFmpeg was missing a rewind function: rename stop() to pause() and add stop() that will also reset the frame counter.

Benoit Bolsee benoit.bolsee at online.be
Tue May 26 20:37:46 CEST 2009


Revision: 20435
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20435
Author:   ben2610
Date:     2009-05-26 20:37:46 +0200 (Tue, 26 May 2009)

Log Message:
-----------
BGE VideoTexture: VideoFFmpeg was missing a rewind function: rename stop() to pause() and add stop() that will also reset the frame counter.

Modified Paths:
--------------
    trunk/blender/source/gameengine/VideoTexture/VideoBase.cpp
    trunk/blender/source/gameengine/VideoTexture/VideoBase.h
    trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.cpp
    trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.h

Modified: trunk/blender/source/gameengine/VideoTexture/VideoBase.cpp
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/VideoBase.cpp	2009-05-26 18:06:09 UTC (rev 20434)
+++ trunk/blender/source/gameengine/VideoTexture/VideoBase.cpp	2009-05-26 18:37:46 UTC (rev 20435)
@@ -113,7 +113,10 @@
 PyObject * Video_play (PyImage * self)
 { if (getVideo(self)->play()) Py_RETURN_TRUE; else Py_RETURN_FALSE; }
 
-// stop video
+// pause video
+PyObject * Video_pause (PyImage * self)
+{ if (getVideo(self)->pause()) Py_RETURN_TRUE; else Py_RETURN_FALSE; }
+
 PyObject * Video_stop (PyImage * self)
 { if (getVideo(self)->stop()) Py_RETURN_TRUE; else Py_RETURN_FALSE; }
 

Modified: trunk/blender/source/gameengine/VideoTexture/VideoBase.h
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/VideoBase.h	2009-05-26 18:06:09 UTC (rev 20434)
+++ trunk/blender/source/gameengine/VideoTexture/VideoBase.h	2009-05-26 18:37:46 UTC (rev 20435)
@@ -80,7 +80,17 @@
 		}
 		return false;
 	}
-	/// stop/pause video
+	/// pause video
+	virtual bool pause (void)
+	{
+		if (m_status == SourcePlaying)
+		{
+			m_status = SourceStopped;
+			return true;
+		}
+		return false;
+	}
+	/// stop video
 	virtual bool stop (void)
 	{
 		if (m_status == SourcePlaying)
@@ -170,6 +180,7 @@
 // video functions
 void Video_open (VideoBase * self, char * file, short captureID);
 PyObject * Video_play (PyImage * self);
+PyObject * Video_pause (PyImage * self);
 PyObject * Video_stop (PyImage * self);
 PyObject * Video_refresh (PyImage * self);
 PyObject * Video_getStatus (PyImage * self, void * closure);

Modified: trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.cpp
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.cpp	2009-05-26 18:06:09 UTC (rev 20434)
+++ trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.cpp	2009-05-26 18:37:46 UTC (rev 20435)
@@ -669,12 +669,12 @@
 }
 
 
-// stop video
-bool VideoFFmpeg::stop (void)
+// pause video
+bool VideoFFmpeg::pause (void)
 {
 	try
 	{
-		if (VideoBase::stop())
+		if (VideoBase::pause())
 		{
 			return true;
 		}
@@ -683,7 +683,21 @@
 	return false;
 }
 
+// stop video
+bool VideoFFmpeg::stop (void)
+{
+	try
+	{
+		VideoBase::stop();
+		// force restart when play
+		m_lastFrame = -1;
+		return true;
+	}
+	CATCH_EXCP;
+	return false;
+}
 
+
 // set video range
 void VideoFFmpeg::setRange (double start, double stop)
 {
@@ -721,6 +735,8 @@
 	{
 		// get actual time
 		double startTime = PIL_check_seconds_timer();
+		if (m_lastFrame == -1)
+			m_startTime = startTime;
 		double actTime = startTime - m_startTime;
 		// if video has ended
 		if (m_isFile && actTime * m_frameRate >= m_range[1])
@@ -886,28 +902,47 @@
 		if (position != m_curPosition + 1) 
 		{ 
 			double timeBase = av_q2d(m_formatCtx->streams[m_videoStream]->time_base);
-			long long pos = (long long)
-				((long long) (position - m_preseek) * AV_TIME_BASE / m_baseFrameRate);
-			long long startTs = m_formatCtx->streams[m_videoStream]->start_time;
+			int64_t pos = (int64_t)((position - m_preseek) / (m_baseFrameRate*timeBase));
+			int64_t startTs = m_formatCtx->streams[m_videoStream]->start_time;
+			int seekres;
 
 			if (pos < 0)
 				pos = 0;
 
 			if (startTs != AV_NOPTS_VALUE)
-				pos += (long long)(startTs * AV_TIME_BASE * timeBase);
+				pos += startTs;
 
 			if (position <= m_curPosition || !m_eof)
 			{
-				// no need to seek past the end of the file
-				if (av_seek_frame(m_formatCtx, -1, pos, AVSEEK_FLAG_BACKWARD) >= 0)
+#if 0
+				// Tried to make this work but couldn't: seeking on byte is ignored by the
+				// format plugin and it will generally continue to read from last timestamp.
+				// Too bad because frame seek is not always able to get the first frame
+				// of the file.
+				if (position <= m_preseek)
 				{
+					// we can safely go the begining of the file
+					if (av_seek_frame(m_formatCtx, m_videoStream, 0, AVSEEK_FLAG_BYTE) >= 0)
+					{
+						// binary seek does not reset the timestamp, must do it now
+						av_update_cur_dts(m_formatCtx, m_formatCtx->streams[m_videoStream], startTs);
+						m_curPosition = 0;
+					}
+				}
+				else
+#endif
+				{
 					// current position is now lost, guess a value. 
-					// It's not important because it will be set at this end of this function
-					m_curPosition = position - m_preseek - 1;
+					if (av_seek_frame(m_formatCtx, m_videoStream, pos, AVSEEK_FLAG_BACKWARD) >= 0)
+					{
+						// current position is now lost, guess a value. 
+						// It's not important because it will be set at this end of this function
+						m_curPosition = position - m_preseek - 1;
+					}
 				}
 			}
 			// this is the timestamp of the frame we're looking for
-			targetTs = (long long)(((double) position) / m_baseFrameRate / timeBase);
+			targetTs = (int64_t)(position / (m_baseFrameRate * timeBase));
 			if (startTs != AV_NOPTS_VALUE)
 				targetTs += startTs;
 
@@ -1097,8 +1132,9 @@
 // methods structure
 static PyMethodDef videoMethods[] =
 { // methods from VideoBase class
-	{"play", (PyCFunction)Video_play, METH_NOARGS, "Play video"},
-	{"stop", (PyCFunction)Video_stop, METH_NOARGS, "Stop (pause) video"},
+	{"play", (PyCFunction)Video_play, METH_NOARGS, "Play (restart) video"},
+	{"pause", (PyCFunction)Video_pause, METH_NOARGS, "pause video"},
+	{"stop", (PyCFunction)Video_stop, METH_NOARGS, "stop video (play will replay it from start)"},
 	{"refresh", (PyCFunction)Video_refresh, METH_NOARGS, "Refresh video - get its status"},
 	{NULL}
 };

Modified: trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.h
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.h	2009-05-26 18:06:09 UTC (rev 20434)
+++ trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.h	2009-05-26 18:37:46 UTC (rev 20435)
@@ -83,9 +83,10 @@
 
 	/// play video
 	virtual bool play (void);
-	/// stop/pause video
+	/// pause video
+	virtual bool pause (void);
+	/// stop video
 	virtual bool stop (void);
-
 	/// set play range
 	virtual void setRange (double start, double stop);
 	/// set frame rate





More information about the Bf-blender-cvs mailing list