You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.1 KiB
63 lines
2.1 KiB
// 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 <utility>
|
|
|
|
#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 <typename Integer>
|
|
inline Integer ConsumeField(absl::Span<const uint8_t>* in) {
|
|
const Integer result = ReadBigEndian<Integer>(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 <typename Integer>
|
|
inline void AppendField(Integer value, absl::Span<uint8_t>* out) {
|
|
WriteBigEndian<Integer>(value, out->data());
|
|
out->remove_prefix(sizeof(Integer));
|
|
}
|
|
|
|
// Returns a bitmask for a field having the given number of bits. For example,
|
|
// FieldBitmask<uint8_t>(5) returns 0b00011111.
|
|
template <typename Integer>
|
|
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<uint8_t> ReserveSpace(int num_bytes,
|
|
absl::Span<uint8_t>* out) {
|
|
const absl::Span<uint8_t> 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<ApparentPacketType, Ssrc> InspectPacketForRouting(
|
|
absl::Span<const uint8_t> packet);
|
|
|
|
} // namespace cast
|
|
} // namespace openscreen
|
|
|
|
#endif // CAST_STREAMING_PACKET_UTIL_H_
|