\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
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
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
}\r
-\r
}\r
\r
std::wstring print() const\r
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
{ \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
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
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
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
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