Changeset 9869

Show
Ignore:
Timestamp:
03/08/09 17:48:48 (5 years ago)
Author:
robert
Message:

Fixed thread exit problems

Location:
OpenSceneGraph/trunk/src/osgPlugins/ffmpeg
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp

    r9865 r9869  
    3232FFmpegDecoder::~FFmpegDecoder() 
    3333{ 
    34     close(); 
     34    close(true); 
    3535} 
    3636 
     
    124124 
    125125 
    126 void FFmpegDecoder::close() 
     126void FFmpegDecoder::close(bool waitForThreadToExit) 
    127127{ 
    128128    flushAudioQueue(); 
    129129    flushVideoQueue(); 
     130     
     131    m_audio_decoder.close(waitForThreadToExit); 
     132    m_video_decoder.close(waitForThreadToExit); 
    130133} 
    131134 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp

    r9847 r9869  
    6565 
    6666    bool open(const std::string & filename); 
    67     void close(); 
     67    void close(bool waitForThreadToExit); 
    6868 
    6969    bool readNextPacket(); 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp

    r9847 r9869  
    3838    { 
    3939        m_exit = true; 
     40#if 0         
     41        while(isRunning()) { OpenThreads::YieldCurrentThread(); } 
     42#else         
    4043        join(); 
     44#endif 
    4145    } 
    4246} 
     
    8690 
    8791 
     92void FFmpegDecoderAudio::close(bool waitForThreadToExit) 
     93{ 
     94    m_exit = true; 
     95     
     96    if (isRunning() && waitForThreadToExit) 
     97    { 
     98        while(isRunning()) { OpenThreads::Thread::YieldCurrentThread(); } 
     99    } 
     100} 
     101 
    88102 
    89103void FFmpegDecoderAudio::run() 
     
    104118    } 
    105119} 
    106  
    107120 
    108121 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.hpp

    r9861 r9869  
    3030 
    3131    void open(AVStream * stream); 
     32    void close(bool waitForThreadToExit); 
     33     
    3234    virtual void run(); 
    3335 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp

    r9861 r9869  
    3535    osg::notify(osg::NOTICE)<<"Destructing FFmpegDecoderVideo..."<<std::endl; 
    3636 
     37 
    3738    if (isRunning()) 
    3839    { 
    3940        m_exit = true; 
     41#if 0         
     42        while(isRunning()) { OpenThreads::YieldCurrentThread(); } 
     43#else         
    4044        join(); 
     45#endif 
    4146    } 
    4247     
     
    102107} 
    103108 
     109 
     110void FFmpegDecoderVideo::close(bool waitForThreadToExit) 
     111{ 
     112    m_exit = true; 
     113     
     114    if (isRunning() && waitForThreadToExit) 
     115    { 
     116        while(isRunning()) { OpenThreads::Thread::YieldCurrentThread(); } 
     117    } 
     118} 
    104119 
    105120 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp

    r9861 r9869  
    6666 
    6767    void open(AVStream * stream); 
     68    void close(bool waitForThreadToExit); 
     69 
    6870    virtual void run(); 
    6971 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp

    r9861 r9869  
    4343 
    4444    quit(true); 
     45     
     46    osg::notify(osg::NOTICE)<<"Have done quit"<<std::endl; 
     47 
     48    // release athe audio streams to make sure that the decoder doesn't retain any external 
     49    // refences. 
     50    getAudioStreams().clear(); 
    4551 
    4652    // destroy the decoder and associated threads 
     
    131137 
    132138    // Close the decoder (i.e. flush the decoder packet queues) 
    133     m_decoder->close(); 
     139    m_decoder->close(waitForThreadToExit); 
    134140} 
    135141 
     
    198204        osg::notify(osg::WARN) << "FFmpegImageStream::run : unhandled exception" << std::endl; 
    199205    } 
     206     
     207    osg::notify(osg::NOTICE)<<"Finished FFmpegImageStream::run()"<<std::endl; 
    200208} 
    201209