]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Fixed loop frame seeking.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 26 Apr 2011 06:37:35 +0000 (06:37 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 26 Apr 2011 06:37:35 +0000 (06:37 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@645 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

common/gl/gl_check.h
core/channel.cpp
core/producer/color/color_producer.cpp
core/producer/frame_producer_device.cpp
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/input.cpp
shell/caspar.config
shell/main.cpp

index 4437af60f816df8267e383015e39a5ba140efa68..4b00c3f2bc5f8081ee86aa1b4467afcbfdbb8eb8 100644 (file)
@@ -107,7 +107,7 @@ inline void SMFL_GLCheckError(const std::string& expr, const std::string& File,
        }\r
 }\r
 \r
-#ifdef _DEBUG\r
+//#ifdef _DEBUG\r
        \r
 #define CASPAR_GL_EXPR_STR(expr) #expr\r
 \r
@@ -117,8 +117,8 @@ inline void SMFL_GLCheckError(const std::string& expr, const std::string& File,
                (expr);  \\r
                caspar::gl::SMFL_GLCheckError(CASPAR_GL_EXPR_STR(expr), __FILE__, __LINE__);\\r
        }while(0);\r
-#else\r
-#define GL(expr) expr\r
-#endif\r
+//#else\r
+//#define GL(expr) expr\r
+//#endif\r
 \r
 }}
\ No newline at end of file
index 2fda119fd68ef208b7534e566424e38d396878e6..575c034e5eea23bab9adbdfa2dc30f366d138747 100644 (file)
@@ -26,7 +26,7 @@ struct channel::implementation : boost::noncopyable
        const int index_;\r
        video_format_desc format_desc_;\r
        \r
-       safe_ptr<mixer::frame_mixer_device>      mixer_;\r
+       safe_ptr<mixer::frame_mixer_device> mixer_;\r
        safe_ptr<frame_consumer_device> consumer_;\r
        safe_ptr<frame_producer_device> producer_;\r
 \r
index cc540d10cc449be8e56848e67776026257584970..b211b0d5e8eaa630e2ac7d3651a0c28736da874b 100644 (file)
@@ -31,7 +31,7 @@ namespace caspar { namespace core {
 class color_producer : public frame_producer\r
 {\r
        safe_ptr<basic_frame> frame_;\r
-       std::wstring color_str_;\r
+       const std::wstring color_str_;\r
 \r
 public:\r
        explicit color_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& color) \r
index e283614f2ae3866a844001eecb1d8beafa83463f..9603ae726cd9a0985a83763417e238880a80ff1f 100644 (file)
@@ -39,11 +39,6 @@ public:
                executor_.start();\r
        }\r
 \r
-       ~implementation()\r
-       {\r
-               CASPAR_LOG(info) << "Shutting down producer-device.";\r
-       }\r
-\r
        boost::signals2::connection connect(const output_t::slot_type& subscriber)\r
        {\r
                return executor_.invoke([&]() -> boost::signals2::connection\r
@@ -115,10 +110,7 @@ public:
        \r
        void swap_layer(int index, size_t other_index)\r
        {\r
-               executor_.invoke([&]\r
-               {\r
-                       layers_[index].swap(layers_[other_index]);\r
-               });\r
+               executor_.invoke([&]{layers_[index].swap(layers_[other_index]);});\r
        }\r
 \r
        void swap_layer(int index, size_t other_index, frame_producer_device& other)\r
@@ -130,12 +122,7 @@ public:
                        if(format_desc_ != other.impl_->format_desc_)\r
                                BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("Cannot swap between channels with different formats."));\r
 \r
-                       auto func = [&]\r
-                       {\r
-                               layers_[index].swap(other.impl_->layers_[other_index]);         \r
-\r
-                               CASPAR_LOG(info) << print() << L" Swapped layer " << index << L" with " << other.impl_->print() << L" layer " << other_index << L".";   \r
-                       };\r
+                       auto func = [&]{layers_[index].swap(other.impl_->layers_[other_index]);};\r
                \r
                        executor_.invoke([&]{other.impl_->executor_.invoke(func);});\r
                }\r
@@ -154,14 +141,14 @@ public:
                        auto sel_first = [](const std::pair<int, layer>& pair){return pair.first;};\r
 \r
                        std::set<int> indices;\r
-                       std::transform(layers_.begin(), layers_.end(), std::inserter(indices, indices.begin()), sel_first);\r
-                       std::transform(other.impl_->layers_.begin(), other.impl_->layers_.end(), std::inserter(indices, indices.begin()), sel_first);\r
+                       auto inserter = std::inserter(indices, indices.begin());\r
+\r
+                       std::transform(layers_.begin(), layers_.end(), inserter, sel_first);\r
+                       std::transform(other.impl_->layers_.begin(), other.impl_->layers_.end(), inserter, sel_first);\r
                        std::for_each(indices.begin(), indices.end(), [&](int index)\r
                        {\r
                                layers_[index].swap(other.impl_->layers_[index]);\r
                        });                                     \r
-\r
-                       CASPAR_LOG(info) << print() << L" Swapped layers with " << other.impl_->print() << L".";\r
                };\r
                \r
                executor_.invoke([&]{other.impl_->executor_.invoke(func);});\r
@@ -169,15 +156,7 @@ public:
        \r
        boost::unique_future<safe_ptr<frame_producer>> foreground(int index)\r
        {\r
-               return executor_.begin_invoke([=]\r
-               {                       \r
-                       return layers_[index].foreground();\r
-               });\r
-       }\r
-\r
-       std::wstring print() const\r
-       {\r
-               return L"frame_producer_device";\r
+               return executor_.begin_invoke([=]{return layers_[index].foreground();});\r
        }\r
 };\r
 \r
index 5a6d7bbfc49861e603fef60b958c4ae16d252eba..c0fac8964c598b780f595296eadd8c67cad1468a 100644 (file)
@@ -78,12 +78,15 @@ public:
                        \r
                        aligned_buffer audio_packet;\r
                        if(audio_chunk_channel_.size() < 3 && audio_decoder_)   \r
-                               audio_packet = input_->get_audio_packet();              \r
+                               audio_packet = input_->get_audio_packet();      \r
+\r
+                       if(video_packet.empty() && audio_packet.empty()) // Skip frame if lagging.                       \r
+                               break;\r
 \r
                        tbb::parallel_invoke(\r
                        [&]\r
-                       { // Video Decoding and Scaling\r
-                               if(!video_packet.empty() && video_decoder_)\r
+                       {\r
+                               if(!video_packet.empty() && video_decoder_) // Video Decoding.\r
                                {\r
                                        try\r
                                        {\r
@@ -99,8 +102,8 @@ public:
                                }\r
                        }, \r
                        [&] \r
-                       { // Audio Decoding\r
-                               if(!audio_packet.empty() && audio_decoder_)\r
+                       { \r
+                               if(!audio_packet.empty() && audio_decoder_) // Audio Decoding.\r
                                {\r
                                        try\r
                                        {\r
@@ -152,6 +155,8 @@ public:
                        result = get_frame(); // TODO: Support 50p              \r
                else if(input_->is_eof())\r
                        result = core::basic_frame::eof();\r
+               else\r
+                       graph_->add_tag("lag");\r
                \r
                return result;\r
        }\r
index 24677c1f4dac927c170abe60aafa11a57872b783..a2a0a50cc44690511359f5df001fa9c39f16872f 100644 (file)
@@ -158,7 +158,7 @@ public:
                        else if(read_packet->stream_index == audio_s_index_)    \r
                                audio_packet_buffer_.try_push(std::move(packet));               \r
                }\r
-               else if(!loop_ || !seek_frame(0, AVSEEK_FLAG_BACKWARD)) // TODO: av_seek_frame does not work for all formats\r
+               else if(!loop_ || av_seek_frame(format_context_.get(), -1, 0, AVSEEK_FLAG_BACKWARD) < 0) // TODO: av_seek_frame does not work for all formats\r
                        executor_.stop();\r
                else\r
                        graph_->add_tag("seek");                \r
@@ -170,22 +170,6 @@ public:
                while(executor_.is_running() && audio_packet_buffer_.size() > PACKET_BUFFER_COUNT && video_packet_buffer_.size() > PACKET_BUFFER_COUNT)\r
                        cond_.wait(lock);               \r
        }\r
-       \r
-       bool seek_frame(int64_t seek_target, int flags = 0)\r
-       {  \r
-               static const AVRational TIME_BASE_Q = {1, AV_TIME_BASE};\r
-               \r
-               int stream_index = std::max(video_s_index_, audio_s_index_);\r
-               seek_target *= AV_TIME_BASE;\r
-\r
-               if(stream_index >= 0)     \r
-                       seek_target = av_rescale_q(seek_target, TIME_BASE_Q, format_context_->streams[stream_index]->time_base);\r
-         \r
-               bool result = av_seek_frame(format_context_.get(), stream_index, seek_target, flags) >= 0;\r
-               if(!result)\r
-                       CASPAR_LOG(warning) << print() << " Failed to seek frame.";\r
-               return result;\r
-       }\r
                \r
        aligned_buffer get_video_packet()\r
        {\r
index 12182036102d7ca932aa50723da3b22771ff59ec..b1b63dce58978a556ec30aa6ffae9da99a727b0a 100644 (file)
     <channel>\r
       <videomode>1080i5000</videomode>\r
       <consumers>\r
-        <decklink>\r
+        <!--<decklink>\r
           <device>1</device>\r
           <embedded-audio>true</embedded-audio>\r
           <internal-key>false</internal-key>\r
-        </decklink>\r
+        </decklink>-->\r
         <ogl>\r
           <device>0</device>\r
           <stretch>uniform</stretch>\r
index 51f067cc80a7705f377d48f1cc6d7da1c64c81db..a3648b7612ef2ca2780d0f173833c72f93cc02cb 100644 (file)
@@ -208,7 +208,7 @@ int main(int argc, wchar_t* argv[])
                        else if(wcmd.substr(0, 1) == L"5")\r
                                wcmd = L"LOADBG 1-2 " + wcmd.substr(1, wcmd.length()-1) + L" LOOP \r\nPLAY 1-2";\r
                        else if(wcmd.substr(0, 1) == L"6")\r
-                               wcmd = L"CG 1-2 ADD 1 BBTELEFONARE 1";\r
+                               wcmd = L"CG 1-2 ADD 1 THING 1";\r
                        else if(wcmd.substr(0, 1) == L"7")\r
                                wcmd = L"LOAD 1-1 720p2500";\r
                        else if(wcmd.substr(0, 1) == L"8")\r