#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
#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
\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
\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
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
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
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