xref: /aosp_15_r20/external/openscreen/cast/streaming/receiver_message.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2020 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_RECEIVER_MESSAGE_H_
6*3f982cf4SFabien Sanglard #define CAST_STREAMING_RECEIVER_MESSAGE_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <memory>
9*3f982cf4SFabien Sanglard #include <string>
10*3f982cf4SFabien Sanglard #include <vector>
11*3f982cf4SFabien Sanglard 
12*3f982cf4SFabien Sanglard #include "absl/types/variant.h"
13*3f982cf4SFabien Sanglard #include "cast/streaming/answer_messages.h"
14*3f982cf4SFabien Sanglard #include "json/value.h"
15*3f982cf4SFabien Sanglard #include "util/osp_logging.h"
16*3f982cf4SFabien Sanglard 
17*3f982cf4SFabien Sanglard namespace openscreen {
18*3f982cf4SFabien Sanglard namespace cast {
19*3f982cf4SFabien Sanglard 
20*3f982cf4SFabien Sanglard enum class MediaCapability {
21*3f982cf4SFabien Sanglard   kAudio,
22*3f982cf4SFabien Sanglard   kAac,
23*3f982cf4SFabien Sanglard   kOpus,
24*3f982cf4SFabien Sanglard   kVideo,
25*3f982cf4SFabien Sanglard   k4k,
26*3f982cf4SFabien Sanglard   kH264,
27*3f982cf4SFabien Sanglard   kVp8,
28*3f982cf4SFabien Sanglard   kVp9,
29*3f982cf4SFabien Sanglard   kHevc,
30*3f982cf4SFabien Sanglard   kAv1
31*3f982cf4SFabien Sanglard };
32*3f982cf4SFabien Sanglard 
33*3f982cf4SFabien Sanglard struct ReceiverCapability {
34*3f982cf4SFabien Sanglard   static constexpr int kRemotingVersionUnknown = -1;
35*3f982cf4SFabien Sanglard 
36*3f982cf4SFabien Sanglard   Json::Value ToJson() const;
37*3f982cf4SFabien Sanglard   static ErrorOr<ReceiverCapability> Parse(const Json::Value& value);
38*3f982cf4SFabien Sanglard 
39*3f982cf4SFabien Sanglard   // The remoting version that the receiver uses.
40*3f982cf4SFabien Sanglard   int remoting_version = kRemotingVersionUnknown;
41*3f982cf4SFabien Sanglard 
42*3f982cf4SFabien Sanglard   // Set of capabilities (e.g., ac3, 4k, hevc, vp9, dolby_vision, etc.).
43*3f982cf4SFabien Sanglard   std::vector<MediaCapability> media_capabilities;
44*3f982cf4SFabien Sanglard };
45*3f982cf4SFabien Sanglard 
46*3f982cf4SFabien Sanglard struct ReceiverError {
47*3f982cf4SFabien Sanglard   Json::Value ToJson() const;
48*3f982cf4SFabien Sanglard   static ErrorOr<ReceiverError> Parse(const Json::Value& value);
49*3f982cf4SFabien Sanglard 
50*3f982cf4SFabien Sanglard   // Error code.
51*3f982cf4SFabien Sanglard   // TODO(issuetracker.google.com/184766188): Error codes should be well
52*3f982cf4SFabien Sanglard   // defined.
53*3f982cf4SFabien Sanglard   int32_t code = -1;
54*3f982cf4SFabien Sanglard 
55*3f982cf4SFabien Sanglard   // Error description.
56*3f982cf4SFabien Sanglard   std::string description;
57*3f982cf4SFabien Sanglard };
58*3f982cf4SFabien Sanglard 
59*3f982cf4SFabien Sanglard struct ReceiverMessage {
60*3f982cf4SFabien Sanglard  public:
61*3f982cf4SFabien Sanglard   // Receiver response message type.
62*3f982cf4SFabien Sanglard   enum class Type {
63*3f982cf4SFabien Sanglard     // Unknown message type.
64*3f982cf4SFabien Sanglard     kUnknown,
65*3f982cf4SFabien Sanglard 
66*3f982cf4SFabien Sanglard     // Response to OFFER message.
67*3f982cf4SFabien Sanglard     kAnswer,
68*3f982cf4SFabien Sanglard 
69*3f982cf4SFabien Sanglard     // Response to GET_CAPABILITIES message.
70*3f982cf4SFabien Sanglard     kCapabilitiesResponse,
71*3f982cf4SFabien Sanglard 
72*3f982cf4SFabien Sanglard     // Rpc binary messages. The payload is base64-encoded.
73*3f982cf4SFabien Sanglard     kRpc,
74*3f982cf4SFabien Sanglard   };
75*3f982cf4SFabien Sanglard 
76*3f982cf4SFabien Sanglard   static ErrorOr<ReceiverMessage> Parse(const Json::Value& value);
77*3f982cf4SFabien Sanglard   ErrorOr<Json::Value> ToJson() const;
78*3f982cf4SFabien Sanglard 
79*3f982cf4SFabien Sanglard   Type type = Type::kUnknown;
80*3f982cf4SFabien Sanglard 
81*3f982cf4SFabien Sanglard   int32_t sequence_number = -1;
82*3f982cf4SFabien Sanglard 
83*3f982cf4SFabien Sanglard   bool valid = false;
84*3f982cf4SFabien Sanglard 
85*3f982cf4SFabien Sanglard   absl::variant<absl::monostate,
86*3f982cf4SFabien Sanglard                 Answer,
87*3f982cf4SFabien Sanglard                 std::vector<uint8_t>,  // Binary-encoded RPC message.
88*3f982cf4SFabien Sanglard                 ReceiverCapability,
89*3f982cf4SFabien Sanglard                 ReceiverError>
90*3f982cf4SFabien Sanglard       body;
91*3f982cf4SFabien Sanglard };
92*3f982cf4SFabien Sanglard 
93*3f982cf4SFabien Sanglard }  // namespace cast
94*3f982cf4SFabien Sanglard }  // namespace openscreen
95*3f982cf4SFabien Sanglard 
96*3f982cf4SFabien Sanglard #endif  // CAST_STREAMING_RECEIVER_MESSAGE_H_
97