\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
, 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
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
\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
, 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
{\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
}\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
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