]> 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>
Sun, 23 Oct 2011 14:05:49 +0000 (14:05 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 23 Oct 2011 14:05:49 +0000 (14:05 +0000)
modules/decklink/producer/decklink_producer.cpp
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/filter/filter.h
modules/ffmpeg/producer/frame_muxer.cpp
modules/ffmpeg/producer/frame_muxer.h

index 6fa2e54d7ec88e08f8f0a4ecfb214dea62e2435a..b4da52949a4211a17cef1b7c2dfcf934d8c1ecdb 100644 (file)
@@ -180,15 +180,11 @@ class decklink_producer_proxy : public Concurrency::agent, public core::frame_pr
 \r
        safe_ptr<core::basic_frame>                     last_frame_;\r
        const int64_t                                           length_;\r
-\r
-       ffmpeg::filter                                          filter_;\r
-               \r
+                       \r
        ffmpeg::frame_muxer2                            muxer_;\r
 \r
        mutable Concurrency::single_assignment<std::wstring> print_;\r
-\r
-       safe_ptr<Concurrency::semaphore> semaphore_;\r
-\r
+       \r
        volatile bool is_running_;\r
 public:\r
 \r
@@ -200,10 +196,8 @@ public:
                , device_index_(device_index)\r
                , last_frame_(core::basic_frame::empty())\r
                , length_(length)\r
-               , filter_(filter_str)\r
-               , muxer_(&video_frames_, &audio_buffers_, muxed_frames_, ffmpeg::double_rate(filter_str) ? format_desc.fps * 2.0 : format_desc.fps, frame_factory)\r
+               , muxer_(&video_frames_, &audio_buffers_, muxed_frames_, format_desc.fps, frame_factory, filter_str)\r
                , is_running_(true)\r
-               , semaphore_(make_safe<Concurrency::semaphore>(3))\r
        {\r
                agent::start();\r
        }\r
@@ -286,18 +280,10 @@ public:
                                av_frame->interlaced_frame      = format_desc_.field_mode != core::field_mode::progressive;\r
                                av_frame->top_field_first       = format_desc_.field_mode == core::field_mode::upper ? 1 : 0;\r
                                        \r
-                               filter_.push(av_frame);\r
-\r
                                Concurrency::parallel_invoke(\r
                                [&]\r
                                {\r
-                                       while(true)\r
-                                       {\r
-                                               auto frame = filter_.poll();\r
-                                               if(!frame)\r
-                                                       break;\r
-                                               Concurrency::send(video_frames_, make_safe_ptr(frame));\r
-                                       }\r
+                                       Concurrency::send(video_frames_, av_frame);                                     \r
                                },\r
                                [&]\r
                                {                                                                                                       \r
index 029505a4f93af63c145948bd3bf4336a5aca05c5..3648e2863008e94b7e9ad540c49d63da074db0ed 100644 (file)
@@ -126,7 +126,7 @@ public:
 \r
                CASPAR_VERIFY(video_decoder_ || audio_decoder_, ffmpeg_error());\r
 \r
-               muxer_.reset(new frame_muxer2(video_source, audio_source, frames_, video_decoder_ ? video_decoder_->fps() : frame_factory->get_video_format_desc().fps, frame_factory));\r
+               muxer_.reset(new frame_muxer2(video_source, audio_source, frames_, video_decoder_ ? video_decoder_->fps() : frame_factory->get_video_format_desc().fps, frame_factory, filter));\r
                                \r
                graph_->set_color("underflow", diagnostics::color(0.6f, 0.3f, 0.9f));   \r
                graph_->start();\r
index 4f6f5d456bfae2585a420ff558d1f138d6c94b23..7570e4138747d3839fb011247ebbe0067e11588a 100644 (file)
@@ -12,7 +12,7 @@ enum PixelFormat;
 \r
 namespace caspar { namespace ffmpeg {\r
                \r
-static bool double_rate(const std::wstring& filters)\r
+static bool is_double_rate(const std::wstring& filters)\r
 {\r
        if(filters.find(L"YADIF=1") != std::string::npos)\r
                return true;\r
@@ -23,6 +23,13 @@ static bool double_rate(const std::wstring& filters)
        return false;\r
 }\r
 \r
+static bool is_deinterlacing(const std::wstring& filters)\r
+{\r
+       if(filters.find(L"YADIF") != std::string::npos)\r
+               return true;    \r
+       return false;\r
+}\r
+\r
 class filter : boost::noncopyable\r
 {\r
 public:\r
index 86bab74dd415aaf420263ac3c3600ac8ffb48e25..8ec482577c7b7f3ff4f063d1384a60ce292f7a54 100644 (file)
@@ -143,11 +143,14 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
 \r
        Concurrency::overwrite_buffer<bool>                             is_running_;\r
 \r
+       std::wstring                                                                    filter_str_;\r
+\r
        implementation(frame_muxer2::video_source_t* video_source,\r
                                   frame_muxer2::audio_source_t* audio_source,\r
                                   frame_muxer2::target_t& target,\r
                                   double in_fps, \r
-                                  const safe_ptr<core::frame_factory>& frame_factory)\r
+                                  const safe_ptr<core::frame_factory>& frame_factory,\r
+                                  const std::wstring& filter)\r
                : target_(target)\r
                , display_mode_(display_mode::invalid)\r
                , in_fps_(in_fps)\r
@@ -156,6 +159,7 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                , frame_factory_(frame_factory)\r
                , push_video_(std::bind(&implementation::push_video, this, std::placeholders::_1))\r
                , push_audio_(std::bind(&implementation::push_audio, this, std::placeholders::_1))\r
+               , filter_str_(filter)\r
        {\r
                if(video_source)\r
                        video_source->link_target(&push_video_);\r
@@ -276,16 +280,24 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                {\r
                        if(auto_transcode_)\r
                        {\r
-                               auto in_mode = get_mode(*video_frame);\r
-                               display_mode_ = get_display_mode(in_mode, in_fps_, format_desc_.field_mode, format_desc_.fps);\r
+                               auto mode = get_mode(*video_frame);\r
+                               auto fps         = in_fps_;\r
+\r
+                               if(is_deinterlacing(filter_str_))\r
+                                       mode = core::field_mode::progressive;\r
+\r
+                               if(is_double_rate(filter_str_))\r
+                                       fps *= 2;\r
+\r
+                               display_mode_ = get_display_mode(mode, fps, format_desc_.field_mode, format_desc_.fps);\r
                        \r
-                               if(display_mode_ == display_mode::simple && in_mode != core::field_mode::progressive && format_desc_.field_mode != core::field_mode::progressive && video_frame->height != static_cast<int>(format_desc_.height))\r
+                               if(display_mode_ == display_mode::simple && mode != core::field_mode::progressive && format_desc_.field_mode != core::field_mode::progressive && video_frame->height != static_cast<int>(format_desc_.height))\r
                                        display_mode_ = display_mode::deinterlace_bob_reinterlace; // The frame will most likely be scaled, we need to deinterlace->reinterlace \r
                                \r
                                if(display_mode_ == display_mode::deinterlace)\r
-                                       filter_ = filter(L"YADIF=0:-1");\r
+                                       filter_str_ += L"YADIF=0:-1";\r
                                else if(display_mode_ == display_mode::deinterlace_bob || display_mode_ == display_mode::deinterlace_bob_reinterlace)\r
-                                       filter_ = filter(L"YADIF=1:-1");\r
+                                       filter_str_ += L"YADIF=1:-1";\r
                        }\r
                        else\r
                                display_mode_ = display_mode::simple;\r
@@ -297,9 +309,11 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                        }\r
 \r
                        // copy <= We need to release frames\r
-                       if(display_mode_ != display_mode::simple && filter_.filter_str().empty())\r
+                       if(display_mode_ != display_mode::simple && filter_str_.empty())\r
                                filter_ = filter(L"copy"); \r
 \r
+                       filter_ = filter(filter_str_);\r
+\r
                        CASPAR_LOG(info) << "[frame_muxer] " << display_mode::print(display_mode_);\r
                }\r
                                                \r
@@ -367,8 +381,9 @@ frame_muxer2::frame_muxer2(video_source_t* video_source,
                                                   audio_source_t* audio_source,\r
                                                   target_t& target,\r
                                                   double in_fps, \r
-                                                  const safe_ptr<core::frame_factory>& frame_factory)\r
-       : impl_(new implementation(video_source, audio_source, target, in_fps, frame_factory))\r
+                                                  const safe_ptr<core::frame_factory>& frame_factory,\r
+                                                  const std::wstring& filter)\r
+       : impl_(new implementation(video_source, audio_source, target, in_fps, frame_factory, filter))\r
 {\r
 }\r
 \r
index 168d28211f8acd21021717163dd82f096fdbb837..5a1aa9cba2b20ccb909253ddb6551e61e33d0238 100644 (file)
@@ -39,7 +39,8 @@ public:
                                 audio_source_t* audio_source, \r
                                 target_t& target,\r
                                 double in_fps, \r
-                                const safe_ptr<core::frame_factory>& frame_factory);\r
+                                const safe_ptr<core::frame_factory>& frame_factory,\r
+                                const std::wstring& filter);\r
        \r
        int64_t calc_nb_frames(int64_t nb_frames) const;\r
 private:\r