Simplify some of the framing code. PiperOrigin-RevId: 680734084
diff --git a/quiche/quic/moqt/moqt_framer.cc b/quiche/quic/moqt/moqt_framer.cc index e7042e7..f17caf8 100644 --- a/quiche/quic/moqt/moqt_framer.cc +++ b/quiche/quic/moqt/moqt_framer.cc
@@ -8,6 +8,7 @@ #include <cstdint> #include <cstdlib> #include <optional> +#include <string> #include <type_traits> #include <utility> @@ -118,88 +119,55 @@ : list_(list) {} size_t GetLengthOnWire() { - uint64_t num_params = 0; - size_t length = 0; - if (list_.authorization_info.has_value()) { - ++num_params; - length += - WireStringParameter( - StringParameter(MoqtTrackRequestParameter::kAuthorizationInfo, - *list_.authorization_info)) - .GetLengthOnWire(); - } - if (list_.delivery_timeout.has_value()) { - ++num_params; - length += WireIntParameter( - IntParameter(MoqtTrackRequestParameter::kDeliveryTimeout, - static_cast<uint64_t>( - list_.delivery_timeout->ToMilliseconds()))) - .GetLengthOnWire(); - } - if (list_.max_cache_duration.has_value()) { - ++num_params; - length += - WireIntParameter( - IntParameter(MoqtTrackRequestParameter::kMaxCacheDuration, - static_cast<uint64_t>( - list_.max_cache_duration->ToMilliseconds()))) - .GetLengthOnWire(); - } - if (list_.object_ack_window.has_value()) { - ++num_params; - length += - WireIntParameter( - IntParameter(MoqtTrackRequestParameter::kOackWindowSize, - static_cast<uint64_t>( - list_.object_ack_window->ToMicroseconds()))) - .GetLengthOnWire(); - } - length += WireVarInt62(num_params).GetLengthOnWire(); - return length; + auto string_parameters = StringParameters(); + auto int_parameters = IntParameters(); + return quiche::ComputeLengthOnWire( + WireVarInt62(string_parameters.size() + int_parameters.size()), + WireSpan<WireStringParameter>(string_parameters), + WireSpan<WireIntParameter>(int_parameters)); } absl::Status SerializeIntoWriter(quiche::QuicheDataWriter& writer) { - uint64_t num_params = (list_.authorization_info.has_value() ? 1 : 0) + - (list_.delivery_timeout.has_value() ? 1 : 0) + - (list_.max_cache_duration.has_value() ? 1 : 0) + - (list_.object_ack_window.has_value() ? 1 : 0); - if (!writer.WriteVarInt62(num_params)) { - return absl::InternalError("Failed to serialize the length prefix"); - } - if (list_.authorization_info.has_value() && - WireStringParameter( - StringParameter(MoqtTrackRequestParameter::kAuthorizationInfo, - *list_.authorization_info)) - .SerializeIntoWriter(writer) != absl::OkStatus()) { - return absl::InternalError("Failed to serialize the authorization info"); - } - if (list_.delivery_timeout.has_value() && - WireIntParameter( - IntParameter(MoqtTrackRequestParameter::kDeliveryTimeout, - static_cast<uint64_t>( - list_.delivery_timeout->ToMilliseconds()))) - .SerializeIntoWriter(writer) != absl::OkStatus()) { - return absl::InternalError("Failed to serialize the delivery timeout"); - } - if (list_.max_cache_duration.has_value() && - WireIntParameter( - IntParameter(MoqtTrackRequestParameter::kMaxCacheDuration, - static_cast<uint64_t>( - list_.max_cache_duration->ToMilliseconds()))) - .SerializeIntoWriter(writer) != absl::OkStatus()) { - return absl::InternalError("Failed to serialize the max cache duration"); - } - if (list_.object_ack_window.has_value() && - WireIntParameter( - IntParameter(MoqtTrackRequestParameter::kOackWindowSize, - static_cast<uint64_t>( - list_.object_ack_window->ToMicroseconds()))) - .SerializeIntoWriter(writer) != absl::OkStatus()) { - return absl::InternalError("Failed to serialize the oack window size"); - } - return absl::OkStatus(); + auto string_parameters = StringParameters(); + auto int_parameters = IntParameters(); + return quiche::SerializeIntoWriter( + writer, WireVarInt62(string_parameters.size() + int_parameters.size()), + WireSpan<WireStringParameter>(string_parameters), + WireSpan<WireIntParameter>(int_parameters)); } private: + absl::InlinedVector<StringParameter, 1> StringParameters() const { + absl::InlinedVector<StringParameter, 1> result; + if (list_.authorization_info.has_value()) { + result.push_back( + StringParameter(MoqtTrackRequestParameter::kAuthorizationInfo, + *list_.authorization_info)); + } + return result; + } + absl::InlinedVector<IntParameter, 3> IntParameters() const { + absl::InlinedVector<IntParameter, 3> result; + if (list_.delivery_timeout.has_value()) { + QUICHE_DCHECK_GE(*list_.delivery_timeout, quic::QuicTimeDelta::Zero()); + result.push_back(IntParameter( + MoqtTrackRequestParameter::kDeliveryTimeout, + static_cast<uint64_t>(list_.delivery_timeout->ToMilliseconds()))); + } + if (list_.max_cache_duration.has_value()) { + QUICHE_DCHECK_GE(*list_.max_cache_duration, quic::QuicTimeDelta::Zero()); + result.push_back(IntParameter( + MoqtTrackRequestParameter::kMaxCacheDuration, + static_cast<uint64_t>(list_.max_cache_duration->ToMilliseconds()))); + } + if (list_.object_ack_window.has_value()) { + QUICHE_DCHECK_GE(*list_.object_ack_window, quic::QuicTimeDelta::Zero()); + result.push_back(IntParameter( + MoqtTrackRequestParameter::kOackWindowSize, + static_cast<uint64_t>(list_.object_ack_window->ToMicroseconds()))); + } + return result; + } + const MoqtSubscribeParameters& list_; }; @@ -213,30 +181,21 @@ : name_(name), includes_name_(includes_name) {} size_t GetLengthOnWire() { - const auto tuple = name_.tuple(); - size_t num_elements = includes_name_ ? (tuple.size() - 1) : tuple.size(); - size_t length = WireVarInt62(num_elements).GetLengthOnWire(); - for (const auto& element : tuple) { - length += WireStringWithVarInt62Length(element).GetLengthOnWire(); - } - return length; + return quiche::ComputeLengthOnWire( + WireVarInt62(num_elements()), + WireSpan<WireStringWithVarInt62Length, std::string>(name_.tuple())); } absl::Status SerializeIntoWriter(quiche::QuicheDataWriter& writer) { - const auto tuple = name_.tuple(); - size_t num_elements = includes_name_ ? (tuple.size() - 1) : tuple.size(); - if (!writer.WriteVarInt62(num_elements)) { - return absl::InternalError("Failed to serialize the length prefix"); - } - for (const auto& element : tuple) { - if (WireStringWithVarInt62Length(element).SerializeIntoWriter(writer) != - absl::OkStatus()) { - return absl::InternalError("Failed to serialize the element"); - } - } - return absl::OkStatus(); + return quiche::SerializeIntoWriter( + writer, WireVarInt62(num_elements()), + WireSpan<WireStringWithVarInt62Length, std::string>(name_.tuple())); } private: + size_t num_elements() const { + return includes_name_ ? (name_.tuple().size() - 1) : name_.tuple().size(); + } + const FullTrackName& name_; const bool includes_name_; };