]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 23 Oct 2011 15:08:06 +0000 (15:08 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 23 Oct 2011 15:08:06 +0000 (15:08 +0000)
modules/ffmpeg/producer/frame_muxer.cpp

index e523e8d690c72b2a07ac3341740fa99c4554c6a5..d6afa44b33a39f87a7bcb929eee275143c51150b 100644 (file)
@@ -179,28 +179,46 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
 \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
@@ -289,6 +307,9 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                        \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
@@ -298,65 +319,43 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                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
@@ -366,17 +365,63 @@ struct frame_muxer2::implementation : public Concurrency::agent, boost::noncopya
                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