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"
53 using namespace boost;
55 FFmpegDecoder::FFmpegDecoder (boost::shared_ptr<Film> f, boost::shared_ptr<const Options> o, Job* j, bool minimal, bool ignore_length)
56 : Decoder (f, o, j, minimal, ignore_length)
60 , _subtitle_stream (-1)
62 , _video_codec_context (0)
64 , _audio_codec_context (0)
66 , _subtitle_codec_context (0)
75 FFmpegDecoder::~FFmpegDecoder ()
77 if (_audio_codec_context) {
78 avcodec_close (_audio_codec_context);
81 if (_video_codec_context) {
82 avcodec_close (_video_codec_context);
85 if (_subtitle_codec_context) {
86 avcodec_close (_subtitle_codec_context);
90 avformat_close_input (&_format_context);
94 FFmpegDecoder::setup_general ()
100 if ((r = avformat_open_input (&_format_context, _film->content_path().c_str(), 0, 0)) != 0) {
101 throw OpenFileError (_film->content_path ());
104 if (avformat_find_stream_info (_format_context, 0) < 0) {
105 throw DecodeError ("could not find stream information");
108 /* Find video, audio and subtitle streams and choose the first of each */
110 for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
111 AVStream* s = _format_context->streams[i];
112 if (s->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
114 } else if (s->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
115 if (_audio_stream == -1) {
118 _audio_streams.push_back (AudioStream (stream_name (s), i, s->codec->channels));
119 } else if (s->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
120 if (_subtitle_stream == -1) {
121 _subtitle_stream = i;
123 _subtitle_streams.push_back (SubtitleStream (stream_name (s), i));
127 /* Now override audio and subtitle streams with those from the Film, if it has any */
129 if (_film->audio_stream_index() != -1) {
130 _audio_stream = _film->audio_stream().id();
133 if (_film->subtitle_stream_index() != -1) {
134 _subtitle_stream = _film->subtitle_stream().id ();
137 if (_video_stream < 0) {
138 throw DecodeError ("could not find video stream");
141 _frame = avcodec_alloc_frame ();
143 throw DecodeError ("could not allocate frame");
148 FFmpegDecoder::setup_video ()
150 _video_codec_context = _format_context->streams[_video_stream]->codec;
151 _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
153 if (_video_codec == 0) {
154 throw DecodeError ("could not find video decoder");
157 if (avcodec_open2 (_video_codec_context, _video_codec, 0) < 0) {
158 throw DecodeError ("could not open video decoder");
163 FFmpegDecoder::setup_audio ()
165 if (_audio_stream < 0) {
169 _audio_codec_context = _format_context->streams[_audio_stream]->codec;
170 _audio_codec = avcodec_find_decoder (_audio_codec_context->codec_id);
172 if (_audio_codec == 0) {
173 throw DecodeError ("could not find audio decoder");
176 if (avcodec_open2 (_audio_codec_context, _audio_codec, 0) < 0) {
177 throw DecodeError ("could not open audio decoder");
180 /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
181 so bodge it here. No idea why we should have to do this.
184 if (_audio_codec_context->channel_layout == 0) {
185 _audio_codec_context->channel_layout = av_get_default_channel_layout (audio_channels ());
190 FFmpegDecoder::setup_subtitle ()
192 if (_subtitle_stream < 0) {
196 _subtitle_codec_context = _format_context->streams[_subtitle_stream]->codec;
197 _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
199 if (_subtitle_codec == 0) {
200 throw DecodeError ("could not find subtitle decoder");
203 if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
204 throw DecodeError ("could not open subtitle decoder");
210 FFmpegDecoder::do_pass ()
212 int r = av_read_frame (_format_context, &_packet);
215 if (r != AVERROR_EOF) {
216 throw DecodeError ("error on av_read_frame");
219 /* Get any remaining frames */
224 /* XXX: should we reset _packet.data and size after each *_decode_* call? */
228 while (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
229 process_video (_frame);
232 if (_audio_stream >= 0 && _opt->decode_audio) {
233 while (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
234 int const data_size = av_samples_get_buffer_size (
235 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
238 assert (_audio_codec_context->channels == _film->audio_channels());
239 process_audio (_frame->data[0], data_size);
246 double const pts_seconds = av_q2d (_format_context->streams[_packet.stream_index]->time_base) * _packet.pts;
248 if (_packet.stream_index == _video_stream) {
251 _first_video = pts_seconds;
255 if (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
256 process_video (_frame);
259 } else if (_audio_stream >= 0 && _packet.stream_index == _audio_stream && _opt->decode_audio && _first_video && _first_video.get() <= pts_seconds) {
261 /* Note: We only decode audio if we've had our first video packet through, and if it
262 was before this packet. Until then audio is thrown away.
266 _first_audio = pts_seconds;
268 /* This is our first audio packet, and if we've arrived here we must have had our
269 first video packet. Push some silence to make up the gap between our first
270 video packet and our first audio.
273 /* frames of silence that we must push */
274 int const s = rint ((_first_audio.get() - _first_video.get()) * audio_sample_rate ());
278 "First video at %1, first audio at %2, pushing %3 frames of silence for %4 channels (%5 bytes per sample)",
279 _first_video.get(), _first_audio.get(), s, audio_channels(), bytes_per_audio_sample()
284 int const b = s * audio_channels() * bytes_per_audio_sample();
286 /* XXX: this assumes that it won't be too much, and there are shaky assumptions
287 that all sound representations are silent with memset()ed zero data.
290 memset (silence, 0, b);
291 process_audio (silence, b);
294 avcodec_get_frame_defaults (_frame);
297 if (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
298 int const data_size = av_samples_get_buffer_size (
299 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
302 assert (_audio_codec_context->channels == _film->audio_channels());
303 process_audio (_frame->data[0], data_size);
306 } else if (_subtitle_stream >= 0 && _packet.stream_index == _subtitle_stream && _opt->decode_subtitles && _first_video) {
310 if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) && got_subtitle) {
311 /* Sometimes we get an empty AVSubtitle, which is used by some codecs to
312 indicate that the previous subtitle should stop.
314 if (sub.num_rects > 0) {
315 process_subtitle (shared_ptr<TimedSubtitle> (new TimedSubtitle (sub, _first_video.get())));
317 process_subtitle (shared_ptr<TimedSubtitle> ());
319 avsubtitle_free (&sub);
323 av_free_packet (&_packet);
328 FFmpegDecoder::frames_per_second () const
330 AVStream* s = _format_context->streams[_video_stream];
332 if (s->avg_frame_rate.num && s->avg_frame_rate.den) {
333 return av_q2d (s->avg_frame_rate);
336 return av_q2d (s->r_frame_rate);
340 FFmpegDecoder::audio_channels () const
342 if (_audio_codec_context == 0) {
346 return _audio_codec_context->channels;
350 FFmpegDecoder::audio_sample_rate () const
352 if (_audio_codec_context == 0) {
356 return _audio_codec_context->sample_rate;
360 FFmpegDecoder::audio_sample_format () const
362 if (_audio_codec_context == 0) {
363 return (AVSampleFormat) 0;
366 return _audio_codec_context->sample_fmt;
370 FFmpegDecoder::audio_channel_layout () const
372 if (_audio_codec_context == 0) {
376 return _audio_codec_context->channel_layout;
380 FFmpegDecoder::native_size () const
382 return Size (_video_codec_context->width, _video_codec_context->height);
386 FFmpegDecoder::pixel_format () const
388 return _video_codec_context->pix_fmt;
392 FFmpegDecoder::time_base_numerator () const
394 return _video_codec_context->time_base.num;
398 FFmpegDecoder::time_base_denominator () const
400 return _video_codec_context->time_base.den;
404 FFmpegDecoder::sample_aspect_ratio_numerator () const
406 return _video_codec_context->sample_aspect_ratio.num;
410 FFmpegDecoder::sample_aspect_ratio_denominator () const
412 return _video_codec_context->sample_aspect_ratio.den;
416 FFmpegDecoder::has_subtitles () const
418 return (_subtitle_stream != -1);
422 FFmpegDecoder::audio_streams () const
424 return _audio_streams;
427 vector<SubtitleStream>
428 FFmpegDecoder::subtitle_streams () const
430 return _subtitle_streams;
434 FFmpegDecoder::stream_name (AVStream* s) const
438 AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0);
443 AVDictionaryEntry const * title = av_dict_get (s->metadata, "title", 0, 0);
445 if (!n.str().empty()) {
451 if (n.str().empty()) {