From 73c2615d179355672ffe171d92c73ad6843b20d8 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sun, 8 Mar 2009 16:48:48 +0000 Subject: [PATCH] Fixed thread exit problems --- src/osgPlugins/ffmpeg/FFmpegDecoder.cpp | 7 +++++-- src/osgPlugins/ffmpeg/FFmpegDecoder.hpp | 2 +- src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp | 15 ++++++++++++++- src/osgPlugins/ffmpeg/FFmpegDecoderAudio.hpp | 2 ++ src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp | 15 +++++++++++++++ src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp | 2 ++ src/osgPlugins/ffmpeg/FFmpegImageStream.cpp | 10 +++++++++- 7 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp b/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp index ea8bd049f..fd657aabb 100644 --- a/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp +++ b/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp @@ -31,7 +31,7 @@ FFmpegDecoder::FFmpegDecoder() : FFmpegDecoder::~FFmpegDecoder() { - close(); + close(true); } @@ -123,10 +123,13 @@ bool FFmpegDecoder::open(const std::string & filename) -void FFmpegDecoder::close() +void FFmpegDecoder::close(bool waitForThreadToExit) { flushAudioQueue(); flushVideoQueue(); + + m_audio_decoder.close(waitForThreadToExit); + m_video_decoder.close(waitForThreadToExit); } diff --git a/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp b/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp index bd625e45d..f6c83e714 100644 --- a/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp +++ b/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp @@ -64,7 +64,7 @@ public: ~FFmpegDecoder(); bool open(const std::string & filename); - void close(); + void close(bool waitForThreadToExit); bool readNextPacket(); void rewind(); diff --git a/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp b/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp index 8890fad7d..fd78b8a9e 100644 --- a/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp +++ b/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp @@ -37,7 +37,11 @@ FFmpegDecoderAudio::~FFmpegDecoderAudio() if (isRunning()) { m_exit = true; +#if 0 + while(isRunning()) { OpenThreads::YieldCurrentThread(); } +#else join(); +#endif } } @@ -85,6 +89,16 @@ void FFmpegDecoderAudio::open(AVStream * const stream) } +void FFmpegDecoderAudio::close(bool waitForThreadToExit) +{ + m_exit = true; + + if (isRunning() && waitForThreadToExit) + { + while(isRunning()) { OpenThreads::Thread::YieldCurrentThread(); } + } +} + void FFmpegDecoderAudio::run() { @@ -105,7 +119,6 @@ void FFmpegDecoderAudio::run() } - void FFmpegDecoderAudio::setAudioSink(osg::ref_ptr audio_sink) { // The FFmpegDecoderAudio object takes the responsability of destroying the audio_sink. diff --git a/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.hpp b/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.hpp index 3a4c9ba73..8e0da0b7f 100644 --- a/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.hpp +++ b/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.hpp @@ -29,6 +29,8 @@ public: ~FFmpegDecoderAudio(); void open(AVStream * stream); + void close(bool waitForThreadToExit); + virtual void run(); void setAudioSink(osg::ref_ptr audio_sink); diff --git a/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp b/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp index 2f5af7c8b..6744fe3e5 100644 --- a/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp +++ b/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp @@ -34,10 +34,15 @@ FFmpegDecoderVideo::~FFmpegDecoderVideo() { osg::notify(osg::NOTICE)<<"Destructing FFmpegDecoderVideo..."<close(); + m_decoder->close(waitForThreadToExit); } @@ -197,6 +203,8 @@ void FFmpegImageStream::run() { osg::notify(osg::WARN) << "FFmpegImageStream::run : unhandled exception" << std::endl; } + + osg::notify(osg::NOTICE)<<"Finished FFmpegImageStream::run()"<