1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef CAST_STREAMING_ANSWER_MESSAGES_H_ 6*3f982cf4SFabien Sanglard #define CAST_STREAMING_ANSWER_MESSAGES_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <array> 9*3f982cf4SFabien Sanglard #include <chrono> 10*3f982cf4SFabien Sanglard #include <cstdint> 11*3f982cf4SFabien Sanglard #include <initializer_list> 12*3f982cf4SFabien Sanglard #include <memory> 13*3f982cf4SFabien Sanglard #include <string> 14*3f982cf4SFabien Sanglard #include <utility> 15*3f982cf4SFabien Sanglard #include <vector> 16*3f982cf4SFabien Sanglard 17*3f982cf4SFabien Sanglard #include "absl/types/optional.h" 18*3f982cf4SFabien Sanglard #include "cast/streaming/resolution.h" 19*3f982cf4SFabien Sanglard #include "cast/streaming/ssrc.h" 20*3f982cf4SFabien Sanglard #include "json/value.h" 21*3f982cf4SFabien Sanglard #include "platform/base/error.h" 22*3f982cf4SFabien Sanglard #include "util/simple_fraction.h" 23*3f982cf4SFabien Sanglard 24*3f982cf4SFabien Sanglard namespace openscreen { 25*3f982cf4SFabien Sanglard namespace cast { 26*3f982cf4SFabien Sanglard 27*3f982cf4SFabien Sanglard // For each of the below classes, though a number of methods are shared, the use 28*3f982cf4SFabien Sanglard // of a shared base class has intentionally been avoided. This is to improve 29*3f982cf4SFabien Sanglard // readability of the structs provided in this file by cutting down on the 30*3f982cf4SFabien Sanglard // amount of obscuring boilerplate code. For each of the following struct 31*3f982cf4SFabien Sanglard // definitions, the following method definitions are shared: 32*3f982cf4SFabien Sanglard // (1) TryParse. Shall return a boolean indicating whether the out 33*3f982cf4SFabien Sanglard // parameter is in a valid state after checking bounds and restrictions. 34*3f982cf4SFabien Sanglard // (2) ToJson. Should return a proper JSON object. Assumes that IsValid() 35*3f982cf4SFabien Sanglard // has been called already, OSP_DCHECKs if not IsValid(). 36*3f982cf4SFabien Sanglard // (3) IsValid. Used by both TryParse and ToJson to ensure that the 37*3f982cf4SFabien Sanglard // object is in a good state. 38*3f982cf4SFabien Sanglard struct AudioConstraints { 39*3f982cf4SFabien Sanglard static bool TryParse(const Json::Value& value, AudioConstraints* out); 40*3f982cf4SFabien Sanglard Json::Value ToJson() const; 41*3f982cf4SFabien Sanglard bool IsValid() const; 42*3f982cf4SFabien Sanglard 43*3f982cf4SFabien Sanglard int max_sample_rate = 0; 44*3f982cf4SFabien Sanglard int max_channels = 0; 45*3f982cf4SFabien Sanglard int min_bit_rate = 0; // optional 46*3f982cf4SFabien Sanglard int max_bit_rate = 0; 47*3f982cf4SFabien Sanglard absl::optional<std::chrono::milliseconds> max_delay = {}; 48*3f982cf4SFabien Sanglard }; 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard struct VideoConstraints { 51*3f982cf4SFabien Sanglard static bool TryParse(const Json::Value& value, VideoConstraints* out); 52*3f982cf4SFabien Sanglard Json::Value ToJson() const; 53*3f982cf4SFabien Sanglard bool IsValid() const; 54*3f982cf4SFabien Sanglard 55*3f982cf4SFabien Sanglard absl::optional<double> max_pixels_per_second = {}; 56*3f982cf4SFabien Sanglard absl::optional<Dimensions> min_resolution = {}; 57*3f982cf4SFabien Sanglard Dimensions max_dimensions = {}; 58*3f982cf4SFabien Sanglard int min_bit_rate = 0; // optional 59*3f982cf4SFabien Sanglard int max_bit_rate = 0; 60*3f982cf4SFabien Sanglard absl::optional<std::chrono::milliseconds> max_delay = {}; 61*3f982cf4SFabien Sanglard }; 62*3f982cf4SFabien Sanglard 63*3f982cf4SFabien Sanglard struct Constraints { 64*3f982cf4SFabien Sanglard static bool TryParse(const Json::Value& value, Constraints* out); 65*3f982cf4SFabien Sanglard Json::Value ToJson() const; 66*3f982cf4SFabien Sanglard bool IsValid() const; 67*3f982cf4SFabien Sanglard 68*3f982cf4SFabien Sanglard AudioConstraints audio; 69*3f982cf4SFabien Sanglard VideoConstraints video; 70*3f982cf4SFabien Sanglard }; 71*3f982cf4SFabien Sanglard 72*3f982cf4SFabien Sanglard // Decides whether the Sender scales and letterboxes content to 16:9, or if 73*3f982cf4SFabien Sanglard // it may send video frames of any arbitrary size and the Receiver must 74*3f982cf4SFabien Sanglard // handle the presentation details. 75*3f982cf4SFabien Sanglard enum class AspectRatioConstraint : uint8_t { kVariable = 0, kFixed }; 76*3f982cf4SFabien Sanglard 77*3f982cf4SFabien Sanglard struct AspectRatio { 78*3f982cf4SFabien Sanglard static bool TryParse(const Json::Value& value, AspectRatio* out); 79*3f982cf4SFabien Sanglard bool IsValid() const; 80*3f982cf4SFabien Sanglard 81*3f982cf4SFabien Sanglard bool operator==(const AspectRatio& other) const { 82*3f982cf4SFabien Sanglard return width == other.width && height == other.height; 83*3f982cf4SFabien Sanglard } 84*3f982cf4SFabien Sanglard 85*3f982cf4SFabien Sanglard int width = 0; 86*3f982cf4SFabien Sanglard int height = 0; 87*3f982cf4SFabien Sanglard }; 88*3f982cf4SFabien Sanglard 89*3f982cf4SFabien Sanglard struct DisplayDescription { 90*3f982cf4SFabien Sanglard static bool TryParse(const Json::Value& value, DisplayDescription* out); 91*3f982cf4SFabien Sanglard Json::Value ToJson() const; 92*3f982cf4SFabien Sanglard bool IsValid() const; 93*3f982cf4SFabien Sanglard 94*3f982cf4SFabien Sanglard // May exceed, be the same, or less than those mentioned in the 95*3f982cf4SFabien Sanglard // video constraints. 96*3f982cf4SFabien Sanglard absl::optional<Dimensions> dimensions; 97*3f982cf4SFabien Sanglard absl::optional<AspectRatio> aspect_ratio = {}; 98*3f982cf4SFabien Sanglard absl::optional<AspectRatioConstraint> aspect_ratio_constraint = {}; 99*3f982cf4SFabien Sanglard }; 100*3f982cf4SFabien Sanglard 101*3f982cf4SFabien Sanglard struct Answer { 102*3f982cf4SFabien Sanglard // TODO(jophba): DEPRECATED, remove separately. 103*3f982cf4SFabien Sanglard static bool ParseAndValidate(const Json::Value& value, Answer* out); 104*3f982cf4SFabien Sanglard 105*3f982cf4SFabien Sanglard static bool TryParse(const Json::Value& value, Answer* out); 106*3f982cf4SFabien Sanglard Json::Value ToJson() const; 107*3f982cf4SFabien Sanglard bool IsValid() const; 108*3f982cf4SFabien Sanglard 109*3f982cf4SFabien Sanglard int udp_port = 0; 110*3f982cf4SFabien Sanglard std::vector<int> send_indexes; 111*3f982cf4SFabien Sanglard std::vector<Ssrc> ssrcs; 112*3f982cf4SFabien Sanglard 113*3f982cf4SFabien Sanglard // Constraints and display descriptions are optional fields, and maybe null in 114*3f982cf4SFabien Sanglard // the valid case. 115*3f982cf4SFabien Sanglard absl::optional<Constraints> constraints; 116*3f982cf4SFabien Sanglard absl::optional<DisplayDescription> display; 117*3f982cf4SFabien Sanglard std::vector<int> receiver_rtcp_event_log; 118*3f982cf4SFabien Sanglard std::vector<int> receiver_rtcp_dscp; 119*3f982cf4SFabien Sanglard 120*3f982cf4SFabien Sanglard // RTP extensions should be empty, but not null. 121*3f982cf4SFabien Sanglard std::vector<std::string> rtp_extensions = {}; 122*3f982cf4SFabien Sanglard }; 123*3f982cf4SFabien Sanglard 124*3f982cf4SFabien Sanglard } // namespace cast 125*3f982cf4SFabien Sanglard } // namespace openscreen 126*3f982cf4SFabien Sanglard 127*3f982cf4SFabien Sanglard #endif // CAST_STREAMING_ANSWER_MESSAGES_H_ 128