Build fixes for OS X.
[dcpomatic.git] / src / lib / stream.h
index 764c03d79f5a809ba3935141e09505cfae3ac76c..16b06e4bcac5021e77b73de57a2e186bf16ab295 100644 (file)
 
 */
 
+/** @file src/lib/stream.h
+ *  @brief Representations of audio and subtitle streams.
+ *
+ *  Some content may have multiple `streams' of audio and/or subtitles; perhaps
+ *  for multiple languages, or for stereo / surround mixes.  These classes represent
+ *  those streams, and know about their details.
+ */
+
 #ifndef DVDOMATIC_STREAM_H
 #define DVDOMATIC_STREAM_H
 
-struct Stream
+#include <stdint.h>
+#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
+extern "C" {
+#include <libavutil/audioconvert.h>
+}
+
+/** @class Stream
+ *  @brief Parent class for streams.
+ */
+class Stream
 {
 public:
-       Stream (std::string t);
-       
-       Stream (std::string n, int i)
-               : name (n)
-               , id (i)
+       virtual ~Stream () {}
+       virtual std::string to_string () const = 0;
+};
+
+/** @class AudioStream
+ *  @brief A stream of audio data.
+ */
+struct AudioStream : public Stream
+{
+public:
+       AudioStream (int r, int64_t l)
+               : _sample_rate (r)
+               , _channel_layout (l)
+       {}
+
+       /* Only used for backwards compatibility for state file version < 1 */
+       void set_sample_rate (int s) {
+               _sample_rate = s;
+       }
+
+       int channels () const {
+               return av_get_channel_layout_nb_channels (_channel_layout);
+       }
+
+       int sample_rate () const {
+               return _sample_rate;
+       }
+
+       int64_t channel_layout () const {
+               return _channel_layout;
+       }
+
+protected:
+       AudioStream ()
+               : _sample_rate (0)
+               , _channel_layout (0)
+       {}
+
+       int _sample_rate;
+       int64_t _channel_layout;
+};
+
+/** @class SubtitleStream
+ *  @brief A stream of subtitle data.
+ */
+class SubtitleStream : public Stream
+{
+public:
+       SubtitleStream (std::string n, int i)
+               : _name (n)
+               , _id (i)
        {}
 
        std::string to_string () const;
+
+       std::string name () const {
+               return _name;
+       }
+
+       int id () const {
+               return _id;
+       }
+
+       static boost::shared_ptr<SubtitleStream> create (std::string t, boost::optional<int> v);
+
+private:
+       friend class stream_test;
+       
+       SubtitleStream (std::string t, boost::optional<int> v);
        
-       std::string name;
-       int id;
+       std::string _name;
+       int _id;
 };
 
+boost::shared_ptr<AudioStream> audio_stream_factory (std::string t, boost::optional<int> version);
+boost::shared_ptr<SubtitleStream> subtitle_stream_factory (std::string t, boost::optional<int> version);
+
 #endif