xref: /aosp_15_r20/external/openscreen/cast/streaming/offer_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_OFFER_MESSAGES_H_
6*3f982cf4SFabien Sanglard #define CAST_STREAMING_OFFER_MESSAGES_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <chrono>
9*3f982cf4SFabien Sanglard #include <string>
10*3f982cf4SFabien Sanglard #include <vector>
11*3f982cf4SFabien Sanglard 
12*3f982cf4SFabien Sanglard #include "absl/strings/string_view.h"
13*3f982cf4SFabien Sanglard #include "absl/types/optional.h"
14*3f982cf4SFabien Sanglard #include "cast/streaming/message_fields.h"
15*3f982cf4SFabien Sanglard #include "cast/streaming/resolution.h"
16*3f982cf4SFabien Sanglard #include "cast/streaming/rtp_defines.h"
17*3f982cf4SFabien Sanglard #include "cast/streaming/session_config.h"
18*3f982cf4SFabien Sanglard #include "json/value.h"
19*3f982cf4SFabien Sanglard #include "platform/base/error.h"
20*3f982cf4SFabien Sanglard #include "util/simple_fraction.h"
21*3f982cf4SFabien Sanglard 
22*3f982cf4SFabien Sanglard // This file contains the implementation of the Cast V2 Mirroring Control
23*3f982cf4SFabien Sanglard // Protocol offer object definition.
24*3f982cf4SFabien Sanglard namespace openscreen {
25*3f982cf4SFabien Sanglard namespace cast {
26*3f982cf4SFabien Sanglard 
27*3f982cf4SFabien Sanglard // If the target delay provided by the sender is not bounded by
28*3f982cf4SFabien Sanglard // [kMinTargetDelay, kMaxTargetDelay], it will be set to
29*3f982cf4SFabien Sanglard // kDefaultTargetPlayoutDelay.
30*3f982cf4SFabien Sanglard constexpr auto kMinTargetPlayoutDelay = std::chrono::milliseconds(0);
31*3f982cf4SFabien Sanglard constexpr auto kMaxTargetPlayoutDelay = std::chrono::milliseconds(5000);
32*3f982cf4SFabien Sanglard 
33*3f982cf4SFabien Sanglard // If the sender provides an invalid maximum frame rate, it ill
34*3f982cf4SFabien Sanglard // be set to kDefaultMaxFrameRate.
35*3f982cf4SFabien Sanglard constexpr int kDefaultMaxFrameRate = 30;
36*3f982cf4SFabien Sanglard 
37*3f982cf4SFabien Sanglard constexpr int kDefaultNumVideoChannels = 1;
38*3f982cf4SFabien Sanglard constexpr int kDefaultNumAudioChannels = 2;
39*3f982cf4SFabien Sanglard 
40*3f982cf4SFabien Sanglard // A stream, as detailed by the CastV2 protocol spec, is a segment of an
41*3f982cf4SFabien Sanglard // offer message specifically representing a configuration object for
42*3f982cf4SFabien Sanglard // a codec and its related fields, such as maximum bit rate, time base,
43*3f982cf4SFabien Sanglard // and other fields.
44*3f982cf4SFabien Sanglard // Composed classes include AudioStream and VideoStream, which contain
45*3f982cf4SFabien Sanglard // fields specific to audio and video respectively.
46*3f982cf4SFabien Sanglard struct Stream {
47*3f982cf4SFabien Sanglard   enum class Type : uint8_t { kAudioSource, kVideoSource };
48*3f982cf4SFabien Sanglard 
49*3f982cf4SFabien Sanglard   static Error TryParse(const Json::Value& root,
50*3f982cf4SFabien Sanglard                         Stream::Type type,
51*3f982cf4SFabien Sanglard                         Stream* out);
52*3f982cf4SFabien Sanglard   Json::Value ToJson() const;
53*3f982cf4SFabien Sanglard   bool IsValid() const;
54*3f982cf4SFabien Sanglard 
55*3f982cf4SFabien Sanglard   int index = 0;
56*3f982cf4SFabien Sanglard   Type type = {};
57*3f982cf4SFabien Sanglard 
58*3f982cf4SFabien Sanglard   // Default channel count is 1, e.g. for video.
59*3f982cf4SFabien Sanglard   int channels = 0;
60*3f982cf4SFabien Sanglard   RtpPayloadType rtp_payload_type = {};
61*3f982cf4SFabien Sanglard   Ssrc ssrc = {};
62*3f982cf4SFabien Sanglard   std::chrono::milliseconds target_delay = {};
63*3f982cf4SFabien Sanglard 
64*3f982cf4SFabien Sanglard   // AES Key and IV mask format is very strict: a 32 digit hex string that
65*3f982cf4SFabien Sanglard   // must be converted to a 16 digit byte array.
66*3f982cf4SFabien Sanglard   std::array<uint8_t, 16> aes_key = {};
67*3f982cf4SFabien Sanglard   std::array<uint8_t, 16> aes_iv_mask = {};
68*3f982cf4SFabien Sanglard   bool receiver_rtcp_event_log = false;
69*3f982cf4SFabien Sanglard   std::string receiver_rtcp_dscp;
70*3f982cf4SFabien Sanglard   int rtp_timebase = 0;
71*3f982cf4SFabien Sanglard 
72*3f982cf4SFabien Sanglard   // The codec parameter field honors the format laid out in RFC 6381:
73*3f982cf4SFabien Sanglard   // https://datatracker.ietf.org/doc/html/rfc6381.
74*3f982cf4SFabien Sanglard   std::string codec_parameter;
75*3f982cf4SFabien Sanglard };
76*3f982cf4SFabien Sanglard 
77*3f982cf4SFabien Sanglard struct AudioStream {
78*3f982cf4SFabien Sanglard   static Error TryParse(const Json::Value& root, AudioStream* out);
79*3f982cf4SFabien Sanglard   Json::Value ToJson() const;
80*3f982cf4SFabien Sanglard   bool IsValid() const;
81*3f982cf4SFabien Sanglard 
82*3f982cf4SFabien Sanglard   Stream stream;
83*3f982cf4SFabien Sanglard   AudioCodec codec = AudioCodec::kNotSpecified;
84*3f982cf4SFabien Sanglard   int bit_rate = 0;
85*3f982cf4SFabien Sanglard };
86*3f982cf4SFabien Sanglard 
87*3f982cf4SFabien Sanglard 
88*3f982cf4SFabien Sanglard struct VideoStream {
89*3f982cf4SFabien Sanglard   static Error TryParse(const Json::Value& root, VideoStream* out);
90*3f982cf4SFabien Sanglard   Json::Value ToJson() const;
91*3f982cf4SFabien Sanglard   bool IsValid() const;
92*3f982cf4SFabien Sanglard 
93*3f982cf4SFabien Sanglard   Stream stream;
94*3f982cf4SFabien Sanglard   VideoCodec codec = VideoCodec::kNotSpecified;
95*3f982cf4SFabien Sanglard   SimpleFraction max_frame_rate;
96*3f982cf4SFabien Sanglard   int max_bit_rate = 0;
97*3f982cf4SFabien Sanglard   std::string protection;
98*3f982cf4SFabien Sanglard   std::string profile;
99*3f982cf4SFabien Sanglard   std::string level;
100*3f982cf4SFabien Sanglard   std::vector<Resolution> resolutions;
101*3f982cf4SFabien Sanglard   std::string error_recovery_mode;
102*3f982cf4SFabien Sanglard };
103*3f982cf4SFabien Sanglard 
104*3f982cf4SFabien Sanglard struct Offer {
105*3f982cf4SFabien Sanglard   // TODO(jophba): remove deprecated declaration in a separate patch.
106*3f982cf4SFabien Sanglard   static ErrorOr<Offer> Parse(const Json::Value& root);
107*3f982cf4SFabien Sanglard   static Error TryParse(const Json::Value& root, Offer* out);
108*3f982cf4SFabien Sanglard   Json::Value ToJson() const;
109*3f982cf4SFabien Sanglard   bool IsValid() const;
110*3f982cf4SFabien Sanglard 
111*3f982cf4SFabien Sanglard   CastMode cast_mode = CastMode::kMirroring;
112*3f982cf4SFabien Sanglard   std::vector<AudioStream> audio_streams;
113*3f982cf4SFabien Sanglard   std::vector<VideoStream> video_streams;
114*3f982cf4SFabien Sanglard };
115*3f982cf4SFabien Sanglard 
116*3f982cf4SFabien Sanglard }  // namespace cast
117*3f982cf4SFabien Sanglard }  // namespace openscreen
118*3f982cf4SFabien Sanglard 
119*3f982cf4SFabien Sanglard #endif  // CAST_STREAMING_OFFER_MESSAGES_H_
120