2 Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /** @file src/ffmpeg_decoder.cc
21 * @brief A decoder using FFmpeg to decode content.
30 #include <boost/lexical_cast.hpp>
33 #include <libavcodec/avcodec.h>
34 #include <libavformat/avformat.h>
35 #include <libswscale/swscale.h>
36 #include <libpostproc/postprocess.h>
41 #include "transcoder.h"
45 #include "exceptions.h"
49 #include "ffmpeg_decoder.h"
55 using std::stringstream;
56 using boost::shared_ptr;
58 FFmpegDecoder::FFmpegDecoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j, bool minimal, bool ignore_length)
59 : Decoder (f, o, j, minimal, ignore_length)
63 , _subtitle_stream (-1)
65 , _video_codec_context (0)
67 , _audio_codec_context (0)
69 , _subtitle_codec_context (0)
78 FFmpegDecoder::~FFmpegDecoder ()
80 if (_audio_codec_context) {
81 avcodec_close (_audio_codec_context);
84 if (_video_codec_context) {
85 avcodec_close (_video_codec_context);
88 if (_subtitle_codec_context) {
89 avcodec_close (_subtitle_codec_context);
94 avformat_close_input (&_format_context);
98 FFmpegDecoder::setup_general ()
104 if ((r = avformat_open_input (&_format_context, _film->content_path().c_str(), 0, 0)) != 0) {
105 throw OpenFileError (_film->content_path ());
108 if (avformat_find_stream_info (_format_context, 0) < 0) {
109 throw DecodeError ("could not find stream information");
112 /* Find video, audio and subtitle streams and choose the first of each */
114 for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
115 AVStream* s = _format_context->streams[i];
116 if (s->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
118 } else if (s->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
119 if (_audio_stream == -1) {
122 _audio_streams.push_back (AudioStream (stream_name (s), i, s->codec->channels));
123 } else if (s->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
124 if (_subtitle_stream == -1) {
125 _subtitle_stream = i;
127 _subtitle_streams.push_back (SubtitleStream (stream_name (s), i));
131 /* Now override audio and subtitle streams with those from the Film, if it has any */
133 if (_film->audio_stream_index() != -1) {
134 _audio_stream = _film->audio_stream().id();
137 if (_film->subtitle_stream_index() != -1) {
138 _subtitle_stream = _film->subtitle_stream().id ();
141 if (_video_stream < 0) {
142 throw DecodeError ("could not find video stream");
145 _frame = avcodec_alloc_frame ();
147 throw DecodeError ("could not allocate frame");
152 FFmpegDecoder::setup_video ()
154 _video_codec_context = _format_context->streams[_video_stream]->codec;
155 _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
157 if (_video_codec == 0) {
158 throw DecodeError ("could not find video decoder");
161 /* I think this prevents problems with green hash on decodes and
162 "changing frame properties on the fly is not supported by all filters"
163 messages with some content. Although I'm not sure; needs checking.
165 AVDictionary* opts = 0;
166 av_dict_set (&opts, "threads", "1", 0);
168 if (avcodec_open2 (_video_codec_context, _video_codec, &opts) < 0) {
169 throw DecodeError ("could not open video decoder");
174 FFmpegDecoder::setup_audio ()
176 if (_audio_stream < 0) {
180 _audio_codec_context = _format_context->streams[_audio_stream]->codec;
181 _audio_codec = avcodec_find_decoder (_audio_codec_context->codec_id);
183 if (_audio_codec == 0) {
184 throw DecodeError ("could not find audio decoder");
187 if (avcodec_open2 (_audio_codec_context, _audio_codec, 0) < 0) {
188 throw DecodeError ("could not open audio decoder");
191 /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
192 so bodge it here. No idea why we should have to do this.
195 if (_audio_codec_context->channel_layout == 0) {
196 _audio_codec_context->channel_layout = av_get_default_channel_layout (audio_channels ());
201 FFmpegDecoder::setup_subtitle ()
203 if (_subtitle_stream < 0) {
207 _subtitle_codec_context = _format_context->streams[_subtitle_stream]->codec;
208 _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
210 if (_subtitle_codec == 0) {
211 throw DecodeError ("could not find subtitle decoder");
214 if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
215 throw DecodeError ("could not open subtitle decoder");
221 FFmpegDecoder::do_pass ()
223 int r = av_read_frame (_format_context, &_packet);
226 if (r != AVERROR_EOF) {
227 throw DecodeError ("error on av_read_frame");
230 /* Get any remaining frames */
235 /* XXX: should we reset _packet.data and size after each *_decode_* call? */
239 while (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
240 process_video (_frame);
243 if (_audio_stream >= 0 && _opt->decode_audio) {
244 while (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
245 int const data_size = av_samples_get_buffer_size (
246 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
249 assert (_audio_codec_context->channels == _film->audio_channels());
250 process_audio (_frame->data[0], data_size);
257 double const pts_seconds = av_q2d (_format_context->streams[_packet.stream_index]->time_base) * _packet.pts;
259 avcodec_get_frame_defaults (_frame);
261 if (_packet.stream_index == _video_stream) {
264 _first_video = pts_seconds;
268 if (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
270 /* Where we are in the output, in seconds */
271 double const out_pts_seconds = video_frame_index() / frames_per_second();
273 /* Difference between where we are and where we should be */
274 double const delta = pts_seconds - out_pts_seconds;
275 double const one_frame = 1 / frames_per_second();
277 /* Insert frames if required to get out_pts_seconds up to pts_seconds */
278 if (delta > one_frame) {
279 int const extra = rint (delta / one_frame);
280 for (int i = 0; i < extra; ++i) {
281 repeat_last_video ();
284 "Extra frame inserted at %1s; DCP frame %2, packet PTS %3",
285 out_pts_seconds, video_frame_index(), pts_seconds
291 if (delta > -one_frame) {
292 /* Process this frame */
293 process_video (_frame);
295 /* Otherwise we are omitting a frame to keep things right */
296 _film->log()->log (String::compose ("Frame removed at %1s", out_pts_seconds));
300 } else if (_audio_stream >= 0 && _packet.stream_index == _audio_stream && _opt->decode_audio && _first_video && _first_video.get() <= pts_seconds) {
302 /* Note: We only decode audio if we've had our first video packet through, and if it
303 was before this packet. Until then audio is thrown away.
307 _first_audio = pts_seconds;
309 /* This is our first audio packet, and if we've arrived here we must have had our
310 first video packet. Push some silence to make up any gap between our first
311 video packet and our first audio.
314 /* frames of silence that we must push */
315 int const s = rint ((_first_audio.get() - _first_video.get()) * audio_sample_rate ());
319 "First video at %1, first audio at %2, pushing %3 frames of silence for %4 channels (%5 bytes per sample)",
320 _first_video.get(), _first_audio.get(), s, audio_channels(), bytes_per_audio_sample()
326 int const b = s * audio_channels() * bytes_per_audio_sample();
328 /* XXX: this assumes that it won't be too much, and there are shaky assumptions
329 that all sound representations are silent with memset()ed zero data.
332 memset (silence, 0, b);
333 process_audio (silence, b);
338 if (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
339 int const data_size = av_samples_get_buffer_size (
340 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
343 assert (_audio_codec_context->channels == _film->audio_channels());
344 process_audio (_frame->data[0], data_size);
347 } else if (_subtitle_stream >= 0 && _packet.stream_index == _subtitle_stream && _opt->decode_subtitles && _first_video) {
351 if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) && got_subtitle) {
352 /* Sometimes we get an empty AVSubtitle, which is used by some codecs to
353 indicate that the previous subtitle should stop.
355 if (sub.num_rects > 0) {
356 process_subtitle (shared_ptr<TimedSubtitle> (new TimedSubtitle (sub, _first_video.get())));
358 process_subtitle (shared_ptr<TimedSubtitle> ());
360 avsubtitle_free (&sub);
364 av_free_packet (&_packet);
369 FFmpegDecoder::frames_per_second () const
371 AVStream* s = _format_context->streams[_video_stream];
373 if (s->avg_frame_rate.num && s->avg_frame_rate.den) {
374 return av_q2d (s->avg_frame_rate);
377 return av_q2d (s->r_frame_rate);
381 FFmpegDecoder::audio_channels () const
383 if (_audio_codec_context == 0) {
387 return _audio_codec_context->channels;
391 FFmpegDecoder::audio_sample_rate () const
393 if (_audio_codec_context == 0) {
397 return _audio_codec_context->sample_rate;
401 FFmpegDecoder::audio_sample_format () const
403 if (_audio_codec_context == 0) {
404 return (AVSampleFormat) 0;
407 return _audio_codec_context->sample_fmt;
411 FFmpegDecoder::audio_channel_layout () const
413 if (_audio_codec_context == 0) {
417 return _audio_codec_context->channel_layout;
421 FFmpegDecoder::native_size () const
423 return Size (_video_codec_context->width, _video_codec_context->height);
427 FFmpegDecoder::pixel_format () const
429 return _video_codec_context->pix_fmt;
433 FFmpegDecoder::time_base_numerator () const
435 return _video_codec_context->time_base.num;
439 FFmpegDecoder::time_base_denominator () const
441 return _video_codec_context->time_base.den;
445 FFmpegDecoder::sample_aspect_ratio_numerator () const
447 return _video_codec_context->sample_aspect_ratio.num;
451 FFmpegDecoder::sample_aspect_ratio_denominator () const
453 return _video_codec_context->sample_aspect_ratio.den;
457 FFmpegDecoder::has_subtitles () const
459 return (_subtitle_stream != -1);
463 FFmpegDecoder::audio_streams () const
465 return _audio_streams;
468 vector<SubtitleStream>
469 FFmpegDecoder::subtitle_streams () const
471 return _subtitle_streams;
475 FFmpegDecoder::stream_name (AVStream* s) const
479 AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0);
484 AVDictionaryEntry const * title = av_dict_get (s->metadata, "title", 0, 0);
486 if (!n.str().empty()) {
492 if (n.str().empty()) {