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