\r
std::shared_ptr<core::write_frame> transform_video(const safe_ptr<AVFrame>& video)\r
{ \r
- CASPAR_ASSERT(audio != loop_video());\r
-\r
- if(video == eof_video())\r
+ if(!is_running_.value() || video == eof_video())\r
return nullptr;\r
+ \r
+ CASPAR_ASSERT(video != loop_video());\r
\r
- if(video == empty_video())\r
- return make_safe<core::write_frame>(this);\r
- \r
- return make_write_frame(this, video, frame_factory_, 0);\r
+ try\r
+ {\r
+ if(video == empty_video())\r
+ return make_safe<core::write_frame>(this);\r
+\r
+ return make_write_frame(this, video, frame_factory_, 0);\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ send(is_running_, false);\r
+ return nullptr;\r
+ }\r
}\r
\r
std::shared_ptr<core::audio_buffer> transform_audio(const safe_ptr<core::audio_buffer>& audio)\r
- { \r
- CASPAR_ASSERT(audio != loop_audio());\r
-\r
- if(audio == eof_audio())\r
+ { \r
+ if(!is_running_.value() || audio == eof_audio())\r
return nullptr;\r
+ \r
+ CASPAR_ASSERT(audio != loop_audio());\r
\r
- if(audio == empty_audio())\r
- return make_safe<core::audio_buffer>(format_desc_.audio_samples_per_frame, 0);\r
+ try\r
+ {\r
+ if(audio == empty_audio())\r
+ return make_safe<core::audio_buffer>(format_desc_.audio_samples_per_frame, 0);\r
\r
- return audio;\r
+ return audio;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ send(is_running_, false);\r
+ return nullptr;\r
+ }\r
}\r
\r
virtual void run()\r
\r
void push_video(const safe_ptr<AVFrame>& video_frame)\r
{ \r
+ if(!is_running_.value())\r
+ return;\r
+\r
if(video_frame == eof_video() || video_frame == empty_video())\r
{\r
send(video_, video_frame);\r
if(video_frame == loop_video()) \r
return; \r
\r
- if(display_mode_ == display_mode::invalid)\r
+ try\r
{\r
- if(auto_transcode_)\r
- {\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 && 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
- append_filter(filter_str_, L"YADIF=0:-1");\r
- else if(display_mode_ == display_mode::deinterlace_bob || display_mode_ == display_mode::deinterlace_bob_reinterlace)\r
- append_filter(filter_str_, L"YADIF=1:-1");\r
- }\r
- else\r
- display_mode_ = display_mode::simple;\r
-\r
if(display_mode_ == display_mode::invalid)\r
- {\r
- CASPAR_LOG(warning) << L"[frame_muxer] Failed to detect display-mode.";\r
- display_mode_ = display_mode::simple;\r
- }\r
- \r
- filter_ = filter(filter_str_);\r
-\r
- CASPAR_LOG(info) << "[frame_muxer] " << display_mode::print(display_mode_);\r
- }\r
+ initialize_display_mode(*video_frame);\r
\r
- //if(hints & core::frame_producer::ALPHA_HINT)\r
- // video_frame->format = make_alpha_format(video_frame->format);\r
+ //if(hints & core::frame_producer::ALPHA_HINT)\r
+ // video_frame->format = make_alpha_format(video_frame->format);\r
\r
- auto format = video_frame->format;\r
- if(video_frame->format == CASPAR_PIX_FMT_LUMA) // CASPAR_PIX_FMT_LUMA is not valid for filter, change it to GRAY8\r
- video_frame->format = PIX_FMT_GRAY8;\r
+ auto format = video_frame->format;\r
+ if(video_frame->format == CASPAR_PIX_FMT_LUMA) // CASPAR_PIX_FMT_LUMA is not valid for filter, change it to GRAY8\r
+ video_frame->format = PIX_FMT_GRAY8;\r
\r
- filter_.push(video_frame);\r
+ filter_.push(video_frame);\r
\r
- while(true)\r
- {\r
- auto frame = filter_.poll();\r
- if(!frame)\r
- break; \r
+ while(true)\r
+ {\r
+ auto frame = filter_.poll();\r
+ if(!frame)\r
+ break; \r
\r
- frame->format = format;\r
- send(video_, make_safe_ptr(frame));\r
+ frame->format = format;\r
+ send(video_, make_safe_ptr(frame));\r
+ }\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ send(is_running_ , false);\r
+ send(video_, eof_video());\r
}\r
}\r
\r
void push_audio(const safe_ptr<core::audio_buffer>& audio_samples)\r
{\r
+ if(!is_running_.value())\r
+ return;\r
+\r
if(audio_samples == eof_audio() || audio_samples == empty_audio())\r
{\r
send(audio_, audio_samples);\r
if(audio_samples == loop_audio()) \r
return; \r
\r
- audio_data_.insert(audio_data_.end(), audio_samples->begin(), audio_samples->end());\r
- \r
- while(audio_data_.size() >= format_desc_.audio_samples_per_frame)\r
+ try\r
{\r
- auto begin = audio_data_.begin(); \r
- auto end = begin + format_desc_.audio_samples_per_frame;\r
+ audio_data_.insert(audio_data_.end(), audio_samples->begin(), audio_samples->end());\r
+ \r
+ while(audio_data_.size() >= format_desc_.audio_samples_per_frame)\r
+ {\r
+ auto begin = audio_data_.begin(); \r
+ auto end = begin + format_desc_.audio_samples_per_frame;\r
\r
- send(audio_, make_safe<core::audio_buffer>(begin, end));\r
+ send(audio_, make_safe<core::audio_buffer>(begin, end));\r
+\r
+ audio_data_.erase(begin, end);\r
+ }\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ send(is_running_ , false);\r
+ send(audio_, eof_audio());\r
+ }\r
+ }\r
+\r
+ void initialize_display_mode(AVFrame& frame)\r
+ {\r
+ if(auto_transcode_)\r
+ {\r
+ auto mode = get_mode(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
- audio_data_.erase(begin, end);\r
+ display_mode_ = get_display_mode(mode, fps, format_desc_.field_mode, format_desc_.fps);\r
+ \r
+ if(display_mode_ == display_mode::simple && mode != core::field_mode::progressive && format_desc_.field_mode != core::field_mode::progressive && 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
+ append_filter(filter_str_, L"YADIF=0:-1");\r
+ else if(display_mode_ == display_mode::deinterlace_bob || display_mode_ == display_mode::deinterlace_bob_reinterlace)\r
+ append_filter(filter_str_, L"YADIF=1:-1");\r
}\r
+ else\r
+ display_mode_ = display_mode::simple;\r
+\r
+ if(display_mode_ == display_mode::invalid)\r
+ {\r
+ CASPAR_LOG(warning) << L"[frame_muxer] Failed to detect display-mode.";\r
+ display_mode_ = display_mode::simple;\r
+ }\r
+ \r
+ filter_ = filter(filter_str_);\r
+\r
+ CASPAR_LOG(info) << "[frame_muxer] " << display_mode::print(display_mode_);\r
}\r
\r
int64_t calc_nb_frames(int64_t nb_frames) const\r