]> git.sesse.net Git - casparcg/blobdiff - core/producer/channel/channel_producer.cpp
Fixed bug in channel_producer
[casparcg] / core / producer / channel / channel_producer.cpp
index 6d3bdb2636b2ba760ed53434cd3e98f5c426c677..98d845ca0880f5986a5199cfe5138e79ac26418c 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-* Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>\r
+* Copyright 2013 Sveriges Television AB http://casparcg.com/\r
 *\r
 * This file is part of CasparCG (www.casparcg.com).\r
 *\r
@@ -23,6 +23,7 @@
 \r
 #include "channel_producer.h"\r
 \r
+#include "../../monitor/monitor.h"\r
 #include "../../consumer/frame_consumer.h"\r
 #include "../../consumer/output.h"\r
 #include "../../video_channel.h"\r
@@ -34,7 +35,8 @@
 \r
 #include <common/exception/exceptions.h>\r
 #include <common/memory/memcpy.h>\r
-#include <common/concurrency/future_util.h>\r\r
+#include <common/concurrency/future_util.h>\r
+\r
 #include <tbb/concurrent_queue.h>\r
 \r
 namespace caspar { namespace core {\r
@@ -45,11 +47,13 @@ class channel_consumer : public frame_consumer
        core::video_format_desc                                                                         format_desc_;\r
        int                                                                                                                     channel_index_;\r
        tbb::atomic<bool>                                                                                       is_running_;\r
+       tbb::atomic<int64_t>                                                                            current_age_;\r
 \r
 public:\r
        channel_consumer() \r
        {\r
                is_running_ = true;\r
+               current_age_ = 0;\r
                frame_buffer_.set_capacity(3);\r
        }\r
 \r
@@ -72,6 +76,11 @@ public:
                channel_index_  = channel_index;\r
        }\r
 \r
+       virtual int64_t presentation_frame_age_millis() const override\r
+       {\r
+               return current_age_;\r
+       }\r
+\r
        virtual std::wstring print() const override\r
        {\r
                return L"[channel-consumer|" + boost::lexical_cast<std::wstring>(channel_index_) + L"]";\r
@@ -118,13 +127,18 @@ public:
                if(!is_running_)\r
                        return make_safe<read_frame>();\r
                std::shared_ptr<read_frame> frame;\r
-               frame_buffer_.try_pop(frame);\r
+               \r
+               if (frame_buffer_.try_pop(frame))\r
+                       current_age_ = frame->get_age_millis();\r
+\r
                return frame;\r
        }\r
 };\r
        \r
 class channel_producer : public frame_producer\r
 {\r
+       monitor::subject                                        monitor_subject_;\r
+\r
        const safe_ptr<frame_factory>           frame_factory_;\r
        const safe_ptr<channel_consumer>        consumer_;\r
 \r
@@ -206,6 +220,11 @@ public:
                info.add(L"type", L"channel-producer");\r
                return info;\r
        }\r
+\r
+       monitor::source& monitor_output() \r
+       {\r
+               return monitor_subject_;\r
+       }\r
 };\r
 \r
 safe_ptr<frame_producer> create_channel_producer(const safe_ptr<core::frame_factory>& frame_factory, const safe_ptr<video_channel>& channel)\r