Chromium Code Reviews

Unified Diff: extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.cc

Issue 1800493003: Implement some WiFi Display elementary stream descriptors. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Grammar nits Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.cc
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.cc
new file mode 100644
index 0000000000000000000000000000000000000000..7f59ce68f4683da75020e8b7e96a4a594be04ec2
--- /dev/null
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.cc
@@ -0,0 +1,165 @@
+// 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.
+
+#include "extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.h"
+
+#include <cstring>
+
+namespace extensions {
+
+WiFiDisplayElementaryStreamDescriptor::WiFiDisplayElementaryStreamDescriptor(
+ const WiFiDisplayElementaryStreamDescriptor& other) {
+ if (!other.empty()) {
+ data_.reset(new uint8_t[other.size()]);
+ std::memcpy(data(), other.data(), other.size());
+ }
+}
+
+WiFiDisplayElementaryStreamDescriptor::WiFiDisplayElementaryStreamDescriptor(
+ WiFiDisplayElementaryStreamDescriptor&&) = default;
+
+WiFiDisplayElementaryStreamDescriptor::WiFiDisplayElementaryStreamDescriptor(
+ DescriptorTag tag,
+ uint8_t length)
+ : data_(new uint8_t[kHeaderSize + length]) {
+ uint8_t* p = data();
+ *p++ = tag;
+ *p++ = length;
+ DCHECK_EQ(private_data(), p);
+}
+
+WiFiDisplayElementaryStreamDescriptor::
+ ~WiFiDisplayElementaryStreamDescriptor() {}
+
+WiFiDisplayElementaryStreamDescriptor& WiFiDisplayElementaryStreamDescriptor::
+operator=(WiFiDisplayElementaryStreamDescriptor&&) = default;
+
+const uint8_t* WiFiDisplayElementaryStreamDescriptor::data() const {
+ return data_.get();
+}
+
+uint8_t* WiFiDisplayElementaryStreamDescriptor::data() {
+ return data_.get();
+}
+
+size_t WiFiDisplayElementaryStreamDescriptor::size() const {
+ if (empty())
+ return 0u;
+ return kHeaderSize + length();
+}
+
+WiFiDisplayElementaryStreamDescriptor
+WiFiDisplayElementaryStreamDescriptor::AVCTimingAndHRD::Create() {
+ WiFiDisplayElementaryStreamDescriptor descriptor(
+ DESCRIPTOR_TAG_AVC_TIMING_AND_HRD, 2u);
+ uint8_t* p = descriptor.private_data();
+ *p++ = (false << 7) | // hrd_management_valid_flag
+ (0x3Fu << 1) | // reserved (all six bits on)
+ (false << 0); // picture_and_timing_info_present
+ // No picture nor timing info bits.
+ *p++ = (false << 7) | // fixed_frame_rate_flag
+ (false << 6) | // temporal_poc_flag
+ (false << 5) | // picture_to_display_conversion_flag
+ (0x1Fu << 0); // reserved (all five bits on)
+ DCHECK_EQ(descriptor.end(), p);
+ return descriptor;
+}
+
+WiFiDisplayElementaryStreamDescriptor
+WiFiDisplayElementaryStreamDescriptor::AVCVideo::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) {
+ const bool avc_24_hour_picture_flag = false;
+ WiFiDisplayElementaryStreamDescriptor descriptor(DESCRIPTOR_TAG_AVC_VIDEO,
+ 4u);
+ uint8_t* p = descriptor.private_data();
+ *p++ = profile_idc;
+ *p++ = (constraint_set0_flag << 7) | (constraint_set1_flag << 6) |
+ (constraint_set2_flag << 5) | (avc_compatible_flags << 0);
+ *p++ = level_idc;
+ *p++ = (avc_still_present << 7) | (avc_24_hour_picture_flag << 6) |
+ (0x3Fu << 0); // Reserved (all 6 bits on)
+ DCHECK_EQ(descriptor.end(), p);
+ return descriptor;
+}
+
+namespace {
+struct LPCMAudioStreamByte0 {
+ enum : uint8_t {
+ kBitsPerSampleShift = 3u,
+ kBitsPerSampleMask = ((1u << 2) - 1u) << kBitsPerSampleShift,
+ kEmphasisFlagShift = 0u,
+ kEmphasisFlagMask = 1u << kEmphasisFlagShift,
+ kReservedOnBitsShift = 1u,
+ kReservedOnBitsMask = ((1u << 2) - 1u) << kReservedOnBitsShift,
+ kSamplingFrequencyShift = 5u,
+ kSamplingFrequencyMask = ((1u << 3) - 1u) << kSamplingFrequencyShift,
+ };
+};
+
+struct LPCMAudioStreamByte1 {
+ enum : uint8_t {
+ kNumberOfChannelsShift = 5u,
+ kNumberOfChannelsMask = ((1u << 3) - 1u) << kNumberOfChannelsShift,
+ kReservedOnBitsShift = 0u,
+ kReservedOnBitsMask = ((1u << 4) - 1u) << kReservedOnBitsShift,
+ // The bit not listed above having a shift 4u is a reserved off bit.
+ };
+};
+} // namespace
+
+WiFiDisplayElementaryStreamDescriptor
+WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream::Create(
+ SamplingFrequency sampling_frequency,
+ BitsPerSample bits_per_sample,
+ bool emphasis_flag,
+ NumberOfChannels number_of_channels) {
+ WiFiDisplayElementaryStreamDescriptor descriptor(
+ DESCRIPTOR_TAG_LPCM_AUDIO_STREAM, 2u);
+ uint8_t* p = descriptor.private_data();
+ *p++ = (sampling_frequency << LPCMAudioStreamByte0::kSamplingFrequencyShift) |
+ (bits_per_sample << LPCMAudioStreamByte0::kBitsPerSampleShift) |
+ LPCMAudioStreamByte0::kReservedOnBitsMask |
+ (emphasis_flag << LPCMAudioStreamByte0::kEmphasisFlagShift);
+ *p++ = (number_of_channels << LPCMAudioStreamByte1::kNumberOfChannelsShift) |
+ LPCMAudioStreamByte1::kReservedOnBitsMask;
+ DCHECK_EQ(descriptor.end(), p);
+ return descriptor;
+}
+
+WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream::BitsPerSample
+WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream::bits_per_sample()
+ const {
+ return static_cast<BitsPerSample>(
+ (private_data()[0] & LPCMAudioStreamByte0::kBitsPerSampleMask) >>
+ LPCMAudioStreamByte0::kBitsPerSampleShift);
+}
+
+bool WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream::emphasis_flag()
+ const {
+ return (private_data()[0] & LPCMAudioStreamByte0::kEmphasisFlagMask) != 0u;
+}
+
+WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream::NumberOfChannels
+WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream::number_of_channels()
+ const {
+ return static_cast<NumberOfChannels>(
+ (private_data()[1] & LPCMAudioStreamByte1::kNumberOfChannelsMask) >>
+ LPCMAudioStreamByte1::kNumberOfChannelsShift);
+}
+
+WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream::SamplingFrequency
+WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream::sampling_frequency()
+ const {
+ return static_cast<SamplingFrequency>(
+ (private_data()[0] & LPCMAudioStreamByte0::kSamplingFrequencyMask) >>
+ LPCMAudioStreamByte0::kSamplingFrequencyShift);
+}
+
+} // namespace extensions

Powered by Google App Engine