blob: 3c66829c6b4392e2f7161c2757c7e75f63a80fd6 [file] [log] [blame]
// 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.
#include "absl/types/optional.h"
#include "absl/types/span.h"
#include "cast/streaming/rtcp_common.h"
#include "cast/streaming/rtcp_session.h"
#include "cast/streaming/rtp_defines.h"
#include "cast/streaming/rtp_time.h"
namespace openscreen {
namespace cast {
// Parses RTCP packets from a Sender to extract Sender Reports. Ignores anything
// else, since that is all a Receiver would be interested in.
class SenderReportParser {
// Returned by Parse(), to also separately expose the StatusReportId. The
// report ID isn't included in the common RtcpSenderReport struct because it's
// not an input to SenderReportBuilder (it is generated by the builder).
struct SenderReportWithId : public RtcpSenderReport {
StatusReportId report_id{};
explicit SenderReportParser(RtcpSession* session);
// Parses the RTCP |packet|, and returns a parsed sender report if the packet
// contained one. Returns nullopt if the data is corrupt or the packet did not
// contain a sender report.
absl::optional<SenderReportWithId> Parse(absl::Span<const uint8_t> packet);
RtcpSession* const session_;
// Tracks the recently-parsed RTP timestamps so that the truncated values can
// be re-expanded into full-form.
RtpTimeTicks last_parsed_rtp_timestamp_;
} // namespace cast
} // namespace openscreen