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"
44 #include "film_state.h"
46 #include "exceptions.h"
50 #include "ffmpeg_decoder.h"
54 using namespace boost;
56 FFmpegDecoder::FFmpegDecoder (boost::shared_ptr<const FilmState> s, boost::shared_ptr<const Options> o, Job* j, Log* l, bool minimal, bool ignore_length)
57 : Decoder (s, o, j, l, minimal, ignore_length)
61 , _subtitle_stream (-1)
63 , _video_codec_context (0)
65 , _audio_codec_context (0)
67 , _subtitle_codec_context (0)
69 , _first_video_pts (-1)
77 FFmpegDecoder::~FFmpegDecoder ()
79 if (_audio_codec_context) {
80 avcodec_close (_audio_codec_context);
83 if (_video_codec_context) {
84 avcodec_close (_video_codec_context);
87 if (_subtitle_codec_context) {
88 avcodec_close (_subtitle_codec_context);
92 avformat_close_input (&_format_context);
96 FFmpegDecoder::setup_general ()
102 if ((r = avformat_open_input (&_format_context, _fs->content_path().c_str(), 0, 0)) != 0) {
103 throw OpenFileError (_fs->content_path ());
106 if (avformat_find_stream_info (_format_context, 0) < 0) {
107 throw DecodeError ("could not find stream information");
110 /* Find video, audio and subtitle streams and choose the first of each */
112 for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
113 AVStream* s = _format_context->streams[i];
114 if (s->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
116 } else if (s->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
117 if (_audio_stream == -1) {
120 _audio_streams.push_back (AudioStream (stream_name (s), i, s->codec->channels));
121 } else if (s->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
122 if (_subtitle_stream == -1) {
123 _subtitle_stream = i;
125 _subtitle_streams.push_back (SubtitleStream (stream_name (s), i));
129 /* Now override audio and subtitle streams with those from the Film, if it has any */
131 if (_fs->audio_stream_index() != -1) {
132 _audio_stream = _fs->audio_stream().id();
135 if (_fs->subtitle_stream_index() != -1) {
136 _subtitle_stream = _fs->subtitle_stream().id ();
139 if (_video_stream < 0) {
140 throw DecodeError ("could not find video stream");
143 _frame = avcodec_alloc_frame ();
145 throw DecodeError ("could not allocate frame");
150 FFmpegDecoder::setup_video ()
152 _video_codec_context = _format_context->streams[_video_stream]->codec;
153 _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
155 if (_video_codec == 0) {
156 throw DecodeError ("could not find video decoder");
159 if (avcodec_open2 (_video_codec_context, _video_codec, 0) < 0) {
160 throw DecodeError ("could not open video decoder");
165 FFmpegDecoder::setup_audio ()
167 if (_audio_stream < 0) {
171 _audio_codec_context = _format_context->streams[_audio_stream]->codec;
172 _audio_codec = avcodec_find_decoder (_audio_codec_context->codec_id);
174 if (_audio_codec == 0) {
175 throw DecodeError ("could not find audio decoder");
178 if (avcodec_open2 (_audio_codec_context, _audio_codec, 0) < 0) {
179 throw DecodeError ("could not open audio decoder");
182 /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
183 so bodge it here. No idea why we should have to do this.
186 if (_audio_codec_context->channel_layout == 0) {
187 _audio_codec_context->channel_layout = av_get_default_channel_layout (audio_channels ());
192 FFmpegDecoder::setup_subtitle ()
194 if (_subtitle_stream < 0) {
198 _subtitle_codec_context = _format_context->streams[_subtitle_stream]->codec;
199 _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
201 if (_subtitle_codec == 0) {
202 throw DecodeError ("could not find subtitle decoder");
205 if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
206 throw DecodeError ("could not open subtitle decoder");
212 FFmpegDecoder::do_pass ()
214 int r = av_read_frame (_format_context, &_packet);
216 if (r != AVERROR_EOF) {
217 throw DecodeError ("error on av_read_frame");
220 /* Get any remaining frames */
225 /* XXX: should we reset _packet.data and size after each *_decode_* call? */
229 while (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
230 process_video (_frame);
233 if (_audio_stream >= 0 && _opt->decode_audio) {
234 while (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
235 int const data_size = av_samples_get_buffer_size (
236 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
239 assert (_audio_codec_context->channels == _fs->audio_channels());
240 process_audio (_frame->data[0], data_size);
247 if (_packet.stream_index == _video_stream) {
250 if (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
251 if (_first_video_pts == -1) {
252 _first_video_pts = _packet.pts;
254 process_video (_frame);
257 } else if (_audio_stream >= 0 && _packet.stream_index == _audio_stream && _opt->decode_audio) {
259 avcodec_get_frame_defaults (_frame);
262 if (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
263 int const data_size = av_samples_get_buffer_size (
264 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
267 assert (_audio_codec_context->channels == _fs->audio_channels());
268 process_audio (_frame->data[0], data_size);
271 } else if (_subtitle_stream >= 0 && _packet.stream_index == _subtitle_stream && _opt->decode_subtitles) {
275 if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) && got_subtitle) {
276 /* I'm not entirely sure why, but sometimes we get an AVSubtitle with
279 if (sub.num_rects > 0) {
280 process_subtitle (shared_ptr<TimedSubtitle> (new TimedSubtitle (sub)));
282 avsubtitle_free (&sub);
286 av_free_packet (&_packet);
291 FFmpegDecoder::length_in_frames () const
293 return (_format_context->duration / AV_TIME_BASE) * frames_per_second ();
297 FFmpegDecoder::frames_per_second () const
299 AVStream* s = _format_context->streams[_video_stream];
301 if (s->avg_frame_rate.num && s->avg_frame_rate.den) {
302 return av_q2d (s->avg_frame_rate);
305 return av_q2d (s->r_frame_rate);
309 FFmpegDecoder::audio_channels () const
311 if (_audio_codec_context == 0) {
315 return _audio_codec_context->channels;
319 FFmpegDecoder::audio_sample_rate () const
321 if (_audio_codec_context == 0) {
325 return _audio_codec_context->sample_rate;
329 FFmpegDecoder::audio_sample_format () const
331 if (_audio_codec_context == 0) {
332 return (AVSampleFormat) 0;
335 return _audio_codec_context->sample_fmt;
339 FFmpegDecoder::audio_channel_layout () const
341 if (_audio_codec_context == 0) {
345 return _audio_codec_context->channel_layout;
349 FFmpegDecoder::native_size () const
351 return Size (_video_codec_context->width, _video_codec_context->height);
355 FFmpegDecoder::pixel_format () const
357 return _video_codec_context->pix_fmt;
361 FFmpegDecoder::time_base_numerator () const
363 return _video_codec_context->time_base.num;
367 FFmpegDecoder::time_base_denominator () const
369 return _video_codec_context->time_base.den;
373 FFmpegDecoder::sample_aspect_ratio_numerator () const
375 return _video_codec_context->sample_aspect_ratio.num;
379 FFmpegDecoder::sample_aspect_ratio_denominator () const
381 return _video_codec_context->sample_aspect_ratio.den;
385 FFmpegDecoder::has_subtitles () const
387 return (_subtitle_stream != -1);
391 FFmpegDecoder::audio_streams () const
393 return _audio_streams;
396 vector<SubtitleStream>
397 FFmpegDecoder::subtitle_streams () const
399 return _subtitle_streams;
403 FFmpegDecoder::stream_name (AVStream* s) const
407 AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0);
412 AVDictionaryEntry const * title = av_dict_get (s->metadata, "title", 0, 0);
414 if (!n.str().empty()) {
420 if (n.str().empty()) {
428 FFmpegDecoder::audio_to_discard () const
430 AVStream* v = _format_context->streams[_video_stream];
431 AVStream* a = _format_context->streams[_audio_stream];
433 assert (v->time_base.num == a->time_base.num);
434 assert (v->time_base.den == a->time_base.den);
436 return rint (av_q2d (v->time_base) * 1000 * (_first_video_pts - _first_audio_pts));