// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CAST_STREAMING_PACKET_UTIL_H_ #define CAST_STREAMING_PACKET_UTIL_H_ #include #include "absl/types/span.h" #include "cast/streaming/ssrc.h" #include "util/big_endian.h" namespace openscreen { namespace cast { // Reads a field from the start of the given span and advances the span to point // just after the field. template inline Integer ConsumeField(absl::Span* in) { const Integer result = ReadBigEndian(in->data()); in->remove_prefix(sizeof(Integer)); return result; } // Writes a field at the start of the given span and advances the span to point // just after the field. template inline void AppendField(Integer value, absl::Span* out) { WriteBigEndian(value, out->data()); out->remove_prefix(sizeof(Integer)); } // Returns a bitmask for a field having the given number of bits. For example, // FieldBitmask(5) returns 0b00011111. template constexpr Integer FieldBitmask(unsigned field_size_in_bits) { return (Integer{1} << field_size_in_bits) - 1; } // Reserves |num_bytes| from the beginning of the given span, returning the // reserved space. inline absl::Span ReserveSpace(int num_bytes, absl::Span* out) { const absl::Span reserved = out->subspan(0, num_bytes); out->remove_prefix(num_bytes); return reserved; } // Performs a quick-scan of the packet data for the purposes of routing it to an // appropriate parser. Identifies whether the packet is a RTP packet, RTCP // packet, or unknown; and provides the originator's SSRC. This only performs a // very quick scan of the packet data, and does not guarantee that a full parse // will later succeed. enum class ApparentPacketType { UNKNOWN, RTP, RTCP }; std::pair InspectPacketForRouting( absl::Span packet); } // namespace cast } // namespace openscreen #endif // CAST_STREAMING_PACKET_UTIL_H_