\r
void commit()\r
{\r
- if(video_streams_.size() > 1 && audio_streams_.size() > 1 &&\r
- (video_streams_.front().empty() || audio_streams_.front().empty()))\r
+ if(video_streams_.size() > 1 && audio_streams_.size() > 1 && !ready())\r
{\r
if(!video_streams_.front().empty() || !audio_streams_.front().empty())\r
CASPAR_LOG(debug) << "Truncating: " << video_streams_.front().size() << L" video-frames, " << audio_streams_.front().size() << L" audio-samples.";\r
audio_streams_.pop_front();\r
}\r
\r
- if(video_streams_.front().empty() || audio_streams_.front().size() < format_desc_.audio_samples_per_frame)\r
+ if(!ready())\r
return;\r
\r
switch(display_mode_)\r
}\r
}\r
\r
- void simple(std::deque<safe_ptr<basic_frame>>& dest)\r
+ bool ready()\r
{\r
- if(video_streams_.front().empty() || audio_streams_.front().size() < format_desc_.audio_samples_per_frame)\r
- return;\r
- \r
+ switch(display_mode_)\r
+ {\r
+ case display_mode::deinterlace_bob:\r
+ case display_mode::deinterlace:\r
+ case display_mode::simple: return !video_streams_.front().empty() && audio_streams_.front().size() >= format_desc_.audio_samples_per_frame;\r
+ case display_mode::duplicate: return !video_streams_.front().empty() && audio_streams_.front().size()/2 >= format_desc_.audio_samples_per_frame;\r
+ case display_mode::half: \r
+ case display_mode::deinterlace_bob_reinterlace: \r
+ case display_mode::interlace: return video_streams_.front().size() >= 2 && audio_streams_.front().size() >= format_desc_.audio_samples_per_frame;\r
+ default: return false;\r
+ }\r
+ }\r
+\r
+ void simple(std::deque<safe_ptr<basic_frame>>& dest)\r
+ { \r
auto frame1 = pop_video();\r
frame1->audio_data() = pop_audio();\r
\r
\r
void duplicate(std::deque<safe_ptr<basic_frame>>& dest)\r
{ \r
- if(video_streams_.front().empty() || audio_streams_.front().size()/2 < format_desc_.audio_samples_per_frame)\r
- return;\r
-\r
auto frame = pop_video();\r
\r
auto frame1 = make_safe<core::write_frame>(*frame); // make a copy\r
}\r
\r
void half(std::deque<safe_ptr<basic_frame>>& dest)\r
- { \r
- if(video_streams_.front().size() < 2 || audio_streams_.front().size() < format_desc_.audio_samples_per_frame)\r
- return;\r
- \r
+ { \r
auto frame1 = pop_video();\r
frame1->audio_data() = pop_audio();\r
\r
}\r
\r
void interlace(std::deque<safe_ptr<basic_frame>>& dest)\r
- { \r
- if(video_streams_.front().size() < 2 || audio_streams_.front().size() < format_desc_.audio_samples_per_frame)\r
- return;\r
- \r
+ { \r
auto frame1 = pop_video();\r
frame1->audio_data() = pop_audio();\r
\r