// Copyright 2019 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 CAST_STREAMING_ANSWER_MESSAGES_H_ #define CAST_STREAMING_ANSWER_MESSAGES_H_ #include #include #include #include #include #include #include #include #include "absl/types/optional.h" #include "cast/streaming/ssrc.h" #include "json/value.h" #include "platform/base/error.h" #include "util/simple_fraction.h" namespace openscreen { namespace cast { // For each of the below classes, though a number of methods are shared, the use // of a shared base class has intentionally been avoided. This is to improve // readability of the structs provided in this file by cutting down on the // amount of obscuring boilerplate code. For each of the following struct // definitions, the following method definitions are shared: // (1) ParseAndValidate. Shall return a boolean indicating whether the out // parameter is in a valid state after checking bounds and restrictions. // (2) ToJson. Should return a proper JSON object. Assumes that IsValid() // has been called already, OSP_DCHECKs if not IsValid(). // (3) IsValid. Used by both ParseAndValidate and ToJson to ensure that the // object is in a good state. struct AudioConstraints { static bool ParseAndValidate(const Json::Value& value, AudioConstraints* out); Json::Value ToJson() const; bool IsValid() const; int max_sample_rate = 0; int max_channels = 0; int min_bit_rate = 0; // optional int max_bit_rate = 0; absl::optional max_delay = {}; }; struct Dimensions { static bool ParseAndValidate(const Json::Value& value, Dimensions* out); Json::Value ToJson() const; bool IsValid() const; int width = 0; int height = 0; SimpleFraction frame_rate; }; struct VideoConstraints { static bool ParseAndValidate(const Json::Value& value, VideoConstraints* out); Json::Value ToJson() const; bool IsValid() const; absl::optional max_pixels_per_second = {}; absl::optional min_dimensions = {}; Dimensions max_dimensions = {}; int min_bit_rate = 0; // optional int max_bit_rate = 0; absl::optional max_delay = {}; }; struct Constraints { static bool ParseAndValidate(const Json::Value& value, Constraints* out); Json::Value ToJson() const; bool IsValid() const; AudioConstraints audio; VideoConstraints video; }; // Decides whether the Sender scales and letterboxes content to 16:9, or if // it may send video frames of any arbitrary size and the Receiver must // handle the presentation details. enum class AspectRatioConstraint : uint8_t { kVariable = 0, kFixed }; struct AspectRatio { static bool ParseAndValidate(const Json::Value& value, AspectRatio* out); bool IsValid() const; bool operator==(const AspectRatio& other) const { return width == other.width && height == other.height; } int width = 0; int height = 0; }; struct DisplayDescription { static bool ParseAndValidate(const Json::Value& value, DisplayDescription* out); Json::Value ToJson() const; bool IsValid() const; // May exceed, be the same, or less than those mentioned in the // video constraints. absl::optional dimensions; absl::optional aspect_ratio = {}; absl::optional aspect_ratio_constraint = {}; }; struct Answer { static bool ParseAndValidate(const Json::Value& value, Answer* out); Json::Value ToJson() const; bool IsValid() const; int udp_port = 0; std::vector send_indexes; std::vector ssrcs; // Constraints and display descriptions are optional fields, and maybe null in // the valid case. absl::optional constraints; absl::optional display; std::vector receiver_rtcp_event_log; std::vector receiver_rtcp_dscp; bool supports_wifi_status_reporting = false; // RTP extensions should be empty, but not null. std::vector rtp_extensions = {}; }; } // namespace cast } // namespace openscreen #endif // CAST_STREAMING_ANSWER_MESSAGES_H_