]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Added some utility algorithms.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 14 May 2011 10:56:22 +0000 (10:56 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 14 May 2011 10:56:22 +0000 (10:56 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@739 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

common/common.vcxproj
common/common.vcxproj.filters
common/utility/algorithm.h [new file with mode: 0644]
core/mixer/frame_mixer_device.cpp
modules/ffmpeg/producer/audio/audio_decoder.cpp
modules/ffmpeg/producer/ffmpeg_producer.cpp

index 235708c9de8dab6effe8c3ee2712f6a5c8e99ea2..df99d2d69db8e88de37fba4e8d534ba1c211a9c2 100644 (file)
     <ClInclude Include="os\windows\current_version.h" />\r
     <ClInclude Include="os\windows\system_info.h" />\r
     <ClInclude Include="stdafx.h" />\r
+    <ClInclude Include="utility\algorithm.h" />\r
     <ClInclude Include="utility\assert.h" />\r
     <ClInclude Include="utility\string.h" />\r
     <ClInclude Include="utility\timer.h" />\r
index b0b0d26adc1002932f6611460f113ebcf75ab45c..293dfc54c57a290a74d3803d5391b48f56a08166 100644 (file)
     <ClInclude Include="concurrency\com_context.h">\r
       <Filter>concurrency</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="utility\algorithm.h">\r
+      <Filter>utility</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
diff --git a/common/utility/algorithm.h b/common/utility/algorithm.h
new file mode 100644 (file)
index 0000000..c657118
--- /dev/null
@@ -0,0 +1,25 @@
+#pragma once\r
+\r
+namespace caspar {\r
+\r
+template<typename T>\r
+typename T::value_type pop_front(T& container)\r
+{\r
+       auto item = std::move(container.front());\r
+       container.pop_front();\r
+       return std::move(item);\r
+}\r
+\r
+template<typename T>\r
+std::vector<T> split(const T& container, size_t size)\r
+{\r
+       std::vector<T> result;\r
+       const auto last = container.end() - container.size() % size;    \r
+       for(auto it = container.begin(); it != last; it += size)\r
+               result.push_back(T(it, it + size));\r
+       result.push_back(T(last, container.end()));\r
+\r
+       return std::move(result);\r
+}\r
+\r
+}
\ No newline at end of file
index fc88c838653e8d82232266e12357a65c7ba9ccdd..9c7dca934db27f511984b0970cddb2431fb57c88 100644 (file)
@@ -115,7 +115,7 @@ public:
                diag_->set_color("frame-time", diagnostics::color(1.0f, 0.0f, 0.0f));\r
                diag_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f));\r
                diag_->set_color("input-buffer", diagnostics::color(1.0f, 1.0f, 0.0f)); \r
-               executor_.set_capacity(1);      \r
+               executor_.set_capacity(2);      \r
                executor_.begin_invoke([]\r
                {\r
                        SetThreadPriority(GetCurrentThread(), ABOVE_NORMAL_PRIORITY_CLASS);\r
index 311df2f478f96684e0b928beefbb9632d6ba3537..e3265ef5f6fe16cb6780c91961e09271df6681b2 100644 (file)
@@ -21,6 +21,8 @@
 \r
 #include "audio_decoder.h"\r
 \r
+#include <common/utility/algorithm.h>\r
+\r
 #if defined(_MSC_VER)\r
 #pragma warning (push)\r
 #pragma warning (disable : 4244)\r
@@ -39,14 +41,12 @@ extern "C"
 namespace caspar {\r
 \r
 struct audio_decoder::implementation : boost::noncopyable\r
-{\r
-       typedef std::vector<short, tbb::cache_aligned_allocator<short>> buffer;\r
-       \r
+{      \r
        AVCodecContext* codec_context_;\r
                \r
        const core::video_format_desc format_desc_;\r
 \r
-       buffer current_chunk_;\r
+       std::vector<short> current_chunk_;\r
 \r
 public:\r
        explicit implementation(AVCodecContext* codec_context, const core::video_format_desc& format_desc) \r
@@ -97,13 +97,10 @@ public:
 \r
                current_chunk_.resize(s + written_bytes/2);\r
 \r
-               const auto last = current_chunk_.end() - current_chunk_.size() % format_desc_.audio_samples_per_frame;\r
-               \r
-               std::vector<std::vector<short>> chunks;\r
-               for(auto it = current_chunk_.begin(); it != last; it += format_desc_.audio_samples_per_frame)           \r
-                       chunks.push_back(std::vector<short>(it, it + format_desc_.audio_samples_per_frame));            \r
+               auto chunks = split(current_chunk_, format_desc_.audio_samples_per_frame);\r
 \r
-               current_chunk_.erase(current_chunk_.begin(), last);\r
+               current_chunk_ = chunks.back();\r
+               chunks.pop_back();\r
                \r
                return chunks;\r
        }\r
index db7e0060254ca9f06f32d56f848b804b5d7d7ee9..93327040231098913194e849979724caa0dbdc60 100644 (file)
 #include "audio/audio_decoder.h"\r
 #include "video/video_decoder.h"\r
 \r
-#include <common/utility/timer.h>\r
 #include <common/diagnostics/graph.h>\r
+#include <common/env.h>\r
+#include <common/utility/algorithm.h>\r
 \r
+#include <core/video_format.h>\r
 #include <core/producer/frame/basic_frame.h>\r
 #include <core/producer/frame/write_frame.h>\r
 #include <core/producer/frame/audio_transform.h>\r
-#include <core/video_format.h>\r
-\r
-#include <common/env.h>\r
-#include <common/utility/timer.h>\r
-#include <common/utility/assert.h>\r
 \r
 #include <tbb/parallel_invoke.h>\r
 \r
 #include <boost/timer.hpp>\r
 \r
 #include <deque>\r
-#include <functional>\r
 \r
 namespace caspar {\r
        \r
 struct ffmpeg_producer : public core::frame_producer\r
 {\r
-       const std::wstring                                      filename_;\r
-       const bool                                                      loop_;\r
+       const std::wstring                                              filename_;\r
+       const bool                                                              loop_;\r
        \r
-       std::shared_ptr<diagnostics::graph>     graph_;\r
-       boost::timer                                            perf_timer_;\r
+       std::shared_ptr<diagnostics::graph>             graph_;\r
+       boost::timer                                                    perf_timer_;\r
                \r
        std::deque<safe_ptr<core::write_frame>> video_frame_buffer_;    \r
        std::deque<std::vector<short>>                  audio_chunk_buffer_;\r
-\r
-       std::queue<safe_ptr<core::basic_frame>> ouput_channel_;\r
+       std::queue<safe_ptr<core::basic_frame>> output_channel_;\r
                \r
        std::shared_ptr<core::frame_factory>    frame_factory_;\r
 \r
-       input                                                           input_; \r
-       std::unique_ptr<video_decoder>          video_decoder_;\r
-       std::unique_ptr<audio_decoder>          audio_decoder_;\r
+       input                                                                   input_; \r
+       std::unique_ptr<video_decoder>                  video_decoder_;\r
+       std::unique_ptr<audio_decoder>                  audio_decoder_;\r
 public:\r
        explicit ffmpeg_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& filename, bool loop, int start_frame, int end_frame) \r
                : filename_(filename)\r
@@ -117,7 +112,7 @@ public:
        {\r
                perf_timer_.restart();\r
 \r
-               for(size_t n = 0; ouput_channel_.size() < 2 && input_.has_packet() && n < 32; ++n) // 32 packets should be enough. Otherwise there probably was an error and we want to avoid infinite recursion.\r
+               for(size_t n = 0; output_channel_.size() < 2 && input_.has_packet() && n < 32; ++n) // 32 packets should be enough. Otherwise there probably was an error and we want to avoid infinite recursion.\r
                {       \r
                        tbb::parallel_invoke\r
                        (\r
@@ -189,16 +184,12 @@ public:
 \r
                if(!video_frame_buffer_.empty() && !audio_chunk_buffer_.empty())\r
                {\r
-                       frame = video_frame_buffer_.front();                            \r
-                       video_frame_buffer_.pop_front();\r
-                               \r
-                       frame->audio_data() = std::move(audio_chunk_buffer_.front());\r
-                       audio_chunk_buffer_.pop_front();        \r
+                       frame = pop_front(video_frame_buffer_);\r
+                       frame->audio_data() = pop_front(audio_chunk_buffer_);\r
                }\r
                else if(!video_frame_buffer_.empty() && !audio_decoder_)\r
                {\r
-                       frame = video_frame_buffer_.front();                            \r
-                       video_frame_buffer_.pop_front();\r
+                       frame = pop_front(video_frame_buffer_);\r
                        frame->get_audio_transform().set_has_audio(false);      \r
                }\r
                else if(!audio_chunk_buffer_.empty() && !video_decoder_)\r
@@ -206,12 +197,11 @@ public:
                        frame = frame_factory_->create_frame(this, 1, 1);\r
                        std::fill(frame->image_data().begin(), frame->image_data().end(), 0);\r
                                \r
-                       frame->audio_data() = std::move(audio_chunk_buffer_.front());\r
-                       audio_chunk_buffer_.pop_front();\r
+                       frame->audio_data() = pop_front(audio_chunk_buffer_);\r
                }\r
                \r
                if(frame)\r
-                       ouput_channel_.push(make_safe(frame));                  \r
+                       output_channel_.push(make_safe(frame));                 \r
        }\r
                \r
        safe_ptr<core::basic_frame> get_next_frame()\r
@@ -219,20 +209,18 @@ public:
                if(is_eof())\r
                        return core::basic_frame::eof();\r
 \r
-               if(ouput_channel_.empty())\r
+               if(output_channel_.empty())\r
                {\r
                        graph_->add_tag("underflow");\r
                        return core::basic_frame::late();                       \r
                }\r
 \r
-               auto frame = std::move(ouput_channel_.front());\r
-               ouput_channel_.pop();           \r
-               return frame;\r
+               return pop_front(output_channel_);\r
        }\r
 \r
        bool is_eof() const\r
        {\r
-               return ouput_channel_.empty() && (!video_decoder_ && !audio_decoder_) || !input_.is_running();\r
+               return output_channel_.empty() && (!video_decoder_ && !audio_decoder_) || !input_.is_running();\r
        }\r
 };\r
 \r