Try to clean up stream handling wrt audio channel counts.
[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         /* Find video, audio and subtitle streams and choose the first of each */
110
111         for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
112                 AVStream* s = _format_context->streams[i];
113                 if (s->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
114                         _video_stream = i;
115                 } else if (s->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
116                         if (_audio_stream == -1) {
117                                 _audio_stream = i;
118                         }
119                         _audio_streams.push_back (AudioStream (stream_name (s), i, s->codec->channels));
120                 } else if (s->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
121                         if (_subtitle_stream == -1) {
122                                 _subtitle_stream = i;
123                         }
124                         _subtitle_streams.push_back (SubtitleStream (stream_name (s), i));
125                 }
126         }
127
128         /* Now override audio and subtitle streams with those from the Film, if it has any */
129
130         if (_fs->audio_stream_index() != -1) {
131                 _audio_stream = _fs->audio_stream_decoder_id ();
132         }
133
134         if (_fs->subtitle_stream_index() != -1) {
135                 _subtitle_stream = _fs->subtitle_stream_decoder_id ();
136         }
137
138         if (_video_stream < 0) {
139                 throw DecodeError ("could not find video stream");
140         }
141
142         _frame = avcodec_alloc_frame ();
143         if (_frame == 0) {
144                 throw DecodeError ("could not allocate frame");
145         }
146 }
147
148 void
149 FFmpegDecoder::setup_video ()
150 {
151         _video_codec_context = _format_context->streams[_video_stream]->codec;
152         _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
153
154         if (_video_codec == 0) {
155                 throw DecodeError ("could not find video decoder");
156         }
157         
158         if (avcodec_open2 (_video_codec_context, _video_codec, 0) < 0) {
159                 throw DecodeError ("could not open video decoder");
160         }
161 }
162
163 void
164 FFmpegDecoder::setup_audio ()
165 {
166         if (_audio_stream < 0) {
167                 return;
168         }
169         
170         _audio_codec_context = _format_context->streams[_audio_stream]->codec;
171         _audio_codec = avcodec_find_decoder (_audio_codec_context->codec_id);
172
173         if (_audio_codec == 0) {
174                 throw DecodeError ("could not find audio decoder");
175         }
176
177         if (avcodec_open2 (_audio_codec_context, _audio_codec, 0) < 0) {
178                 throw DecodeError ("could not open audio decoder");
179         }
180
181         /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
182            so bodge it here.  No idea why we should have to do this.
183         */
184
185         if (_audio_codec_context->channel_layout == 0) {
186                 _audio_codec_context->channel_layout = av_get_default_channel_layout (audio_channels ());
187         }
188 }
189
190 void
191 FFmpegDecoder::setup_subtitle ()
192 {
193         if (_subtitle_stream < 0) {
194                 return;
195         }
196
197         _subtitle_codec_context = _format_context->streams[_subtitle_stream]->codec;
198         _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
199
200         if (_subtitle_codec == 0) {
201                 throw DecodeError ("could not find subtitle decoder");
202         }
203         
204         if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
205                 throw DecodeError ("could not open subtitle decoder");
206         }
207 }
208
209
210 bool
211 FFmpegDecoder::do_pass ()
212 {
213         int r = av_read_frame (_format_context, &_packet);
214         if (r < 0) {
215                 if (r != AVERROR_EOF) {
216                         throw DecodeError ("error on av_read_frame");
217                 }
218                 
219                 /* Get any remaining frames */
220                 
221                 _packet.data = 0;
222                 _packet.size = 0;
223
224                 int frame_finished;
225
226                 while (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
227                         process_video (_frame);
228                 }
229
230                 if (_audio_stream >= 0 && _opt->decode_audio) {
231                         while (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
232                                 int const data_size = av_samples_get_buffer_size (
233                                         0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
234                                         );
235                                 
236                                 assert (_audio_codec_context->channels == _fs->audio_channels());
237                                 process_audio (_frame->data[0], data_size);
238                         }
239                 }
240
241                 return true;
242         }
243
244         if (_packet.stream_index == _video_stream) {
245
246                 int frame_finished;
247                 if (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
248                         process_video (_frame);
249                 }
250
251         } else if (_audio_stream >= 0 && _packet.stream_index == _audio_stream && _opt->decode_audio) {
252                 
253                 avcodec_get_frame_defaults (_frame);
254                 
255                 int frame_finished;
256                 if (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
257                         int const data_size = av_samples_get_buffer_size (
258                                 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
259                                 );
260
261                         assert (_audio_codec_context->channels == _fs->audio_channels());
262                         process_audio (_frame->data[0], data_size);
263                 }
264
265         } else if (_subtitle_stream >= 0 && _packet.stream_index == _subtitle_stream && _opt->decode_subtitles) {
266
267                 int got_subtitle;
268                 AVSubtitle sub;
269                 if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) && got_subtitle) {
270                         /* I'm not entirely sure why, but sometimes we get an AVSubtitle with
271                            no AVSubtitleRects.
272                         */
273                         if (sub.num_rects > 0) {
274                                 process_subtitle (shared_ptr<TimedSubtitle> (new TimedSubtitle (sub)));
275                         }
276                         avsubtitle_free (&sub);
277                 }
278         }
279         
280         av_free_packet (&_packet);
281         return false;
282 }
283
284 int
285 FFmpegDecoder::length_in_frames () const
286 {
287         return (_format_context->duration / AV_TIME_BASE) * frames_per_second ();
288 }
289
290 float
291 FFmpegDecoder::frames_per_second () const
292 {
293         AVStream* s = _format_context->streams[_video_stream];
294
295         if (s->avg_frame_rate.num && s->avg_frame_rate.den) {
296                 return av_q2d (s->avg_frame_rate);
297         }
298
299         return av_q2d (s->r_frame_rate);
300 }
301
302 int
303 FFmpegDecoder::audio_channels () const
304 {
305         if (_audio_codec_context == 0) {
306                 return 0;
307         }
308
309         return _audio_codec_context->channels;
310 }
311
312 int
313 FFmpegDecoder::audio_sample_rate () const
314 {
315         if (_audio_codec_context == 0) {
316                 return 0;
317         }
318         
319         return _audio_codec_context->sample_rate;
320 }
321
322 AVSampleFormat
323 FFmpegDecoder::audio_sample_format () const
324 {
325         if (_audio_codec_context == 0) {
326                 return (AVSampleFormat) 0;
327         }
328         
329         return _audio_codec_context->sample_fmt;
330 }
331
332 int64_t
333 FFmpegDecoder::audio_channel_layout () const
334 {
335         if (_audio_codec_context == 0) {
336                 return 0;
337         }
338         
339         return _audio_codec_context->channel_layout;
340 }
341
342 Size
343 FFmpegDecoder::native_size () const
344 {
345         return Size (_video_codec_context->width, _video_codec_context->height);
346 }
347
348 PixelFormat
349 FFmpegDecoder::pixel_format () const
350 {
351         return _video_codec_context->pix_fmt;
352 }
353
354 int
355 FFmpegDecoder::time_base_numerator () const
356 {
357         return _video_codec_context->time_base.num;
358 }
359
360 int
361 FFmpegDecoder::time_base_denominator () const
362 {
363         return _video_codec_context->time_base.den;
364 }
365
366 int
367 FFmpegDecoder::sample_aspect_ratio_numerator () const
368 {
369         return _video_codec_context->sample_aspect_ratio.num;
370 }
371
372 int
373 FFmpegDecoder::sample_aspect_ratio_denominator () const
374 {
375         return _video_codec_context->sample_aspect_ratio.den;
376 }
377
378 bool
379 FFmpegDecoder::has_subtitles () const
380 {
381         return (_subtitle_stream != -1);
382 }
383
384 vector<AudioStream>
385 FFmpegDecoder::audio_streams () const
386 {
387         return _audio_streams;
388 }
389
390 vector<SubtitleStream>
391 FFmpegDecoder::subtitle_streams () const
392 {
393         return _subtitle_streams;
394 }
395
396 string
397 FFmpegDecoder::stream_name (AVStream* s) const
398 {
399         stringstream n;
400         
401         AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0);
402         if (lang) {
403                 n << lang->value;
404         }
405         
406         AVDictionaryEntry const * title = av_dict_get (s->metadata, "title", 0, 0);
407         if (title) {
408                 if (!n.str().empty()) {
409                         n << " ";
410                 }
411                 n << title->value;
412         }
413
414         if (n.str().empty()) {
415                 n << "unknown";
416         }
417
418         return n.str ();
419 }