Changeset 10809
- Timestamp:
- 11/20/09 15:31:11 (3 years ago)
- Location:
- OpenSceneGraph/trunk
- Files:
-
- 5 modified
-
examples/osgmovie/osgmovie.cpp (modified) (3 diffs)
-
src/osgPlugins/ffmpeg/FFmpegDecoder.cpp (modified) (4 diffs)
-
src/osgPlugins/ffmpeg/FFmpegDecoder.hpp (modified) (3 diffs)
-
src/osgPlugins/ffmpeg/FFmpegImageStream.cpp (modified) (5 diffs)
-
src/osgPlugins/ffmpeg/FFmpegImageStream.hpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/examples/osgmovie/osgmovie.cpp
r10799 r10809 119 119 bool _trackMouse; 120 120 ImageStreamList _imageStreamList; 121 unsigned int _seekIncr; 121 122 122 123 }; … … 238 239 return true; 239 240 } 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 } 240 258 else if (ea.getKey()=='L') 241 259 { … … 310 328 usage.addKeyboardMouseBinding("-","Decrease speed of movie"); 311 329 usage.addKeyboardMouseBinding("o","Display frame rate of movie"); 330 usage.addKeyboardMouseBinding(">","Advance the movie using seek"); 312 331 } 313 332 -
OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.cpp
r10422 r10809 167 167 return readNextPacketNormal(); 168 168 169 case PAUSE: 170 return false; 171 169 172 case END_OF_STREAM: 170 173 return readNextPacketEndOfStream(); … … 172 175 case REWINDING: 173 176 return readNextPacketRewinding(); 177 178 case SEEKING: 179 return readNextPacketSeeking(); 174 180 175 181 default: … … 190 196 } 191 197 192 193 198 void FFmpegDecoder::seek(double time) 199 { 200 m_pending_packet.clear(); 201 202 flushAudioQueue(); 203 flushVideoQueue(); 204 seekButDontFlushQueues(time); 205 } 206 207 void FFmpegDecoder::pause() 208 { 209 m_pending_packet.clear(); 210 211 flushAudioQueue(); 212 flushVideoQueue(); 213 m_state = PAUSE; 214 } 215 216 void FFmpegDecoder::resume() 217 { 218 m_pending_packet.clear(); 219 220 flushAudioQueue(); 221 flushVideoQueue(); 222 m_state = NORMAL; 223 } 194 224 195 225 void FFmpegDecoder::findAudioStream() … … 347 377 } 348 378 379 bool 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 389 void 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 349 402 350 403 -
OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoder.hpp
r10392 r10809 69 69 bool readNextPacket(); 70 70 void rewind(); 71 void seek(double time); 72 void pause(); 73 void resume(); 71 74 72 75 void loop(bool loop); … … 85 88 { 86 89 NORMAL, 90 PAUSE, 87 91 END_OF_STREAM, 88 REWINDING 92 REWINDING, 93 SEEKING 89 94 }; 90 95 … … 98 103 bool readNextPacketEndOfStream(); 99 104 bool readNextPacketRewinding(); 105 bool readNextPacketSeeking(); 106 bool readNextPacketPause(); 100 107 void rewindButDontFlushQueues(); 108 void seekButDontFlushQueues(double time); 101 109 102 110 FormatContextPtr m_format_context; -
OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.cpp
r10538 r10809 129 129 { 130 130 m_commands->push(CMD_REWIND); 131 } 132 133 void FFmpegImageStream::seek(double time) { 134 m_seek_time = time; 135 m_commands->push(CMD_SEEK); 131 136 } 132 137 … … 235 240 return true; 236 241 242 case CMD_SEEK: 243 cmdSeek(m_seek_time); 244 return true; 245 237 246 case CMD_STOP: 238 247 return false; … … 255 264 if (! m_decoder->video_decoder().isRunning()) 256 265 m_decoder->video_decoder().start(); 266 267 m_decoder->resume(); 257 268 } 258 269 … … 266 277 if (_status == PLAYING) 267 278 { 268 279 m_decoder->pause(); 269 280 } 270 281 … … 279 290 } 280 291 292 void FFmpegImageStream::cmdSeek(double time) 293 { 294 m_decoder->seek(time); 295 } 281 296 282 297 -
OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp
r9910 r10809 31 31 virtual void pause(); 32 32 virtual void rewind(); 33 virtual void seek(double time); 33 34 virtual void quit(bool waitForThreadToExit = true); 34 35 … … 45 46 CMD_PAUSE, 46 47 CMD_STOP, 47 CMD_REWIND 48 CMD_REWIND, 49 CMD_SEEK 48 50 }; 49 51 … … 61 63 void cmdPause(); 62 64 void cmdRewind(); 65 void cmdSeek(double time); 63 66 64 67 static void publishNewFrame(const FFmpegDecoderVideo &, void * user_data); … … 70 73 Condition m_frame_published_cond; 71 74 bool m_frame_published_flag; 75 double m_seek_time; 72 76 }; 73 77
