Index: extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.h |
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.h b/extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c149af851f81ac557e0168f576ccde5efb8f1cc8 |
--- /dev/null |
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.h |
@@ -0,0 +1,122 @@ |
+// 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 EXTENSIONS_RENDERER_API_DISPLAY_SOURCE_WIFI_DISPLAY_WIFI_DISPLAY_ELEMENTARY_STREAM_DESCRIPTOR_H_ |
+#define EXTENSIONS_RENDERER_API_DISPLAY_SOURCE_WIFI_DISPLAY_WIFI_DISPLAY_ELEMENTARY_STREAM_DESCRIPTOR_H_ |
+ |
+#include <stdint.h> |
+#include <type_traits> |
+ |
+#include "base/memory/scoped_ptr.h" |
+ |
+namespace extensions { |
+ |
+// WiFi Display elementary stream descriptors are used for passing descriptive |
+// information about elementary streams to WiFiDisplayTransportStreamPacketizer |
+// which then packetizes that information so that it can be passed to a remote |
+// sink. |
+class WiFiDisplayElementaryStreamDescriptor { |
+ public: |
+ enum { kHeaderSize = 2u }; |
+ |
+ enum DescriptorTag : uint8_t { |
+ DESCRIPTOR_TAG_AVC_VIDEO = 0x28u, |
+ DESCRIPTOR_TAG_AVC_TIMING_AND_HRD = 0x2A, |
+ DESCRIPTOR_TAG_LPCM_AUDIO_STREAM = 0x83u, |
+ }; |
+ |
+ // Make Google Test treat this class as a container. |
+ using const_iterator = const uint8_t*; |
+ using iterator = const uint8_t*; |
+ |
+ WiFiDisplayElementaryStreamDescriptor( |
+ const WiFiDisplayElementaryStreamDescriptor&); |
+ WiFiDisplayElementaryStreamDescriptor( |
+ WiFiDisplayElementaryStreamDescriptor&&); |
+ ~WiFiDisplayElementaryStreamDescriptor(); |
+ |
+ WiFiDisplayElementaryStreamDescriptor& operator=( |
+ WiFiDisplayElementaryStreamDescriptor&&); |
+ |
+ const uint8_t* begin() const { return data(); } |
+ const uint8_t* data() const; |
+ bool empty() const { return !data_; } |
+ const uint8_t* end() const { return data() + size(); } |
+ size_t size() const; |
+ |
+ DescriptorTag tag() const { return static_cast<DescriptorTag>(data()[0]); } |
+ uint8_t length() const { return data()[1]; } |
+ |
+ // AVC (Advanced Video Coding) timing and HRD (Hypothetical Reference |
+ // Decoder) descriptor provides timing and HRD parameters for a video stream. |
+ struct AVCTimingAndHRD { |
+ static WiFiDisplayElementaryStreamDescriptor Create(); |
+ }; |
+ |
+ // AVC (Advanced Video Coding) video descriptor provides basic coding |
+ // parameters for a video stream. |
+ struct AVCVideo { |
+ static WiFiDisplayElementaryStreamDescriptor Create( |
+ uint8_t profile_idc, |
+ bool constraint_set0_flag, |
+ bool constraint_set1_flag, |
+ bool constraint_set2_flag, |
+ uint8_t avc_compatible_flags, |
+ uint8_t level_idc, |
+ bool avc_still_present); |
+ }; |
+ |
+ class LPCMAudioStream; |
+ |
+ protected: |
+ WiFiDisplayElementaryStreamDescriptor(DescriptorTag tag, uint8_t length); |
+ |
+ uint8_t* data(); |
+ const uint8_t* private_data() const { return data() + kHeaderSize; } |
+ uint8_t* private_data() { return data() + kHeaderSize; } |
+ |
+ private: |
+ scoped_ptr<uint8_t[]> data_; |
+}; |
+ |
+// LPCM (Linear pulse-code modulation) audio stream descriptor provides basic |
+// coding parameters for a private WiFi Display LPCM audio stream. |
+class WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream |
+ : public WiFiDisplayElementaryStreamDescriptor { |
+ public: |
+ enum { kTag = DESCRIPTOR_TAG_LPCM_AUDIO_STREAM }; |
+ enum BitsPerSample : uint8_t { BITS_PER_SAMPLE_16 = 0u }; |
+ enum NumberOfChannels : uint8_t { |
+ NUMBER_OF_CHANNELS_DUAL_MONO = 0u, |
+ NUMBER_OF_CHANNELS_STEREO = 1u |
+ }; |
+ enum SamplingFrequency : uint8_t { |
+ SAMPLING_FREQUENCY_44_1K = 1u, |
+ SAMPLING_FREQUENCY_48K = 2u |
+ }; |
+ |
+ static WiFiDisplayElementaryStreamDescriptor Create( |
+ SamplingFrequency sampling_frequency, |
+ BitsPerSample bits_per_sample, |
+ bool emphasis_flag, |
+ NumberOfChannels number_of_channels); |
+ |
+ BitsPerSample bits_per_sample() const; |
+ bool emphasis_flag() const; |
+ NumberOfChannels number_of_channels() const; |
+ SamplingFrequency sampling_frequency() const; |
+}; |
+ |
+// Subclasses of WiFiDisplayElementaryStreamDescriptor MUST NOT define new |
+// member variables but only new non-virtual member functions which parse |
+// the inherited data. This allows WiFiDisplayElementaryStreamDescriptor |
+// pointers to be cast to subclass pointers. |
+static_assert( |
+ std::is_standard_layout< |
+ WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream>::value, |
+ "Forbidden memory layout for an elementary stream descriptor"); |
+ |
+} // namespace extensions |
+ |
+#endif // EXTENSIONS_RENDERER_API_DISPLAY_SOURCE_WIFI_DISPLAY_WIFI_DISPLAY_ELEMENTARY_STREAM_DESCRIPTOR_H_ |