- Timestamp:
- 11/20/09 15:31:11 (4 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
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
