-\r
-class frame_filter\r
-{\r
- std::unique_ptr<filter> filter_;\r
- safe_ptr<core::frame_factory> frame_factory_;\r
-\r
-public:\r
- frame_filter(const std::string& filter_str, const safe_ptr<core::frame_factory>& frame_factory) \r
- : filter_(filter_str.empty() ? nullptr : new filter(filter_str))\r
- , frame_factory_(frame_factory)\r
- {\r
- }\r
-\r
- std::vector<safe_ptr<core::basic_frame>> execute(const safe_ptr<core::write_frame>& input_frame)\r
- { \r
- std::vector<safe_ptr<core::basic_frame>> result;\r
-\r
- if(!filter_)\r
- {\r
- input_frame->commit();\r
- result.push_back(input_frame);\r
- }\r
- else\r
- {\r
- auto desc = input_frame->get_pixel_format_desc();\r
-\r
- auto av_frame = as_av_frame(input_frame);\r
- \r
- filter_->push(av_frame); \r
- auto buffer = filter_->poll(); \r
- \r
- if(buffer.size() == 2)\r
- {\r
- auto frame1 = make_write_frame(this, buffer[0], frame_factory_);\r
- auto frame2 = make_write_frame(this, buffer[1], frame_factory_);\r
- frame1->audio_data() = std::move(input_frame->audio_data());\r
- \r
- if(frame_factory_->get_video_format_desc().mode == core::video_mode::progressive)\r
- {\r
- frame2->audio_data().insert(frame2->audio_data().begin(), frame1->audio_data().begin() + frame1->audio_data().size()/2, frame1->audio_data().end());\r
- frame1->audio_data().erase(frame1->audio_data().begin() + frame1->audio_data().size()/2, frame1->audio_data().end());\r
- CASPAR_LOG(trace) << frame1->audio_data().size();\r
- CASPAR_LOG(trace) << frame2->audio_data().size();\r
- result.push_back(frame1);\r
- result.push_back(frame2);\r
- }\r
- else\r
- {\r
- frame2->get_audio_transform().set_has_audio(false);\r
- result.push_back(core::basic_frame::interlace(frame1, frame2, frame_factory_->get_video_format_desc().mode));\r
- }\r
- }\r
- else if(buffer.size() > 0)\r
- {\r
- auto frame1 = make_write_frame(this, buffer[0], frame_factory_);\r
- frame1->audio_data() = std::move(input_frame->audio_data());\r
- result.push_back(frame1);\r
- }\r
-\r
- }\r