+ if(is_eof(ret)) \r
+ {\r
+ ++nb_loops_;\r
+ frame_number_ = 0;\r
+\r
+ if(loop_)\r
+ {\r
+ int flags = AVSEEK_FLAG_BACKWARD;\r
+\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
+ seek_frame(start_, flags);\r
+ graph_->add_tag("seek"); \r
+ CASPAR_LOG(debug) << print() << " Looping."; \r
+ } \r
+ else\r
+ {\r
+ is_running_ = false;\r
+ CASPAR_LOG(debug) << print() << " Stopping.";\r
+ }\r
+ }\r
+ else\r
+ { \r
+ THROW_ON_ERROR(ret, print(), "av_read_frame");\r
+\r
+ if(read_packet->stream_index == default_stream_index_)\r
+ {\r
+ if(nb_loops_ == 0)\r
+ ++nb_frames_;\r
+ ++frame_number_;\r
+ }\r
+\r
+ THROW_ON_ERROR2(av_dup_packet(read_packet.get()), print());\r
+ \r
+ // Make sure that the packet is correctly deallocated even if size and data is modified during decoding.\r
+ auto size = read_packet->size;\r
+ auto data = read_packet->data;\r
+\r
+ read_packet = std::shared_ptr<AVPacket>(read_packet.get(), [=](AVPacket*)\r
+ {\r
+ read_packet->size = size;\r
+ read_packet->data = data;\r
+ });\r
+\r
+ buffer_.try_push(read_packet);\r
+ buffer_size_ += read_packet->size;\r
+ \r
+ graph_->update_value("buffer-size", (static_cast<double>(buffer_size_)+0.001)/MAX_BUFFER_SIZE);\r
+ graph_->update_value("buffer-count", (static_cast<double>(buffer_.size()+0.001)/MAX_BUFFER_COUNT));\r
+ } \r
+ }\r
+\r
+ bool full() const\r