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)
64 , _last_video_frame (-1)
65 , _this_video_frame (0)
67 , _video_codec_context (0)
69 , _audio_codec_context (0)
71 , _subtitle_codec_context (0)
74 for (int i = 0; i < 2; ++i) {
84 FFmpegDecoder::~FFmpegDecoder ()
86 if (_audio_codec_context) {
87 avcodec_close (_audio_codec_context);
90 if (_video_codec_context) {
91 avcodec_close (_video_codec_context);
94 if (_subtitle_codec_context) {
95 avcodec_close (_subtitle_codec_context);
98 for (int i = 0; i < 2; ++i) {
99 av_free (_video_frame[i]);
102 av_free (_audio_frame);
104 avformat_close_input (&_format_context);
108 FFmpegDecoder::setup_general ()
114 if ((r = avformat_open_input (&_format_context, _film->content_path().c_str(), 0, 0)) != 0) {
115 throw OpenFileError (_film->content_path ());
118 if (avformat_find_stream_info (_format_context, 0) < 0) {
119 throw DecodeError ("could not find stream information");
122 /* Find video, audio and subtitle streams and choose the first of each */
124 for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
125 AVStream* s = _format_context->streams[i];
126 if (s->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
128 } else if (s->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
129 if (_audio_stream == -1) {
132 _audio_streams.push_back (AudioStream (stream_name (s), i, s->codec->channels));
133 } else if (s->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
134 if (_subtitle_stream == -1) {
135 _subtitle_stream = i;
137 _subtitle_streams.push_back (SubtitleStream (stream_name (s), i));
141 /* Now override audio and subtitle streams with those from the Film, if it has any */
143 if (_film->audio_stream_index() != -1) {
144 _audio_stream = _film->audio_stream().id();
147 if (_film->subtitle_stream_index() != -1) {
148 _subtitle_stream = _film->subtitle_stream().id ();
151 if (_video_stream < 0) {
152 throw DecodeError ("could not find video stream");
155 for (int i = 0; i < 2; ++i) {
156 _video_frame[i] = avcodec_alloc_frame ();
157 if (_video_frame[i] == 0) {
158 throw DecodeError ("could not allocate frame");
162 _audio_frame = avcodec_alloc_frame ();
163 if (_audio_frame == 0) {
164 throw DecodeError ("could not allocate frame");
169 FFmpegDecoder::setup_video ()
171 _video_codec_context = _format_context->streams[_video_stream]->codec;
172 _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
174 if (_video_codec == 0) {
175 throw DecodeError ("could not find video decoder");
178 /* I think this prevents problems with green hash on decodes and
179 "changing frame properties on the fly is not supported by all filters"
180 messages with some content. Although I'm not sure; needs checking.
182 AVDictionary* opts = 0;
183 av_dict_set (&opts, "threads", "1", 0);
185 if (avcodec_open2 (_video_codec_context, _video_codec, &opts) < 0) {
186 throw DecodeError ("could not open video decoder");
191 FFmpegDecoder::setup_audio ()
193 if (_audio_stream < 0) {
197 _audio_codec_context = _format_context->streams[_audio_stream]->codec;
198 _audio_codec = avcodec_find_decoder (_audio_codec_context->codec_id);
200 if (_audio_codec == 0) {
201 throw DecodeError ("could not find audio decoder");
204 if (avcodec_open2 (_audio_codec_context, _audio_codec, 0) < 0) {
205 throw DecodeError ("could not open audio decoder");
208 /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
209 so bodge it here. No idea why we should have to do this.
212 if (_audio_codec_context->channel_layout == 0) {
213 _audio_codec_context->channel_layout = av_get_default_channel_layout (audio_channels ());
218 FFmpegDecoder::setup_subtitle ()
220 if (_subtitle_stream < 0) {
224 _subtitle_codec_context = _format_context->streams[_subtitle_stream]->codec;
225 _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
227 if (_subtitle_codec == 0) {
228 throw DecodeError ("could not find subtitle decoder");
231 if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
232 throw DecodeError ("could not open subtitle decoder");
238 FFmpegDecoder::do_pass ()
240 int r = av_read_frame (_format_context, &_packet);
243 if (r != AVERROR_EOF) {
244 throw DecodeError ("error on av_read_frame");
247 /* Get any remaining frames */
252 /* XXX: should we reset _packet.data and size after each *_decode_* call? */
256 while (avcodec_decode_video2 (_video_codec_context, _video_frame[_this_video_frame], &frame_finished, &_packet) >= 0 && frame_finished) {
257 process_video (_video_frame[_this_video_frame]);
260 if (_audio_stream >= 0 && _opt->decode_audio) {
261 while (avcodec_decode_audio4 (_audio_codec_context, _audio_frame, &frame_finished, &_packet) >= 0 && frame_finished) {
262 int const data_size = av_samples_get_buffer_size (
263 0, _audio_codec_context->channels, _audio_frame->nb_samples, audio_sample_format (), 1
266 assert (_audio_codec_context->channels == _film->audio_channels());
267 process_audio (_audio_frame->data[0], data_size);
274 double const pts_seconds = av_q2d (_format_context->streams[_packet.stream_index]->time_base) * _packet.pts;
276 if (_packet.stream_index == _video_stream) {
278 avcodec_get_frame_defaults (_video_frame[_this_video_frame]);
281 _first_video = pts_seconds;
285 if (avcodec_decode_video2 (_video_codec_context, _video_frame[_this_video_frame], &frame_finished, &_packet) >= 0 && frame_finished) {
287 /* Where we are in the output, in seconds */
288 double const out_pts_seconds = video_frame() / frames_per_second();
290 /* Difference between where we are and where we should be */
291 double const delta = pts_seconds - out_pts_seconds;
292 double const one_frame = 1 / frames_per_second();
294 /* Insert the last frame if we have one, otherwise just use this one */
295 int const insert_frame = _last_video_frame == -1 ? _this_video_frame : _last_video_frame;
297 /* Insert frames if required to get out_pts_seconds up to pts_seconds */
298 if (delta > one_frame) {
299 int const extra = rint (delta / one_frame);
300 for (int i = 0; i < extra; ++i) {
301 _film->log()->log (String::compose ("Extra frame inserted at %1s", out_pts_seconds));
302 process_video (_video_frame[insert_frame]);
306 if (delta > -one_frame) {
307 /* Process this frame */
308 process_video (_video_frame[_this_video_frame]);
310 /* Otherwise we are omitting a frame to keep things right */
311 _film->log()->log (String::compose ("Frame removed at %1s", out_pts_seconds));
314 /* Swap over so that we use the alternate video frames next time */
315 _this_video_frame = 1 - _this_video_frame;
316 _last_video_frame = 1 - _this_video_frame;
319 } else if (_audio_stream >= 0 && _packet.stream_index == _audio_stream && _opt->decode_audio && _first_video && _first_video.get() <= pts_seconds) {
321 /* Note: We only decode audio if we've had our first video packet through, and if it
322 was before this packet. Until then audio is thrown away.
326 _first_audio = pts_seconds;
328 /* This is our first audio packet, and if we've arrived here we must have had our
329 first video packet. Push some silence to make up any gap between our first
330 video packet and our first audio.
333 /* frames of silence that we must push */
334 int const s = rint ((_first_audio.get() - _first_video.get()) * audio_sample_rate ());
338 "First video at %1, first audio at %2, pushing %3 frames of silence for %4 channels (%5 bytes per sample)",
339 _first_video.get(), _first_audio.get(), s, audio_channels(), bytes_per_audio_sample()
345 int const b = s * audio_channels() * bytes_per_audio_sample();
347 /* XXX: this assumes that it won't be too much, and there are shaky assumptions
348 that all sound representations are silent with memset()ed zero data.
351 memset (silence, 0, b);
352 process_audio (silence, b);
357 if (avcodec_decode_audio4 (_audio_codec_context, _audio_frame, &frame_finished, &_packet) >= 0 && frame_finished) {
358 int const data_size = av_samples_get_buffer_size (
359 0, _audio_codec_context->channels, _audio_frame->nb_samples, audio_sample_format (), 1
362 assert (_audio_codec_context->channels == _film->audio_channels());
363 process_audio (_audio_frame->data[0], data_size);
366 } else if (_subtitle_stream >= 0 && _packet.stream_index == _subtitle_stream && _opt->decode_subtitles && _first_video) {
370 if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) && got_subtitle) {
371 /* Sometimes we get an empty AVSubtitle, which is used by some codecs to
372 indicate that the previous subtitle should stop.
374 if (sub.num_rects > 0) {
375 process_subtitle (shared_ptr<TimedSubtitle> (new TimedSubtitle (sub, _first_video.get())));
377 process_subtitle (shared_ptr<TimedSubtitle> ());
379 avsubtitle_free (&sub);
383 av_free_packet (&_packet);
388 FFmpegDecoder::frames_per_second () const
390 AVStream* s = _format_context->streams[_video_stream];
392 if (s->avg_frame_rate.num && s->avg_frame_rate.den) {
393 return av_q2d (s->avg_frame_rate);
396 return av_q2d (s->r_frame_rate);
400 FFmpegDecoder::audio_channels () const
402 if (_audio_codec_context == 0) {
406 return _audio_codec_context->channels;
410 FFmpegDecoder::audio_sample_rate () const
412 if (_audio_codec_context == 0) {
416 return _audio_codec_context->sample_rate;
420 FFmpegDecoder::audio_sample_format () const
422 if (_audio_codec_context == 0) {
423 return (AVSampleFormat) 0;
426 return _audio_codec_context->sample_fmt;
430 FFmpegDecoder::audio_channel_layout () const
432 if (_audio_codec_context == 0) {
436 return _audio_codec_context->channel_layout;
440 FFmpegDecoder::native_size () const
442 return Size (_video_codec_context->width, _video_codec_context->height);
446 FFmpegDecoder::pixel_format () const
448 return _video_codec_context->pix_fmt;
452 FFmpegDecoder::time_base_numerator () const
454 return _video_codec_context->time_base.num;
458 FFmpegDecoder::time_base_denominator () const
460 return _video_codec_context->time_base.den;
464 FFmpegDecoder::sample_aspect_ratio_numerator () const
466 return _video_codec_context->sample_aspect_ratio.num;
470 FFmpegDecoder::sample_aspect_ratio_denominator () const
472 return _video_codec_context->sample_aspect_ratio.den;
476 FFmpegDecoder::has_subtitles () const
478 return (_subtitle_stream != -1);
482 FFmpegDecoder::audio_streams () const
484 return _audio_streams;
487 vector<SubtitleStream>
488 FFmpegDecoder::subtitle_streams () const
490 return _subtitle_streams;
494 FFmpegDecoder::stream_name (AVStream* s) const
498 AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0);
503 AVDictionaryEntry const * title = av_dict_get (s->metadata, "title", 0, 0);
505 if (!n.str().empty()) {
511 if (n.str().empty()) {