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"
50 #include "filter_graph.h"
56 using std::stringstream;
58 using boost::shared_ptr;
59 using boost::optional;
61 FFmpegDecoder::FFmpegDecoder (shared_ptr<Film> f, shared_ptr<const Options> o, Job* j)
63 , VideoDecoder (f, o, j)
64 , AudioDecoder (f, o, j)
68 , _video_codec_context (0)
70 , _audio_codec_context (0)
72 , _subtitle_codec_context (0)
81 FFmpegDecoder::~FFmpegDecoder ()
83 if (_audio_codec_context) {
84 avcodec_close (_audio_codec_context);
87 if (_video_codec_context) {
88 avcodec_close (_video_codec_context);
91 if (_subtitle_codec_context) {
92 avcodec_close (_subtitle_codec_context);
97 avformat_close_input (&_format_context);
101 FFmpegDecoder::setup_general ()
107 if ((r = avformat_open_input (&_format_context, _film->content_path().c_str(), 0, 0)) != 0) {
108 throw OpenFileError (_film->content_path ());
111 if (avformat_find_stream_info (_format_context, 0) < 0) {
112 throw DecodeError ("could not find stream information");
115 /* Find video, audio and subtitle streams and choose the first of each */
117 for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
118 AVStream* s = _format_context->streams[i];
119 if (s->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
121 } else if (s->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
122 _audio_streams.push_back (AudioStream (stream_name (s), i, s->codec->sample_rate, s->codec->channel_layout));
123 } else if (s->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
124 _subtitle_streams.push_back (SubtitleStream (stream_name (s), i));
128 if (_video_stream < 0) {
129 throw DecodeError ("could not find video stream");
132 _frame = avcodec_alloc_frame ();
134 throw DecodeError ("could not allocate frame");
139 FFmpegDecoder::setup_video ()
141 _video_codec_context = _format_context->streams[_video_stream]->codec;
142 _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
144 if (_video_codec == 0) {
145 throw DecodeError ("could not find video decoder");
148 /* I think this prevents problems with green hash on decodes and
149 "changing frame properties on the fly is not supported by all filters"
150 messages with some content. Although I'm not sure; needs checking.
152 AVDictionary* opts = 0;
153 av_dict_set (&opts, "threads", "1", 0);
155 if (avcodec_open2 (_video_codec_context, _video_codec, &opts) < 0) {
156 throw DecodeError ("could not open video decoder");
161 FFmpegDecoder::setup_audio ()
163 if (!_audio_stream) {
167 _audio_codec_context = _format_context->streams[_audio_stream.get().id()]->codec;
168 _audio_codec = avcodec_find_decoder (_audio_codec_context->codec_id);
170 if (_audio_codec == 0) {
171 throw DecodeError ("could not find audio decoder");
174 if (avcodec_open2 (_audio_codec_context, _audio_codec, 0) < 0) {
175 throw DecodeError ("could not open audio decoder");
178 /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
179 so bodge it here. No idea why we should have to do this.
182 if (_audio_codec_context->channel_layout == 0) {
183 _audio_codec_context->channel_layout = av_get_default_channel_layout (_audio_stream.get().channels());
188 FFmpegDecoder::setup_subtitle ()
190 if (!_subtitle_stream) {
194 _subtitle_codec_context = _format_context->streams[_subtitle_stream.get().id()]->codec;
195 _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
197 if (_subtitle_codec == 0) {
198 throw DecodeError ("could not find subtitle decoder");
201 if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
202 throw DecodeError ("could not open subtitle decoder");
208 FFmpegDecoder::pass ()
210 int r = av_read_frame (_format_context, &_packet);
213 if (r != AVERROR_EOF) {
214 /* Maybe we should fail here, but for now we'll just finish off instead */
216 av_strerror (r, buf, sizeof(buf));
217 _film->log()->log (String::compose ("error on av_read_frame (%1) (%2)", buf, r));
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 filter_and_emit_video (_frame);
233 if (_audio_stream && _opt->decode_audio && _film->use_content_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 == _film->audio_channels());
240 Audio (deinterleave_audio (_frame->data[0], data_size));
247 avcodec_get_frame_defaults (_frame);
249 if (_packet.stream_index == _video_stream) {
252 int const r = avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet);
253 if (r >= 0 && frame_finished) {
255 if (r != _packet.size) {
256 _film->log()->log (String::compose ("Used only %1 bytes of %2 in packet", r, _packet.size));
259 /* Where we are in the output, in seconds */
260 double const out_pts_seconds = video_frame() / frames_per_second();
262 /* Where we are in the source, in seconds */
263 double const source_pts_seconds = av_q2d (_format_context->streams[_packet.stream_index]->time_base)
264 * av_frame_get_best_effort_timestamp(_frame);
267 _first_video = source_pts_seconds;
270 /* Difference between where we are and where we should be */
271 double const delta = source_pts_seconds - _first_video.get() - out_pts_seconds;
272 double const one_frame = 1 / frames_per_second();
274 /* Insert frames if required to get out_pts_seconds up to pts_seconds */
275 if (delta > one_frame) {
276 int const extra = rint (delta / one_frame);
277 for (int i = 0; i < extra; ++i) {
278 repeat_last_video ();
281 "Extra frame inserted at %1s; source frame %2, source PTS %3",
282 out_pts_seconds, video_frame(), source_pts_seconds
288 if (delta > -one_frame) {
289 /* Process this frame */
290 filter_and_emit_video (_frame);
292 /* Otherwise we are omitting a frame to keep things right */
293 _film->log()->log (String::compose ("Frame removed at %1s", out_pts_seconds));
297 } else if (_audio_stream && _packet.stream_index == _audio_stream.get().id() && _opt->decode_audio && _film->use_content_audio()) {
300 if (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
302 /* Where we are in the source, in seconds */
303 double const source_pts_seconds = av_q2d (_format_context->streams[_packet.stream_index]->time_base)
304 * av_frame_get_best_effort_timestamp(_frame);
306 /* We only decode audio if we've had our first video packet through, and if it
307 was before this packet. Until then audio is thrown away.
310 if (_first_video && _first_video.get() <= source_pts_seconds) {
313 _first_audio = source_pts_seconds;
315 /* This is our first audio frame, and if we've arrived here we must have had our
316 first video frame. Push some silence to make up any gap between our first
317 video frame and our first audio.
320 /* frames of silence that we must push */
321 int const s = rint ((_first_audio.get() - _first_video.get()) * _audio_stream.get().sample_rate ());
325 "First video at %1, first audio at %2, pushing %3 frames of silence for %4 channels (%5 bytes per sample)",
326 _first_video.get(), _first_audio.get(), s, _audio_stream.get().channels(), bytes_per_audio_sample()
331 shared_ptr<AudioBuffers> audio (new AudioBuffers (_audio_stream.get().channels(), s));
332 audio->make_silent ();
337 int const data_size = av_samples_get_buffer_size (
338 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
341 assert (_audio_codec_context->channels == _film->audio_channels());
342 Audio (deinterleave_audio (_frame->data[0], data_size));
346 } else if (_subtitle_stream && _packet.stream_index == _subtitle_stream.get().id() && _opt->decode_subtitles && _first_video) {
350 if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) && got_subtitle) {
351 /* Sometimes we get an empty AVSubtitle, which is used by some codecs to
352 indicate that the previous subtitle should stop.
354 if (sub.num_rects > 0) {
355 emit_subtitle (shared_ptr<TimedSubtitle> (new TimedSubtitle (sub, _first_video.get())));
357 emit_subtitle (shared_ptr<TimedSubtitle> ());
359 avsubtitle_free (&sub);
363 av_free_packet (&_packet);
367 shared_ptr<AudioBuffers>
368 FFmpegDecoder::deinterleave_audio (uint8_t* data, int size)
370 assert (_film->audio_channels());
371 assert (bytes_per_audio_sample());
373 /* Deinterleave and convert to float */
375 assert ((size % (bytes_per_audio_sample() * _audio_stream.get().channels())) == 0);
377 int const total_samples = size / bytes_per_audio_sample();
378 int const frames = total_samples / _film->audio_channels();
379 shared_ptr<AudioBuffers> audio (new AudioBuffers (_audio_stream.get().channels(), frames));
381 switch (audio_sample_format()) {
382 case AV_SAMPLE_FMT_S16:
384 int16_t* p = (int16_t *) data;
387 for (int i = 0; i < total_samples; ++i) {
388 audio->data(channel)[sample] = float(*p++) / (1 << 15);
391 if (channel == _film->audio_channels()) {
399 case AV_SAMPLE_FMT_S32:
401 int32_t* p = (int32_t *) data;
404 for (int i = 0; i < total_samples; ++i) {
405 audio->data(channel)[sample] = float(*p++) / (1 << 31);
408 if (channel == _film->audio_channels()) {
415 case AV_SAMPLE_FMT_FLTP:
417 float* p = reinterpret_cast<float*> (data);
418 for (int i = 0; i < _film->audio_channels(); ++i) {
419 memcpy (audio->data(i), p, frames * sizeof(float));
433 FFmpegDecoder::frames_per_second () const
435 AVStream* s = _format_context->streams[_video_stream];
437 if (s->avg_frame_rate.num && s->avg_frame_rate.den) {
438 return av_q2d (s->avg_frame_rate);
441 return av_q2d (s->r_frame_rate);
445 FFmpegDecoder::audio_sample_format () const
447 if (_audio_codec_context == 0) {
448 return (AVSampleFormat) 0;
451 return _audio_codec_context->sample_fmt;
455 FFmpegDecoder::native_size () const
457 return Size (_video_codec_context->width, _video_codec_context->height);
461 FFmpegDecoder::pixel_format () const
463 return _video_codec_context->pix_fmt;
467 FFmpegDecoder::time_base_numerator () const
469 return _video_codec_context->time_base.num;
473 FFmpegDecoder::time_base_denominator () const
475 return _video_codec_context->time_base.den;
479 FFmpegDecoder::sample_aspect_ratio_numerator () const
481 return _video_codec_context->sample_aspect_ratio.num;
485 FFmpegDecoder::sample_aspect_ratio_denominator () const
487 return _video_codec_context->sample_aspect_ratio.den;
491 FFmpegDecoder::stream_name (AVStream* s) const
495 AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0);
500 AVDictionaryEntry const * title = av_dict_get (s->metadata, "title", 0, 0);
502 if (!n.str().empty()) {
508 if (n.str().empty()) {
516 FFmpegDecoder::bytes_per_audio_sample () const
518 return av_get_bytes_per_sample (audio_sample_format ());
522 FFmpegDecoder::set_audio_stream (optional<AudioStream> s)
524 AudioDecoder::set_audio_stream (s);
529 FFmpegDecoder::set_subtitle_stream (optional<SubtitleStream> s)
531 VideoDecoder::set_subtitle_stream (s);
536 FFmpegDecoder::filter_and_emit_video (AVFrame* frame)
538 shared_ptr<FilterGraph> graph;
540 list<shared_ptr<FilterGraph> >::iterator i = _filter_graphs.begin();
541 while (i != _filter_graphs.end() && !(*i)->can_process (Size (frame->width, frame->height), (AVPixelFormat) frame->format)) {
545 if (i == _filter_graphs.end ()) {
546 graph.reset (new FilterGraph (_film, this, _opt->apply_crop, Size (frame->width, frame->height), (AVPixelFormat) frame->format));
547 _filter_graphs.push_back (graph);
548 _film->log()->log (String::compose ("New graph for %1x%2, pixel format %3", frame->width, frame->height, frame->format));
553 list<shared_ptr<Image> > images = graph->process (frame);
555 for (list<shared_ptr<Image> >::iterator i = images.begin(); i != images.end(); ++i) {