2 Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
4 This file is part of DCP-o-matic.
6 DCP-o-matic 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 2 of the License, or
9 (at your option) any later version.
11 DCP-o-matic 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 DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
21 /** @file src/ffmpeg_decoder.cc
22 * @brief A decoder using FFmpeg to decode content.
26 #include "exceptions.h"
30 #include "ffmpeg_decoder.h"
31 #include "caption_decoder.h"
32 #include "ffmpeg_audio_stream.h"
33 #include "ffmpeg_subtitle_stream.h"
34 #include "video_filter_graph.h"
35 #include "audio_buffers.h"
36 #include "ffmpeg_content.h"
37 #include "raw_image_proxy.h"
38 #include "video_decoder.h"
40 #include "audio_decoder.h"
41 #include "compose.hpp"
42 #include "caption_content.h"
43 #include "audio_content.h"
44 #include <dcp/subtitle_string.h>
45 #include <sub/ssa_reader.h>
46 #include <sub/subtitle.h>
47 #include <sub/collect.h>
49 #include <libavcodec/avcodec.h>
50 #include <libavformat/avformat.h>
52 #include <boost/foreach.hpp>
53 #include <boost/algorithm/string.hpp>
61 #define LOG_GENERAL(...) _log->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL);
62 #define LOG_ERROR(...) _log->log (String::compose (__VA_ARGS__), LogEntry::TYPE_ERROR);
63 #define LOG_WARNING_NC(...) _log->log (__VA_ARGS__, LogEntry::TYPE_WARNING);
64 #define LOG_WARNING(...) _log->log (String::compose (__VA_ARGS__), LogEntry::TYPE_WARNING);
74 using boost::shared_ptr;
75 using boost::is_any_of;
77 using boost::optional;
78 using boost::dynamic_pointer_cast;
81 FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log> log, bool fast)
84 , _have_current_subtitle (false)
87 video.reset (new VideoDecoder (this, c, log));
88 _pts_offset = pts_offset (c->ffmpeg_audio_streams(), c->first_video(), c->active_video_frame_rate());
89 /* It doesn't matter what size or pixel format this is, it just needs to be black */
90 _black_image.reset (new Image (AV_PIX_FMT_RGB24, dcp::Size (128, 128), true));
91 _black_image->make_black ();
93 _pts_offset = ContentTime ();
97 audio.reset (new AudioDecoder (this, c->audio, log, fast));
100 if (c->only_caption()) {
101 /* XXX: this time here should be the time of the first subtitle, not 0 */
102 caption.push_back (shared_ptr<CaptionDecoder> (new CaptionDecoder (this, c->only_caption(), log, ContentTime())));
105 _next_time.resize (_format_context->nb_streams);
109 FFmpegDecoder::flush ()
111 /* Get any remaining frames */
116 /* XXX: should we reset _packet.data and size after each *_decode_* call? */
118 while (video && decode_video_packet ()) {}
121 decode_audio_packet ();
124 /* Make sure all streams are the same length and round up to the next video frame */
126 FrameRateChange const frc = _ffmpeg_content->film()->active_frame_rate_change(_ffmpeg_content->position());
127 ContentTime full_length (_ffmpeg_content->full_length(), frc);
128 full_length = full_length.ceil (frc.source);
130 double const vfr = _ffmpeg_content->video_frame_rate().get();
131 Frame const f = full_length.frames_round (vfr);
132 Frame v = video->position().frames_round (vfr) + 1;
134 video->emit (shared_ptr<const ImageProxy> (new RawImageProxy (_black_image)), v);
139 BOOST_FOREACH (shared_ptr<FFmpegAudioStream> i, _ffmpeg_content->ffmpeg_audio_streams ()) {
140 ContentTime a = audio->stream_position(i);
141 /* Unfortunately if a is 0 that really means that we don't know the stream position since
142 there has been no data on it since the last seek. In this case we'll just do nothing
143 here. I'm not sure if that's the right idea.
145 if (a > ContentTime()) {
146 while (a < full_length) {
147 ContentTime to_do = min (full_length - a, ContentTime::from_seconds (0.1));
148 shared_ptr<AudioBuffers> silence (new AudioBuffers (i->channels(), to_do.frames_ceil (i->frame_rate())));
149 silence->make_silent ();
150 audio->emit (i, silence, a);
162 FFmpegDecoder::pass ()
164 int r = av_read_frame (_format_context, &_packet);
166 /* AVERROR_INVALIDDATA can apparently be returned sometimes even when av_read_frame
167 has pretty-much succeeded (and hence generated data which should be processed).
168 Hence it makes sense to continue here in that case.
170 if (r < 0 && r != AVERROR_INVALIDDATA) {
171 if (r != AVERROR_EOF) {
172 /* Maybe we should fail here, but for now we'll just finish off instead */
174 av_strerror (r, buf, sizeof(buf));
175 LOG_ERROR (N_("error on av_read_frame (%1) (%2)"), &buf[0], r);
182 int const si = _packet.stream_index;
183 shared_ptr<const FFmpegContent> fc = _ffmpeg_content;
185 if (_video_stream && si == _video_stream.get() && !video->ignore()) {
186 decode_video_packet ();
187 } else if (fc->subtitle_stream() && fc->subtitle_stream()->uses_index(_format_context, si) && !only_caption()->ignore()) {
188 decode_subtitle_packet ();
190 decode_audio_packet ();
193 av_packet_unref (&_packet);
197 /** @param data pointer to array of pointers to buffers.
198 * Only the first buffer will be used for non-planar data, otherwise there will be one per channel.
200 shared_ptr<AudioBuffers>
201 FFmpegDecoder::deinterleave_audio (shared_ptr<FFmpegAudioStream> stream) const
203 DCPOMATIC_ASSERT (bytes_per_audio_sample (stream));
205 int const size = av_samples_get_buffer_size (
206 0, stream->stream(_format_context)->codec->channels, _frame->nb_samples, audio_sample_format (stream), 1
209 /* Deinterleave and convert to float */
211 /* total_samples and frames will be rounded down here, so if there are stray samples at the end
212 of the block that do not form a complete sample or frame they will be dropped.
214 int const total_samples = size / bytes_per_audio_sample (stream);
215 int const channels = stream->channels();
216 int const frames = total_samples / channels;
217 shared_ptr<AudioBuffers> audio (new AudioBuffers (channels, frames));
218 float** data = audio->data();
220 switch (audio_sample_format (stream)) {
221 case AV_SAMPLE_FMT_U8:
223 uint8_t* p = reinterpret_cast<uint8_t *> (_frame->data[0]);
226 for (int i = 0; i < total_samples; ++i) {
227 data[channel][sample] = float(*p++) / (1 << 23);
230 if (channel == channels) {
238 case AV_SAMPLE_FMT_S16:
240 int16_t* p = reinterpret_cast<int16_t *> (_frame->data[0]);
243 for (int i = 0; i < total_samples; ++i) {
244 data[channel][sample] = float(*p++) / (1 << 15);
247 if (channel == channels) {
255 case AV_SAMPLE_FMT_S16P:
257 int16_t** p = reinterpret_cast<int16_t **> (_frame->data);
258 for (int i = 0; i < channels; ++i) {
259 for (int j = 0; j < frames; ++j) {
260 data[i][j] = static_cast<float>(p[i][j]) / (1 << 15);
266 case AV_SAMPLE_FMT_S32:
268 int32_t* p = reinterpret_cast<int32_t *> (_frame->data[0]);
271 for (int i = 0; i < total_samples; ++i) {
272 data[channel][sample] = static_cast<float>(*p++) / 2147483648;
275 if (channel == channels) {
283 case AV_SAMPLE_FMT_S32P:
285 int32_t** p = reinterpret_cast<int32_t **> (_frame->data);
286 for (int i = 0; i < channels; ++i) {
287 for (int j = 0; j < frames; ++j) {
288 data[i][j] = static_cast<float>(p[i][j]) / 2147483648;
294 case AV_SAMPLE_FMT_FLT:
296 float* p = reinterpret_cast<float*> (_frame->data[0]);
299 for (int i = 0; i < total_samples; ++i) {
300 data[channel][sample] = *p++;
303 if (channel == channels) {
311 case AV_SAMPLE_FMT_FLTP:
313 float** p = reinterpret_cast<float**> (_frame->data);
314 /* Sometimes there aren't as many channels in the _frame as in the stream */
315 for (int i = 0; i < _frame->channels; ++i) {
316 memcpy (data[i], p[i], frames * sizeof(float));
318 for (int i = _frame->channels; i < channels; ++i) {
319 audio->make_silent (i);
325 throw DecodeError (String::compose (_("Unrecognised audio sample format (%1)"), static_cast<int> (audio_sample_format (stream))));
332 FFmpegDecoder::audio_sample_format (shared_ptr<FFmpegAudioStream> stream) const
334 return stream->stream (_format_context)->codec->sample_fmt;
338 FFmpegDecoder::bytes_per_audio_sample (shared_ptr<FFmpegAudioStream> stream) const
340 return av_get_bytes_per_sample (audio_sample_format (stream));
344 FFmpegDecoder::seek (ContentTime time, bool accurate)
346 Decoder::seek (time, accurate);
348 /* If we are doing an `accurate' seek, we need to use pre-roll, as
349 we don't really know what the seek will give us.
352 ContentTime pre_roll = accurate ? ContentTime::from_seconds (2) : ContentTime (0);
355 /* XXX: it seems debatable whether PTS should be used here...
356 http://www.mjbshaw.com/2012/04/seeking-in-ffmpeg-know-your-timestamp.html
359 optional<int> stream;
362 stream = _video_stream;
364 shared_ptr<FFmpegAudioStream> s = dynamic_pointer_cast<FFmpegAudioStream> (_ffmpeg_content->audio->stream ());
366 stream = s->index (_format_context);
370 DCPOMATIC_ASSERT (stream);
372 ContentTime u = time - _pts_offset;
373 if (u < ContentTime ()) {
379 u.seconds() / av_q2d (_format_context->streams[stream.get()]->time_base),
383 if (video_codec_context ()) {
384 avcodec_flush_buffers (video_codec_context());
387 BOOST_FOREACH (shared_ptr<FFmpegAudioStream> i, ffmpeg_content()->ffmpeg_audio_streams()) {
388 avcodec_flush_buffers (i->stream(_format_context)->codec);
391 if (subtitle_codec_context ()) {
392 avcodec_flush_buffers (subtitle_codec_context ());
395 _have_current_subtitle = false;
399 FFmpegDecoder::decode_audio_packet ()
401 /* Audio packets can contain multiple frames, so we may have to call avcodec_decode_audio4
405 AVPacket copy_packet = _packet;
406 int const stream_index = copy_packet.stream_index;
408 /* XXX: inefficient */
409 vector<shared_ptr<FFmpegAudioStream> > streams = ffmpeg_content()->ffmpeg_audio_streams ();
410 vector<shared_ptr<FFmpegAudioStream> >::const_iterator stream = streams.begin ();
411 while (stream != streams.end () && !(*stream)->uses_index (_format_context, stream_index)) {
415 if (stream == streams.end ()) {
416 /* The packet's stream may not be an audio one; just ignore it in this method if so */
420 while (copy_packet.size > 0) {
423 int decode_result = avcodec_decode_audio4 ((*stream)->stream (_format_context)->codec, _frame, &frame_finished, ©_packet);
424 if (decode_result < 0) {
425 /* avcodec_decode_audio4 can sometimes return an error even though it has decoded
426 some valid data; for example dca_subframe_footer can return AVERROR_INVALIDDATA
427 if it overreads the auxiliary data. ffplay carries on if frame_finished is true,
428 even in the face of such an error, so I think we should too.
430 Returning from the method here caused mantis #352.
432 LOG_WARNING ("avcodec_decode_audio4 failed (%1)", decode_result);
434 /* Fudge decode_result so that we come out of the while loop when
435 we've processed this data.
437 decode_result = copy_packet.size;
440 if (frame_finished) {
441 shared_ptr<AudioBuffers> data = deinterleave_audio (*stream);
444 if (_frame->pts == AV_NOPTS_VALUE && _next_time[stream_index]) {
445 /* In some streams we see not every frame coming through with a timestamp; for those
446 that have AV_NOPTS_VALUE we need to work out the timestamp ourselves. This is
447 particularly noticeable with TrueHD streams (see #1111).
449 ct = *_next_time[stream_index];
451 ct = ContentTime::from_seconds (
452 av_frame_get_best_effort_timestamp (_frame) *
453 av_q2d ((*stream)->stream (_format_context)->time_base))
457 _next_time[stream_index] = ct + ContentTime::from_frames(data->frames(), (*stream)->frame_rate());
459 if (ct < ContentTime ()) {
460 /* Discard audio data that comes before time 0 */
461 Frame const remove = min (int64_t (data->frames()), (-ct).frames_ceil(double((*stream)->frame_rate ())));
462 data->move (data->frames() - remove, remove, 0);
463 data->set_frames (data->frames() - remove);
464 ct += ContentTime::from_frames (remove, (*stream)->frame_rate ());
467 if (ct < ContentTime()) {
469 "Crazy timestamp %1 for %2 samples in stream %3 packet pts %4 (ts=%5 tb=%6, off=%7)",
472 copy_packet.stream_index,
474 av_frame_get_best_effort_timestamp(_frame),
475 av_q2d((*stream)->stream(_format_context)->time_base),
476 to_string(_pts_offset)
480 /* Give this data provided there is some, and its time is sane */
481 if (ct >= ContentTime() && data->frames() > 0) {
482 audio->emit (*stream, data, ct);
486 copy_packet.data += decode_result;
487 copy_packet.size -= decode_result;
492 FFmpegDecoder::decode_video_packet ()
494 DCPOMATIC_ASSERT (_video_stream);
497 if (avcodec_decode_video2 (video_codec_context(), _frame, &frame_finished, &_packet) < 0 || !frame_finished) {
501 boost::mutex::scoped_lock lm (_filter_graphs_mutex);
503 shared_ptr<VideoFilterGraph> graph;
505 list<shared_ptr<VideoFilterGraph> >::iterator i = _filter_graphs.begin();
506 while (i != _filter_graphs.end() && !(*i)->can_process (dcp::Size (_frame->width, _frame->height), (AVPixelFormat) _frame->format)) {
510 if (i == _filter_graphs.end ()) {
511 dcp::Fraction vfr (lrint(_ffmpeg_content->video_frame_rate().get() * 1000), 1000);
512 graph.reset (new VideoFilterGraph (dcp::Size (_frame->width, _frame->height), (AVPixelFormat) _frame->format, vfr));
513 graph->setup (_ffmpeg_content->filters ());
514 _filter_graphs.push_back (graph);
515 LOG_GENERAL (N_("New graph for %1x%2, pixel format %3"), _frame->width, _frame->height, _frame->format);
520 list<pair<shared_ptr<Image>, int64_t> > images = graph->process (_frame);
522 for (list<pair<shared_ptr<Image>, int64_t> >::iterator i = images.begin(); i != images.end(); ++i) {
524 shared_ptr<Image> image = i->first;
526 if (i->second != AV_NOPTS_VALUE) {
527 double const pts = i->second * av_q2d (_format_context->streams[_video_stream.get()]->time_base) + _pts_offset.seconds ();
529 shared_ptr<ImageProxy> (new RawImageProxy (image)),
530 llrint (pts * _ffmpeg_content->active_video_frame_rate ())
533 LOG_WARNING_NC ("Dropping frame without PTS");
541 FFmpegDecoder::decode_subtitle_packet ()
545 if (avcodec_decode_subtitle2 (subtitle_codec_context(), &sub, &got_subtitle, &_packet) < 0 || !got_subtitle) {
549 /* Stop any current subtitle, either at the time it was supposed to stop, or now if now is sooner */
550 if (_have_current_subtitle) {
551 if (_current_subtitle_to) {
552 only_caption()->emit_stop (min(*_current_subtitle_to, subtitle_period(sub).from + _pts_offset));
554 only_caption()->emit_stop (subtitle_period(sub).from + _pts_offset);
556 _have_current_subtitle = false;
559 if (sub.num_rects <= 0) {
560 /* Nothing new in this subtitle */
564 /* Subtitle PTS (within the source, not taking into account any of the
565 source that we may have chopped off for the DCP).
567 FFmpegSubtitlePeriod sub_period = subtitle_period (sub);
569 from = sub_period.from + _pts_offset;
571 _current_subtitle_to = *sub_period.to + _pts_offset;
573 _current_subtitle_to = optional<ContentTime>();
574 _have_current_subtitle = true;
577 for (unsigned int i = 0; i < sub.num_rects; ++i) {
578 AVSubtitleRect const * rect = sub.rects[i];
580 switch (rect->type) {
583 case SUBTITLE_BITMAP:
584 decode_bitmap_subtitle (rect, from);
587 cout << "XXX: SUBTITLE_TEXT " << rect->text << "\n";
590 decode_ass_subtitle (rect->ass, from);
595 if (_current_subtitle_to) {
596 only_caption()->emit_stop (*_current_subtitle_to);
599 avsubtitle_free (&sub);
603 FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTime from)
605 /* Note BGRA is expressed little-endian, so the first byte in the word is B, second
606 G, third R, fourth A.
608 shared_ptr<Image> image (new Image (AV_PIX_FMT_BGRA, dcp::Size (rect->w, rect->h), true));
610 #ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT
611 /* Start of the first line in the subtitle */
612 uint8_t* sub_p = rect->pict.data[0];
613 /* sub_p looks up into a BGRA palette which is here
614 (i.e. first byte B, second G, third R, fourth A)
616 uint32_t const * palette = (uint32_t *) rect->pict.data[1];
618 /* Start of the first line in the subtitle */
619 uint8_t* sub_p = rect->data[0];
620 /* sub_p looks up into a BGRA palette which is here
621 (i.e. first byte B, second G, third R, fourth A)
623 uint32_t const * palette = (uint32_t *) rect->data[1];
625 /* And the stream has a map of those palette colours to colours
626 chosen by the user; created a `mapped' palette from those settings.
628 map<RGBA, RGBA> colour_map = ffmpeg_content()->subtitle_stream()->colours ();
629 vector<RGBA> mapped_palette (rect->nb_colors);
630 for (int i = 0; i < rect->nb_colors; ++i) {
631 RGBA c ((palette[i] & 0xff0000) >> 16, (palette[i] & 0xff00) >> 8, palette[i] & 0xff, (palette[i] & 0xff000000) >> 24);
632 map<RGBA, RGBA>::const_iterator j = colour_map.find (c);
633 if (j != colour_map.end ()) {
634 mapped_palette[i] = j->second;
636 /* This colour was not found in the FFmpegSubtitleStream's colour map; probably because
637 it is from a project that was created before this stuff was added. Just use the
638 colour straight from the original palette.
640 mapped_palette[i] = c;
644 /* Start of the output data */
645 uint32_t* out_p = (uint32_t *) image->data()[0];
647 for (int y = 0; y < rect->h; ++y) {
648 uint8_t* sub_line_p = sub_p;
649 uint32_t* out_line_p = out_p;
650 for (int x = 0; x < rect->w; ++x) {
651 RGBA const p = mapped_palette[*sub_line_p++];
652 /* XXX: this seems to be wrong to me (isn't the output image BGRA?) but it looks right on screen */
653 *out_line_p++ = (p.a << 24) | (p.b << 16) | (p.g << 8) | p.r;
655 #ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT
656 sub_p += rect->pict.linesize[0];
658 sub_p += rect->linesize[0];
660 out_p += image->stride()[0] / sizeof (uint32_t);
663 int const target_width = subtitle_codec_context()->width;
664 int const target_height = subtitle_codec_context()->height;
665 dcpomatic::Rect<double> const scaled_rect (
666 static_cast<double> (rect->x) / target_width,
667 static_cast<double> (rect->y) / target_height,
668 static_cast<double> (rect->w) / target_width,
669 static_cast<double> (rect->h) / target_height
672 only_caption()->emit_bitmap_start (from, image, scaled_rect);
676 FFmpegDecoder::decode_ass_subtitle (string ass, ContentTime from)
678 /* We have no styles and no Format: line, so I'm assuming that FFmpeg
679 produces a single format of Dialogue: lines...
684 for (size_t i = 0; i < ass.length(); ++i) {
685 if (commas < 9 && ass[i] == ',') {
687 } else if (commas == 9) {
696 sub::RawSubtitle base;
697 list<sub::RawSubtitle> raw = sub::SSAReader::parse_line (
700 _ffmpeg_content->video->size().width,
701 _ffmpeg_content->video->size().height
704 BOOST_FOREACH (sub::Subtitle const & i, sub::collect<list<sub::Subtitle> > (raw)) {
705 only_caption()->emit_plain_start (from, i);