Changeset 10851

Show
Ignore:
Timestamp:
12/02/09 19:58:45 (4 years ago)
Author:
robert
Message:

From Julen Garcia,"I've been lately working also with the ffmpeg plugin and I implemented pause(), seek() and getReferenceTime(). I think that I have solved the internal clock issues (maybe not in the most elegant way :?"

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

Legend:

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

    r9816 r10851  
    3131    m_video_clock(0), 
    3232    m_start_time(0), 
     33    m_pause_time(0), 
     34    m_seek_time(0), 
    3335    m_last_frame_delay(0.040), 
    3436    m_last_frame_pts(0), 
     
    3840    m_audio_delay(0.0), 
    3941    m_audio_disabled(false), 
    40     m_rewind(false) 
     42    m_rewind(false), 
     43    m_paused(false), 
     44    m_last_current_time(0.0) 
    4145{ 
    4246 
     
    5862    m_audio_buffer_end_pts = start_time; 
    5963    m_audio_timer.setStartTick(); 
     64} 
     65 
     66void FFmpegClocks::pause(bool pause) 
     67{ 
     68    if(pause) 
     69        m_paused = true; 
     70    else 
     71        m_paused = false; 
    6072} 
    6173 
     
    206218} 
    207219 
     220void FFmpegClocks::setPauseTime(double pause_time) 
     221{ 
     222    m_pause_time += pause_time; 
     223} 
     224 
     225void FFmpegClocks::setSeekTime(double seek_time) 
     226{ 
     227    m_seek_time = getAudioTime() - seek_time; 
     228} 
     229 
    208230 
    209231 
    210232double FFmpegClocks::getAudioTime() const 
    211233{ 
    212     return m_audio_buffer_end_pts + m_audio_timer.time_s() - m_audio_delay; 
    213 } 
    214  
    215  
     234    return m_audio_buffer_end_pts + m_audio_timer.time_s() - m_pause_time - m_audio_delay; 
     235} 
     236 
     237 
     238double FFmpegClocks::getCurrentTime() 
     239{ 
     240    if(!m_paused) 
     241        m_last_current_time = getAudioTime() - m_seek_time; // synced with audio 
     242     
     243    return m_last_current_time;   
     244} 
    216245 
    217246} // namespace osgFFmpeg 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegClocks.hpp

    r10161 r10851  
    2323 
    2424    void reset(double start_time); 
     25    void pause(bool pause); 
    2526    void rewindAudio(); 
    2627    void rewindVideo(); 
     
    3637 
    3738    double getStartTime() const; 
     39    double getCurrentTime(); 
     40    void setPauseTime(double pause_time); 
     41    void setSeekTime(double seek_time); 
    3842 
    3943private: 
     
    5054 
    5155    double    m_start_time; 
     56    double    m_pause_time; 
     57    double    m_seek_time; 
    5258    double    m_last_frame_delay; 
    5359    double    m_last_frame_pts; 
     
    5662    double    m_audio_buffer_end_pts; 
    5763    double    m_audio_delay; 
    58     Timer    m_audio_timer; 
    59     bool    m_audio_disabled; 
    60     bool    m_rewind; 
     64    Timer     m_audio_timer; 
     65    bool      m_audio_disabled; 
     66    bool      m_rewind; 
     67    bool      m_paused; 
     68    double    m_last_current_time; 
     69 
    6170     
    6271}; 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp

    r10809 r10851  
    214214} 
    215215 
    216 void FFmpegDecoder::resume()  
    217 { 
    218     m_pending_packet.clear(); 
    219  
    220     flushAudioQueue(); 
    221     flushVideoQueue(); 
    222     m_state = NORMAL; 
    223 } 
    224  
    225216void FFmpegDecoder::findAudioStream() 
    226217{ 
     
    295286            // If we reach the end of the stream, change the decoder state 
    296287            if (loop()) 
     288            { 
     289                m_clocks.reset(m_start); 
    297290                rewindButDontFlushQueues(); 
     291            } 
    298292            else 
    299293                m_state = END_OF_STREAM; 
     
    394388    const int64_t seek_target = av_rescale_q(pos, AvTimeBaseQ, m_video_stream->time_base); 
    395389 
     390    m_clocks.setSeekTime(time); 
     391 
    396392    if (av_seek_frame(m_format_context.get(), m_video_index, seek_target, 0/*AVSEEK_FLAG_BYTE |*/ /*AVSEEK_FLAG_BACKWARD*/) < 0) 
    397393        throw std::runtime_error("av_seek_frame failed()"); 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp

    r10809 r10851  
    7171    void seek(double time); 
    7272    void pause(); 
    73     void resume(); 
    7473 
    7574    void loop(bool loop); 
     
    7776 
    7877    double duration() const; 
     78    double reference(); 
    7979 
    8080    FFmpegDecoderAudio & audio_decoder(); 
     
    109109 
    110110    FormatContextPtr    m_format_context; 
    111     AVStream *            m_audio_stream; 
    112     AVStream *            m_video_stream; 
     111    AVStream *          m_audio_stream; 
     112    AVStream *          m_video_stream; 
    113113 
    114114    int                 m_audio_index; 
     
    117117    FFmpegClocks        m_clocks; 
    118118    FFmpegPacket        m_pending_packet; 
    119     PacketQueue            m_audio_queue; 
    120     PacketQueue            m_video_queue; 
     119    PacketQueue         m_audio_queue; 
     120    PacketQueue         m_video_queue; 
    121121     
    122     FFmpegDecoderAudio    m_audio_decoder; 
    123     FFmpegDecoderVideo    m_video_decoder; 
     122    FFmpegDecoderAudio  m_audio_decoder; 
     123    FFmpegDecoderVideo  m_video_decoder; 
    124124 
    125     double                m_duration; 
    126     double                m_start; 
     125    double              m_duration; 
     126    double              m_start; 
    127127 
    128     State                m_state; 
     128    State               m_state; 
    129129    bool                m_loop; 
    130130}; 
     
    149149{ 
    150150    return double(m_format_context->duration) / AV_TIME_BASE;     
     151} 
     152 
     153inline double FFmpegDecoder::reference() 
     154{ 
     155    return m_clocks.getCurrentTime();     
    151156} 
    152157 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp

    r10414 r10851  
    2626    m_audio_buf_index(0), 
    2727    m_end_of_stream(false), 
     28    m_paused(true), 
    2829    m_exit(false) 
    2930{ 
     
    8990} 
    9091 
     92void FFmpegDecoderAudio::pause(bool pause) 
     93{ 
     94    if(pause) 
     95        m_paused = true; 
     96    else 
     97        m_paused = false; 
     98} 
    9199 
    92100void FFmpegDecoderAudio::close(bool waitForThreadToExit) 
     
    185193    while (! m_exit) 
    186194    { 
     195 
     196        if(m_paused) 
     197        { 
     198            m_clocks.pause(true); 
     199            m_pause_timer.setStartTick(); 
     200 
     201            while(m_paused) 
     202            { 
     203                microSleep(10000); 
     204            } 
     205 
     206            m_clocks.setPauseTime(m_pause_timer.time_s()); 
     207            m_clocks.pause(false); 
     208        } 
     209 
    187210        // If skipping audio, make sure the audio stream is still consumed. 
    188211        if (skip_audio) 
     
    194217                packet.clear(); 
    195218        } 
    196  
    197219        // Else, just idle in this thread. 
    198220        // Note: If m_audio_sink has an audio callback, this thread will still be awaken 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.hpp

    r9869 r10851  
    44 
    55#include <OpenThreads/Thread> 
     6 
     7#include <osg/Timer> 
    68 
    79#include "FFmpegClocks.hpp" 
     
    3032 
    3133    void open(AVStream * stream); 
     34    void pause(bool pause); 
    3235    void close(bool waitForThreadToExit); 
    3336     
     
    5255 
    5356 
    54     PacketQueue &        m_packets; 
    55     FFmpegClocks &        m_clocks; 
    56     AVStream *            m_stream; 
    57     AVCodecContext *    m_context; 
    58     FFmpegPacket        m_packet; 
    59     const uint8_t *        m_packet_data; 
    60     int                    m_bytes_remaining; 
     57    PacketQueue &                       m_packets; 
     58    FFmpegClocks &                      m_clocks; 
     59    AVStream *                          m_stream; 
     60    AVCodecContext *                    m_context; 
     61    FFmpegPacket                        m_packet; 
     62    const uint8_t *                     m_packet_data; 
     63    int                                 m_bytes_remaining; 
    6164 
    62     Buffer                m_audio_buffer; 
    63     size_t                m_audio_buf_size; 
    64     size_t                m_audio_buf_index; 
     65    Buffer                              m_audio_buffer; 
     66    size_t                              m_audio_buf_size; 
     67    size_t                              m_audio_buf_index; 
    6568 
    66     int                    m_frequency; 
    67     int                    m_nb_channels; 
    68     osg::AudioStream::SampleFormat    m_sample_format; 
     69    int                                 m_frequency; 
     70    int                                 m_nb_channels; 
     71    osg::AudioStream::SampleFormat      m_sample_format; 
    6972 
    70     SinkPtr                m_audio_sink; 
     73    SinkPtr                             m_audio_sink; 
    7174 
    72     bool                m_end_of_stream; 
    73     volatile bool        m_exit; 
     75    osg::Timer                          m_pause_timer; 
     76 
     77    bool                                m_end_of_stream; 
     78    bool                                m_paused; 
     79    volatile bool                       m_exit; 
    7480}; 
    7581 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp

    r10414 r10851  
    2121    m_user_data(0), 
    2222    m_publish_func(0), 
     23    m_paused(true), 
    2324    m_exit(false) 
    2425#ifdef USE_SWSCALE 
     
    118119} 
    119120 
     121void FFmpegDecoderVideo::pause(bool pause) 
     122{ 
     123    if(pause) 
     124        m_paused = true; 
     125    else 
     126        m_paused = false; 
     127} 
    120128 
    121129void FFmpegDecoderVideo::run() 
     
    193201                publishFrame(frame_delay, m_clocks.audioDisabled()); 
    194202            } 
     203        } 
     204 
     205        while(m_paused && !m_exit) 
     206        { 
     207            microSleep(10000); 
    195208        } 
    196209 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp

    r10161 r10851  
    6666 
    6767    void open(AVStream * stream); 
     68    void pause(bool pause); 
    6869    void close(bool waitForThreadToExit); 
    6970 
     
    121122    bool                    m_alpha_channel; 
    122123 
     124    bool                    m_paused; 
    123125    volatile bool           m_exit; 
    124126     
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp

    r10809 r10851  
    157157{  
    158158    return m_decoder->duration();  
     159} 
     160 
     161 
     162double FFmpegImageStream::getReferenceTime () const 
     163{ 
     164    return m_decoder->reference(); 
    159165} 
    160166 
     
    265271            m_decoder->video_decoder().start(); 
    266272 
    267         m_decoder->resume(); 
     273        m_decoder->video_decoder().pause(false); 
     274        m_decoder->audio_decoder().pause(false); 
    268275    } 
    269276 
     
    277284    if (_status == PLAYING) 
    278285    { 
    279         m_decoder->pause(); 
     286        m_decoder->video_decoder().pause(true); 
     287        m_decoder->audio_decoder().pause(true); 
    280288    } 
    281289 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp

    r10809 r10851  
    3535 
    3636        virtual double getLength() const; 
     37        virtual double getReferenceTime () const;  
    3738        virtual double getFrameRate() const; 
    3839 
     
    7273        Mutex            m_mutex; 
    7374        Condition        m_frame_published_cond; 
    74         bool            m_frame_published_flag; 
     75        bool             m_frame_published_flag; 
    7576        double           m_seek_time; 
    7677    };