2 * Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
4 * This file is part of CasparCG (www.casparcg.com).
6 * CasparCG is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * CasparCG is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with CasparCG. If not, see <http://www.gnu.org/licenses/>.
19 * Author: Robert Nagy, ronag89@gmail.com
22 #include "../../StdAfx.h"
24 #include "frame_muxer.h"
26 #include "../filter/filter.h"
27 #include "../filter/audio_filter.h"
28 #include "../util/util.h"
29 #include "../../ffmpeg.h"
31 #include <core/producer/frame_producer.h>
32 #include <core/frame/draw_frame.h>
33 #include <core/frame/frame_transform.h>
34 #include <core/frame/pixel_format.h>
35 #include <core/frame/frame_factory.h>
36 #include <core/frame/frame.h>
37 #include <core/frame/audio_channel_layout.h>
39 #include <common/env.h>
40 #include <common/except.h>
41 #include <common/log.h>
44 #pragma warning (push)
45 #pragma warning (disable : 4244)
49 #define __STDC_CONSTANT_MACROS
50 #define __STDC_LIMIT_MACROS
51 #include <libavcodec/avcodec.h>
52 #include <libavformat/avformat.h>
58 #include <common/assert.h>
59 #include <boost/range/algorithm_ext/push_back.hpp>
60 #include <boost/algorithm/string/predicate.hpp>
61 #include <boost/thread/mutex.hpp>
62 #include <boost/optional.hpp>
68 using namespace caspar::core;
70 namespace caspar { namespace ffmpeg {
72 struct av_frame_format
75 std::array<int, AV_NUM_DATA_POINTERS> line_sizes;
79 av_frame_format(const AVFrame& frame)
80 : pix_format(frame.format)
82 , height(frame.height)
84 boost::copy(frame.linesize, line_sizes.begin());
87 bool operator==(const av_frame_format& other) const
89 return pix_format == other.pix_format
90 && line_sizes == other.line_sizes
91 && width == other.width
92 && height == other.height;
95 bool operator!=(const av_frame_format& other) const
97 return !(*this == other);
101 std::unique_ptr<audio_filter> create_amerge_filter(std::vector<audio_input_pad> input_pads, const core::audio_channel_layout& layout)
103 std::vector<audio_output_pad> output_pads;
106 output_pads.emplace_back(
107 std::vector<int> { 48000 },
108 std::vector<AVSampleFormat> { AVSampleFormat::AV_SAMPLE_FMT_S32 },
109 std::vector<uint64_t> { static_cast<uint64_t>(av_get_default_channel_layout(layout.num_channels)) });
111 if (input_pads.size() > 1)
113 for (int i = 0; i < input_pads.size(); ++i)
114 amerge += L"[a:" + boost::lexical_cast<std::wstring>(i) + L"]";
116 amerge += L"amerge=inputs=" + boost::lexical_cast<std::wstring>(input_pads.size());
119 std::wstring afilter;
124 afilter += L"[aout:0]";
127 return std::unique_ptr<audio_filter>(new audio_filter(input_pads, output_pads, u8(afilter)));
130 struct frame_muxer::impl : boost::noncopyable
132 static constexpr std::size_t max_stream_size = 120;
133 std::queue<std::queue<core::mutable_frame>> video_streams_;
134 std::queue<core::mutable_audio_buffer> audio_streams_;
135 std::queue<core::draw_frame> frame_buffer_;
136 display_mode display_mode_ = display_mode::invalid;
137 const boost::rational<int> in_framerate_;
138 const video_format_desc format_desc_;
139 const audio_channel_layout audio_channel_layout_;
141 std::vector<int> audio_cadence_ = format_desc_.audio_cadence;
143 spl::shared_ptr<core::frame_factory> frame_factory_;
144 boost::optional<av_frame_format> previously_filtered_frame_;
146 std::unique_ptr<filter> filter_;
147 const std::wstring filter_str_;
148 std::unique_ptr<audio_filter> audio_filter_;
149 const bool multithreaded_filter_;
150 bool force_deinterlacing_ = env::properties().get(L"configuration.force-deinterlace", false);
152 mutable boost::mutex out_framerate_mutex_;
153 boost::rational<int> out_framerate_;
156 boost::rational<int> in_framerate,
157 std::vector<audio_input_pad> audio_input_pads,
158 const spl::shared_ptr<core::frame_factory>& frame_factory,
159 const core::video_format_desc& format_desc,
160 const core::audio_channel_layout& channel_layout,
161 const std::wstring& filter_str,
162 bool multithreaded_filter)
163 : in_framerate_(in_framerate)
164 , format_desc_(format_desc)
165 , audio_channel_layout_(channel_layout)
166 , frame_factory_(frame_factory)
167 , filter_str_(filter_str)
168 , multithreaded_filter_(multithreaded_filter)
170 video_streams_.push(std::queue<core::mutable_frame>());
171 audio_streams_.push(core::mutable_audio_buffer());
173 set_out_framerate(in_framerate_);
175 if (!audio_input_pads.empty())
177 audio_filter_ = create_amerge_filter(std::move(audio_input_pads), audio_channel_layout_);
181 void push(const std::shared_ptr<AVFrame>& video_frame)
186 av_frame_format current_frame_format(*video_frame);
188 if (previously_filtered_frame_ && video_frame->data[0] && *previously_filtered_frame_ != current_frame_format)
190 // Fixes bug where avfilter crashes server on some DV files (starts in YUV420p but changes to YUV411p after the first frame).
191 if (ffmpeg::is_logging_quiet_for_thread())
192 CASPAR_LOG(debug) << L"[frame_muxer] Frame format has changed. Resetting display mode.";
194 CASPAR_LOG(info) << L"[frame_muxer] Frame format has changed. Resetting display mode.";
196 display_mode_ = display_mode::invalid;
198 previously_filtered_frame_ = boost::none;
201 if (video_frame == flush_video())
203 video_streams_.push(std::queue<core::mutable_frame>());
205 else if (video_frame == empty_video())
207 video_streams_.back().push(frame_factory_->create_frame(this, core::pixel_format::invalid, audio_channel_layout_));
208 display_mode_ = display_mode::simple;
212 if (!filter_ || display_mode_ == display_mode::invalid)
213 update_display_mode(video_frame);
217 filter_->push(video_frame);
218 previously_filtered_frame_ = current_frame_format;
220 for (auto& av_frame : filter_->poll_all())
221 video_streams_.back().push(make_frame(this, av_frame, *frame_factory_, audio_channel_layout_));
225 if (video_streams_.back().size() > max_stream_size)
226 CASPAR_THROW_EXCEPTION(invalid_operation() << source_info("frame_muxer") << msg_info("video-stream overflow. This can be caused by incorrect frame-rate. Check clip meta-data."));
229 void push(const std::vector<std::shared_ptr<core::mutable_audio_buffer>>& audio_samples_per_stream)
231 if (audio_samples_per_stream.empty())
234 bool is_flush = boost::count_if(
235 audio_samples_per_stream,
236 [](std::shared_ptr<core::mutable_audio_buffer> a) { return a == flush_audio(); }) > 0;
240 audio_streams_.push(core::mutable_audio_buffer());
242 else if (audio_samples_per_stream.at(0) == empty_audio())
244 boost::range::push_back(audio_streams_.back(), core::mutable_audio_buffer(audio_cadence_.front() * audio_channel_layout_.num_channels, 0));
248 for (int i = 0; i < audio_samples_per_stream.size(); ++i)
250 auto range = boost::make_iterator_range_n(
251 audio_samples_per_stream.at(i)->data(),
252 audio_samples_per_stream.at(i)->size());
254 audio_filter_->push(i, range);
257 for (auto frame : audio_filter_->poll_all(0))
259 auto audio = boost::make_iterator_range_n(
260 reinterpret_cast<std::int32_t*>(frame->extended_data[0]),
261 frame->nb_samples * frame->channels);
263 boost::range::push_back(audio_streams_.back(), audio);
267 if (audio_streams_.back().size() > max_stream_size * audio_cadence_.front() * audio_channel_layout_.num_channels)
268 CASPAR_THROW_EXCEPTION(invalid_operation() << source_info("frame_muxer") << msg_info("audio-stream overflow. This can be caused by incorrect frame-rate. Check clip meta-data."));
271 bool video_ready() const
273 return video_streams_.size() > 1 || (video_streams_.size() >= audio_streams_.size() && video_ready2());
276 bool audio_ready() const
278 return audio_streams_.size() > 1 || (audio_streams_.size() >= video_streams_.size() && audio_ready2());
281 bool video_ready2() const
283 return video_streams_.front().size() >= 1;
286 bool audio_ready2() const
288 return audio_streams_.front().size() >= audio_cadence_.front() * audio_channel_layout_.num_channels;
291 core::draw_frame poll()
293 if (!frame_buffer_.empty())
295 auto frame = frame_buffer_.front();
300 if (video_streams_.size() > 1 && audio_streams_.size() > 1 && (!video_ready2() || !audio_ready2()))
302 if (!video_streams_.front().empty() || !audio_streams_.front().empty())
303 CASPAR_LOG(trace) << "Truncating: " << video_streams_.front().size() << L" video-frames, " << audio_streams_.front().size() << L" audio-samples.";
305 video_streams_.pop();
306 audio_streams_.pop();
309 if (!video_ready2() || !audio_ready2() || display_mode_ == display_mode::invalid)
310 return core::draw_frame::empty();
312 auto frame = pop_video();
313 frame.audio_data() = pop_audio();
315 frame_buffer_.push(core::draw_frame(std::move(frame)));
320 core::mutable_frame pop_video()
322 auto frame = std::move(video_streams_.front().front());
323 video_streams_.front().pop();
327 core::mutable_audio_buffer pop_audio()
329 CASPAR_VERIFY(audio_streams_.front().size() >= audio_cadence_.front() * audio_channel_layout_.num_channels);
331 auto begin = audio_streams_.front().begin();
332 auto end = begin + (audio_cadence_.front() * audio_channel_layout_.num_channels);
334 core::mutable_audio_buffer samples(begin, end);
335 audio_streams_.front().erase(begin, end);
337 boost::range::rotate(audio_cadence_, std::begin(audio_cadence_) + 1);
342 uint32_t calc_nb_frames(uint32_t nb_frames) const
344 uint64_t nb_frames2 = nb_frames;
346 if(filter_ && filter_->is_double_rate()) // Take into account transformations in filter.
349 return static_cast<uint32_t>(nb_frames2);
352 boost::rational<int> out_framerate() const
354 boost::lock_guard<boost::mutex> lock(out_framerate_mutex_);
356 return out_framerate_;
359 void update_display_mode(const std::shared_ptr<AVFrame>& frame)
361 std::wstring filter_str = filter_str_;
363 display_mode_ = display_mode::simple;
365 auto mode = get_mode(*frame);
367 if (filter::is_deinterlacing(filter_str_))
369 display_mode_ = display_mode::simple;
371 else if (mode != core::field_mode::progressive)
373 if (force_deinterlacing_)
375 display_mode_ = display_mode::deinterlace_bob;
379 bool output_also_interlaced = format_desc_.field_mode != core::field_mode::progressive;
380 bool interlaced_output_compatible =
381 output_also_interlaced
383 (frame->height == 480 && format_desc_.height == 486) // don't deinterlace for NTSC DV
384 || frame->height == format_desc_.height
386 && in_framerate_ == format_desc_.framerate;
388 display_mode_ = interlaced_output_compatible ? display_mode::simple : display_mode::deinterlace_bob;
392 if (display_mode_ == display_mode::deinterlace_bob)
393 filter_str = append_filter(filter_str, L"YADIF=1:-1");
395 auto out_framerate = in_framerate_;
397 if (filter::is_double_rate(filter_str))
400 if (frame->height == 480) // NTSC DV
402 auto pad_str = L"PAD=" + boost::lexical_cast<std::wstring>(frame->width) + L":486:0:2:black";
403 filter_str = append_filter(filter_str, pad_str);
406 filter_.reset (new filter(
411 boost::rational<int>(frame->sample_aspect_ratio.num, frame->sample_aspect_ratio.den),
412 static_cast<AVPixelFormat>(frame->format),
413 std::vector<AVPixelFormat>(),
416 set_out_framerate(out_framerate);
418 auto in_fps = static_cast<double>(in_framerate_.numerator()) / static_cast<double>(in_framerate_.denominator());
420 if (ffmpeg::is_logging_quiet_for_thread())
421 CASPAR_LOG(debug) << L"[frame_muxer] " << display_mode_ << L" " << print_mode(frame->width, frame->height, in_fps, frame->interlaced_frame > 0);
423 CASPAR_LOG(info) << L"[frame_muxer] " << display_mode_ << L" " << print_mode(frame->width, frame->height, in_fps, frame->interlaced_frame > 0);
428 while (video_ready() && audio_ready() && display_mode_ != display_mode::invalid)
430 auto frame1 = pop_video();
431 frame1.audio_data() = pop_audio();
433 frame_buffer_.push(core::draw_frame(std::move(frame1)));
437 void set_out_framerate(boost::rational<int> out_framerate)
439 boost::lock_guard<boost::mutex> lock(out_framerate_mutex_);
441 bool changed = out_framerate != out_framerate_;
442 out_framerate_ = std::move(out_framerate);
445 update_audio_cadence();
448 void update_audio_cadence()
450 audio_cadence_ = find_audio_cadence(out_framerate_);
452 // Note: Uses 1 step rotated cadence for 1001 modes (1602, 1602, 1601, 1602, 1601)
453 // This cadence fills the audio mixer most optimally.
454 boost::range::rotate(audio_cadence_, std::end(audio_cadence_) - 1);
458 frame_muxer::frame_muxer(
459 boost::rational<int> in_framerate,
460 std::vector<audio_input_pad> audio_input_pads,
461 const spl::shared_ptr<core::frame_factory>& frame_factory,
462 const core::video_format_desc& format_desc,
463 const core::audio_channel_layout& channel_layout,
464 const std::wstring& filter,
465 bool multithreaded_filter)
466 : impl_(new impl(std::move(in_framerate), std::move(audio_input_pads), frame_factory, format_desc, channel_layout, filter, multithreaded_filter)){}
467 void frame_muxer::push(const std::shared_ptr<AVFrame>& video){impl_->push(video);}
468 void frame_muxer::push(const std::vector<std::shared_ptr<core::mutable_audio_buffer>>& audio_samples_per_stream){impl_->push(audio_samples_per_stream);}
469 core::draw_frame frame_muxer::poll(){return impl_->poll();}
470 uint32_t frame_muxer::calc_nb_frames(uint32_t nb_frames) const {return impl_->calc_nb_frames(nb_frames);}
471 bool frame_muxer::video_ready() const{return impl_->video_ready();}
472 bool frame_muxer::audio_ready() const{return impl_->audio_ready();}
473 boost::rational<int> frame_muxer::out_framerate() const { return impl_->out_framerate(); }