xref: /aosp_15_r20/external/openscreen/cast/streaming/rtp_packet_parser.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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_RTP_PACKET_PARSER_H_
6*3f982cf4SFabien Sanglard #define CAST_STREAMING_RTP_PACKET_PARSER_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <chrono>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include "absl/types/optional.h"
11*3f982cf4SFabien Sanglard #include "absl/types/span.h"
12*3f982cf4SFabien Sanglard #include "cast/streaming/frame_id.h"
13*3f982cf4SFabien Sanglard #include "cast/streaming/rtp_defines.h"
14*3f982cf4SFabien Sanglard #include "cast/streaming/rtp_time.h"
15*3f982cf4SFabien Sanglard #include "cast/streaming/ssrc.h"
16*3f982cf4SFabien Sanglard 
17*3f982cf4SFabien Sanglard namespace openscreen {
18*3f982cf4SFabien Sanglard namespace cast {
19*3f982cf4SFabien Sanglard 
20*3f982cf4SFabien Sanglard // Parses RTP packets for all frames in the same Cast RTP stream. One
21*3f982cf4SFabien Sanglard // RtpPacketParser instance should be used for all RTP packets having the same
22*3f982cf4SFabien Sanglard // SSRC.
23*3f982cf4SFabien Sanglard //
24*3f982cf4SFabien Sanglard // Note that the parser is not stateless: One of its responsibilities is to
25*3f982cf4SFabien Sanglard // bit-expand values that exist in a truncated form within the packets. It
26*3f982cf4SFabien Sanglard // tracks the progression of those values in a live system to re-constitute such
27*3f982cf4SFabien Sanglard // values.
28*3f982cf4SFabien Sanglard class RtpPacketParser {
29*3f982cf4SFabien Sanglard  public:
30*3f982cf4SFabien Sanglard   struct ParseResult {
31*3f982cf4SFabien Sanglard     // Elements from RTP packet header.
32*3f982cf4SFabien Sanglard     // https://tools.ietf.org/html/rfc3550#section-5
33*3f982cf4SFabien Sanglard     RtpPayloadType payload_type;
34*3f982cf4SFabien Sanglard     uint16_t sequence_number;    // Wrap-around packet transmission counter.
35*3f982cf4SFabien Sanglard     RtpTimeTicks rtp_timestamp;  // The media timestamp.
36*3f982cf4SFabien Sanglard 
37*3f982cf4SFabien Sanglard     // Elements from Cast header (at beginning of RTP payload).
38*3f982cf4SFabien Sanglard     bool is_key_frame;
39*3f982cf4SFabien Sanglard     FrameId frame_id;
40*3f982cf4SFabien Sanglard     FramePacketId packet_id;  // Always in the range [0,max_packet_id].
41*3f982cf4SFabien Sanglard     FramePacketId max_packet_id;
42*3f982cf4SFabien Sanglard     FrameId referenced_frame_id;  // ID of frame required to decode this one.
43*3f982cf4SFabien Sanglard     std::chrono::milliseconds new_playout_delay{};  // Ignore if non-positive.
44*3f982cf4SFabien Sanglard 
45*3f982cf4SFabien Sanglard     // Portion of the |packet| that was passed into Parse() that contains the
46*3f982cf4SFabien Sanglard     // payload. WARNING: This memory region is only valid while the original
47*3f982cf4SFabien Sanglard     // |packet| memory remains valid.
48*3f982cf4SFabien Sanglard     absl::Span<const uint8_t> payload;
49*3f982cf4SFabien Sanglard 
50*3f982cf4SFabien Sanglard     ParseResult();
51*3f982cf4SFabien Sanglard     ~ParseResult();
52*3f982cf4SFabien Sanglard   };
53*3f982cf4SFabien Sanglard 
54*3f982cf4SFabien Sanglard   explicit RtpPacketParser(Ssrc sender_ssrc);
55*3f982cf4SFabien Sanglard   ~RtpPacketParser();
56*3f982cf4SFabien Sanglard 
57*3f982cf4SFabien Sanglard   // Parses the packet. The caller should use InspectPacketForRouting()
58*3f982cf4SFabien Sanglard   // beforehand to ensure that the packet is meant to be parsed by this
59*3f982cf4SFabien Sanglard   // instance. Returns absl::nullopt if the |packet| was corrupt.
60*3f982cf4SFabien Sanglard   absl::optional<ParseResult> Parse(absl::Span<const uint8_t> packet);
61*3f982cf4SFabien Sanglard 
62*3f982cf4SFabien Sanglard  private:
63*3f982cf4SFabien Sanglard   const Ssrc sender_ssrc_;
64*3f982cf4SFabien Sanglard 
65*3f982cf4SFabien Sanglard   // Tracks recently-parsed RTP timestamps so that the truncated values can be
66*3f982cf4SFabien Sanglard   // re-expanded into full-form.
67*3f982cf4SFabien Sanglard   RtpTimeTicks last_parsed_rtp_timestamp_;
68*3f982cf4SFabien Sanglard 
69*3f982cf4SFabien Sanglard   // The highest frame ID seen in any RTP packets so far. This is tracked so
70*3f982cf4SFabien Sanglard   // that the truncated frame ID fields in RTP packets can be re-expanded into
71*3f982cf4SFabien Sanglard   // full-form.
72*3f982cf4SFabien Sanglard   FrameId highest_rtp_frame_id_;
73*3f982cf4SFabien Sanglard };
74*3f982cf4SFabien Sanglard 
75*3f982cf4SFabien Sanglard }  // namespace cast
76*3f982cf4SFabien Sanglard }  // namespace openscreen
77*3f982cf4SFabien Sanglard 
78*3f982cf4SFabien Sanglard #endif  // CAST_STREAMING_RTP_PACKET_PARSER_H_
79