auto packet = create_packet();\r
auto ret = av_read_frame(format_context_.get(), packet.get()); // packet is only valid until next call of av_read_frame. Use av_dup_packet to extend its life. \r
\r
- CASPAR_ASSERT(nb_frames_ < 1000);\r
-\r
if(is_eof(ret)) \r
{\r
++nb_loops_;\r
\r
void seek_frame(int64_t frame, int flags = 0)\r
{ \r
- if(flags == AVSEEK_FLAG_BACKWARD)\r
- {\r
- // Fix VP6 seeking\r
- int vid_stream_index = av_find_best_stream(format_context_.get(), AVMEDIA_TYPE_VIDEO, -1, -1, 0, 0);\r
- if(vid_stream_index >= 0)\r
- {\r
- auto codec_id = format_context_->streams[vid_stream_index]->codec->codec_id;\r
- if(codec_id == CODEC_ID_VP6A || codec_id == CODEC_ID_VP6F || codec_id == CODEC_ID_VP6)\r
- flags |= AVSEEK_FLAG_BYTE;\r
- }\r
- }\r
-\r
- THROW_ON_ERROR2(av_seek_frame(format_context_.get(), default_stream_index_, frame, flags), print()); \r
+ CASPAR_LOG(debug) << print() << " Seeking: " << frame;\r
+\r
+ flags |= AVSEEK_FLAG_FRAME;\r
+ //if(flags == AVSEEK_FLAG_BACKWARD)\r
+ //{\r
+ // // Fix VP6 seeking\r
+ // int vid_stream_index = av_find_best_stream(format_context_.get(), AVMEDIA_TYPE_VIDEO, -1, -1, 0, 0);\r
+ // if(vid_stream_index >= 0)\r
+ // {\r
+ // auto codec_id = format_context_->streams[vid_stream_index]->codec->codec_id;\r
+ // if(codec_id == CODEC_ID_VP6A || codec_id == CODEC_ID_VP6F || codec_id == CODEC_ID_VP6)\r
+ // flags |= AVSEEK_FLAG_BYTE;\r
+ // }\r
+ //}\r
+ \r
+ THROW_ON_ERROR2(avformat_seek_file(format_context_.get(), default_stream_index_, std::max<int64_t>(0, frame-50), frame, frame+50, flags), print()); \r
\r
buffer_.push(flush_packet());\r
} \r