]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: video_decoder: Fixed stack-corruption bug for media with non gpu-accelerated...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 21 Jan 2011 12:08:37 +0000 (12:08 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 21 Jan 2011 12:08:37 +0000 (12:08 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@397 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/producer/ffmpeg/video/video_decoder.cpp
core/producer/layer.cpp

index 684b56d941aeaa1e1f7dfde529c07c31d4a5ec67..fc6de24867b5ec83a6057a0320dad4c70792cd7c 100644 (file)
@@ -98,7 +98,7 @@ struct video_decoder::implementation : boost::noncopyable
        const int width_;\r
        const int height_;\r
        const PixelFormat pix_fmt_;\r
-       const pixel_format_desc desc_;\r
+       pixel_format_desc desc_;\r
 \r
 public:\r
        explicit implementation(AVCodecContext* codec_context, const safe_ptr<frame_factory>& frame_factory) \r
@@ -117,6 +117,7 @@ public:
                {\r
                        CASPAR_LOG(warning) << "Hardware accelerated color transform not supported.";\r
 \r
+                       desc_ = get_pixel_format_desc(PIX_FMT_BGRA, width_, height_);\r
                        double param;\r
                        sws_context_.reset(sws_getContext(width_, height_, pix_fmt_, width_, height_, PIX_FMT_BGRA, SWS_BILINEAR, nullptr, nullptr, &param), sws_freeContext);\r
                        if(!sws_context_)\r
@@ -135,11 +136,10 @@ public:
                \r
                if(result < 0)\r
                        BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("avcodec_decode_video failed"));\r
-\r
+               \r
+               auto write = frame_factory_->create_frame(desc_);\r
                if(sws_context_ == nullptr)\r
                {\r
-                       auto write = frame_factory_->create_frame(desc_);\r
-\r
                        tbb::parallel_for(0, static_cast<int>(desc_.planes.size()), 1, [&](int n)\r
                        {\r
                                auto plane            = desc_.planes[n];\r
@@ -160,13 +160,11 @@ public:
                }\r
                else\r
                {\r
-                       auto write = frame_factory_->create_frame(width_, height_);\r
-\r
-                       AVFrame av_frame;       \r
-                       avcodec_get_frame_defaults(&av_frame);\r
-                       avpicture_fill(reinterpret_cast<AVPicture*>(&av_frame), write->image_data().begin(), PIX_FMT_BGRA, width_, height_);\r
+                       safe_ptr<AVFrame> av_frame(avcodec_alloc_frame(), av_free);     \r
+                       avcodec_get_frame_defaults(av_frame.get());                     \r
+                       avpicture_fill(reinterpret_cast<AVPicture*>(av_frame.get()), write->image_data().begin(), PIX_FMT_BGRA, width_, height_);\r
                 \r
-                       sws_scale(sws_context_.get(), decoded_frame->data, decoded_frame->linesize, 0, height_, av_frame.data, av_frame.linesize);      \r
+                       sws_scale(sws_context_.get(), decoded_frame->data, decoded_frame->linesize, 0, height_, av_frame->data, av_frame->linesize);    \r
 \r
                        return write;\r
                }       \r
index 66fda5c9e61f8970869b51a5d8139a8d732454b9..064a322ff1ffac83e93829dbbaaf3c170afc5548 100644 (file)
@@ -90,14 +90,18 @@ public:
                if(is_paused_)\r
                        return last_frame_;\r
 \r
+               if(foreground_ == frame_producer::empty())\r
+               {\r
+                       last_frame_ = draw_frame::empty();\r
+                       return last_frame_;\r
+               }\r
+\r
                try\r
                {\r
                        last_frame_ = foreground_->receive(); \r
                        last_frame_->set_layer_index(index_);\r
                        if(last_frame_ == draw_frame::eof())\r
                        {\r
-                               CASPAR_ASSERT(foreground_ != frame_producer::empty());\r
-\r
                                auto following = foreground_->get_following_producer();\r
                                following->set_leading_producer(foreground_);\r
                                foreground_ = following;\r