From cf62f7097d4d3a5409df148f32c859428688db70 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 23 Jul 2004 09:15:22 +0000 Subject: [PATCH] Added ImageStream::quit(bool) for exiting from video threads, and added clean up to OsgCameGroup to quit movie threads automatically. --- include/osg/ImageStream | 2 + include/osgProducer/OsgCameraGroup | 2 +- src/osgPlugins/mpeg/MpegImageStream.cpp | 33 ++++---- src/osgPlugins/mpeg/MpegImageStream.h | 2 + .../quicktime/QuicktimeImageStream.cpp | 56 ++++++------- .../quicktime/QuicktimeImageStream.h | 8 +- src/osgProducer/OsgCameraGroup.cpp | 81 +++++++++++++++++++ src/osgProducer/Viewer.cpp | 2 - 8 files changed, 135 insertions(+), 51 deletions(-) diff --git a/include/osg/ImageStream b/include/osg/ImageStream index 9f265e759..f36574f52 100644 --- a/include/osg/ImageStream +++ b/include/osg/ImageStream @@ -50,6 +50,8 @@ class SG_EXPORT ImageStream : public Image virtual void pause() { _status=PAUSED; } virtual void rewind() { _status=REWINDING; } + + virtual void quit(bool /*wiatForThreadToExit*/ = true) {} StreamStatus getStatus() { return _status; } diff --git a/include/osgProducer/OsgCameraGroup b/include/osgProducer/OsgCameraGroup index 59e01d980..b54dfdacb 100644 --- a/include/osgProducer/OsgCameraGroup +++ b/include/osgProducer/OsgCameraGroup @@ -42,7 +42,7 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup OsgCameraGroup(osg::ArgumentParser& arguments); - virtual ~OsgCameraGroup() {} + virtual ~OsgCameraGroup(); void setApplicationUsage(osg::ApplicationUsage* au) { _applicationUsage = au; } diff --git a/src/osgPlugins/mpeg/MpegImageStream.cpp b/src/osgPlugins/mpeg/MpegImageStream.cpp index 8a45a7e26..c47e8d33d 100644 --- a/src/osgPlugins/mpeg/MpegImageStream.cpp +++ b/src/osgPlugins/mpeg/MpegImageStream.cpp @@ -65,23 +65,10 @@ MpegImageStream::MpegImageStream(const char* fileName) : ImageStream() // Deconstructor: stop and terminate thread MpegImageStream::~MpegImageStream() { - setCmd(THREAD_QUIT); if( isRunning() ) { - - // cancel the thread.. - // cancel(); - - //join(); - - // then wait for the the thread to stop running. - while(isRunning()) - { - osg::notify(osg::INFO)<<"Waiting for MpegImageStream to cancel"< lock(s_qtMutex); + osgQuicktime::initQuicktime(); + } _len = 0; @@ -66,22 +69,10 @@ QuicktimeImageStream::QuicktimeImageStream(std::string fileName) : ImageStream() // Deconstructor: stop and terminate thread QuicktimeImageStream::~QuicktimeImageStream() { - setCmd(THREAD_QUIT); if( isRunning() ) { - - // cancel the thread.. - // cancel(); - //join(); - - // then wait for the the thread to stop running. - while(isRunning()) - { - osg::notify(osg::DEBUG_INFO)<<"Waiting for QuicktimeImageStream to cancel"< lock(_mutex); + _cmd[_wrIndex] = cmd; _wrIndex = (_wrIndex + 1) % NUM_CMD_INDEX; - unlock(); } @@ -108,12 +99,14 @@ void QuicktimeImageStream::setCmd(ThreadCommand cmd) QuicktimeImageStream::ThreadCommand QuicktimeImageStream::getCmd() { ThreadCommand cmd = THREAD_IDLE; - lock(); + + OpenThreads::ScopedLock lock(_mutex); + if (_rdIndex != _wrIndex) { cmd = _cmd[_rdIndex]; _rdIndex = (_rdIndex + 1) % NUM_CMD_INDEX; } - unlock(); + return cmd; } @@ -131,6 +124,21 @@ void QuicktimeImageStream::load(std::string fileName) } +void QuicktimeImageStream::quit(bool wiatForThreadToExit) +{ + osg::notify(osg::DEBUG_INFO)<<"Sending quit"< lock(s_qtMutex); @@ -184,7 +186,7 @@ void QuicktimeImageStream::run() case THREAD_QUIT: // TODO SetMovieRate(_data->getMovie(),0); osg::notify(NOTICE) << "QT-ImageStream: quit" << std::endl; - playing = false; + //playing = false; done = true; break; default: diff --git a/src/osgPlugins/quicktime/QuicktimeImageStream.h b/src/osgPlugins/quicktime/QuicktimeImageStream.h index c760f4e63..23307b118 100644 --- a/src/osgPlugins/quicktime/QuicktimeImageStream.h +++ b/src/osgPlugins/quicktime/QuicktimeImageStream.h @@ -59,8 +59,8 @@ namespace osg { /// Rewind stream to beginning. virtual void rewind() { setCmd(THREAD_REWIND); } - - + virtual void quit(bool wiatForThreadToExit); + /// Get total length in seconds. inline float getLength() const { return _len; } @@ -90,10 +90,6 @@ namespace osg { OpenThreads::Mutex _mutex; - // Lock/unlock object. - inline void lock() { _mutex.lock(); } - inline void unlock() { _mutex.unlock(); } - /// Set command. void setCmd(ThreadCommand cmd); diff --git a/src/osgProducer/OsgCameraGroup.cpp b/src/osgProducer/OsgCameraGroup.cpp index c1fbace54..b94f76fe7 100644 --- a/src/osgProducer/OsgCameraGroup.cpp +++ b/src/osgProducer/OsgCameraGroup.cpp @@ -14,6 +14,9 @@ #include #include #include +#include +#include +#include #include #include @@ -122,6 +125,84 @@ OsgCameraGroup::OsgCameraGroup(osg::ArgumentParser& arguments): } } + +class QuitImageStreamVisitor : public osg::NodeVisitor +{ + public: + + QuitImageStreamVisitor(): + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {} + + + /** Simply traverse using standard NodeVisitor traverse method.*/ + virtual void apply(osg::Node& node) + { + if (node.getStateSet()) + apply(*(node.getStateSet())); + + traverse(node); + } + + virtual void apply(osg::Geode& node) + { + if (node.getStateSet()) + apply(*(node.getStateSet())); + + for(unsigned int i=0;igetStateSet()) + apply(*(drawable->getStateSet())); + } + } + + void apply(osg::StateSet& stateset) + { + for(unsigned int i=0;i(texture); + if (textureRect) + { + osg::ImageStream* imageStream = dynamic_cast(textureRect->getImage()); + if (imageStream) + { + imageStream->quit(); + } + } + + osg::Texture2D* texture2D = dynamic_cast(texture); + if (texture2D) + { + osg::ImageStream* imageStream = dynamic_cast(texture2D->getImage()); + if (imageStream) + { + imageStream->quit(); + } + } + } + } + } + +}; + +OsgCameraGroup::~OsgCameraGroup() +{ + // kill the DatabasePager and associated thread if one exists. + osgDB::Registry::instance()->setDatabasePager(0); + + osg::Node* node = getTopMostSceneData(); + if (node) + { + // kill any ImageStream threads + QuitImageStreamVisitor qisv; + node->accept(qisv); + } +} + + void OsgCameraGroup::_init() { _thread_model = ThreadPerCamera; diff --git a/src/osgProducer/Viewer.cpp b/src/osgProducer/Viewer.cpp index a2400b25e..2dd90ba46 100644 --- a/src/osgProducer/Viewer.cpp +++ b/src/osgProducer/Viewer.cpp @@ -303,8 +303,6 @@ Viewer::Viewer(osg::ArgumentParser& arguments): Viewer::~Viewer() { - // kill the DatabasePager and associated thread if one exists. - osgDB::Registry::instance()->setDatabasePager(0); } void Viewer::setCoordindateSystemNodePath(const osg::NodePath& nodePath)