xref: /aosp_15_r20/external/openscreen/cast/streaming/answer_messages.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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