Merge branch 'master' of /home/carl/git/dvdomatic
[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 extern "C" {
31 #include <tiffio.h>
32 #include <libavcodec/avcodec.h>
33 #include <libavformat/avformat.h>
34 #include <libswscale/swscale.h>
35 #include <libpostproc/postprocess.h>
36 }
37 #include <sndfile.h>
38 #include "film.h"
39 #include "format.h"
40 #include "transcoder.h"
41 #include "job.h"
42 #include "filter.h"
43 #include "film_state.h"
44 #include "options.h"
45 #include "exceptions.h"
46 #include "image.h"
47 #include "util.h"
48 #include "log.h"
49 #include "ffmpeg_decoder.h"
50
51 using namespace std;
52 using namespace boost;
53
54 FFmpegDecoder::FFmpegDecoder (boost::shared_ptr<const FilmState> s, boost::shared_ptr<const Options> o, Job* j, Log* l, bool minimal, bool ignore_length)
55         : Decoder (s, o, j, l, minimal, ignore_length)
56         , _format_context (0)
57         , _video_stream (-1)
58         , _audio_stream (-1)
59         , _frame (0)
60         , _video_codec_context (0)
61         , _video_codec (0)
62         , _audio_codec_context (0)
63         , _audio_codec (0)
64 {
65         setup_general ();
66         setup_video ();
67         setup_audio ();
68 }
69
70 FFmpegDecoder::~FFmpegDecoder ()
71 {
72         if (_audio_codec_context) {
73                 avcodec_close (_audio_codec_context);
74         }
75         
76         if (_video_codec_context) {
77                 avcodec_close (_video_codec_context);
78         }
79         
80         av_free (_frame);
81         avformat_close_input (&_format_context);
82 }       
83
84 void
85 FFmpegDecoder::setup_general ()
86 {
87         int r;
88         
89         av_register_all ();
90
91         if ((r = avformat_open_input (&_format_context, _fs->content_path().c_str(), 0, 0)) != 0) {
92                 throw OpenFileError (_fs->content_path ());
93         }
94
95         if (avformat_find_stream_info (_format_context, 0) < 0) {
96                 throw DecodeError ("could not find stream information");
97         }
98
99         for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
100                 if (_format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
101                         _video_stream = i;
102                 } else if (_format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
103                         _audio_stream = i;
104                 }
105         }
106
107         if (_video_stream < 0) {
108                 throw DecodeError ("could not find video stream");
109         }
110
111         _frame = avcodec_alloc_frame ();
112         if (_frame == 0) {
113                 throw DecodeError ("could not allocate frame");
114         }
115 }
116
117 void
118 FFmpegDecoder::setup_video ()
119 {
120         _video_codec_context = _format_context->streams[_video_stream]->codec;
121         _video_codec = avcodec_find_decoder (_video_codec_context->codec_id);
122
123         if (_video_codec == 0) {
124                 throw DecodeError ("could not find video decoder");
125         }
126         
127         if (avcodec_open2 (_video_codec_context, _video_codec, 0) < 0) {
128                 throw DecodeError ("could not open video decoder");
129         }
130 }
131
132 void
133 FFmpegDecoder::setup_audio ()
134 {
135         if (_audio_stream < 0) {
136                 return;
137         }
138         
139         _audio_codec_context = _format_context->streams[_audio_stream]->codec;
140         _audio_codec = avcodec_find_decoder (_audio_codec_context->codec_id);
141
142         if (_audio_codec == 0) {
143                 throw DecodeError ("could not find audio decoder");
144         }
145
146         if (avcodec_open2 (_audio_codec_context, _audio_codec, 0) < 0) {
147                 throw DecodeError ("could not open audio decoder");
148         }
149
150         /* This is a hack; sometimes it seems that _audio_codec_context->channel_layout isn't set up,
151            so bodge it here.  No idea why we should have to do this.
152         */
153
154         if (_audio_codec_context->channel_layout == 0) {
155                 _audio_codec_context->channel_layout = av_get_default_channel_layout (audio_channels ());
156         }
157 }
158
159 bool
160 FFmpegDecoder::do_pass ()
161 {
162         int r = av_read_frame (_format_context, &_packet);
163         if (r < 0) {
164                 return true;
165         }
166
167         if (_packet.stream_index == _video_stream && _opt->decode_video) {
168                 
169                 int frame_finished;
170                 if (avcodec_decode_video2 (_video_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
171                         process_video (_frame);
172                 }
173
174         } else if (_audio_stream >= 0 && _packet.stream_index == _audio_stream && _opt->decode_audio) {
175                 
176                 avcodec_get_frame_defaults (_frame);
177                 
178                 int frame_finished;
179                 if (avcodec_decode_audio4 (_audio_codec_context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) {
180                         int const data_size = av_samples_get_buffer_size (
181                                 0, _audio_codec_context->channels, _frame->nb_samples, audio_sample_format (), 1
182                                 );
183
184                         assert (_audio_codec_context->channels == _fs->audio_channels);
185                         process_audio (_frame->data[0], data_size);
186                 }
187         }
188         
189         av_free_packet (&_packet);
190         return false;
191 }
192
193 int
194 FFmpegDecoder::length_in_frames () const
195 {
196         return (_format_context->duration / AV_TIME_BASE) * frames_per_second ();
197 }
198
199 float
200 FFmpegDecoder::frames_per_second () const
201 {
202         return av_q2d (_format_context->streams[_video_stream]->avg_frame_rate);
203 }
204
205 int
206 FFmpegDecoder::audio_channels () const
207 {
208         if (_audio_codec_context == 0) {
209                 return 0;
210         }
211
212         return _audio_codec_context->channels;
213 }
214
215 int
216 FFmpegDecoder::audio_sample_rate () const
217 {
218         if (_audio_codec_context == 0) {
219                 return 0;
220         }
221         
222         return _audio_codec_context->sample_rate;
223 }
224
225 AVSampleFormat
226 FFmpegDecoder::audio_sample_format () const
227 {
228         if (_audio_codec_context == 0) {
229                 return (AVSampleFormat) 0;
230         }
231         
232         return _audio_codec_context->sample_fmt;
233 }
234
235 int64_t
236 FFmpegDecoder::audio_channel_layout () const
237 {
238         if (_audio_codec_context == 0) {
239                 return 0;
240         }
241         
242         return _audio_codec_context->channel_layout;
243 }
244
245 Size
246 FFmpegDecoder::native_size () const
247 {
248         return Size (_video_codec_context->width, _video_codec_context->height);
249 }
250
251 PixelFormat
252 FFmpegDecoder::pixel_format () const
253 {
254         return _video_codec_context->pix_fmt;
255 }
256
257 int
258 FFmpegDecoder::time_base_numerator () const
259 {
260         return _video_codec_context->time_base.num;
261 }
262
263 int
264 FFmpegDecoder::time_base_denominator () const
265 {
266         return _video_codec_context->time_base.den;
267 }
268
269 int
270 FFmpegDecoder::sample_aspect_ratio_numerator () const
271 {
272         return _video_codec_context->sample_aspect_ratio.num;
273 }
274
275 int
276 FFmpegDecoder::sample_aspect_ratio_denominator () const
277 {
278         return _video_codec_context->sample_aspect_ratio.den;
279 }
280