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"
53 using namespace boost;
55 FFmpegDecoder::FFmpegDecoder (boost::shared_ptr<const FilmState> s, boost::shared_ptr<const Options> o, Job* j, Log* l, bool minimal, bool ignore_length)
56 : Decoder (s, o, j, l, minimal, ignore_length)
60 , _subtitle_stream (-1)
62 , _video_codec_context (0)
64 , _audio_codec_context (0)
66 , _subtitle_codec_context (0)
68 , _have_subtitle (false)
76 FFmpegDecoder::~FFmpegDecoder ()
78 if (_audio_codec_context) {
79 avcodec_close (_audio_codec_context);
82 if (_video_codec_context) {
83 avcodec_close (_video_codec_context);
87 avsubtitle_free (&_subtitle);
90 if (_subtitle_codec_context) {
91 avcodec_close (_subtitle_codec_context);
95 avformat_close_input (&_format_context);
99 FFmpegDecoder::setup_general ()
105 if ((r = avformat_open_input (&_format_context, _fs->content_path().c_str(), 0, 0)) != 0) {
106 throw OpenFileError (_fs->content_path ());
109 if (avformat_find_stream_info (_format_context, 0) < 0) {
110 throw DecodeError ("could not find stream information");
113 for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
114 if (_format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
116 } else if (_format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
118 } else if (_format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
119 _subtitle_stream = i;
123 if (_video_stream < 0) {
124 throw DecodeError ("could not find video stream");
127 _frame = avcodec_alloc_frame ();
129 throw DecodeError ("could not allocate frame");
134 FFmpegDecoder::setup_video ()
136 _video_codec_context = _format_context->streams[_video_stream]->codec;
137 _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
139 if (_video_codec == 0) {
140 throw DecodeError ("could not find video decoder");
143 if (avcodec_open2 (_video_codec_context, _video_codec, 0) < 0) {
144 throw DecodeError ("could not open video decoder");
149 FFmpegDecoder::setup_audio ()
151 if (_audio_stream < 0) {
155 _audio_codec_context = _format_context->streams[_audio_stream]->codec;
156 _audio_codec = avcodec_find_decoder (_audio_codec_context->codec_id);
158 if (_audio_codec == 0) {
159 throw DecodeError ("could not find audio decoder");
162 if (avcodec_open2 (_audio_codec_context, _audio_codec, 0) < 0) {
163 throw DecodeError ("could not open audio decoder");
166 /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
167 so bodge it here. No idea why we should have to do this.
170 if (_audio_codec_context->channel_layout == 0) {
171 _audio_codec_context->channel_layout = av_get_default_channel_layout (audio_channels ());
176 FFmpegDecoder::setup_subtitle ()
178 if (_subtitle_stream < 0) {
182 _subtitle_codec_context = _format_context->streams[_subtitle_stream]->codec;
183 _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
185 if (_subtitle_codec == 0) {
186 throw DecodeError ("could not find subtitle decoder");
189 if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
190 throw DecodeError ("could not open subtitle decoder");
196 FFmpegDecoder::do_pass ()
198 int r = av_read_frame (_format_context, &_packet);
200 if (r != AVERROR_EOF) {
201 throw DecodeError ("error on av_read_frame");
204 /* Get any remaining frames */
211 while (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
212 process_video (_frame);
215 if (_audio_stream >= 0 && _opt->decode_audio) {
216 while (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
217 int const data_size = av_samples_get_buffer_size (
218 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
221 assert (_audio_codec_context->channels == _fs->audio_channels);
222 process_audio (_frame->data[0], data_size);
229 if (_packet.stream_index == _video_stream) {
232 if (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
233 process_video (_frame);
236 } else if (_audio_stream >= 0 && _packet.stream_index == _audio_stream && _opt->decode_audio) {
238 avcodec_get_frame_defaults (_frame);
241 if (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
242 int const data_size = av_samples_get_buffer_size (
243 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
246 assert (_audio_codec_context->channels == _fs->audio_channels);
247 process_audio (_frame->data[0], data_size);
250 } else if (_subtitle_stream >= 0 && _packet.stream_index == _subtitle_stream && _fs->with_subtitles) {
252 if (_have_subtitle) {
253 avsubtitle_free (&_subtitle);
254 _have_subtitle = false;
258 if (avcodec_decode_subtitle2 (_subtitle_codec_context, &_subtitle, &got_subtitle, &_packet) && got_subtitle) {
259 _have_subtitle = true;
263 av_free_packet (&_packet);
268 FFmpegDecoder::length_in_frames () const
270 return (_format_context->duration / AV_TIME_BASE) * frames_per_second ();
274 FFmpegDecoder::frames_per_second () const
276 AVStream* s = _format_context->streams[_video_stream];
278 if (s->avg_frame_rate.num && s->avg_frame_rate.den) {
279 return av_q2d (s->avg_frame_rate);
282 return av_q2d (s->r_frame_rate);
286 FFmpegDecoder::audio_channels () const
288 if (_audio_codec_context == 0) {
292 return _audio_codec_context->channels;
296 FFmpegDecoder::audio_sample_rate () const
298 if (_audio_codec_context == 0) {
302 return _audio_codec_context->sample_rate;
306 FFmpegDecoder::audio_sample_format () const
308 if (_audio_codec_context == 0) {
309 return (AVSampleFormat) 0;
312 return _audio_codec_context->sample_fmt;
316 FFmpegDecoder::audio_channel_layout () const
318 if (_audio_codec_context == 0) {
322 return _audio_codec_context->channel_layout;
326 FFmpegDecoder::native_size () const
328 return Size (_video_codec_context->width, _video_codec_context->height);
332 FFmpegDecoder::pixel_format () const
334 return _video_codec_context->pix_fmt;
338 FFmpegDecoder::time_base_numerator () const
340 return _video_codec_context->time_base.num;
344 FFmpegDecoder::time_base_denominator () const
346 return _video_codec_context->time_base.den;
350 FFmpegDecoder::sample_aspect_ratio_numerator () const
352 return _video_codec_context->sample_aspect_ratio.num;
356 FFmpegDecoder::sample_aspect_ratio_denominator () const
358 return _video_codec_context->sample_aspect_ratio.den;
362 FFmpegDecoder::overlay (shared_ptr<Image> image) const
364 if (!_have_subtitle) {
368 /* subtitle PTS in seconds */
369 float const packet_time = (_subtitle.pts / AV_TIME_BASE) + float (_subtitle.pts % AV_TIME_BASE) / 1e6;
370 /* hence start time for this sub */
371 float const from = packet_time + (float (_subtitle.start_display_time) / 1e3);
372 float const to = packet_time + (float (_subtitle.end_display_time) / 1e3);
374 float const video_frame_time = float (last_video_frame ()) / rint (_fs->frames_per_second);
376 if (from > video_frame_time || video_frame_time < to) {
380 for (unsigned int i = 0; i < _subtitle.num_rects; ++i) {
381 AVSubtitleRect* rect = _subtitle.rects[i];
382 if (rect->type != SUBTITLE_BITMAP) {
383 throw DecodeError ("non-bitmap subtitles not yet supported");
386 /* XXX: all this assumes YUV420 in image */
388 assert (rect->pict.data[0]);
390 /* Start of the first line in the target image */
391 uint8_t* frame_y_p = image->data()[0] + rect->y * image->line_size()[0];
392 uint8_t* frame_u_p = image->data()[1] + (rect->y / 2) * image->line_size()[1];
393 uint8_t* frame_v_p = image->data()[2] + (rect->y / 2) * image->line_size()[2];
395 int const hlim = min (rect->y + rect->h, image->size().height) - rect->y;
397 /* Start of the first line in the subtitle */
398 uint8_t* sub_p = rect->pict.data[0];
399 /* sub_p looks up into a RGB palette which is here */
400 uint32_t const * palette = (uint32_t *) rect->pict.data[1];
402 for (int sub_y = 0; sub_y < hlim; ++sub_y) {
403 /* Pointers to the start of this line */
404 uint8_t* sub_line_p = sub_p;
405 uint8_t* frame_line_y_p = frame_y_p + rect->x;
406 uint8_t* frame_line_u_p = frame_u_p + (rect->x / 2);
407 uint8_t* frame_line_v_p = frame_v_p + (rect->x / 2);
409 /* U and V are subsampled */
412 int subsample_step = 0;
414 for (int sub_x = 0; sub_x < rect->w; ++sub_x) {
416 /* RGB value for this subtitle pixel */
417 uint32_t const val = palette[*sub_line_p++];
419 int const red = (val & 0xff);
420 int const green = (val & 0xff00) >> 8;
421 int const blue = (val & 0xff0000) >> 16;
422 float const alpha = ((val & 0xff000000) >> 24) / 255.0;
425 int const cy = *frame_line_y_p;
426 *frame_line_y_p++ = int (cy * (1 - alpha)) + int (RGB_TO_Y_CCIR (red, green, blue) * alpha);
428 /* Store up U and V */
429 next_u |= ((RGB_TO_U_CCIR (red, green, blue, 0) & 0xf0) >> 4) << (4 * subsample_step);
430 next_v |= ((RGB_TO_V_CCIR (red, green, blue, 0) & 0xf0) >> 4) << (4 * subsample_step);
432 if (subsample_step == 1 && (sub_y % 2) == 0) {
433 int const cu = *frame_line_u_p;
434 int const cv = *frame_line_v_p;
437 int (((cu & 0x0f) * (1 - alpha) + (next_u & 0x0f) * alpha)) |
438 int (((cu & 0xf0) * (1 - alpha) + (next_u & 0xf0) * alpha));
441 int (((cv & 0x0f) * (1 - alpha) + (next_v & 0x0f) * alpha)) |
442 int (((cv & 0xf0) * (1 - alpha) + (next_v & 0xf0) * alpha));
447 subsample_step = (subsample_step + 1) % 2;
450 sub_p += rect->pict.linesize[0];
451 frame_y_p += image->line_size()[0];
452 if ((sub_y % 2) == 0) {
453 frame_u_p += image->line_size()[1];
454 frame_v_p += image->line_size()[2];
461 FFmpegDecoder::has_subtitles () const
463 return (_subtitle_stream != -1);