]> git.sesse.net Git - casparcg/commitdiff
[image_producer] refuse too large images nicely instead of letting OpenGL tell us...
authorHelge Norberg <helge.norberg@svt.se>
Mon, 23 May 2016 19:14:53 +0000 (21:14 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Mon, 23 May 2016 19:14:53 +0000 (21:14 +0200)
accelerator/cpu/image/image_mixer.cpp
accelerator/cpu/image/image_mixer.h
accelerator/ogl/image/image_mixer.cpp
accelerator/ogl/image/image_mixer.h
core/frame/frame_factory.h
modules/image/producer/image_producer.cpp

index 07d669deb382a90f91dc93700f219bc9dacc864c..bf69a0558ec8b98332f4adb374b0e38c9edce5e8 100644 (file)
@@ -371,6 +371,7 @@ image_mixer::~image_mixer(){}
 void image_mixer::push(const core::frame_transform& transform){impl_->push(transform);}
 void image_mixer::visit(const core::const_frame& frame){impl_->visit(frame);}
 void image_mixer::pop(){impl_->pop();}
+int image_mixer::get_max_frame_size() { return std::numeric_limits<int>::max(); }
 std::future<array<const std::uint8_t>> image_mixer::operator()(const core::video_format_desc& format_desc, bool /* straighten_alpha */){return impl_->render(format_desc);}
 core::mutable_frame image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc, const core::audio_channel_layout& channel_layout) {return impl_->create_frame(tag, desc, channel_layout);}
 
index 55f2b416bd08c514975acd93f024eabfa2ae8464..ba4d0a3915d20c5f4bf73a4ecb029b6ede7f2b85 100644 (file)
@@ -37,7 +37,7 @@ public:
        core::mutable_frame create_frame(const void* tag, const core::pixel_format_desc& desc, const core::audio_channel_layout& channel_layout) override;
 
        // Properties
-
+       int get_max_frame_size() override;
 private:
        struct impl;
        spl::unique_ptr<impl> impl_;
index 1c983cee20e4f8db8e5a0d7904fabc57c5bc387f..19d0191e5fef9a23f5a70e542d24a02806f2d776 100644 (file)
@@ -369,6 +369,16 @@ public:
 
                return core::mutable_frame(std::move(buffers), core::mutable_audio_buffer(), tag, desc, channel_layout);
        }
+
+       int get_max_frame_size() override
+       {
+               return ogl_->invoke([]
+               {
+                       GLint64 params[1];
+                       glGetInteger64v(GL_MAX_TEXTURE_SIZE, params);
+                       return static_cast<int>(params[0]);
+               });
+       }
 };
 
 image_mixer::image_mixer(const spl::shared_ptr<device>& ogl, bool blend_modes_wanted, bool straight_alpha_wanted, int channel_id) : impl_(new impl(ogl, blend_modes_wanted, straight_alpha_wanted, channel_id)){}
@@ -376,6 +386,7 @@ image_mixer::~image_mixer(){}
 void image_mixer::push(const core::frame_transform& transform){impl_->push(transform);}
 void image_mixer::visit(const core::const_frame& frame){impl_->visit(frame);}
 void image_mixer::pop(){impl_->pop();}
+int image_mixer::get_max_frame_size() { return impl_->get_max_frame_size(); }
 std::future<array<const std::uint8_t>> image_mixer::operator()(const core::video_format_desc& format_desc, bool straighten_alpha){return impl_->render(format_desc, straighten_alpha);}
 core::mutable_frame image_mixer::create_frame(const void* tag, const core::pixel_format_desc& desc, const core::audio_channel_layout& channel_layout) {return impl_->create_frame(tag, desc, channel_layout);}
 
index 3b203b5119425e799206631d8578aa4664a394f8..2ce6e4d69643c0e8bd2c0f9475cd141251069076 100644 (file)
@@ -60,6 +60,8 @@ public:
                        
        // Properties
 
+       int get_max_frame_size() override;
+
 private:
        struct impl;
        spl::unique_ptr<impl> impl_;
index ac2cda11375294e061ec6f2e0ad252d3177762f4..4f9d1c8d80e250efc85b2c6d5c07d87c7921628d 100644 (file)
@@ -48,6 +48,8 @@ public:
                        const core::audio_channel_layout& channel_layout) = 0;
 
        // Properties
+
+       virtual int get_max_frame_size() = 0;
 };
 
 }}
\ No newline at end of file
index 0da1a981c39e69ec3efdf7093db789262eadf51b..112922ac5f68fe450de2feec264398800f94066f 100644 (file)
@@ -106,6 +106,11 @@ struct image_producer : public core::frame_producer_base
        void load(const std::shared_ptr<FIBITMAP>& bitmap)
        {
                FreeImage_FlipVertical(bitmap.get());
+               auto longest_side = static_cast<int>(std::max(FreeImage_GetWidth(bitmap.get()), FreeImage_GetHeight(bitmap.get())));
+
+               if (longest_side > frame_factory_->get_max_frame_size())
+                       CASPAR_THROW_EXCEPTION(user_error() << msg_info("Image too large for texture"));
+
                core::pixel_format_desc desc;
                desc.format = core::pixel_format::bgra;
                desc.planes.push_back(core::pixel_format_desc::plane(FreeImage_GetWidth(bitmap.get()), FreeImage_GetHeight(bitmap.get()), 4));