]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 29 Nov 2011 21:22:18 +0000 (21:22 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 29 Nov 2011 21:22:18 +0000 (21:22 +0000)
core/StdAfx.h
core/mixer/audio/audio_mixer.cpp
modules/decklink/StdAfx.h
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/muxer/frame_muxer.cpp
modules/ffmpeg/producer/util/util.cpp
modules/ffmpeg/producer/util/util.h

index 2cd385119b51193e9923ce08f9d6d4804d6f8d70..6c72569612c3a2d2b25ce5e64f0c398f13c70bfa 100644 (file)
 #include <tbb/concurrent_unordered_map.h>\r
 \r
 #include <boost/assign.hpp>\r
+#include <boost/circular_buffer.hpp>\r
+#include <boost/timer.hpp>\r
 #include <boost/filesystem.hpp>\r
 #include <boost/foreach.hpp>\r
+#include <boost/range.hpp>\r
+#include <boost/range/adaptors.hpp>\r
 #include <boost/range/algorithm.hpp>\r
 \r
 #include <common/utility/string.h>\r
index 60e7dd812701519252fa782de1828ad2fed0ec50..17850909b3eaeb30b78c4a98e3d49524699a2b1e 100644 (file)
 \r
 #include <tbb/cache_aligned_allocator.h>\r
 \r
-#include <boost/range.hpp>\r
-#include <boost/range/algorithm_ext/push_back.hpp>\r
+#include <boost/range/adaptors.hpp>\r
+#include <boost/range/distance.hpp>\r
 \r
-#include <array>\r
 #include <map>\r
 #include <stack>\r
 #include <vector>\r
-#include <valarray>\r
 \r
 namespace caspar { namespace core {\r
 \r
@@ -137,44 +135,38 @@ public:
                        const float prev_volume = static_cast<float>(prev_transform.volume);\r
                        const float next_volume = static_cast<float>(next_transform.volume);\r
                                                                        \r
-                       auto alpha              = (next_volume-prev_volume)/static_cast<float>(item.audio_data.size()/format_desc.audio_channels);\r
+                       auto alpha = (next_volume-prev_volume)/static_cast<float>(item.audio_data.size()/format_desc.audio_channels);\r
                        \r
-                       audio_buffer_ps result;\r
-                       result.reserve(item.audio_data.size());\r
-                       for(size_t n = 0; n < item.audio_data.size()/2; ++n)\r
-                       {\r
-                               result.push_back(item.audio_data[n*2+0] * (prev_volume + n * alpha));\r
-                               result.push_back(item.audio_data[n*2+1] * (prev_volume + n * alpha));\r
-                       }\r
-                                               \r
-                       boost::range::push_back(next_audio, std::move(result));\r
-                               \r
+                       for(size_t n = 0; n < item.audio_data.size(); ++n)\r
+                               next_audio.push_back(item.audio_data[n] * (prev_volume + static_cast<float>(n)/static_cast<float>(format_desc_.audio_channels) * alpha));\r
+                                                                               \r
                        next_audio_streams_[item.tag].transform  = std::move(next_transform); // Store all active tags, inactive tags will be removed at the end.\r
                        next_audio_streams_[item.tag].audio_data = std::move(next_audio);                       \r
                }                               \r
+\r
                items_.clear();\r
 \r
-               audio_streams_  = std::move(next_audio_streams_);\r
-               next_audio_streams_.clear();\r
+               audio_streams_ = std::move(next_audio_streams_);\r
                \r
                if(audio_streams_.empty())              \r
                        audio_streams_[nullptr].audio_data = audio_buffer_ps(audio_cadence_.front(), 0.0f);\r
                                \r
-               std::vector<float> result_ps(audio_cadence_.front(), 0.0f);\r
-               BOOST_FOREACH(auto& stream, audio_streams_)\r
-               {\r
-                       auto& audio_data        = stream.second.audio_data;\r
-                       \r
-                       if(audio_data.size() < audio_cadence_.front())\r
-                       {\r
-                               CASPAR_LOG(warning) << "[audio_mixer] Incorrect frame audio cadence, prepending silence: " << audio_cadence_.front()-audio_data.size();\r
-                               boost::range::push_back(audio_data, audio_buffer_ps(audio_cadence_.front()-audio_data.size(), 0.0f));\r
-                       }\r
+               { // sanity check\r
+\r
+                       auto invalid_streams = boost::distance(audio_streams_ | \r
+                                                                                                  boost::adaptors::map_values | \r
+                                                                                                  boost::adaptors::filtered([&](const audio_stream& x)\r
+                                                                                                  {return x.audio_data.size() < audio_cadence_.front();}));\r
 \r
-                       for(size_t n = 0; n < audio_cadence_.front(); ++n)\r
-                               result_ps[n] += audio_data[n];\r
+                       if(invalid_streams > 0)         \r
+                               CASPAR_LOG(trace) << "[audio_mixer] Incorrect frame audio cadence detected.";                   \r
+               }\r
 \r
-                       audio_data.erase(std::begin(audio_data), std::begin(audio_data) + audio_cadence_.front());\r
+               std::vector<float> result_ps(audio_cadence_.front(), 0.0f);\r
+               BOOST_FOREACH(auto& stream, audio_streams_ | boost::adaptors::map_values)\r
+               {\r
+                       auto out = boost::range::transform(result_ps, stream.audio_data, std::begin(result_ps), std::plus<float>());\r
+                       stream.audio_data.erase(std::begin(stream.audio_data), std::begin(stream.audio_data) + std::distance(std::begin(result_ps), out));\r
                }               \r
                \r
                boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
index fb6112a10231a992651aacc6e12a7d9a3f9e95ad..5e821e7443ecf93b3f69d9db4f9eb4da5d1aaccf 100644 (file)
 #include <tbb/concurrent_queue.h>\r
 \r
 #include <boost/assign.hpp>\r
+#include <boost/circular_buffer.hpp>\r
+#include <boost/timer.hpp>\r
 #include <boost/filesystem.hpp>\r
 #include <boost/foreach.hpp>\r
+#include <boost/range.hpp>\r
 #include <boost/range/algorithm.hpp>\r
 \r
 #include "../common/memory/safe_ptr.h"\r
index 8ba264c35c56aa8219eb0b021a393fe4233763d2..67c93ccd40f12fe3c2aef1070f2ed6f462dbff8b 100644 (file)
@@ -215,12 +215,7 @@ public:
        {\r
                if(video_decoder_)\r
                {\r
-                       std::wostringstream fps_ss;\r
-                       fps_ss << std::fixed << std::setprecision(2) << (video_decoder_->is_progressive() ? fps_ : 2.0 * fps_);\r
-\r
-                       return L"ffmpeg[" + boost::filesystem::wpath(filename_).filename() + L"|" \r
-                                                         + boost::lexical_cast<std::wstring>(video_decoder_->width()) + L"x" + boost::lexical_cast<std::wstring>(video_decoder_->height())\r
-                                                         + (video_decoder_->is_progressive() ? L"p" : L"i") + fps_ss.str()\r
+                       return L"ffmpeg[" + boost::filesystem::wpath(filename_).filename() + L"|" + print_mode(video_decoder_->width(), video_decoder_->height(), fps_, !video_decoder_->is_progressive())\r
                                                          + L"|" + boost::lexical_cast<std::wstring>(file_frame_number()) + L"/" + boost::lexical_cast<std::wstring>(file_nb_frames()) + L"]";\r
                }\r
                \r
index ca6f4a44a0bf4d194145aaff024df2635f2a4b74..8f3dcae317fa5c381e687b425eb43ea850c3362a 100644 (file)
@@ -306,10 +306,7 @@ struct frame_muxer::implementation : boost::noncopyable
                        \r
                filter_ = filter(filter_str_);\r
 \r
-               CASPAR_LOG(info) << "[frame_muxer] " << display_mode::print(display_mode_) \r
-                       << L" " << frame.width << L"x" << frame.height \r
-                       << (frame.interlaced_frame ? L"i" : L"p") \r
-                       << (frame.interlaced_frame ? in_fps_*2 : in_fps_);\r
+               CASPAR_LOG(info) << "[frame_muxer] " << display_mode::print(display_mode_) << L" " << print_mode(frame.width, frame.height, in_fps_, frame.interlaced_frame > 0);\r
        }\r
 \r
        int64_t calc_nb_frames(int64_t nb_frames) const\r
index f677b491856ae43c8c654647c8a36b33f4e7b9bc..ee97d9b5cb55870df59085b1a994b81f87e12b13 100644 (file)
@@ -395,6 +395,14 @@ safe_ptr<AVFormatContext> open_input(const std::wstring& filename)
        fix_meta_data(*context);\r
        return context;\r
 }\r
+\r
+std::wstring print_mode(size_t width, size_t height, double fps, bool interlaced)\r
+{\r
+       std::wostringstream fps_ss;\r
+       fps_ss << std::fixed << std::setprecision(2) << (!interlaced ? fps : 2.0 * fps);\r
+\r
+       return boost::lexical_cast<std::wstring>(width) + L"x" + boost::lexical_cast<std::wstring>(height) + (!interlaced ? L"p" : L"i") + fps_ss.str();\r
+}\r
 //\r
 //void av_dup_frame(AVFrame* frame)\r
 //{\r
index cc448b0aa01bb8c596e9b82fc5899cab9524de4a..100188d6cd2932b103f9bd566a5c450bf66338ce 100644 (file)
@@ -59,4 +59,6 @@ AVRational fix_time_base(AVRational time_base);
 \r
 double read_fps(AVFormatContext& context, double fail_value);\r
 \r
+std::wstring print_mode(size_t width, size_t height, double fps, bool interlaced);\r
+\r
 }}
\ No newline at end of file