]> 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>
Thu, 1 Dec 2011 16:37:03 +0000 (16:37 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 1 Dec 2011 16:37:03 +0000 (16:37 +0000)
modules/ffmpeg/consumer/ffmpeg_consumer.cpp

index da55e707812c348c6ec232fe759ea0bcbd9dd4df..bb89cea857c1884b046d937a31f78f2e38fa9fb8 100644 (file)
@@ -140,11 +140,11 @@ public:
 \r
        ~ffmpeg_consumer()\r
        {    \r
-               file_write_executor_.stop();\r
-               file_write_executor_.join();\r
-\r
                executor_.stop();\r
                executor_.join();\r
+\r
+               file_write_executor_.stop();\r
+               file_write_executor_.join();\r
                \r
                try\r
                {\r
@@ -153,12 +153,6 @@ public:
                        audio_st_.reset();\r
                        video_st_.reset();\r
                          \r
-                       for(size_t i = 0; i < oc_->nb_streams; i++) \r
-                       {\r
-                               av_freep(&oc_->streams[i]->codec);\r
-                               av_freep(&oc_->streams[i]);\r
-                       }\r
-\r
                        if (!(oc_->oformat->flags & AVFMT_NOFILE)) \r
                                THROW_ON_ERROR2(avio_close(oc_->pb), "[ffmpeg_consumer]"); // Close the output ffmpeg.\r
 \r
@@ -168,7 +162,6 @@ public:
                {\r
                        CASPAR_LOG_CURRENT_EXCEPTION();\r
                }\r
-\r
        }\r
                        \r
        std::wstring print() const\r
@@ -176,16 +169,11 @@ public:
                return L"ffmpeg[" + widen(filename_) + L"]";\r
        }\r
 \r
-\r
        std::shared_ptr<AVStream> add_video_stream(enum CodecID codec_id, const std::string& options)\r
        { \r
                auto st = av_new_stream(oc_.get(), 0);\r
-               if (!st) \r
-               {\r
-                       BOOST_THROW_EXCEPTION(caspar_exception() \r
-                               << msg_info("Could not alloc video-stream")                             \r
-                               << boost::errinfo_api_function("av_new_stream"));\r
-               }\r
+               if (!st)                \r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Could not allocate video-stream") << boost::errinfo_api_function("av_new_stream"));               \r
 \r
                auto encoder = avcodec_find_encoder(codec_id);\r
                if (!encoder)\r
@@ -207,7 +195,7 @@ public:
                {                       \r
                        c->bit_rate     = c->bit_rate > 0 ? c->bit_rate : format_desc_.width < 1280 ? 42*1000000 : 147*1000000;\r
                        c->pix_fmt      = PIX_FMT_YUV422P10;\r
-                       CASPAR_LOG(info) << print() << L"Options set: " << av_set_options_string(c->priv_data, options.c_str(), "=", ":");\r
+                       THROW_ON_ERROR2(av_set_options_string(c->priv_data, options.c_str(), "=", ":"), "[ffmpeg_consumer]");\r
                }\r
                else if(c->codec_id == CODEC_ID_DNXHD)\r
                {\r
@@ -217,30 +205,32 @@ public:
                        c->bit_rate     = c->bit_rate > 0 ? c->bit_rate : 220*1000000;\r
                        c->pix_fmt      = PIX_FMT_YUV422P;\r
                        \r
-                       CASPAR_LOG(info) << print() << L"Options set: " << av_set_options_string(c->priv_data, options.c_str(), "=", ":");\r
+                       THROW_ON_ERROR2(av_set_options_string(c->priv_data, options.c_str(), "=", ":"), "[ffmpeg_consumer]");\r
                }\r
                else if(c->codec_id == CODEC_ID_DVVIDEO)\r
                {\r
                        c->bit_rate     = c->bit_rate > 0 ? c->bit_rate : format_desc_.width < 1280 ? 50*1000000 : 100*1000000;\r
                        c->pix_fmt      = PIX_FMT_YUV422P;\r
                        \r
-                       CASPAR_LOG(info) << print() << L"Options set: " << av_set_options_string(c->priv_data, options.c_str(), "=", ":");\r
+                       THROW_ON_ERROR2(av_set_options_string(c->priv_data, options.c_str(), "=", ":"), "[ffmpeg_consumer]");\r
                }\r
                else if(c->codec_id == CODEC_ID_H264)\r
                {                          \r
-                       c->pix_fmt              = PIX_FMT_YUV420P;    \r
-                       av_opt_set(c->priv_data, "preset", "faster", 0);\r
+                       c->pix_fmt = PIX_FMT_YUV420P;    \r
+                       av_opt_set(c->priv_data, "preset", "ultrafast", 0);\r
+                       av_opt_set(c->priv_data, "tune",   "film",   0);\r
+                       av_opt_set(c->priv_data, "crf",    "10",     0);\r
                        \r
-                       CASPAR_LOG(info) << print() << L"Options set: " << av_set_options_string(c->priv_data, options.c_str(), "=", ":");\r
-\r
-                       c->max_b_frames = 0; // b-franes bit supported.\r
+                       THROW_ON_ERROR2(av_set_options_string(c->priv_data, options.c_str(), "=", ":"), "[ffmpeg_consumer]");\r
                }\r
                else\r
                {\r
-                       CASPAR_LOG(info) << print() << L"Options set: " << av_set_options_string(c->priv_data, options.c_str(), "=", ":");\r
+                       THROW_ON_ERROR2(av_set_options_string(c->priv_data, options.c_str(), "=", ":"), "[ffmpeg_consumer]");\r
                        CASPAR_LOG(warning) << " Potentially unsupported output parameters.";\r
                }\r
                \r
+               c->max_b_frames = 0; // b-franes bit supported.\r
+\r
                if(oc_->oformat->flags & AVFMT_GLOBALHEADER)\r
                        c->flags |= CODEC_FLAG_GLOBAL_HEADER;\r
                \r
@@ -250,18 +240,16 @@ public:
                return std::shared_ptr<AVStream>(st, [](AVStream* st)\r
                {\r
                        avcodec_close(st->codec);\r
+                       av_freep(&st->codec);\r
+                       av_freep(&st);\r
                });\r
        }\r
        \r
        std::shared_ptr<AVStream> add_audio_stream()\r
        {\r
                auto st = av_new_stream(oc_.get(), 1);\r
-               if (!st) \r
-               {\r
-                       BOOST_THROW_EXCEPTION(caspar_exception() \r
-                               << msg_info("Could not alloc audio-stream")                             \r
-                               << boost::errinfo_api_function("av_new_stream"));\r
-               }\r
+               if(!st)\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Could not allocate audio-stream") << boost::errinfo_api_function("av_new_stream"));               \r
 \r
                st->codec->codec_id                     = CODEC_ID_PCM_S16LE;\r
                st->codec->codec_type           = AVMEDIA_TYPE_AUDIO;\r
@@ -281,6 +269,8 @@ public:
                return std::shared_ptr<AVStream>(st, [](AVStream* st)\r
                {\r
                        avcodec_close(st->codec);\r
+                       av_freep(&st->codec);\r
+                       av_freep(&st);\r
                });\r
        }\r
 \r
@@ -370,17 +360,21 @@ public:
                executor_.begin_invoke([=]\r
                {               \r
                        frame_timer_.restart();\r
+\r
                        auto video = encode_video_frame(frame);\r
                        auto audio = encode_audio_frame(frame);\r
+\r
                        graph_->update_value("frame-time", frame_timer_.elapsed()*format_desc_.fps*0.5);\r
                        \r
                        file_write_executor_.begin_invoke([=]\r
                        {\r
                                write_timer_.restart();\r
+\r
                                if(video)\r
                                        av_write_frame(oc_.get(), video.get());\r
                                if(audio)\r
                                        av_write_frame(oc_.get(), audio.get());\r
+\r
                                graph_->update_value("write-time", write_timer_.elapsed()*format_desc_.fps*0.5);\r
                        });\r
                });\r