Index: services/media/framework/stream_type.h |
diff --git a/services/media/framework/stream_type.h b/services/media/framework/stream_type.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..84d4456ca2fa60e0e1ab4330245f736b64f63b36 |
--- /dev/null |
+++ b/services/media/framework/stream_type.h |
@@ -0,0 +1,637 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef SERVICES_MEDIA_FRAMEWORK_STREAM_TYPE_H_ |
+#define SERVICES_MEDIA_FRAMEWORK_STREAM_TYPE_H_ |
+ |
+#include <cstring> |
+#include <string> |
+#include <vector> |
+ |
+#include "base/logging.h" |
+#include "services/media/framework/ptr.h" |
+ |
+namespace mojo { |
+namespace media { |
+ |
+class StreamType; |
+class StreamTypes; |
+class MultiplexedStreamType; |
+class LpcmStreamType; |
+class CompressedAudioStreamType; |
+class VideoStreamType; |
+ |
+typedef UniquePtr<StreamType> StreamTypePtr; |
+typedef UniquePtr<StreamTypes> StreamTypesPtr; |
+ |
+// TODO(dalesat): Get rid of this class. |
+class StreamTypes : public std::vector<StreamTypePtr> { |
+ public: |
+ static StreamTypesPtr Create(size_t size) { |
+ return StreamTypesPtr(new StreamTypes(size)); |
+ } |
+ |
+ explicit StreamTypes(size_t size) : std::vector<StreamTypePtr>(size) {} |
+ |
+ StreamTypesPtr Clone() const; |
+}; |
+ |
+class Bytes; |
+typedef UniquePtr<Bytes> BytesPtr; |
+ |
+// TODO(dalesat): Get rid of this class. |
+class Bytes : public std::vector<uint8_t> { |
+ public: |
+ static BytesPtr Create(size_t size) { |
+ return BytesPtr(new Bytes(size)); |
+ } |
+ |
+ static BytesPtr Create(uint8_t* data, size_t size) { |
+ BytesPtr result = Create(size); |
+ if (size != 0) { |
+ DCHECK(result->data()); |
+ DCHECK(data); |
+ std::memcpy(result->data(), data, size); |
+ } |
+ return result; |
+ } |
+ |
+ explicit Bytes(size_t size) : std::vector<uint8_t>(size) {} |
+ |
+ explicit Bytes(const Bytes& copy_from) : std::vector<uint8_t>(copy_from) {} |
+ |
+ BytesPtr Clone() const; |
+}; |
+ |
+// Describes the type of a stream. |
+class StreamType { |
+ public: |
+ enum class Scheme { |
+ kUnknown, |
+ kNone, |
+ kAnyElementary, |
+ kAnyAudio, |
+ kAnyVideo, |
+ kAnySubpicture, |
+ kAnyText, |
+ kAnyMultiplexed, |
+ kAny, |
+ |
+ kMultiplexed, |
+ kLpcm, |
+ kCompressedAudio, |
+ kVideo |
+ }; |
+ |
+ static StreamTypePtr Create(Scheme scheme) { |
+ return StreamTypePtr(new StreamType(scheme)); |
+ } |
+ |
+ explicit StreamType(Scheme scheme); |
+ |
+ virtual ~StreamType(); |
+ |
+ Scheme scheme() const { |
+ return scheme_; |
+ } |
+ |
+ virtual const MultiplexedStreamType* multiplexed() const; |
+ virtual const LpcmStreamType* lpcm() const; |
+ virtual const CompressedAudioStreamType* compressed_audio() const; |
+ virtual const VideoStreamType* video() const; |
+ |
+ virtual StreamTypePtr Clone() const; |
+ |
+ private: |
+ Scheme scheme_; |
+}; |
+ |
+template<typename T> |
+struct Range { |
+ Range(T min_param, T max_param) : min(min_param), max(max_param) { |
+ DCHECK(min_param <= max_param); |
+ } |
+ |
+ T min; |
+ T max; |
+ |
+ constexpr bool contains(const T& t) const { |
+ return t >= min && t <= max; |
+ } |
+}; |
+ |
+class StreamTypeSet; |
+class StreamTypeSets; |
+class MultiplexedStreamTypeSet; |
+class LpcmStreamTypeSet; |
+class CompressedAudioStreamTypeSet; |
+class VideoStreamTypeSet; |
+ |
+typedef UniquePtr<StreamTypeSet> StreamTypeSetPtr; |
+typedef UniquePtr<StreamTypeSets> StreamTypeSetsPtr; |
+ |
+// TODO(dalesat): Get rid of this class. |
+class StreamTypeSets : public std::vector<StreamTypeSetPtr> { |
+ public: |
+ static StreamTypeSetsPtr Create(size_t size) { |
+ return StreamTypeSetsPtr(new StreamTypeSets(size)); |
+ } |
+ |
+ StreamTypeSets(size_t size) : std::vector<StreamTypeSetPtr>(size) {} |
+ |
+ StreamTypeSetsPtr Clone() const; |
+}; |
+ |
+// Describes a set of possible stream types. |
+class StreamTypeSet { |
+ public: |
+ static StreamTypeSetPtr Create(StreamType::Scheme scheme) { |
+ return StreamTypeSetPtr(new StreamTypeSet(scheme)); |
+ } |
+ |
+ StreamTypeSet(StreamType::Scheme scheme); |
+ |
+ virtual ~StreamTypeSet(); |
+ |
+ StreamType::Scheme scheme() const { |
+ return scheme_; |
+ } |
+ |
+ virtual const MultiplexedStreamTypeSet* multiplexed() const; |
+ virtual const LpcmStreamTypeSet* lpcm() const; |
+ virtual const CompressedAudioStreamTypeSet* compressed_audio() const; |
+ virtual const VideoStreamTypeSet* video() const; |
+ |
+ virtual StreamTypeSetPtr Clone() const; |
+ |
+ private: |
+ StreamType::Scheme scheme_; |
+}; |
+ |
+// Describes the type of a multiplexed stream. |
+class MultiplexedStreamType : public StreamType { |
+ public: |
+ static StreamTypePtr Create( |
+ StreamTypePtr multiplex_type, |
+ StreamTypesPtr substream_types) { |
+ return StreamTypePtr( |
+ new MultiplexedStreamType( |
+ std::move(multiplex_type), |
+ std::move(substream_types))); |
+ } |
+ |
+ MultiplexedStreamType( |
+ StreamTypePtr multiplex_type, |
+ StreamTypesPtr substream_types); |
+ |
+ ~MultiplexedStreamType() override; |
+ |
+ const MultiplexedStreamType* multiplexed() const override; |
+ |
+ const StreamTypePtr& multiplex_type() const { |
+ return multiplex_type_; |
+ } |
+ |
+ const StreamTypesPtr& substream_types() const { |
+ return substream_types_; |
+ } |
+ |
+ StreamTypePtr Clone() const override; |
+ |
+private: |
+ StreamTypePtr multiplex_type_; |
+ StreamTypesPtr substream_types_; |
+}; |
+ |
+// Describes the type of a multiplexed stream. |
+class MultiplexedStreamTypeSet : public StreamTypeSet { |
+public: |
+ static StreamTypeSetPtr Create( |
+ StreamTypeSetPtr multiplex_type_set, |
+ StreamTypeSetsPtr substream_type_sets) { |
+ return StreamTypeSetPtr( |
+ new MultiplexedStreamTypeSet( |
+ std::move(multiplex_type_set), |
+ std::move(substream_type_sets))); |
+ } |
+ |
+ MultiplexedStreamTypeSet( |
+ StreamTypeSetPtr multiplex_type_set, |
+ StreamTypeSetsPtr substream_type_sets); |
+ |
+ ~MultiplexedStreamTypeSet() override; |
+ |
+ const MultiplexedStreamTypeSet* multiplexed() const override; |
+ |
+ const StreamTypeSetPtr& multiplex_type_set() const { |
+ return multiplex_type_set_; |
+ } |
+ |
+ const StreamTypeSetsPtr& substream_type_sets() const { |
+ return substream_type_sets_; |
+ } |
+ |
+ StreamTypeSetPtr Clone() const override; |
+ |
+private: |
+ StreamTypeSetPtr multiplex_type_set_; |
+ StreamTypeSetsPtr substream_type_sets_; |
+}; |
+ |
+// Describes the type of an LPCM stream. |
+class LpcmStreamType : public StreamType { |
+ public: |
+ enum class SampleFormat { |
+ kUnknown, |
+ kAny, |
+ kUnsigned8, |
+ kSigned16, |
+ kSigned24In32, |
+ kFloat |
+ }; |
+ |
+ static StreamTypePtr Create( |
+ SampleFormat sample_format, |
+ uint32_t channels, |
+ uint32_t frames_per_second) { |
+ return StreamTypePtr(new LpcmStreamType( |
+ sample_format, |
+ channels, |
+ frames_per_second)); |
+ } |
+ |
+ LpcmStreamType( |
+ SampleFormat sample_format, |
+ uint32_t channels, |
+ uint32_t frames_per_second); |
+ |
+ ~LpcmStreamType() override; |
+ |
+ const LpcmStreamType* lpcm() const override; |
+ |
+ SampleFormat sample_format() const { |
+ return sample_format_; |
+ } |
+ |
+ uint32_t channels() const { |
+ return channels_; |
+ } |
+ |
+ uint32_t frames_per_second() const { |
+ return frames_per_second_; |
+ } |
+ |
+ uint32_t sample_size() const { |
+ return sample_size_; |
+ } |
+ |
+ uint32_t bytes_per_frame() const { |
+ return sample_size_ * channels_; |
+ } |
+ |
+ uint64_t min_buffer_size(uint64_t frame_count) const { |
+ return frame_count * sample_size_ * channels_; |
+ } |
+ |
+ static uint32_t SampleSizeFromFormat(SampleFormat sample_format); |
+ |
+ StreamTypePtr Clone() const override; |
+ |
+ protected: |
+ LpcmStreamType( |
+ Scheme scheme, |
+ SampleFormat sample_format, |
+ uint32_t channels, |
+ uint32_t frames_per_second); |
+ |
+ private: |
+ SampleFormat sample_format_; |
+ uint32_t channels_; |
+ uint32_t frames_per_second_; |
+ uint32_t sample_size_; |
+}; |
+ |
+// Describes a set of LPCM stream types. |
+class LpcmStreamTypeSet : public StreamTypeSet { |
+ public: |
+ static StreamTypeSetPtr Create( |
+ LpcmStreamType::SampleFormat sample_format, |
+ Range<uint32_t> channels, |
+ Range<uint32_t> frames_per_second) { |
+ return StreamTypeSetPtr(new LpcmStreamTypeSet( |
+ sample_format, |
+ channels, |
+ frames_per_second)); |
+ } |
+ |
+ LpcmStreamTypeSet( |
+ LpcmStreamType::SampleFormat sample_format, |
+ Range<uint32_t> channels, |
+ Range<uint32_t> frames_per_second); |
+ |
+ ~LpcmStreamTypeSet() override; |
+ |
+ const LpcmStreamTypeSet* lpcm() const override; |
+ |
+ LpcmStreamType::SampleFormat sample_format() const { |
+ return sample_format_; |
+ } |
+ |
+ Range<uint32_t> channels() const { |
+ return channels_; |
+ } |
+ |
+ Range<uint32_t> frames_per_second() const { |
+ return frames_per_second_; |
+ } |
+ |
+ bool contains(const LpcmStreamType& type) const; |
+ |
+ StreamTypeSetPtr Clone() const override; |
+ |
+ protected: |
+ LpcmStreamTypeSet( |
+ StreamType::Scheme scheme, |
+ LpcmStreamType::SampleFormat sample_format, |
+ Range<uint32_t> channels, |
+ Range<uint32_t> frames_per_second); |
+ |
+ private: |
+ LpcmStreamType::SampleFormat sample_format_; |
+ Range<uint32_t> channels_; |
+ Range<uint32_t> frames_per_second_; |
+}; |
+ |
+// Describes the type of a compressed audio stream. |
+class CompressedAudioStreamType : public LpcmStreamType { |
+ public: |
+ enum class AudioEncoding { |
+ kUnknown, |
+ kAny, |
+ kVorbis |
+ }; |
+ |
+ static StreamTypePtr Create( |
+ AudioEncoding encoding, |
+ SampleFormat sample_format, |
+ uint32_t channels, |
+ uint32_t frames_per_second, |
+ BytesPtr encoding_details) { |
+ return StreamTypePtr(new CompressedAudioStreamType( |
+ encoding, |
+ sample_format, |
+ channels, |
+ frames_per_second, |
+ std::move(encoding_details))); |
+ } |
+ |
+ CompressedAudioStreamType( |
+ AudioEncoding encoding, |
+ SampleFormat sample_format, |
+ uint32_t channels, |
+ uint32_t frames_per_second, |
+ BytesPtr encoding_details); |
+ |
+ ~CompressedAudioStreamType() override; |
+ |
+ const CompressedAudioStreamType* compressed_audio() const override; |
+ |
+ AudioEncoding encoding() const { |
+ return encoding_; |
+ } |
+ |
+ const BytesPtr& encoding_details() const { |
+ return encoding_details_; |
+ } |
+ |
+ StreamTypePtr Clone() const override; |
+ |
+ private: |
+ AudioEncoding encoding_; |
+ BytesPtr encoding_details_; |
+}; |
+ |
+// Describes a set of compressed audio stream types. |
+class CompressedAudioStreamTypeSet : public LpcmStreamTypeSet { |
+ public: |
+ static StreamTypeSetPtr Create( |
+ CompressedAudioStreamType::AudioEncoding encoding, |
+ CompressedAudioStreamType::SampleFormat sample_format, |
+ Range<uint32_t> channels, |
+ Range<uint32_t> frames_per_second) { |
+ return StreamTypeSetPtr(new CompressedAudioStreamTypeSet( |
+ encoding, |
+ sample_format, |
+ channels, |
+ frames_per_second)); |
+ } |
+ |
+ CompressedAudioStreamTypeSet( |
+ CompressedAudioStreamType::AudioEncoding encoding, |
+ CompressedAudioStreamType::SampleFormat sample_format, |
+ Range<uint32_t> channels, |
+ Range<uint32_t> frames_per_second); |
+ |
+ ~CompressedAudioStreamTypeSet() override; |
+ |
+ const CompressedAudioStreamTypeSet* compressed_audio() const override; |
+ |
+ CompressedAudioStreamType::AudioEncoding encoding() const { |
+ return encoding_; |
+ } |
+ |
+ bool contains(const CompressedAudioStreamType& type) const; |
+ |
+ StreamTypeSetPtr Clone() const override; |
+ |
+ private: |
+ CompressedAudioStreamType::AudioEncoding encoding_; |
+}; |
+ |
+// Describes the type of a video stream. |
+class VideoStreamType : public StreamType { |
+ public: |
+ enum class VideoEncoding { |
+ kUnknown, |
+ kAny, |
+ kTheora, |
+ kVp8, |
+ }; |
+ |
+ enum class VideoProfile { |
+ kUnknown, |
+ kNotApplicable, |
+ kH264Baseline, |
+ kH264Main, |
+ kH264Extended, |
+ kH264High, |
+ kH264High10, |
+ kH264High422, |
+ kH264High444Predictive, |
+ kH264ScalableBaseline, |
+ kH264ScalableHigh, |
+ kH264StereoHigh, |
+ kH264MultiviewHigh |
+ }; |
+ |
+ enum class PixelFormat { |
+ kUnknown, |
+ kI420, |
+ kYv12, |
+ kYv16, |
+ kYv12A, |
+ kYv24, |
+ kNv12, |
+ kNv21, |
+ kUyvy, |
+ kYuy2, |
+ kArgb, |
+ kXrgb, |
+ kRgb24, |
+ kRgb32, |
+ kMjpeg, |
+ kMt21 |
+ }; |
+ |
+ enum class ColorSpace { |
+ kUnknown, |
+ kNotApplicable, |
+ kJpeg, |
+ kHdRec709, |
+ kSdRec601 |
+ }; |
+ |
+ static StreamTypePtr Create( |
+ VideoEncoding encoding, |
+ VideoProfile profile, |
+ PixelFormat pixel_format, |
+ ColorSpace color_space, |
+ uint32_t width, |
+ uint32_t height, |
+ uint32_t coded_width, |
+ uint32_t coded_height, |
+ BytesPtr encoding_details) { |
+ return StreamTypePtr(new VideoStreamType( |
+ encoding, |
+ profile, |
+ pixel_format, |
+ color_space, |
+ width, |
+ height, |
+ coded_width, |
+ coded_height, |
+ std::move(encoding_details))); |
+ } |
+ |
+ VideoStreamType( |
+ VideoEncoding encoding, |
+ VideoProfile profile, |
+ PixelFormat pixel_format, |
+ ColorSpace color_space, |
+ uint32_t width, |
+ uint32_t height, |
+ uint32_t coded_width, |
+ uint32_t coded_height, |
+ BytesPtr encoding_details); |
+ |
+ ~VideoStreamType() override; |
+ |
+ const VideoStreamType* video() const override; |
+ |
+ VideoEncoding encoding() const { |
+ return encoding_; |
+ } |
+ |
+ VideoProfile profile() const { |
+ return profile_; |
+ } |
+ |
+ PixelFormat pixel_format() const { |
+ return pixel_format_; |
+ } |
+ |
+ ColorSpace color_space() const { |
+ return color_space_; |
+ } |
+ |
+ uint32_t width() const { |
+ return width_; |
+ } |
+ |
+ uint32_t height() const { |
+ return height_; |
+ } |
+ |
+ uint32_t coded_width() const { |
+ return coded_width_; |
+ } |
+ |
+ uint32_t coded_height() const { |
+ return coded_height_; |
+ } |
+ |
+ const BytesPtr& encoding_details() const { |
+ return encoding_details_; |
+ } |
+ |
+ StreamTypePtr Clone() const override; |
+ |
+ private: |
+ VideoEncoding encoding_; |
+ VideoProfile profile_; |
+ PixelFormat pixel_format_; |
+ ColorSpace color_space_; |
+ uint32_t width_; |
+ uint32_t height_; |
+ uint32_t coded_width_; |
+ uint32_t coded_height_; |
+ BytesPtr encoding_details_; |
+}; |
+ |
+// Describes a set of video stream types. |
+class VideoStreamTypeSet : public StreamTypeSet { |
+ public: |
+ static StreamTypeSetPtr Create( |
+ VideoStreamType::VideoEncoding encoding, |
+ Range<uint32_t> width, |
+ Range<uint32_t> height) { |
+ return StreamTypeSetPtr(new VideoStreamTypeSet( |
+ encoding, |
+ width, |
+ height)); |
+ } |
+ |
+ VideoStreamTypeSet( |
+ VideoStreamType::VideoEncoding encoding, |
+ Range<uint32_t> width, |
+ Range<uint32_t> height); |
+ |
+ ~VideoStreamTypeSet() override; |
+ |
+ const VideoStreamTypeSet* video() const override; |
+ |
+ VideoStreamType::VideoEncoding encoding() const { |
+ return encoding_; |
+ } |
+ |
+ Range<uint32_t> width() const { |
+ return width_; |
+ } |
+ |
+ Range<uint32_t> height() const { |
+ return height_; |
+ } |
+ |
+ StreamTypeSetPtr Clone() const override; |
+ |
+ private: |
+ VideoStreamType::VideoEncoding encoding_; |
+ Range<uint32_t> width_; |
+ Range<uint32_t> height_; |
+}; |
+ |
+} // namespace media |
+} // namespace mojo |
+ |
+#endif // SERVICES_MEDIA_FRAMEWORK_STREAM_TYPE_H_ |