blob: b8c4ca43da294787c5ab9e7749f5f591021203fe [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CAST_STREAMING_IMPL_SENDER_REPORT_PARSER_H_
#define CAST_STREAMING_IMPL_SENDER_REPORT_PARSER_H_
#include <optional>
#include "cast/streaming/impl/rtcp_common.h"
#include "cast/streaming/impl/rtcp_session.h"
#include "cast/streaming/impl/rtp_defines.h"
#include "cast/streaming/rtp_time.h"
#include "platform/base/span.h"
namespace openscreen::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 {
public:
// 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 {
SenderReportWithId();
~SenderReportWithId();
StatusReportId report_id{};
};
explicit SenderReportParser(RtcpSession& session);
~SenderReportParser();
// 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.
std::optional<SenderReportWithId> Parse(ByteView packet);
private:
RtcpSession& 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 openscreen::cast
#endif // CAST_STREAMING_IMPL_SENDER_REPORT_PARSER_H_