Cope with AVSubtitles having no AVSubtitleRects.
[dcpomatic.git] / src / lib / ffmpeg_decoder.cc
1 /*
2     Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
3
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.
8
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.
13
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.
17
18 */
19
20 /** @file  src/ffmpeg_decoder.cc
21  *  @brief A decoder using FFmpeg to decode content.
22  */
23
24 #include <stdexcept>
25 #include <vector>
26 #include <sstream>
27 #include <iomanip>
28 #include <iostream>
29 #include <stdint.h>
30 #include <boost/lexical_cast.hpp>
31 extern "C" {
32 #include <tiffio.h>
33 #include <libavcodec/avcodec.h>
34 #include <libavformat/avformat.h>
35 #include <libswscale/swscale.h>
36 #include <libpostproc/postprocess.h>
37 }
38 #include <sndfile.h>
39 #include "film.h"
40 #include "format.h"
41 #include "transcoder.h"
42 #include "job.h"
43 #include "filter.h"
44 #include "film_state.h"
45 #include "options.h"
46 #include "exceptions.h"
47 #include "image.h"
48 #include "util.h"
49 #include "log.h"
50 #include "ffmpeg_decoder.h"
51 #include "subtitle.h"
52
53 using namespace std;
54 using namespace boost;
55
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)
58         , _format_context (0)
59         , _video_stream (-1)
60         , _audio_stream (-1)
61         , _subtitle_stream (-1)
62         , _frame (0)
63         , _video_codec_context (0)
64         , _video_codec (0)
65         , _audio_codec_context (0)
66         , _audio_codec (0)
67         , _subtitle_codec_context (0)
68         , _subtitle_codec (0)
69 {
70         setup_general ();
71         setup_video ();
72         setup_audio ();
73         setup_subtitle ();
74 }
75
76 FFmpegDecoder::~FFmpegDecoder ()
77 {
78         if (_audio_codec_context) {
79                 avcodec_close (_audio_codec_context);
80         }
81         
82         if (_video_codec_context) {
83                 avcodec_close (_video_codec_context);
84         }
85
86         if (_subtitle_codec_context) {
87                 avcodec_close (_subtitle_codec_context);
88         }
89         
90         av_free (_frame);
91         avformat_close_input (&_format_context);
92 }       
93
94 void
95 FFmpegDecoder::setup_general ()
96 {
97         int r;
98         
99         av_register_all ();
100
101         if ((r = avformat_open_input (&_format_context, _fs->content_path().c_str(), 0, 0)) != 0) {
102                 throw OpenFileError (_fs->content_path ());
103         }
104
105         if (avformat_find_stream_info (_format_context, 0) < 0) {
106                 throw DecodeError ("could not find stream information");
107         }
108
109         for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
110                 if (_format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
111                         _video_stream = i;
112                 } else if (_format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
113                         if (_audio_stream == -1) {
114                                 _audio_stream = i;
115                         }
116                         _audio_streams.push_back (Stream (stream_name (_format_context->streams[i]), i));
117                 } else if (_format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
118                         if (_subtitle_stream == -1) {
119                                 _subtitle_stream = i;
120                         }
121                         _subtitle_streams.push_back (Stream (stream_name (_format_context->streams[i]), i));
122                 }
123         }
124
125         if (_video_stream < 0) {
126                 throw DecodeError ("could not find video stream");
127         }
128
129         _frame = avcodec_alloc_frame ();
130         if (_frame == 0) {
131                 throw DecodeError ("could not allocate frame");
132         }
133 }
134
135 void
136 FFmpegDecoder::setup_video ()
137 {
138         _video_codec_context = _format_context->streams[_video_stream]->codec;
139         _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
140
141         if (_video_codec == 0) {
142                 throw DecodeError ("could not find video decoder");
143         }
144         
145         if (avcodec_open2 (_video_codec_context, _video_codec, 0) < 0) {
146                 throw DecodeError ("could not open video decoder");
147         }
148 }
149
150 void
151 FFmpegDecoder::setup_audio ()
152 {
153         if (_audio_stream < 0) {
154                 return;
155         }
156         
157         _audio_codec_context = _format_context->streams[_audio_stream]->codec;
158         _audio_codec = avcodec_find_decoder (_audio_codec_context->codec_id);
159
160         if (_audio_codec == 0) {
161                 throw DecodeError ("could not find audio decoder");
162         }
163
164         if (avcodec_open2 (_audio_codec_context, _audio_codec, 0) < 0) {
165                 throw DecodeError ("could not open audio decoder");
166         }
167
168         /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
169            so bodge it here.  No idea why we should have to do this.
170         */
171
172         if (_audio_codec_context->channel_layout == 0) {
173                 _audio_codec_context->channel_layout = av_get_default_channel_layout (audio_channels ());
174         }
175 }
176
177 void
178 FFmpegDecoder::setup_subtitle ()
179 {
180         if (_subtitle_stream < 0) {
181                 return;
182         }
183
184         _subtitle_codec_context = _format_context->streams[_subtitle_stream]->codec;
185         _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
186
187         if (_subtitle_codec == 0) {
188                 throw DecodeError ("could not find subtitle decoder");
189         }
190         
191         if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
192                 throw DecodeError ("could not open subtitle decoder");
193         }
194 }
195
196
197 bool
198 FFmpegDecoder::do_pass ()
199 {
200         int r = av_read_frame (_format_context, &_packet);
201         if (r < 0) {
202                 if (r != AVERROR_EOF) {
203                         throw DecodeError ("error on av_read_frame");
204                 }
205                 
206                 /* Get any remaining frames */
207                 
208                 _packet.data = 0;
209                 _packet.size = 0;
210
211                 int frame_finished;
212
213                 while (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
214                         process_video (_frame);
215                 }
216
217                 if (_audio_stream >= 0 && _opt->decode_audio) {
218                         while (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
219                                 int const data_size = av_samples_get_buffer_size (
220                                         0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
221                                         );
222                                 
223                                 assert (_audio_codec_context->channels == _fs->audio_channels());
224                                 process_audio (_frame->data[0], data_size);
225                         }
226                 }
227
228                 return true;
229         }
230
231         if (_packet.stream_index == _video_stream) {
232
233                 int frame_finished;
234                 if (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
235                         process_video (_frame);
236                 }
237
238         } else if (_audio_stream >= 0 && _packet.stream_index == _audio_stream && _opt->decode_audio) {
239                 
240                 avcodec_get_frame_defaults (_frame);
241                 
242                 int frame_finished;
243                 if (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
244                         int const data_size = av_samples_get_buffer_size (
245                                 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
246                                 );
247
248                         assert (_audio_codec_context->channels == _fs->audio_channels());
249                         process_audio (_frame->data[0], data_size);
250                 }
251
252         } else if (_subtitle_stream >= 0 && _packet.stream_index == _subtitle_stream && _opt->decode_subtitles) {
253
254                 int got_subtitle;
255                 AVSubtitle sub;
256                 if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) && got_subtitle) {
257                         /* I'm not entirely sure why, but sometimes we get an AVSubtitle with
258                            no AVSubtitleRects.
259                         */
260                         if (sub.num_rects > 0) {
261                                 process_subtitle (shared_ptr<TimedSubtitle> (new TimedSubtitle (sub)));
262                         }
263                         avsubtitle_free (&sub);
264                 }
265         }
266         
267         av_free_packet (&_packet);
268         return false;
269 }
270
271 int
272 FFmpegDecoder::length_in_frames () const
273 {
274         return (_format_context->duration / AV_TIME_BASE) * frames_per_second ();
275 }
276
277 float
278 FFmpegDecoder::frames_per_second () const
279 {
280         AVStream* s = _format_context->streams[_video_stream];
281
282         if (s->avg_frame_rate.num && s->avg_frame_rate.den) {
283                 return av_q2d (s->avg_frame_rate);
284         }
285
286         return av_q2d (s->r_frame_rate);
287 }
288
289 int
290 FFmpegDecoder::audio_channels () const
291 {
292         if (_audio_codec_context == 0) {
293                 return 0;
294         }
295
296         return _audio_codec_context->channels;
297 }
298
299 int
300 FFmpegDecoder::audio_sample_rate () const
301 {
302         if (_audio_codec_context == 0) {
303                 return 0;
304         }
305         
306         return _audio_codec_context->sample_rate;
307 }
308
309 AVSampleFormat
310 FFmpegDecoder::audio_sample_format () const
311 {
312         if (_audio_codec_context == 0) {
313                 return (AVSampleFormat) 0;
314         }
315         
316         return _audio_codec_context->sample_fmt;
317 }
318
319 int64_t
320 FFmpegDecoder::audio_channel_layout () const
321 {
322         if (_audio_codec_context == 0) {
323                 return 0;
324         }
325         
326         return _audio_codec_context->channel_layout;
327 }
328
329 Size
330 FFmpegDecoder::native_size () const
331 {
332         return Size (_video_codec_context->width, _video_codec_context->height);
333 }
334
335 PixelFormat
336 FFmpegDecoder::pixel_format () const
337 {
338         return _video_codec_context->pix_fmt;
339 }
340
341 int
342 FFmpegDecoder::time_base_numerator () const
343 {
344         return _video_codec_context->time_base.num;
345 }
346
347 int
348 FFmpegDecoder::time_base_denominator () const
349 {
350         return _video_codec_context->time_base.den;
351 }
352
353 int
354 FFmpegDecoder::sample_aspect_ratio_numerator () const
355 {
356         return _video_codec_context->sample_aspect_ratio.num;
357 }
358
359 int
360 FFmpegDecoder::sample_aspect_ratio_denominator () const
361 {
362         return _video_codec_context->sample_aspect_ratio.den;
363 }
364
365 bool
366 FFmpegDecoder::has_subtitles () const
367 {
368         return (_subtitle_stream != -1);
369 }
370
371 vector<Stream>
372 FFmpegDecoder::audio_streams () const
373 {
374         return _audio_streams;
375 }
376
377 vector<Stream>
378 FFmpegDecoder::subtitle_streams () const
379 {
380         return _subtitle_streams;
381 }
382
383 void
384 FFmpegDecoder::set_audio_stream (int s)
385 {
386         _audio_stream = s;
387         setup_audio ();
388 }
389
390 void
391 FFmpegDecoder::set_subtitle_stream (int s)
392 {
393         _subtitle_stream = s;
394         setup_subtitle ();
395 }
396
397 string
398 FFmpegDecoder::stream_name (AVStream* s) const
399 {
400         stringstream n;
401         
402         AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0);
403         if (lang) {
404                 n << lang->value;
405         }
406         
407         AVDictionaryEntry const * title = av_dict_get (s->metadata, "title", 0, 0);
408         if (title) {
409                 if (!n.str().empty()) {
410                         n << " ";
411                 }
412                 n << title->value;
413         }
414
415         if (n.str().empty()) {
416                 n << "unknown";
417         }
418
419         return n.str ();
420 }