diff options
Diffstat (limited to 'cast/streaming/answer_messages.cc')
-rw-r--r-- | cast/streaming/answer_messages.cc | 165 |
1 files changed, 59 insertions, 106 deletions
diff --git a/cast/streaming/answer_messages.cc b/cast/streaming/answer_messages.cc index 906e8901..20af542f 100644 --- a/cast/streaming/answer_messages.cc +++ b/cast/streaming/answer_messages.cc @@ -9,9 +9,9 @@ #include "absl/strings/str_cat.h" #include "absl/strings/str_split.h" #include "platform/base/error.h" +#include "util/enum_name_table.h" #include "util/json/json_helpers.h" #include "util/osp_logging.h" - namespace openscreen { namespace cast { @@ -47,7 +47,7 @@ static constexpr char kMaxPixelsPerSecond[] = "maxPixelsPerSecond"; // Minimum dimensions. If omitted, the sender will assume a reasonable minimum // with the same aspect ratio as maxDimensions, as close to 320*180 as possible. // Should reflect the true operational minimum. -static constexpr char kMinDimensions[] = "minDimensions"; +static constexpr char kMinResolution[] = "minResolution"; // Maximum dimensions, not necessarily ideal dimensions. static constexpr char kMaxDimensions[] = "maxDimensions"; @@ -57,15 +57,6 @@ static constexpr char kMaxSampleRate[] = "maxSampleRate"; // Maximum number of audio channels (1 is mono, 2 is stereo, etc.). static constexpr char kMaxChannels[] = "maxChannels"; -/// Dimension properties. -// Width in pixels. -static constexpr char kWidth[] = "width"; -// Height in pixels. -static constexpr char kHeight[] = "height"; -// Frame rate as a rational decimal number or fraction. -// E.g. 30 and "3000/1001" are both valid representations. -static constexpr char kFrameRate[] = "frameRate"; - /// Display description properties // If this optional field is included in the ANSWER message, the receiver is // attached to a fixed display that has the given dimensions and frame rate @@ -115,41 +106,33 @@ static constexpr char kReceiverRtcpEventLog[] = "receiverRtcpEventLog"; // OPtional array of numbers specifying the indexes of streams that will use // DSCP values specified in the OFFER message for RTCP packets. static constexpr char kReceiverRtcpDscp[] = "receiverRtcpDscp"; -// True if receiver can report wifi status. -static constexpr char kReceiverGetStatus[] = "receiverGetStatus"; // If this optional field is present the receiver supports the specific // RTP extensions (such as adaptive playout delay). static constexpr char kRtpExtensions[] = "rtpExtensions"; +EnumNameTable<AspectRatioConstraint, 2> kAspectRatioConstraintNames{ + {{kScalingReceiver, AspectRatioConstraint::kVariable}, + {kScalingSender, AspectRatioConstraint::kFixed}}}; + Json::Value AspectRatioConstraintToJson(AspectRatioConstraint aspect_ratio) { - switch (aspect_ratio) { - case AspectRatioConstraint::kVariable: - return Json::Value(kScalingReceiver); - case AspectRatioConstraint::kFixed: - default: - return Json::Value(kScalingSender); - } + return Json::Value(GetEnumName(kAspectRatioConstraintNames, aspect_ratio) + .value(kScalingSender)); } -bool AspectRatioConstraintParseAndValidate(const Json::Value& value, - AspectRatioConstraint* out) { - // the aspect ratio constraint is an optional field. - if (!value) { - return true; - } - +bool TryParseAspectRatioConstraint(const Json::Value& value, + AspectRatioConstraint* out) { std::string aspect_ratio; - if (!json::ParseAndValidateString(value, &aspect_ratio)) { + if (!json::TryParseString(value, &aspect_ratio)) { return false; } - if (aspect_ratio == kScalingReceiver) { - *out = AspectRatioConstraint::kVariable; - return true; - } else if (aspect_ratio == kScalingSender) { - *out = AspectRatioConstraint::kFixed; - return true; + + ErrorOr<AspectRatioConstraint> constraint = + GetEnum(kAspectRatioConstraintNames, aspect_ratio); + if (constraint.is_error()) { + return false; } - return false; + *out = constraint.value(); + return true; } template <typename T> @@ -171,7 +154,7 @@ bool ParseOptional(const Json::Value& value, absl::optional<T>* out) { return true; } T tentative_out; - if (!T::ParseAndValidate(value, &tentative_out)) { + if (!T::TryParse(value, &tentative_out)) { return false; } *out = tentative_out; @@ -181,9 +164,9 @@ bool ParseOptional(const Json::Value& value, absl::optional<T>* out) { } // namespace // static -bool AspectRatio::ParseAndValidate(const Json::Value& value, AspectRatio* out) { +bool AspectRatio::TryParse(const Json::Value& value, AspectRatio* out) { std::string parsed_value; - if (!json::ParseAndValidateString(value, &parsed_value)) { + if (!json::TryParseString(value, &parsed_value)) { return false; } @@ -205,21 +188,20 @@ bool AspectRatio::IsValid() const { } // static -bool AudioConstraints::ParseAndValidate(const Json::Value& root, - AudioConstraints* out) { - if (!json::ParseAndValidateInt(root[kMaxSampleRate], - &(out->max_sample_rate)) || - !json::ParseAndValidateInt(root[kMaxChannels], &(out->max_channels)) || - !json::ParseAndValidateInt(root[kMaxBitRate], &(out->max_bit_rate))) { +bool AudioConstraints::TryParse(const Json::Value& root, + AudioConstraints* out) { + if (!json::TryParseInt(root[kMaxSampleRate], &(out->max_sample_rate)) || + !json::TryParseInt(root[kMaxChannels], &(out->max_channels)) || + !json::TryParseInt(root[kMaxBitRate], &(out->max_bit_rate))) { return false; } std::chrono::milliseconds max_delay; - if (json::ParseAndValidateMilliseconds(root[kMaxDelay], &max_delay)) { + if (json::TryParseMilliseconds(root[kMaxDelay], &max_delay)) { out->max_delay = max_delay; } - if (!json::ParseAndValidateInt(root[kMinBitRate], &(out->min_bit_rate))) { + if (!json::TryParseInt(root[kMinBitRate], &(out->min_bit_rate))) { out->min_bit_rate = kDefaultAudioMinBitRate; } return out->IsValid(); @@ -243,52 +225,27 @@ bool AudioConstraints::IsValid() const { max_bit_rate >= min_bit_rate; } -bool Dimensions::ParseAndValidate(const Json::Value& root, Dimensions* out) { - if (!json::ParseAndValidateInt(root[kWidth], &(out->width)) || - !json::ParseAndValidateInt(root[kHeight], &(out->height)) || - !json::ParseAndValidateSimpleFraction(root[kFrameRate], - &(out->frame_rate))) { - return false; - } - return out->IsValid(); -} - -bool Dimensions::IsValid() const { - return width > 0 && height > 0 && frame_rate.is_positive(); -} - -Json::Value Dimensions::ToJson() const { - OSP_DCHECK(IsValid()); - Json::Value root; - root[kWidth] = width; - root[kHeight] = height; - root[kFrameRate] = frame_rate.ToString(); - return root; -} - // static -bool VideoConstraints::ParseAndValidate(const Json::Value& root, - VideoConstraints* out) { - if (!Dimensions::ParseAndValidate(root[kMaxDimensions], - &(out->max_dimensions)) || - !json::ParseAndValidateInt(root[kMaxBitRate], &(out->max_bit_rate)) || - !ParseOptional<Dimensions>(root[kMinDimensions], - &(out->min_dimensions))) { +bool VideoConstraints::TryParse(const Json::Value& root, + VideoConstraints* out) { + if (!Dimensions::TryParse(root[kMaxDimensions], &(out->max_dimensions)) || + !json::TryParseInt(root[kMaxBitRate], &(out->max_bit_rate)) || + !ParseOptional<Dimensions>(root[kMinResolution], + &(out->min_resolution))) { return false; } std::chrono::milliseconds max_delay; - if (json::ParseAndValidateMilliseconds(root[kMaxDelay], &max_delay)) { + if (json::TryParseMilliseconds(root[kMaxDelay], &max_delay)) { out->max_delay = max_delay; } double max_pixels_per_second; - if (json::ParseAndValidateDouble(root[kMaxPixelsPerSecond], - &max_pixels_per_second)) { + if (json::TryParseDouble(root[kMaxPixelsPerSecond], &max_pixels_per_second)) { out->max_pixels_per_second = max_pixels_per_second; } - if (!json::ParseAndValidateInt(root[kMinBitRate], &(out->min_bit_rate))) { + if (!json::TryParseInt(root[kMinBitRate], &(out->min_bit_rate))) { out->min_bit_rate = kDefaultVideoMinBitRate; } return out->IsValid(); @@ -299,8 +256,8 @@ bool VideoConstraints::IsValid() const { max_bit_rate > min_bit_rate && (!max_delay.has_value() || max_delay->count() > 0) && max_dimensions.IsValid() && - (!min_dimensions.has_value() || min_dimensions->IsValid()) && - max_dimensions.frame_rate.numerator > 0; + (!min_resolution.has_value() || min_resolution->IsValid()) && + max_dimensions.frame_rate.numerator() > 0; } Json::Value VideoConstraints::ToJson() const { @@ -313,8 +270,8 @@ Json::Value VideoConstraints::ToJson() const { root[kMaxPixelsPerSecond] = max_pixels_per_second.value(); } - if (min_dimensions.has_value()) { - root[kMinDimensions] = min_dimensions->ToJson(); + if (min_resolution.has_value()) { + root[kMinResolution] = min_resolution->ToJson(); } if (max_delay.has_value()) { @@ -324,9 +281,9 @@ Json::Value VideoConstraints::ToJson() const { } // static -bool Constraints::ParseAndValidate(const Json::Value& root, Constraints* out) { - if (!AudioConstraints::ParseAndValidate(root[kAudio], &(out->audio)) || - !VideoConstraints::ParseAndValidate(root[kVideo], &(out->video))) { +bool Constraints::TryParse(const Json::Value& root, Constraints* out) { + if (!AudioConstraints::TryParse(root[kAudio], &(out->audio)) || + !VideoConstraints::TryParse(root[kVideo], &(out->video))) { return false; } return out->IsValid(); @@ -345,15 +302,15 @@ Json::Value Constraints::ToJson() const { } // static -bool DisplayDescription::ParseAndValidate(const Json::Value& root, - DisplayDescription* out) { +bool DisplayDescription::TryParse(const Json::Value& root, + DisplayDescription* out) { if (!ParseOptional<Dimensions>(root[kDimensions], &(out->dimensions)) || !ParseOptional<AspectRatio>(root[kAspectRatio], &(out->aspect_ratio))) { return false; } AspectRatioConstraint constraint; - if (AspectRatioConstraintParseAndValidate(root[kScaling], &constraint)) { + if (TryParseAspectRatioConstraint(root[kScaling], &constraint)) { out->aspect_ratio_constraint = absl::optional<AspectRatioConstraint>(std::move(constraint)); } else { @@ -402,28 +359,25 @@ Json::Value DisplayDescription::ToJson() const { return root; } -bool Answer::ParseAndValidate(const Json::Value& root, Answer* out) { - if (!json::ParseAndValidateInt(root[kUdpPort], &(out->udp_port)) || - !json::ParseAndValidateIntArray(root[kSendIndexes], - &(out->send_indexes)) || - !json::ParseAndValidateUintArray(root[kSsrcs], &(out->ssrcs)) || +bool Answer::ParseAndValidate(const Json::Value& value, Answer* out) { + return TryParse(value, out); +} + +bool Answer::TryParse(const Json::Value& root, Answer* out) { + if (!json::TryParseInt(root[kUdpPort], &(out->udp_port)) || + !json::TryParseIntArray(root[kSendIndexes], &(out->send_indexes)) || + !json::TryParseUintArray(root[kSsrcs], &(out->ssrcs)) || !ParseOptional<Constraints>(root[kConstraints], &(out->constraints)) || !ParseOptional<DisplayDescription>(root[kDisplay], &(out->display))) { return false; } - if (!json::ParseBool(root[kReceiverGetStatus], - &(out->supports_wifi_status_reporting))) { - out->supports_wifi_status_reporting = false; - } // These function set to empty array if not present, so we can ignore // the return value for optional values. - json::ParseAndValidateIntArray(root[kReceiverRtcpEventLog], - &(out->receiver_rtcp_event_log)); - json::ParseAndValidateIntArray(root[kReceiverRtcpDscp], - &(out->receiver_rtcp_dscp)); - json::ParseAndValidateStringArray(root[kRtpExtensions], - &(out->rtp_extensions)); + json::TryParseIntArray(root[kReceiverRtcpEventLog], + &(out->receiver_rtcp_event_log)); + json::TryParseIntArray(root[kReceiverRtcpDscp], &(out->receiver_rtcp_dscp)); + json::TryParseStringArray(root[kRtpExtensions], &(out->rtp_extensions)); return out->IsValid(); } @@ -459,7 +413,6 @@ Json::Value Answer::ToJson() const { root[kDisplay] = display->ToJson(); } root[kUdpPort] = udp_port; - root[kReceiverGetStatus] = supports_wifi_status_reporting; root[kSendIndexes] = PrimitiveVectorToJson(send_indexes); root[kSsrcs] = PrimitiveVectorToJson(ssrcs); // Some sender do not handle empty array properly, so we omit these fields |