]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Fixed ffmpeg-consumer crash.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 1 Mar 2011 21:15:14 +0000 (21:15 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 1 Mar 2011 21:15:14 +0000 (21:15 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@504 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/consumer/ffmpeg/ffmpeg_consumer.cpp
core/consumer/frame_consumer_device.cpp
core/consumer/ogl/ogl_consumer.cpp
mixer/image/image_transform.h
protocol/amcp/AMCPCommandsImpl.cpp

index a8cf372fea7e3bf9e733df7c12d0d54efc4e43a9..84e850bd1ad617e248cde3933a07bb91273f7c01 100644 (file)
@@ -55,7 +55,7 @@ namespace caspar { namespace core {
 struct ffmpeg_consumer::implementation : boost::noncopyable\r
 {              \r
        printer parent_printer_;\r
-       const std::string filename_;\r
+       std::string filename_;\r
 \r
        // Audio\r
        AVStream* audio_st_;\r
@@ -124,6 +124,7 @@ public:
                {\r
                        CASPAR_LOG(warning) << "Could not deduce output format from ffmpeg extension: using MPEG.";\r
                        fmt_ = av_guess_format("mpeg", nullptr, nullptr);\r
+                       filename_ = filename_ + ".avi"; \r
                }\r
                if (!fmt_)\r
                        BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Could not find suitable output format"));\r
@@ -187,6 +188,8 @@ public:
                }\r
                \r
                av_write_header(oc_.get()); // write the stream header, if any \r
+\r
+               CASPAR_LOG(info) << print() << L" Successfully initialized.";\r
        }\r
        \r
        void set_parent_printer(const printer& parent_printer) \r
@@ -194,6 +197,11 @@ public:
                parent_printer_ = parent_printer;\r
        }\r
 \r
+       std::wstring print() const\r
+       {\r
+               return (parent_printer_ ? parent_printer_() + L"/" : L"") + L"ffmpeg[" + widen(filename_) + L"]";\r
+       }\r
+\r
        AVStream* add_video_stream(enum CodecID codec_id)\r
        { \r
                auto st = av_new_stream(oc_.get(), 0);\r
@@ -251,14 +259,13 @@ public:
                std::shared_ptr<AVFrame> av_frame(avcodec_alloc_frame(), av_free);\r
                avpicture_fill(reinterpret_cast<AVPicture*>(av_frame.get()), const_cast<uint8_t*>(frame->image_data().begin()), PIX_FMT_BGRA, format_desc_.width, format_desc_.height);\r
                                \r
-               AVFrame local_av_frame;\r
-               avcodec_get_frame_defaults(&local_av_frame);\r
+               std::shared_ptr<AVFrame> local_av_frame(avcodec_alloc_frame(), av_free);\r
                picture_buf_.resize(avpicture_get_size(c->pix_fmt, format_desc_.width, format_desc_.height));\r
-               avpicture_fill(reinterpret_cast<AVPicture*>(&local_av_frame), picture_buf_.data(), c->pix_fmt, format_desc_.width, format_desc_.height);\r
+               avpicture_fill(reinterpret_cast<AVPicture*>(local_av_frame.get()), picture_buf_.data(), c->pix_fmt, format_desc_.width, format_desc_.height);\r
 \r
-               sws_scale(img_convert_ctx_, av_frame->data, av_frame->linesize, 0, c->height, local_av_frame.data, local_av_frame.linesize);\r
+               sws_scale(img_convert_ctx_, av_frame->data, av_frame->linesize, 0, c->height, local_av_frame->data, local_av_frame->linesize);\r
                                \r
-               int ret = avcodec_encode_video(c, video_outbuf_.data(), video_outbuf_.size(), &local_av_frame);\r
+               int ret = avcodec_encode_video(c, video_outbuf_.data(), video_outbuf_.size(), local_av_frame.get());\r
                                \r
                int errn = -ret;\r
                if (errn > 0) \r
@@ -406,8 +413,8 @@ safe_ptr<frame_consumer> create_ffmpeg_consumer(const std::vector<std::wstring>&
                return frame_consumer::empty();\r
        \r
        // TODO: Ask stakeholders about case where file already exists.\r
-       boost::filesystem::remove(boost::filesystem::wpath(env::media_folder() + params[2])); // Delete the file if it exists\r
-       return make_safe<ffmpeg_consumer>(env::media_folder() + params[2]);\r
+       boost::filesystem::remove(boost::filesystem::wpath(env::media_folder() + params[1])); // Delete the file if it exists\r
+       return make_safe<ffmpeg_consumer>(env::media_folder() + params[1]);\r
 }\r
 \r
 }}\r
index db5c2e34a5e752fdc1167376309313a04eb0a93b..e47453d1350faea9916905b58be61fc9a3dae0d4 100644 (file)
@@ -10,7 +10,6 @@
 \r
 #include <common/concurrency/executor.h>\r
 #include <common/diagnostics/graph.h>\r
-#include <common/utility/timer.h>\r
 #include <common/utility/assert.h>\r
 \r
 #include <boost/range/algorithm_ext/erase.hpp>\r
@@ -22,7 +21,6 @@ namespace caspar { namespace core {
 struct frame_consumer_device::implementation\r
 {      \r
        const printer parent_printer_;\r
-       timer clock_;\r
 \r
        boost::circular_buffer<safe_ptr<const read_frame>> buffer_;\r
 \r
@@ -97,8 +95,6 @@ public:
                                        CASPAR_LOG(warning) << "Removed consumer from frame_consumer_device.";\r
                                }\r
                        }\r
-\r
-                       clock_.tick(1.0/format_desc_.fps);\r
                });\r
        }\r
 \r
index aabcbd2b734e79090d2e0b29976ecb39a0dae96d..8fd053f88997aee8c9fa717287fc3e562856757e 100644 (file)
@@ -44,6 +44,7 @@ namespace caspar { namespace core {
 \r
 struct ogl_consumer::implementation : boost::noncopyable\r
 {              \r
+       timer clock_;\r
        printer parent_printer_;\r
        boost::unique_future<void> active_;\r
 \r
@@ -253,6 +254,8 @@ public:
                glBindTexture(GL_TEXTURE_2D, 0);\r
 \r
                std::rotate(pbos_.begin(), pbos_.begin() + 1, pbos_.end());\r
+\r
+               clock_.tick(1.0/format_desc_.fps);\r
        }\r
                \r
        void send(const safe_ptr<const read_frame>& frame)\r
index bd9f11642e5aab583c8c958123e2f19a805f848a..7dc7d713587b3836b2a0da974b532e62a7954778 100644 (file)
@@ -18,7 +18,6 @@ struct pixel_format_desc;
 class image_transform \r
 {\r
 public:\r
-\r
        image_transform();\r
 \r
        void set_opacity(double value);\r
index 0323df8df54684ad49f8391d3cb95d0ab706585a..d035dc7cbcef1eeb68685db5539d448c4e6f5b84 100644 (file)
@@ -356,8 +356,6 @@ bool RemoveCommand::DoExecute()
        try\r
        {\r
                GetChannel()->consumer().remove(GetLayerIndex());\r
-       \r
-               CASPAR_LOG(info) << "Removed " << TEXT(" successfully");\r
 \r
                SetReplyString(TEXT("202 REMOVE OK\r\n"));\r
 \r