Runs.
[dcpomatic.git] / src / lib / ffmpeg_content.h
1 #ifndef DVDOMATIC_FFMPEG_CONTENT_H
2 #define DVDOMATIC_FFMPEG_CONTENT_H
3
4 #include <boost/enable_shared_from_this.hpp>
5 #include "video_content.h"
6 #include "audio_content.h"
7
8 class FFmpegAudioStream
9 {
10 public:
11         FFmpegAudioStream (std::string n, int i, int f, int64_t c)
12                 : name (n)
13                 , id (i)
14                 , frame_rate (f)
15                 , channel_layout (c)
16         {}
17
18         int channels () const {
19                 return av_get_channel_layout_nb_channels (channel_layout);
20         }
21         
22         std::string name;
23         int id;
24         int frame_rate;
25         int64_t channel_layout;
26 };
27
28 extern bool operator== (FFmpegAudioStream const & a, FFmpegAudioStream const & b);
29
30 class FFmpegSubtitleStream
31 {
32 public:
33         FFmpegSubtitleStream (std::string n, int i)
34                 : name (n)
35                 , id (i)
36         {}
37         
38         std::string name;
39         int id;
40 };
41
42 extern bool operator== (FFmpegSubtitleStream const & a, FFmpegSubtitleStream const & b);
43
44 class FFmpegContentProperty : public VideoContentProperty
45 {
46 public:
47         static int const SUBTITLE_STREAMS;
48         static int const SUBTITLE_STREAM;
49         static int const AUDIO_STREAMS;
50         static int const AUDIO_STREAM;
51 };
52
53 class FFmpegContent : public VideoContent, public AudioContent, public boost::enable_shared_from_this<FFmpegContent>
54 {
55 public:
56         FFmpegContent (boost::filesystem::path);
57         
58         void examine (boost::shared_ptr<Film>, boost::shared_ptr<Job>, bool);
59         std::string summary () const;
60
61         /* AudioContent */
62         int audio_channels () const;
63         ContentAudioFrame audio_length () const;
64         int audio_frame_rate () const;
65         int64_t audio_channel_layout () const;
66         
67         std::vector<FFmpegSubtitleStream> subtitle_streams () const {
68                 boost::mutex::scoped_lock lm (_mutex);
69                 return _subtitle_streams;
70         }
71
72         boost::optional<FFmpegSubtitleStream> subtitle_stream () const {
73                 boost::mutex::scoped_lock lm (_mutex);
74                 return _subtitle_stream;
75         }
76
77         std::vector<FFmpegAudioStream> audio_streams () const {
78                 boost::mutex::scoped_lock lm (_mutex);
79                 return _audio_streams;
80         }
81         
82         boost::optional<FFmpegAudioStream> audio_stream () const {
83                 boost::mutex::scoped_lock lm (_mutex);
84                 return _audio_stream;
85         }
86
87         void set_subtitle_stream (FFmpegSubtitleStream);
88         void set_audio_stream (FFmpegAudioStream);
89         
90 private:
91         std::vector<FFmpegSubtitleStream> _subtitle_streams;
92         boost::optional<FFmpegSubtitleStream> _subtitle_stream;
93         std::vector<FFmpegAudioStream> _audio_streams;
94         boost::optional<FFmpegAudioStream> _audio_stream;
95 };
96
97 #endif