]> git.sesse.net Git - casparcg/blobdiff - modules/ffmpeg/consumer/ffmpeg_consumer.cpp
2.1.0: -ffmpeg_consumer: Use tbb_avcodec.
[casparcg] / modules / ffmpeg / consumer / ffmpeg_consumer.cpp
index a329863a2147cdc88284acc6a210ca2d51cf4976..12ff965892fdc78d6ff72818d852070032f24b42 100644 (file)
@@ -26,6 +26,7 @@
 #include "ffmpeg_consumer.h"\r
 \r
 #include "../producer/audio/audio_resampler.h"\r
+#include "../producer/tbb_avcodec.h"\r
 \r
 #include <core/frame/frame.h>\r
 #include <core/mixer/audio/audio_util.h>\r
@@ -61,6 +62,7 @@ extern "C"
        #include <libavutil/opt.h>\r
        #include <libavutil/pixdesc.h>\r
        #include <libavutil/parseutils.h>\r
+       #include <libavutil/samplefmt.h>\r
 }\r
 #if defined(_MSC_VER)\r
 #pragma warning (pop)\r
@@ -280,22 +282,19 @@ public:
 \r
                oc_->oformat = output_format_.format;\r
                                \r
-               THROW_ON_ERROR2(av_set_parameters(oc_.get(), nullptr), "[ffmpeg_consumer]");\r
-\r
                strcpy_s(oc_->filename, filename_.c_str());\r
                \r
                //  Add the audio and video streams using the default format codecs     and initialize the codecs.\r
-               auto options2 = options;\r
-               video_st_ = add_video_stream(options2);\r
+               video_st_ = add_video_stream(options);\r
                audio_st_ = add_audio_stream(options);\r
                                \r
-               dump_format(oc_.get(), 0, filename_.c_str(), 1);\r
+               av_dump_format(oc_.get(), 0, filename_.c_str(), 1);\r
                 \r
                // Open the output ffmpeg, if needed.\r
                if (!(oc_->oformat->flags & AVFMT_NOFILE)) \r
-                       THROW_ON_ERROR2(avio_open(&oc_->pb, filename_.c_str(), URL_WRONLY), "[ffmpeg_consumer]");\r
+                       THROW_ON_ERROR2(avio_open(&oc_->pb, filename.c_str(), AVIO_FLAG_WRITE), "[ffmpeg_consumer]");\r
                                \r
-               THROW_ON_ERROR2(av_write_header(oc_.get()), "[ffmpeg_consumer]");\r
+               THROW_ON_ERROR2(avformat_write_header(oc_.get(), nullptr), "[ffmpeg_consumer]");\r
 \r
                if(options.size() > 0)\r
                {\r
@@ -403,22 +402,18 @@ public:
                                \r
                boost::range::remove_erase_if(options, [&](const option& o)\r
                {\r
-                       return ffmpeg::av_opt_set(c, o.name.c_str(), o.value.c_str(), AV_OPT_SEARCH_CHILDREN) > -1;\r
+                       return o.name.at(0) != 'a' && ffmpeg::av_opt_set(c, o.name.c_str(), o.value.c_str(), AV_OPT_SEARCH_CHILDREN) > -1;\r
                });\r
                                \r
                if(output_format_.format->flags & AVFMT_GLOBALHEADER)\r
                        c->flags |= CODEC_FLAG_GLOBAL_HEADER;\r
                \r
-               c->thread_count = boost::thread::hardware_concurrency();\r
-               if(avcodec_open(c, encoder) < 0)\r
-               {\r
-                       c->thread_count = 1;\r
-                       THROW_ON_ERROR2(avcodec_open(c, encoder), "[ffmpeg_consumer]");\r
-               }\r
+               //c->thread_count = boost::thread::hardware_concurrency();\r
+               THROW_ON_ERROR2(tbb_avcodec_open(c, encoder), "[ffmpeg_consumer]");\r
 \r
                return std::shared_ptr<AVStream>(st, [](AVStream* st)\r
                {\r
-                       LOG_ON_ERROR2(avcodec_close(st->codec), "[ffmpeg_consumer]");\r
+                       LOG_ON_ERROR2(tbb_avcodec_close(st->codec), "[ffmpeg_consumer]");\r
                        av_freep(&st->codec);\r
                        av_freep(&st);\r
                });\r
@@ -445,7 +440,7 @@ public:
                c->codec_type           = AVMEDIA_TYPE_AUDIO;\r
                c->sample_rate          = 48000;\r
                c->channels                     = 2;\r
-               c->sample_fmt           = SAMPLE_FMT_S16;\r
+               c->sample_fmt           = AV_SAMPLE_FMT_S16;\r
 \r
                if(output_format_.vcodec == CODEC_ID_FLV1)              \r
                        c->sample_rate  = 44100;                \r
@@ -671,23 +666,23 @@ public:
                consumer_.reset(new ffmpeg_consumer(u8(filename_), format_desc, options_));\r
        }\r
        \r
-       virtual bool send(core::const_frame frame) override\r
+       bool send(core::const_frame frame) override\r
        {\r
                consumer_->send(frame);\r
                return true;\r
        }\r
        \r
-       virtual std::wstring print() const override\r
+       std::wstring print() const override\r
        {\r
                return consumer_ ? consumer_->print() : L"[ffmpeg_consumer]";\r
        }\r
 \r
-       virtual std::wstring name() const override\r
+       std::wstring name() const override\r
        {\r
                return L"file";\r
        }\r
 \r
-       virtual boost::property_tree::wptree info() const override\r
+       boost::property_tree::wptree info() const override\r
        {\r
                boost::property_tree::wptree info;\r
                info.add(L"type", L"file");\r
@@ -695,17 +690,17 @@ public:
                return info;\r
        }\r
                \r
-       virtual bool has_synchronization_clock() const override\r
+       bool has_synchronization_clock() const override\r
        {\r
                return false;\r
        }\r
 \r
-       virtual int buffer_depth() const override\r
+       int buffer_depth() const override\r
        {\r
                return 1;\r
        }\r
 \r
-       virtual int index() const override\r
+       int index() const override\r
        {\r
                return 200;\r
        }\r