channel_consumer() \r
{\r
is_running_ = true;\r
- frame_buffer_.set_capacity(2);\r
+ frame_buffer_.set_capacity(3);\r
}\r
\r
~channel_consumer()\r
\r
std::queue<safe_ptr<basic_frame>> frame_buffer_;\r
safe_ptr<basic_frame> last_frame_;\r
+ uint64_t frame_number_;\r
\r
public:\r
explicit channel_producer(const safe_ptr<frame_factory>& frame_factory, const safe_ptr<video_channel>& channel) \r
: frame_factory_(frame_factory)\r
, consumer_(make_safe<channel_consumer>())\r
, last_frame_(basic_frame::empty())\r
+ , frame_number_(0)\r
{\r
channel->output()->add(consumer_);\r
CASPAR_LOG(info) << print() << L" Initialized";\r
{\r
auto format_desc = consumer_->get_video_format_desc();\r
\r
- bool half_speed = std::abs(format_desc.fps / 2.0 - frame_factory_->get_video_format_desc().fps) < 0.01;\r
- \r
- if(half_speed && frame_buffer_.size() >= 2)\r
- { \r
- frame_buffer_.pop();\r
- auto frame = frame_buffer_.front();\r
- frame_buffer_.pop();\r
- return last_frame_ = frame;\r
- }\r
- else if(!frame_buffer_.empty())\r
+ if(frame_buffer_.size() > 1)\r
{\r
auto frame = frame_buffer_.front();\r
frame_buffer_.pop();\r
auto read_frame = consumer_->receive();\r
if(!read_frame || read_frame->image_data().empty())\r
return basic_frame::late(); \r
+\r
+ frame_number_++;\r
\r
core::pixel_format_desc desc;\r
+ bool double_speed = std::abs(frame_factory_->get_video_format_desc().fps / 2.0 - format_desc.fps) < 0.01; \r
+ bool half_speed = std::abs(format_desc.fps / 2.0 - frame_factory_->get_video_format_desc().fps) < 0.01;\r
+\r
+ if(half_speed && frame_number_ % 2 == 0)\r
+ return receive(0);\r
+\r
desc.pix_fmt = core::pixel_format::bgra;\r
desc.planes.push_back(core::pixel_format_desc::plane(format_desc.width, format_desc.height, 4));\r
auto frame = frame_factory_->create_frame(this, desc);\r
\r
frame_buffer_.push(frame); \r
\r
- bool double_speed = std::abs(frame_factory_->get_video_format_desc().fps / 2.0 - format_desc.fps) < 0.01;\r
-\r
if(double_speed) \r
frame_buffer_.push(frame);\r
\r