Merge master.
[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 #include <sndfile.h>
32 extern "C" {
33 #include <libavcodec/avcodec.h>
34 #include <libavformat/avformat.h>
35 }
36 #include "filter.h"
37 #include "exceptions.h"
38 #include "image.h"
39 #include "util.h"
40 #include "log.h"
41 #include "ffmpeg_decoder.h"
42 #include "filter_graph.h"
43 #include "audio_buffers.h"
44 #include "ffmpeg_content.h"
45
46 #include "i18n.h"
47
48 using std::cout;
49 using std::string;
50 using std::vector;
51 using std::stringstream;
52 using std::list;
53 using std::min;
54 using std::pair;
55 using boost::shared_ptr;
56 using boost::optional;
57 using boost::dynamic_pointer_cast;
58 using dcp::Size;
59
60 FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log> log, bool video, bool audio, bool subtitles)
61         : VideoDecoder (c)
62         , AudioDecoder (c)
63         , FFmpeg (c)
64         , _log (log)
65         , _subtitle_codec_context (0)
66         , _subtitle_codec (0)
67         , _decode_video (video)
68         , _decode_audio (audio)
69         , _decode_subtitles (subtitles)
70         , _pts_offset (0)
71 {
72         setup_subtitle ();
73
74         /* Audio and video frame PTS values may not start with 0.  We want
75            to fiddle them so that:
76
77            1.  One of them starts at time 0.
78            2.  The first video PTS value ends up on a frame boundary.
79
80            Then we remove big initial gaps in PTS and we allow our
81            insertion of black frames to work.
82
83            We will do pts_to_use = pts_from_ffmpeg + pts_offset;
84         */
85
86         bool const have_video = video && c->first_video();
87         bool const have_audio = _decode_audio && c->audio_stream () && c->audio_stream()->first_audio;
88
89         /* First, make one of them start at 0 */
90
91         if (have_audio && have_video) {
92                 _pts_offset = - min (c->first_video().get(), c->audio_stream()->first_audio.get());
93         } else if (have_video) {
94                 _pts_offset = - c->first_video().get();
95         } else if (have_audio) {
96                 _pts_offset = - c->audio_stream()->first_audio.get();
97         }
98
99         /* Now adjust both so that the video pts starts on a frame */
100         if (have_video && have_audio) {
101                 ContentTime first_video = c->first_video().get() + _pts_offset;
102                 ContentTime const old_first_video = first_video;
103                 _pts_offset += first_video.round_up (c->video_frame_rate ()) - old_first_video;
104         }
105 }
106
107 FFmpegDecoder::~FFmpegDecoder ()
108 {
109         boost::mutex::scoped_lock lm (_mutex);
110
111         if (_subtitle_codec_context) {
112                 avcodec_close (_subtitle_codec_context);
113         }
114 }
115
116 void
117 FFmpegDecoder::flush ()
118 {
119         /* Get any remaining frames */
120         
121         _packet.data = 0;
122         _packet.size = 0;
123         
124         /* XXX: should we reset _packet.data and size after each *_decode_* call? */
125         
126         if (_decode_video) {
127                 while (decode_video_packet ()) {}
128         }
129         
130         if (_ffmpeg_content->audio_stream() && _decode_audio) {
131                 decode_audio_packet ();
132                 AudioDecoder::flush ();
133         }
134 }
135
136 bool
137 FFmpegDecoder::pass ()
138 {
139         int r = av_read_frame (_format_context, &_packet);
140
141         if (r < 0) {
142                 if (r != AVERROR_EOF) {
143                         /* Maybe we should fail here, but for now we'll just finish off instead */
144                         char buf[256];
145                         av_strerror (r, buf, sizeof(buf));
146                         _log->log (String::compose (N_("error on av_read_frame (%1) (%2)"), buf, r));
147                 }
148
149                 flush ();
150                 return true;
151         }
152
153         int const si = _packet.stream_index;
154         
155         if (si == _video_stream && _decode_video) {
156                 decode_video_packet ();
157         } else if (_ffmpeg_content->audio_stream() && _ffmpeg_content->audio_stream()->uses_index (_format_context, si) && _decode_audio) {
158                 decode_audio_packet ();
159         } else if (_ffmpeg_content->subtitle_stream() && _ffmpeg_content->subtitle_stream()->uses_index (_format_context, si) && _decode_subtitles) {
160                 decode_subtitle_packet ();
161         }
162
163         av_free_packet (&_packet);
164         return false;
165 }
166
167 /** @param data pointer to array of pointers to buffers.
168  *  Only the first buffer will be used for non-planar data, otherwise there will be one per channel.
169  */
170 shared_ptr<AudioBuffers>
171 FFmpegDecoder::deinterleave_audio (uint8_t** data, int size)
172 {
173         assert (_ffmpeg_content->audio_channels());
174         assert (bytes_per_audio_sample());
175
176         /* Deinterleave and convert to float */
177
178         assert ((size % (bytes_per_audio_sample() * _ffmpeg_content->audio_channels())) == 0);
179
180         int const total_samples = size / bytes_per_audio_sample();
181         int const frames = total_samples / _ffmpeg_content->audio_channels();
182         shared_ptr<AudioBuffers> audio (new AudioBuffers (_ffmpeg_content->audio_channels(), frames));
183
184         switch (audio_sample_format()) {
185         case AV_SAMPLE_FMT_U8:
186         {
187                 uint8_t* p = reinterpret_cast<uint8_t *> (data[0]);
188                 int sample = 0;
189                 int channel = 0;
190                 for (int i = 0; i < total_samples; ++i) {
191                         audio->data(channel)[sample] = float(*p++) / (1 << 23);
192
193                         ++channel;
194                         if (channel == _ffmpeg_content->audio_channels()) {
195                                 channel = 0;
196                                 ++sample;
197                         }
198                 }
199         }
200         break;
201         
202         case AV_SAMPLE_FMT_S16:
203         {
204                 int16_t* p = reinterpret_cast<int16_t *> (data[0]);
205                 int sample = 0;
206                 int channel = 0;
207                 for (int i = 0; i < total_samples; ++i) {
208                         audio->data(channel)[sample] = float(*p++) / (1 << 15);
209
210                         ++channel;
211                         if (channel == _ffmpeg_content->audio_channels()) {
212                                 channel = 0;
213                                 ++sample;
214                         }
215                 }
216         }
217         break;
218
219         case AV_SAMPLE_FMT_S16P:
220         {
221                 int16_t** p = reinterpret_cast<int16_t **> (data);
222                 for (int i = 0; i < _ffmpeg_content->audio_channels(); ++i) {
223                         for (int j = 0; j < frames; ++j) {
224                                 audio->data(i)[j] = static_cast<float>(p[i][j]) / (1 << 15);
225                         }
226                 }
227         }
228         break;
229         
230         case AV_SAMPLE_FMT_S32:
231         {
232                 int32_t* p = reinterpret_cast<int32_t *> (data[0]);
233                 int sample = 0;
234                 int channel = 0;
235                 for (int i = 0; i < total_samples; ++i) {
236                         audio->data(channel)[sample] = static_cast<float>(*p++) / (1 << 31);
237
238                         ++channel;
239                         if (channel == _ffmpeg_content->audio_channels()) {
240                                 channel = 0;
241                                 ++sample;
242                         }
243                 }
244         }
245         break;
246
247         case AV_SAMPLE_FMT_FLT:
248         {
249                 float* p = reinterpret_cast<float*> (data[0]);
250                 int sample = 0;
251                 int channel = 0;
252                 for (int i = 0; i < total_samples; ++i) {
253                         audio->data(channel)[sample] = *p++;
254
255                         ++channel;
256                         if (channel == _ffmpeg_content->audio_channels()) {
257                                 channel = 0;
258                                 ++sample;
259                         }
260                 }
261         }
262         break;
263                 
264         case AV_SAMPLE_FMT_FLTP:
265         {
266                 float** p = reinterpret_cast<float**> (data);
267                 for (int i = 0; i < _ffmpeg_content->audio_channels(); ++i) {
268                         memcpy (audio->data(i), p[i], frames * sizeof(float));
269                 }
270         }
271         break;
272
273         default:
274                 throw DecodeError (String::compose (_("Unrecognised audio sample format (%1)"), static_cast<int> (audio_sample_format())));
275         }
276
277         return audio;
278 }
279
280 AVSampleFormat
281 FFmpegDecoder::audio_sample_format () const
282 {
283         if (!_ffmpeg_content->audio_stream()) {
284                 return (AVSampleFormat) 0;
285         }
286         
287         return audio_codec_context()->sample_fmt;
288 }
289
290 int
291 FFmpegDecoder::bytes_per_audio_sample () const
292 {
293         return av_get_bytes_per_sample (audio_sample_format ());
294 }
295
296 int
297 FFmpegDecoder::minimal_run (boost::function<bool (optional<ContentTime>, optional<ContentTime>, int)> finished)
298 {
299         int frames_read = 0;
300         optional<ContentTime> last_video;
301         optional<ContentTime> last_audio;
302
303         while (!finished (last_video, last_audio, frames_read)) {
304                 int r = av_read_frame (_format_context, &_packet);
305                 if (r < 0) {
306                         /* We should flush our decoders here, possibly yielding a few more frames,
307                            but the consequence of having to do that is too hideous to contemplate.
308                            Instead we give up and say that you can't seek too close to the end
309                            of a file.
310                         */
311                         return frames_read;
312                 }
313
314                 ++frames_read;
315
316                 double const time_base = av_q2d (_format_context->streams[_packet.stream_index]->time_base);
317
318                 if (_packet.stream_index == _video_stream) {
319
320                         avcodec_get_frame_defaults (_frame);
321                         
322                         int finished = 0;
323                         r = avcodec_decode_video2 (video_codec_context(), _frame, &finished, &_packet);
324                         if (r >= 0 && finished) {
325                                 last_video = ContentTime::from_seconds (av_frame_get_best_effort_timestamp (_frame) * time_base) + _pts_offset;
326                         }
327
328                 } else if (_ffmpeg_content->audio_stream() && _ffmpeg_content->audio_stream()->uses_index (_format_context, _packet.stream_index)) {
329                         AVPacket copy_packet = _packet;
330                         while (copy_packet.size > 0) {
331
332                                 int finished;
333                                 r = avcodec_decode_audio4 (audio_codec_context(), _frame, &finished, &_packet);
334                                 if (r >= 0 && finished) {
335                                         last_audio = ContentTime::from_seconds (av_frame_get_best_effort_timestamp (_frame) * time_base) + _pts_offset;
336                                 }
337                                         
338                                 copy_packet.data += r;
339                                 copy_packet.size -= r;
340                         }
341                 }
342                 
343                 av_free_packet (&_packet);
344         }
345
346         return frames_read;
347 }
348
349 bool
350 FFmpegDecoder::seek_overrun_finished (ContentTime seek, optional<ContentTime> last_video, optional<ContentTime> last_audio) const
351 {
352         return (last_video && last_video.get() >= seek) || (last_audio && last_audio.get() >= seek);
353 }
354
355 bool
356 FFmpegDecoder::seek_final_finished (int n, int done) const
357 {
358         return n == done;
359 }
360
361 void
362 FFmpegDecoder::seek_and_flush (ContentTime t)
363 {
364         ContentTime const u = t - _pts_offset;
365         int64_t s = u.seconds() / av_q2d (_format_context->streams[_video_stream]->time_base);
366
367         if (_ffmpeg_content->audio_stream ()) {
368                 s = min (
369                         s, int64_t (u.seconds() / av_q2d (_ffmpeg_content->audio_stream()->stream(_format_context)->time_base))
370                         );
371         }
372
373         /* Ridiculous empirical hack */
374         s--;
375         if (s < 0) {
376                 s = 0;
377         }
378
379         av_seek_frame (_format_context, _video_stream, s, 0);
380
381         avcodec_flush_buffers (video_codec_context());
382         if (audio_codec_context ()) {
383                 avcodec_flush_buffers (audio_codec_context ());
384         }
385         if (_subtitle_codec_context) {
386                 avcodec_flush_buffers (_subtitle_codec_context);
387         }
388 }
389
390 void
391 FFmpegDecoder::seek (ContentTime time, bool accurate)
392 {
393         Decoder::seek (time, accurate);
394         if (_decode_audio) {
395                 AudioDecoder::seek (time, accurate);
396         }
397         
398         /* If we are doing an accurate seek, our initial shot will be 200ms (200 being
399            a number plucked from the air) earlier than we want to end up.  The loop below
400            will hopefully then step through to where we want to be.
401         */
402
403         ContentTime pre_roll = accurate ? ContentTime::from_seconds (0.2) : ContentTime (0);
404         ContentTime initial_seek = time - pre_roll;
405         if (initial_seek < ContentTime (0)) {
406                 initial_seek = ContentTime (0);
407         }
408
409         /* Initial seek time in the video stream's timebase */
410
411         seek_and_flush (initial_seek);
412
413         if (!accurate) {
414                 /* That'll do */
415                 return;
416         }
417
418         int const N = minimal_run (boost::bind (&FFmpegDecoder::seek_overrun_finished, this, time, _1, _2));
419
420         seek_and_flush (initial_seek);
421         if (N > 0) {
422                 minimal_run (boost::bind (&FFmpegDecoder::seek_final_finished, this, N - 1, _3));
423         }
424 }
425
426 void
427 FFmpegDecoder::decode_audio_packet ()
428 {
429         /* Audio packets can contain multiple frames, so we may have to call avcodec_decode_audio4
430            several times.
431         */
432         
433         AVPacket copy_packet = _packet;
434         
435         while (copy_packet.size > 0) {
436
437                 int frame_finished;
438                 int const decode_result = avcodec_decode_audio4 (audio_codec_context(), _frame, &frame_finished, &copy_packet);
439
440                 if (decode_result < 0) {
441                         _log->log (String::compose ("avcodec_decode_audio4 failed (%1)", decode_result));
442                         return;
443                 }
444
445                 if (frame_finished) {
446                         ContentTime const ct = ContentTime::from_seconds (
447                                 av_frame_get_best_effort_timestamp (_frame) *
448                                 av_q2d (_ffmpeg_content->audio_stream()->stream (_format_context)->time_base))
449                                 + _pts_offset;
450                         
451                         int const data_size = av_samples_get_buffer_size (
452                                 0, audio_codec_context()->channels, _frame->nb_samples, audio_sample_format (), 1
453                                 );
454
455                         audio (deinterleave_audio (_frame->data, data_size), ct);
456                 }
457                         
458                 copy_packet.data += decode_result;
459                 copy_packet.size -= decode_result;
460         }
461 }
462
463 bool
464 FFmpegDecoder::decode_video_packet ()
465 {
466         int frame_finished;
467         if (avcodec_decode_video2 (video_codec_context(), _frame, &frame_finished, &_packet) < 0 || !frame_finished) {
468                 return false;
469         }
470
471         boost::mutex::scoped_lock lm (_filter_graphs_mutex);
472
473         shared_ptr<FilterGraph> graph;
474         
475         list<shared_ptr<FilterGraph> >::iterator i = _filter_graphs.begin();
476         while (i != _filter_graphs.end() && !(*i)->can_process (dcp::Size (_frame->width, _frame->height), (AVPixelFormat) _frame->format)) {
477                 ++i;
478         }
479
480         if (i == _filter_graphs.end ()) {
481                 graph.reset (new FilterGraph (_ffmpeg_content, dcp::Size (_frame->width, _frame->height), (AVPixelFormat) _frame->format));
482                 _filter_graphs.push_back (graph);
483                 _log->log (String::compose (N_("New graph for %1x%2, pixel format %3"), _frame->width, _frame->height, _frame->format));
484         } else {
485                 graph = *i;
486         }
487
488         list<pair<shared_ptr<Image>, int64_t> > images = graph->process (_frame);
489
490         for (list<pair<shared_ptr<Image>, int64_t> >::iterator i = images.begin(); i != images.end(); ++i) {
491
492                 shared_ptr<Image> image = i->first;
493                 
494                 if (i->second != AV_NOPTS_VALUE) {
495                         video (image, false, ContentTime::from_seconds (i->second * av_q2d (_format_context->streams[_video_stream]->time_base)) + _pts_offset);
496                 } else {
497                         _log->log ("Dropping frame without PTS");
498                 }
499         }
500
501         return true;
502 }
503
504         
505 void
506 FFmpegDecoder::setup_subtitle ()
507 {
508         boost::mutex::scoped_lock lm (_mutex);
509         
510         if (!_ffmpeg_content->subtitle_stream()) {
511                 return;
512         }
513
514         _subtitle_codec_context = _ffmpeg_content->subtitle_stream()->stream(_format_context)->codec;
515         if (_subtitle_codec_context == 0) {
516                 throw DecodeError (N_("could not find subtitle stream"));
517         }
518
519         _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
520
521         if (_subtitle_codec == 0) {
522                 throw DecodeError (N_("could not find subtitle decoder"));
523         }
524         
525         if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
526                 throw DecodeError (N_("could not open subtitle decoder"));
527         }
528 }
529
530 void
531 FFmpegDecoder::decode_subtitle_packet ()
532 {
533         int got_subtitle;
534         AVSubtitle sub;
535         if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) < 0 || !got_subtitle) {
536                 return;
537         }
538
539         /* Sometimes we get an empty AVSubtitle, which is used by some codecs to
540            indicate that the previous subtitle should stop.
541         */
542         if (sub.num_rects <= 0) {
543                 image_subtitle (shared_ptr<Image> (), dcpomatic::Rect<double> (), ContentTime (), ContentTime ());
544                 return;
545         } else if (sub.num_rects > 1) {
546                 throw DecodeError (_("multi-part subtitles not yet supported"));
547         }
548                 
549         /* Subtitle PTS (within the source, not taking into account any of the
550            source that we may have chopped off for the DCP)
551         */
552         ContentTime packet_time = ContentTime::from_seconds (static_cast<double> (sub.pts) / AV_TIME_BASE) + _pts_offset;
553         
554         /* hence start time for this sub */
555         ContentTime const from = packet_time + ContentTime::from_seconds (sub.start_display_time / 1e3);
556         ContentTime const to = packet_time + ContentTime::from_seconds (sub.end_display_time / 1e3);
557
558         AVSubtitleRect const * rect = sub.rects[0];
559
560         if (rect->type != SUBTITLE_BITMAP) {
561                 throw DecodeError (_("non-bitmap subtitles not yet supported"));
562         }
563
564         /* Note RGBA is expressed little-endian, so the first byte in the word is R, second
565            G, third B, fourth A.
566         */
567         shared_ptr<Image> image (new Image (PIX_FMT_RGBA, dcp::Size (rect->w, rect->h), true));
568
569         /* Start of the first line in the subtitle */
570         uint8_t* sub_p = rect->pict.data[0];
571         /* sub_p looks up into a BGRA palette which is here
572            (i.e. first byte B, second G, third R, fourth A)
573         */
574         uint32_t const * palette = (uint32_t *) rect->pict.data[1];
575         /* Start of the output data */
576         uint32_t* out_p = (uint32_t *) image->data()[0];
577
578         for (int y = 0; y < rect->h; ++y) {
579                 uint8_t* sub_line_p = sub_p;
580                 uint32_t* out_line_p = out_p;
581                 for (int x = 0; x < rect->w; ++x) {
582                         uint32_t const p = palette[*sub_line_p++];
583                         *out_line_p++ = ((p & 0xff) << 16) | (p & 0xff00) | ((p & 0xff0000) >> 16) | (p & 0xff000000);
584                 }
585                 sub_p += rect->pict.linesize[0];
586                 out_p += image->stride()[0] / sizeof (uint32_t);
587         }
588
589         dcp::Size const vs = _ffmpeg_content->video_size ();
590
591         image_subtitle (
592                 image,
593                 dcpomatic::Rect<double> (
594                         static_cast<double> (rect->x) / vs.width,
595                         static_cast<double> (rect->y) / vs.height,
596                         static_cast<double> (rect->w) / vs.width,
597                         static_cast<double> (rect->h) / vs.height
598                         ),
599                 from,
600                 to
601                 );
602                           
603         
604         avsubtitle_free (&sub);
605 }