Changeset 10809

Show
Ignore:
Timestamp:
11/20/09 15:31:11 (4 years ago)
Author:
robert
Message:

From Rafa Gaitan, "Current ffmpeg plugin didn't support pause and seek, I have added this
functionality and I also modified osgmovie example to support "seek"."

Note from Robert Osfield, changes osgmovie to use '>' for the seek as '+' was already used in a separate submission that had been merged.

Location:
OpenSceneGraph/trunk
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgmovie/osgmovie.cpp

    r10799 r10809  
    119119    bool            _trackMouse; 
    120120    ImageStreamList _imageStreamList; 
     121    unsigned int    _seekIncr; 
    121122 
    122123}; 
     
    238239                return true; 
    239240            } 
     241            else if (ea.getKey()=='>') 
     242            { 
     243                for(ImageStreamList::iterator itr=_imageStreamList.begin(); 
     244                    itr!=_imageStreamList.end(); 
     245                    ++itr) 
     246                { 
     247                    std::cout<<"Seeking"<<std::endl; 
     248                    if(_seekIncr > 3) _seekIncr = 0; 
     249                    double length = (*itr)->getLength(); 
     250                    double t_pos = (length/4.0f)*_seekIncr; 
     251                    //(*itr)->rewind(); 
     252                    (*itr)->seek(t_pos); 
     253                    (*itr)->play(); 
     254                    _seekIncr++; 
     255                } 
     256                return true; 
     257            } 
    240258            else if (ea.getKey()=='L') 
    241259            { 
     
    310328    usage.addKeyboardMouseBinding("-","Decrease speed of movie"); 
    311329    usage.addKeyboardMouseBinding("o","Display frame rate of movie"); 
     330    usage.addKeyboardMouseBinding(">","Advance the movie using seek"); 
    312331} 
    313332 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp

    r10422 r10809  
    167167        return readNextPacketNormal(); 
    168168 
     169    case PAUSE: 
     170        return false; 
     171 
    169172    case END_OF_STREAM: 
    170173        return readNextPacketEndOfStream(); 
     
    172175    case REWINDING: 
    173176        return readNextPacketRewinding(); 
     177 
     178    case SEEKING: 
     179        return readNextPacketSeeking(); 
    174180 
    175181    default: 
     
    190196} 
    191197 
    192  
    193  
     198void FFmpegDecoder::seek(double time)  
     199{ 
     200    m_pending_packet.clear(); 
     201 
     202    flushAudioQueue(); 
     203    flushVideoQueue(); 
     204    seekButDontFlushQueues(time); 
     205} 
     206 
     207void FFmpegDecoder::pause()  
     208{ 
     209    m_pending_packet.clear(); 
     210 
     211    flushAudioQueue(); 
     212    flushVideoQueue(); 
     213    m_state = PAUSE; 
     214} 
     215 
     216void FFmpegDecoder::resume()  
     217{ 
     218    m_pending_packet.clear(); 
     219 
     220    flushAudioQueue(); 
     221    flushVideoQueue(); 
     222    m_state = NORMAL; 
     223} 
    194224 
    195225void FFmpegDecoder::findAudioStream() 
     
    347377} 
    348378 
     379bool FFmpegDecoder::readNextPacketSeeking()  
     380{ 
     381    const FFmpegPacket packet(FFmpegPacket::PACKET_FLUSH); 
     382 
     383    if (m_audio_queue.timedPush(packet, 10) && m_video_queue.timedPush(packet, 10)) 
     384        m_state = NORMAL; 
     385 
     386    return false;     
     387} 
     388 
     389void FFmpegDecoder::seekButDontFlushQueues(double time) 
     390{ 
     391    const AVRational AvTimeBaseQ = { 1, AV_TIME_BASE }; // = AV_TIME_BASE_Q 
     392 
     393    const int64_t pos = int64_t(m_clocks.getStartTime()+time * double(AV_TIME_BASE)); 
     394    const int64_t seek_target = av_rescale_q(pos, AvTimeBaseQ, m_video_stream->time_base); 
     395 
     396    if (av_seek_frame(m_format_context.get(), m_video_index, seek_target, 0/*AVSEEK_FLAG_BYTE |*/ /*AVSEEK_FLAG_BACKWARD*/) < 0) 
     397        throw std::runtime_error("av_seek_frame failed()"); 
     398 
     399    m_state = SEEKING;     
     400} 
     401 
    349402 
    350403 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp

    r10392 r10809  
    6969    bool readNextPacket(); 
    7070    void rewind(); 
     71    void seek(double time); 
     72    void pause(); 
     73    void resume(); 
    7174 
    7275    void loop(bool loop); 
     
    8588    { 
    8689        NORMAL, 
     90        PAUSE, 
    8791        END_OF_STREAM, 
    88         REWINDING 
     92        REWINDING, 
     93        SEEKING 
    8994    }; 
    9095 
     
    98103    bool readNextPacketEndOfStream(); 
    99104    bool readNextPacketRewinding(); 
     105    bool readNextPacketSeeking(); 
     106    bool readNextPacketPause(); 
    100107    void rewindButDontFlushQueues(); 
     108    void seekButDontFlushQueues(double time); 
    101109 
    102110    FormatContextPtr    m_format_context; 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp

    r10538 r10809  
    129129{ 
    130130    m_commands->push(CMD_REWIND); 
     131} 
     132 
     133void FFmpegImageStream::seek(double time) { 
     134    m_seek_time = time; 
     135    m_commands->push(CMD_SEEK); 
    131136} 
    132137 
     
    235240        return true; 
    236241 
     242    case CMD_SEEK: 
     243        cmdSeek(m_seek_time); 
     244        return true; 
     245 
    237246    case CMD_STOP: 
    238247        return false; 
     
    255264        if (! m_decoder->video_decoder().isRunning()) 
    256265            m_decoder->video_decoder().start(); 
     266 
     267        m_decoder->resume(); 
    257268    } 
    258269 
     
    266277    if (_status == PLAYING) 
    267278    { 
    268  
     279        m_decoder->pause(); 
    269280    } 
    270281 
     
    279290} 
    280291 
     292void FFmpegImageStream::cmdSeek(double time)  
     293{ 
     294    m_decoder->seek(time); 
     295} 
    281296 
    282297 
  • OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp

    r9910 r10809  
    3131        virtual void pause(); 
    3232        virtual void rewind(); 
     33        virtual void seek(double time); 
    3334        virtual void quit(bool waitForThreadToExit = true); 
    3435 
     
    4546            CMD_PAUSE, 
    4647            CMD_STOP, 
    47             CMD_REWIND 
     48            CMD_REWIND, 
     49            CMD_SEEK 
    4850        }; 
    4951 
     
    6163        void cmdPause(); 
    6264        void cmdRewind(); 
     65        void cmdSeek(double time); 
    6366 
    6467        static void publishNewFrame(const FFmpegDecoderVideo &, void * user_data); 
     
    7073        Condition        m_frame_published_cond; 
    7174        bool            m_frame_published_flag; 
     75        double           m_seek_time; 
    7276    }; 
    7377