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