Basics of FFmpeg examiner works.
[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 "film.h"
37 #include "filter.h"
38 #include "exceptions.h"
39 #include "image.h"
40 #include "util.h"
41 #include "log.h"
42 #include "ffmpeg_decoder.h"
43 #include "filter_graph.h"
44 #include "subtitle.h"
45 #include "audio_buffers.h"
46
47 #include "i18n.h"
48
49 using std::cout;
50 using std::string;
51 using std::vector;
52 using std::stringstream;
53 using std::list;
54 using std::min;
55 using boost::shared_ptr;
56 using boost::optional;
57 using boost::dynamic_pointer_cast;
58 using libdcp::Size;
59
60 FFmpegDecoder::FFmpegDecoder (shared_ptr<const Film> f, shared_ptr<const FFmpegContent> c, bool video, bool audio)
61         : Decoder (f)
62         , VideoDecoder (f, c)
63         , AudioDecoder (f, c)
64         , FFmpeg (c)
65         , _subtitle_codec_context (0)
66         , _subtitle_codec (0)
67         , _decode_video (video)
68         , _decode_audio (audio)
69 {
70         setup_subtitle ();
71 }
72
73 FFmpegDecoder::~FFmpegDecoder ()
74 {
75         if (_subtitle_codec_context) {
76                 avcodec_close (_subtitle_codec_context);
77         }
78 }       
79
80 void
81 FFmpegDecoder::pass ()
82 {
83         int r = av_read_frame (_format_context, &_packet);
84
85         if (r < 0) {
86                 if (r != AVERROR_EOF) {
87                         /* Maybe we should fail here, but for now we'll just finish off instead */
88                         char buf[256];
89                         av_strerror (r, buf, sizeof(buf));
90                         shared_ptr<const Film> film = _film.lock ();
91                         assert (film);
92                         film->log()->log (String::compose (N_("error on av_read_frame (%1) (%2)"), buf, r));
93                 }
94
95                 /* Get any remaining frames */
96                 
97                 _packet.data = 0;
98                 _packet.size = 0;
99                 
100                 /* XXX: should we reset _packet.data and size after each *_decode_* call? */
101                 
102                 if (_decode_video) {
103                         while (decode_video_packet ());
104                 }
105
106                 if (_ffmpeg_content->audio_stream() && _decode_audio) {
107                         decode_audio_packet ();
108                 }
109
110                 /* Stop us being asked for any more data */
111                 _next_video = _next_audio = _ffmpeg_content->length ();
112                 return;
113         }
114
115         avcodec_get_frame_defaults (_frame);
116
117         if (_packet.stream_index == _video_stream && _decode_video) {
118                 decode_video_packet ();
119         } else if (_ffmpeg_content->audio_stream() && _packet.stream_index == _ffmpeg_content->audio_stream()->id && _decode_audio) {
120                 decode_audio_packet ();
121         } else if (_ffmpeg_content->subtitle_stream() && _packet.stream_index == _ffmpeg_content->subtitle_stream()->id) {
122
123                 int got_subtitle;
124                 AVSubtitle sub;
125                 if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) && got_subtitle) {
126                         /* Sometimes we get an empty AVSubtitle, which is used by some codecs to
127                            indicate that the previous subtitle should stop.
128                         */
129                         if (sub.num_rects > 0) {
130                                 shared_ptr<TimedSubtitle> ts;
131                                 try {
132                                         subtitle (shared_ptr<TimedSubtitle> (new TimedSubtitle (sub)));
133                                 } catch (...) {
134                                         /* some problem with the subtitle; we probably didn't understand it */
135                                 }
136                         } else {
137                                 subtitle (shared_ptr<TimedSubtitle> ());
138                         }
139                         avsubtitle_free (&sub);
140                 }
141         }
142
143         av_free_packet (&_packet);
144 }
145
146 /** @param data pointer to array of pointers to buffers.
147  *  Only the first buffer will be used for non-planar data, otherwise there will be one per channel.
148  */
149 shared_ptr<AudioBuffers>
150 FFmpegDecoder::deinterleave_audio (uint8_t** data, int size)
151 {
152         assert (_ffmpeg_content->audio_channels());
153         assert (bytes_per_audio_sample());
154
155         /* Deinterleave and convert to float */
156
157         assert ((size % (bytes_per_audio_sample() * _ffmpeg_content->audio_channels())) == 0);
158
159         int const total_samples = size / bytes_per_audio_sample();
160         int const frames = total_samples / _ffmpeg_content->audio_channels();
161         shared_ptr<AudioBuffers> audio (new AudioBuffers (_ffmpeg_content->audio_channels(), frames));
162
163         switch (audio_sample_format()) {
164         case AV_SAMPLE_FMT_S16:
165         {
166                 int16_t* p = reinterpret_cast<int16_t *> (data[0]);
167                 int sample = 0;
168                 int channel = 0;
169                 for (int i = 0; i < total_samples; ++i) {
170                         audio->data(channel)[sample] = float(*p++) / (1 << 15);
171
172                         ++channel;
173                         if (channel == _ffmpeg_content->audio_channels()) {
174                                 channel = 0;
175                                 ++sample;
176                         }
177                 }
178         }
179         break;
180
181         case AV_SAMPLE_FMT_S16P:
182         {
183                 int16_t** p = reinterpret_cast<int16_t **> (data);
184                 for (int i = 0; i < _ffmpeg_content->audio_channels(); ++i) {
185                         for (int j = 0; j < frames; ++j) {
186                                 audio->data(i)[j] = static_cast<float>(p[i][j]) / (1 << 15);
187                         }
188                 }
189         }
190         break;
191         
192         case AV_SAMPLE_FMT_S32:
193         {
194                 int32_t* p = reinterpret_cast<int32_t *> (data[0]);
195                 int sample = 0;
196                 int channel = 0;
197                 for (int i = 0; i < total_samples; ++i) {
198                         audio->data(channel)[sample] = static_cast<float>(*p++) / (1 << 31);
199
200                         ++channel;
201                         if (channel == _ffmpeg_content->audio_channels()) {
202                                 channel = 0;
203                                 ++sample;
204                         }
205                 }
206         }
207         break;
208
209         case AV_SAMPLE_FMT_FLT:
210         {
211                 float* p = reinterpret_cast<float*> (data[0]);
212                 int sample = 0;
213                 int channel = 0;
214                 for (int i = 0; i < total_samples; ++i) {
215                         audio->data(channel)[sample] = *p++;
216
217                         ++channel;
218                         if (channel == _ffmpeg_content->audio_channels()) {
219                                 channel = 0;
220                                 ++sample;
221                         }
222                 }
223         }
224         break;
225                 
226         case AV_SAMPLE_FMT_FLTP:
227         {
228                 float** p = reinterpret_cast<float**> (data);
229                 for (int i = 0; i < _ffmpeg_content->audio_channels(); ++i) {
230                         memcpy (audio->data(i), p[i], frames * sizeof(float));
231                 }
232         }
233         break;
234
235         default:
236                 throw DecodeError (String::compose (_("Unrecognised audio sample format (%1)"), static_cast<int> (audio_sample_format())));
237         }
238
239         return audio;
240 }
241
242 AVSampleFormat
243 FFmpegDecoder::audio_sample_format () const
244 {
245         if (!_ffmpeg_content->audio_stream()) {
246                 return (AVSampleFormat) 0;
247         }
248         
249         return audio_codec_context()->sample_fmt;
250 }
251
252 int
253 FFmpegDecoder::bytes_per_audio_sample () const
254 {
255         return av_get_bytes_per_sample (audio_sample_format ());
256 }
257
258 void
259 FFmpegDecoder::seek (Time t)
260 {
261         do_seek (t, false, false);
262         VideoDecoder::seek (t);
263 }
264
265 void
266 FFmpegDecoder::seek_back ()
267 {
268         if (position() < (2.5 * TIME_HZ / _ffmpeg_content->video_frame_rate())) {
269                 return;
270         }
271         
272         do_seek (position() - 2.5 * TIME_HZ / _ffmpeg_content->video_frame_rate(), true, true);
273         VideoDecoder::seek_back ();
274 }
275
276 void
277 FFmpegDecoder::seek_forward ()
278 {
279         if (position() >= (_ffmpeg_content->length() - 0.5 * TIME_HZ / _ffmpeg_content->video_frame_rate())) {
280                 return;
281         }
282         
283         do_seek (position() - 0.5 * TIME_HZ / _ffmpeg_content->video_frame_rate(), true, true);
284         VideoDecoder::seek_forward ();
285 }
286
287 void
288 FFmpegDecoder::do_seek (Time t, bool backwards, bool accurate)
289 {
290         int64_t const vt = t / (av_q2d (_format_context->streams[_video_stream]->time_base) * TIME_HZ);
291         av_seek_frame (_format_context, _video_stream, vt, backwards ? AVSEEK_FLAG_BACKWARD : 0);
292
293         avcodec_flush_buffers (video_codec_context());
294         if (_subtitle_codec_context) {
295                 avcodec_flush_buffers (_subtitle_codec_context);
296         }
297
298         if (accurate) {
299                 while (1) {
300                         int r = av_read_frame (_format_context, &_packet);
301                         if (r < 0) {
302                                 return;
303                         }
304                         
305                         avcodec_get_frame_defaults (_frame);
306                         
307                         if (_packet.stream_index == _video_stream) {
308                                 int finished = 0;
309                                 int const r = avcodec_decode_video2 (video_codec_context(), _frame, &finished, &_packet);
310                                 if (r >= 0 && finished) {
311                                         int64_t const bet = av_frame_get_best_effort_timestamp (_frame);
312                                         if (bet > vt) {
313                                                 break;
314                                         }
315                                 }
316                         }
317                         
318                         av_free_packet (&_packet);
319                 }
320         }
321
322         return;
323 }
324
325 void
326 FFmpegDecoder::decode_audio_packet ()
327 {
328         /* Audio packets can contain multiple frames, so we may have to call avcodec_decode_audio4
329            several times.
330         */
331         
332         AVPacket copy_packet = _packet;
333
334         while (copy_packet.size > 0) {
335
336                 int frame_finished;
337                 int const decode_result = avcodec_decode_audio4 (audio_codec_context(), _frame, &frame_finished, &copy_packet);
338                 if (decode_result >= 0) {
339                         if (frame_finished) {
340                         
341                                 /* Where we are in the source, in seconds */
342                                 double const source_pts_seconds = av_q2d (_format_context->streams[copy_packet.stream_index]->time_base)
343                                         * av_frame_get_best_effort_timestamp(_frame);
344                                 
345                                 int const data_size = av_samples_get_buffer_size (
346                                         0, audio_codec_context()->channels, _frame->nb_samples, audio_sample_format (), 1
347                                         );
348                                 
349                                 assert (audio_codec_context()->channels == _ffmpeg_content->audio_channels());
350                                 audio (deinterleave_audio (_frame->data, data_size), source_pts_seconds * TIME_HZ);
351                         }
352                         
353                         copy_packet.data += decode_result;
354                         copy_packet.size -= decode_result;
355                 }
356         }
357 }
358
359 bool
360 FFmpegDecoder::decode_video_packet ()
361 {
362         int frame_finished;
363         if (avcodec_decode_video2 (video_codec_context(), _frame, &frame_finished, &_packet) < 0 || !frame_finished) {
364                 return false;
365         }
366                 
367         boost::mutex::scoped_lock lm (_filter_graphs_mutex);
368
369         shared_ptr<FilterGraph> graph;
370         
371         list<shared_ptr<FilterGraph> >::iterator i = _filter_graphs.begin();
372         while (i != _filter_graphs.end() && !(*i)->can_process (libdcp::Size (_frame->width, _frame->height), (AVPixelFormat) _frame->format)) {
373                 ++i;
374         }
375
376         if (i == _filter_graphs.end ()) {
377                 shared_ptr<const Film> film = _film.lock ();
378                 assert (film);
379
380                 graph.reset (new FilterGraph (_ffmpeg_content, libdcp::Size (_frame->width, _frame->height), (AVPixelFormat) _frame->format));
381                 _filter_graphs.push_back (graph);
382
383                 film->log()->log (String::compose (N_("New graph for %1x%2, pixel format %3"), _frame->width, _frame->height, _frame->format));
384         } else {
385                 graph = *i;
386         }
387
388         list<shared_ptr<Image> > images = graph->process (_frame);
389
390         string post_process = Filter::ffmpeg_strings (_ffmpeg_content->filters()).second;
391         
392         for (list<shared_ptr<Image> >::iterator i = images.begin(); i != images.end(); ++i) {
393
394                 shared_ptr<Image> image = *i;
395                 if (!post_process.empty ()) {
396                         image = image->post_process (post_process, true);
397                 }
398                 
399                 int64_t const bet = av_frame_get_best_effort_timestamp (_frame);
400                 if (bet != AV_NOPTS_VALUE) {
401                         /* XXX: may need to insert extra frames / remove frames here ...
402                            (as per old Matcher)
403                         */
404                         Time const t = bet * av_q2d (_format_context->streams[_video_stream]->time_base) * TIME_HZ;
405                         video (image, false, t);
406                 } else {
407                         shared_ptr<const Film> film = _film.lock ();
408                         assert (film);
409                         film->log()->log ("Dropping frame without PTS");
410                 }
411         }
412
413         return true;
414 }
415
416 Time
417 FFmpegDecoder::position () const
418 {
419         if (_decode_video && _decode_audio && _ffmpeg_content->audio_stream()) {
420                 return min (_next_video, _next_audio);
421         }
422
423         if (_decode_audio && _ffmpeg_content->audio_stream()) {
424                 return _next_audio;
425         }
426
427         return _next_video;
428 }
429
430 bool
431 FFmpegDecoder::done () const
432 {
433         bool const ad = !_decode_audio || !_ffmpeg_content->audio_stream() || audio_done();
434         bool const vd = !_decode_video || video_done();
435         return ad && vd;
436 }
437         
438 void
439 FFmpegDecoder::setup_subtitle ()
440 {
441         boost::mutex::scoped_lock lm (_mutex);
442         
443         if (!_ffmpeg_content->subtitle_stream() || _ffmpeg_content->subtitle_stream()->id >= int (_format_context->nb_streams)) {
444                 return;
445         }
446
447         _subtitle_codec_context = _format_context->streams[_ffmpeg_content->subtitle_stream()->id]->codec;
448         _subtitle_codec = avcodec_find_decoder (_subtitle_codec_context->codec_id);
449
450         if (_subtitle_codec == 0) {
451                 throw DecodeError (_("could not find subtitle decoder"));
452         }
453         
454         if (avcodec_open2 (_subtitle_codec_context, _subtitle_codec, 0) < 0) {
455                 throw DecodeError (N_("could not open subtitle decoder"));
456         }
457 }