]> git.sesse.net Git - casparcg/commitdiff
* Changed usage of BOOST_THROW_EXCEPTION to CASPAR_THROW_EXCEPTION in all places...
authorHelge Norberg <helge.norberg@svt.se>
Mon, 7 Sep 2015 15:37:04 +0000 (17:37 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Mon, 7 Sep 2015 15:37:04 +0000 (17:37 +0200)
* Fixed double av_freep in ffmpeg_consumer
* Made all CG commands which operate on a running cg_proxy instance return 404 CG ERROR if no cg_proxy is running.

14 files changed:
common/base64.cpp
common/log.cpp
core/diagnostics/osd_graph.cpp
core/producer/cg_proxy.cpp
core/producer/color/color_producer.cpp
modules/ffmpeg/consumer/ffmpeg_consumer.cpp
modules/ffmpeg/consumer/streaming_consumer.cpp
modules/flash/util/swf.cpp
modules/html/html.cpp
modules/html/producer/html_producer.cpp
modules/image/producer/image_scroll_producer.cpp
modules/image/util/image_loader.cpp
modules/newtek/consumer/newtek_ivga_consumer.cpp
protocol/amcp/AMCPCommandsImpl.cpp

index e29f34e5308ae57ba454355fb53f9594fa822338..93b9c66f57432c330800f7db15b37618dae018fc 100644 (file)
@@ -85,7 +85,7 @@ std::vector<unsigned char> from_base64(const std::string& data)
                        [] (char c) { return !std::isspace(static_cast<unsigned char>(c)); });
 
        if (length % 4 != 0)
-               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(
+               CASPAR_THROW_EXCEPTION(caspar_exception() << msg_info(
                                "The length of a base64 sequence must be a multiple of 4"));
 
        int padding = 0;
index 4a3df32783605be6bc763467252af1ca4762fd41..82211663c2e07d82ca1a7e87c818a992f2c37b20 100644 (file)
@@ -161,7 +161,7 @@ void add_file_sink(const std::wstring& folder)
        try
        {
                if (!boost::filesystem::is_directory(folder))
-                       BOOST_THROW_EXCEPTION(directory_not_found());
+                       CASPAR_THROW_EXCEPTION(directory_not_found());
 
                auto file_sink = boost::make_shared<file_sink_type>(
                        boost::log::keywords::file_name = (folder + L"caspar_%Y-%m-%d.log"),
index 51766c215380922ccb6b16d792ab3c86fe0b1b92..42d9377544da89580f9357e7c0ddcc3266cbbbb2 100644 (file)
@@ -74,7 +74,7 @@ sf::Font& get_default_font()
        {
                sf::Font font;
                if (!font.loadFromFile("LiberationSans-Regular.ttf"))
-                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("LiberationSans-Regular.ttf not found"));
+                       CASPAR_THROW_EXCEPTION(caspar_exception() << msg_info("LiberationSans-Regular.ttf not found"));
                return font;
        }();
 
index 8c321dc98632460121b60616e0391c43b7ac3208..83099f2a3ab3ab768b58f9a48404473acc459dff 100644 (file)
@@ -190,7 +190,7 @@ public:
                                return rec.second.info_extractor(*found);
                }
 
-               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(L"No meta info extractor for " + filename));
+               CASPAR_THROW_EXCEPTION(caspar_exception() << msg_info(L"No meta info extractor for " + filename));
        }
 
        bool is_cg_extension(const std::wstring& extension) const
index dc94a6e6e8811ca8d2e815d558eb7505416d766c..df1059d8493c902e52212256859c28a889d8175b 100644 (file)
@@ -188,7 +188,7 @@ draw_frame create_color_frame(void* tag, const spl::shared_ptr<frame_factory>& f
 {
        uint32_t value = 0;
        if(!try_get_color(str, value))
-               BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(str) << msg_info("Invalid color."));
+               CASPAR_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(str) << msg_info("Invalid color."));
        
        return create_color_frame(tag, frame_factory, value);
 }
index 8689894ed5f763b5e5f8d8e6b855160d5af0abb9..13371b0b3054c015e7bc87efcaf24d8a7d9bb21c 100644 (file)
@@ -484,8 +484,6 @@ private:
                return std::shared_ptr<AVStream>(st, [](AVStream* st)
                {
                        LOG_ON_ERROR2(tbb_avcodec_close(st->codec), "[ffmpeg_consumer]");
-                       av_freep(&st->codec);
-                       av_freep(&st);
                });
        }
                
@@ -530,8 +528,6 @@ private:
                return std::shared_ptr<AVStream>(st, [](AVStream* st)
                {
                        LOG_ON_ERROR2(avcodec_close(st->codec), "[ffmpeg_consumer]");
-                       av_freep(&st->codec);
-                       av_freep(&st);
                });
        }
   
@@ -592,7 +588,7 @@ private:
                        
                while(audio_buffer_.size() >= frame_size)
                {                       
-                       std::shared_ptr<AVFrame> av_frame(avcodec_alloc_frame(), av_free);
+                       std::shared_ptr<AVFrame> av_frame(av_frame_alloc(), [=](AVFrame* p) { av_frame_free(&p); });
                        avcodec_get_frame_defaults(av_frame.get());             
                        av_frame->nb_samples = frame_size / (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
 
@@ -727,7 +723,7 @@ private:
        {
                auto space = boost::filesystem::space(boost::filesystem::path(filename_).parent_path());
                if(space.available < 512*1000000)
-                       BOOST_THROW_EXCEPTION(file_write_error() << msg_info("out of space"));
+                       CASPAR_THROW_EXCEPTION(file_write_error() << msg_info("out of space"));
        }
 
        void encode(const core::const_frame& frame)
@@ -775,7 +771,7 @@ public:
        void initialize(const core::video_format_desc& format_desc, int) override
        {
                if(consumer_)
-                       BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("Cannot reinitialize ffmpeg-consumer."));
+                       CASPAR_THROW_EXCEPTION(invalid_operation() << msg_info("Cannot reinitialize ffmpeg-consumer."));
 
                consumer_.reset(new ffmpeg_consumer(u8(filename_), format_desc, options_, false));
 
index 7c240d75983e9d240911a3bfbd950107f9654528..0c29df80f9baa7280fcdd47c5254f8cd8869859f 100644 (file)
@@ -268,13 +268,13 @@ public:
                                        : avcodec_find_encoder(oc_->oformat->audio_codec);
                        
                        if (!video_codec)
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(
+                               CASPAR_THROW_EXCEPTION(caspar_exception() << msg_info(
                                                "Failed to find video codec " + (video_codec_name
                                                                ? *video_codec_name
                                                                : "with id " + boost::lexical_cast<std::string>(
                                                                                oc_->oformat->video_codec))));
                        if (!audio_codec)
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(
+                               CASPAR_THROW_EXCEPTION(caspar_exception() << msg_info(
                                                "Failed to find audio codec " + (audio_codec_name
                                                                ? *audio_codec_name
                                                                : "with id " + boost::lexical_cast<std::string>(
@@ -436,7 +436,10 @@ public:
        
        virtual boost::property_tree::wptree info() const override
        {
-               return boost::property_tree::wptree();
+               boost::property_tree::wptree info;
+               info.add(L"type", L"stream");
+               info.add(L"path", path_.wstring());
+               return info;
        }
 
        bool has_synchronization_clock() const override
@@ -478,7 +481,7 @@ private:
                                &codec);
 
                if (!st)                
-                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Could not allocate video-stream.") << boost::errinfo_api_function("av_new_stream"));      
+                       CASPAR_THROW_EXCEPTION(caspar_exception() << msg_info("Could not allocate video-stream.") << boost::errinfo_api_function("av_new_stream"));
 
                auto enc = st->codec;
                                
index 54bed2067dab8c79fb76831b54569a366f91adf7..8132624f9257a957a7735b7d881b19ea574d2a22 100644 (file)
@@ -118,7 +118,7 @@ swf_t::header_t::header_t(const std::wstring& filename)
        auto ret = uncompress(reinterpret_cast<Bytef*>(data.data()), &file_size, reinterpret_cast<const Bytef*>(file_data.data()), static_cast<uLong>(file_data.size()));
 
        if (ret == Z_DATA_ERROR)
-               BOOST_THROW_EXCEPTION(io_error());
+               CASPAR_THROW_EXCEPTION(io_error());
        
        // http://thenobody.blog.matfyz.sk/p13084-how-to-get-dimensions-of-a-swf-file
 
@@ -176,7 +176,7 @@ swf_t::swf_t(const std::wstring& filename)
        auto ret = uncompress(reinterpret_cast<Bytef*>(this->data.data()), &file_size, reinterpret_cast<const Bytef*>(file_data.data()), static_cast<uLong>(file_data.size()));
 
        if (ret != Z_OK)
-               BOOST_THROW_EXCEPTION(io_error());
+               CASPAR_THROW_EXCEPTION(io_error());
 }
 
 }}
index eb9d625fbe654917412c06636fee0ddec16deec7..5a12a2fce37f5889245e377eec5cdf8f849c460b 100644 (file)
@@ -388,7 +388,7 @@ std::future<void> begin_invoke(const std::function<void()>& func)
        if (CefPostTask(TID_UI, task.get()))
                return task->future();
        else
-               BOOST_THROW_EXCEPTION(caspar_exception()
+               CASPAR_THROW_EXCEPTION(caspar_exception()
                                << msg_info("[cef_executor] Could not post task"));
 }
 
index 9414ccc807b037e93637ad16e60391793ee4524c..a1babe41b5ee77629154d95e5d3680a47e7a8b07 100644 (file)
@@ -350,7 +350,7 @@ private:
 
                if (!try_pop(frame))
                {
-                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(u8(print()) + " No frame in buffer"));
+                       CASPAR_THROW_EXCEPTION(caspar_exception() << msg_info(u8(print()) + " No frame in buffer"));
                }
 
                return frame;
index f489bb73041587327a401d7fb67263df39f81e6d..c5f6a42e02bbc6dc2376d5c05f4e3339c7523d2d 100644 (file)
@@ -99,7 +99,7 @@ struct image_scroll_producer : public core::frame_producer_base
                bool horizontal = height_ == format_desc_.height;
 
                if (!vertical && !horizontal)
-                       BOOST_THROW_EXCEPTION(
+                       CASPAR_THROW_EXCEPTION(
                                caspar::invalid_argument() << msg_info("Neither width nor height matched the video resolution"));
 
                if (vertical)
index 8c52f9fe37e0cd78896fbed39e3374aeee90bfe5..f5e15ebcf7ec34b0cc3544ed7e04a8c30267feb5 100644 (file)
@@ -86,7 +86,7 @@ std::shared_ptr<FIBITMAP> load_png_from_memory(const void* memory_location, size
                bitmap = std::shared_ptr<FIBITMAP>(FreeImage_ConvertTo32Bits(bitmap.get()), FreeImage_Unload);
 
                if (!bitmap)
-                       BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));
+                       CASPAR_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));
        }
 
        return bitmap;
index 9de4ded94820f2c0430e2cc807c43ea6ca22335a..8d482bc6b0f5163bdb88b326fc8cf29dc1f57547 100644 (file)
@@ -64,7 +64,7 @@ public:
                : executor_(print())
        {
                if (!airsend::is_available())
-                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(airsend::dll_name() + L" not available"));
+                       CASPAR_THROW_EXCEPTION(caspar_exception() << msg_info(airsend::dll_name() + L" not available"));
 
                connected_ = false;
 
index b4d063d7593b1c2ff06b1b5b64f0ae3b71ca9f1f..0bee7e87ae541232dbb0f9396cd33cf4a29e6cbd 100644 (file)
@@ -980,6 +980,16 @@ std::wstring cg_play_command(command_context& ctx)
        return L"202 CG OK\r\n";
 }
 
+spl::shared_ptr<core::cg_proxy> get_expected_cg_proxy(command_context& ctx)
+{
+       auto proxy = ctx.cg_registry->get_proxy(spl::make_shared_ptr(ctx.channel.channel), ctx.layer_index(core::cg_proxy::DEFAULT_LAYER));
+
+       if (proxy == cg_proxy::empty())
+               CASPAR_THROW_EXCEPTION(file_not_found() << msg_info(L"No CG proxy running on layer"));
+
+       return proxy;
+}
+
 void cg_stop_describer(core::help_sink& sink, const core::help_repository& repo)
 {
        sink.short_description(L"Stop and remove a template.");
@@ -994,7 +1004,7 @@ void cg_stop_describer(core::help_sink& sink, const core::help_repository& repo)
 std::wstring cg_stop_command(command_context& ctx)
 {
        int layer = get_and_validate_layer(ctx.parameters.at(0));
-       ctx.cg_registry->get_proxy(spl::make_shared_ptr(ctx.channel.channel), ctx.layer_index(core::cg_proxy::DEFAULT_LAYER))->stop(layer, 0);
+       get_expected_cg_proxy(ctx)->stop(layer, 0);
 
        return L"202 CG OK\r\n";
 }
@@ -1013,7 +1023,7 @@ void cg_next_describer(core::help_sink& sink, const core::help_repository& repo)
 std::wstring cg_next_command(command_context& ctx)
 {
        int layer = get_and_validate_layer(ctx.parameters.at(0));
-       ctx.cg_registry->get_proxy(spl::make_shared_ptr(ctx.channel.channel), ctx.layer_index(core::cg_proxy::DEFAULT_LAYER))->next(layer);
+       get_expected_cg_proxy(ctx)->next(layer);
 
        return L"202 CG OK\r\n";
 }
@@ -1030,7 +1040,7 @@ void cg_remove_describer(core::help_sink& sink, const core::help_repository& rep
 std::wstring cg_remove_command(command_context& ctx)
 {
        int layer = get_and_validate_layer(ctx.parameters.at(0));
-       ctx.cg_registry->get_proxy(spl::make_shared_ptr(ctx.channel.channel), ctx.layer_index(core::cg_proxy::DEFAULT_LAYER))->remove(layer);
+       get_expected_cg_proxy(ctx)->remove(layer);
 
        return L"202 CG OK\r\n";
 }
@@ -1073,10 +1083,7 @@ std::wstring cg_update_command(command_context& ctx)
                dataString = read_file(boost::filesystem::path(filename));
        }
 
-       ctx.cg_registry->get_proxy(
-               spl::make_shared_ptr(ctx.channel.channel),
-               ctx.layer_index(core::cg_proxy::DEFAULT_LAYER))
-               ->update(layer, dataString);
+       get_expected_cg_proxy(ctx)->update(layer, dataString);
 
        return L"202 CG OK\r\n";
 }
@@ -1094,10 +1101,7 @@ std::wstring cg_invoke_command(command_context& ctx)
        std::wstringstream replyString;
        replyString << L"201 CG OK\r\n";
        int layer = get_and_validate_layer(ctx.parameters.at(0));
-       auto result = ctx.cg_registry->get_proxy(
-               spl::make_shared_ptr(ctx.channel.channel),
-               ctx.layer_index(core::cg_proxy::DEFAULT_LAYER))
-               ->invoke(layer, ctx.parameters.at(1));
+       auto result = get_expected_cg_proxy(ctx)->invoke(layer, ctx.parameters.at(1));
        replyString << result << L"\r\n";
 
        return replyString.str();
@@ -1118,19 +1122,13 @@ std::wstring cg_info_command(command_context& ctx)
 
        if (ctx.parameters.empty())
        {
-               auto info = ctx.cg_registry->get_proxy(
-                       spl::make_shared_ptr(ctx.channel.channel),
-                       ctx.layer_index(core::cg_proxy::DEFAULT_LAYER))
-                       ->template_host_info();
+               auto info = get_expected_cg_proxy(ctx)->template_host_info();
                replyString << info << L"\r\n";
        }
        else
        {
                int layer = get_and_validate_layer(ctx.parameters.at(0));
-               auto desc = ctx.cg_registry->get_proxy(
-                       spl::make_shared_ptr(ctx.channel.channel),
-                       ctx.layer_index(core::cg_proxy::DEFAULT_LAYER))
-                       ->description(layer);
+               auto desc = get_expected_cg_proxy(ctx)->description(layer);
 
                replyString << desc << L"\r\n";
        }