Fix build again.
[dcpomatic.git] / src / lib / stream.h
index 2db63c6208e12c75d92360b1b1676a9637a282b6..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
 
+#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 ()
-               : _id (-1)
-       {}
-       
-       Stream (std::string n, int i)
-               : _name (n)
-               , _id (i)
-       {}
-
+       virtual ~Stream () {}
        virtual std::string to_string () const = 0;
-       
-       std::string name () const {
-               return _name;
-       }
-
-       int id () const {
-               return _id;
-       }
-
-protected:
-       std::string _name;
-       int _id;
 };
 
+/** @class AudioStream
+ *  @brief A stream of audio data.
+ */
 struct AudioStream : public Stream
 {
 public:
-       AudioStream (std::string t);
-       
-       AudioStream (std::string n, int i, int c)
-               : Stream (n, i)
-               , _channels (c)
+       AudioStream (int r, int64_t l)
+               : _sample_rate (r)
+               , _channel_layout (l)
        {}
 
-       std::string to_string () const;
+       /* Only used for backwards compatibility for state file version < 1 */
+       void set_sample_rate (int s) {
+               _sample_rate = s;
+       }
 
        int channels () const {
-               return _channels;
+               return av_get_channel_layout_nb_channels (_channel_layout);
        }
 
-private:
-       int _channels;
+       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 t);
-
        SubtitleStream (std::string n, int i)
-               : Stream (n, 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;
 };
 
+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