blob: 579a4d2ff13a7970d2c69ec3a7148b1f770a4e3d [file] [log] [blame]
// Copyright 2015 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 MEDIA_CAST_NET_RTCP_RECEIVER_RTCP_SESSION_H_
#define MEDIA_CAST_NET_RTCP_RECEIVER_RTCP_SESSION_H_
#include "base/time/tick_clock.h"
#include "media/cast/common/clock_drift_smoother.h"
#include "media/cast/net/pacing/paced_sender.h"
#include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h"
#include "media/cast/net/rtcp/rtcp_defines.h"
#include "media/cast/net/rtcp/rtcp_session.h"
#include "media/cast/net/rtcp/rtcp_utility.h"
namespace media {
namespace cast {
// The RTCP session on a receiver handles incoming RTCP SR packets and maintains
// the offset of local clock from the remote clock and lip sync info (RTP
// & NTP timestamps).
class ReceiverRtcpSession : public RtcpSession {
public:
ReceiverRtcpSession(const base::TickClock* clock, // Not owned.
uint32_t local_ssrc,
uint32_t remote_ssrc);
ReceiverRtcpSession(const ReceiverRtcpSession&) = delete;
ReceiverRtcpSession& operator=(const ReceiverRtcpSession&) = delete;
~ReceiverRtcpSession() override;
uint32_t local_ssrc() const { return local_ssrc_; }
uint32_t remote_ssrc() const { return remote_ssrc_; }
// Handle incoming RTCP packet.
// Returns false if it is not a RTCP packet or it is not directed to
// this session, e.g. SSRC doesn't match.
bool IncomingRtcpPacket(const uint8_t* data, size_t length) override;
// If available, returns true and sets the output arguments to the latest
// lip-sync timestamps gleaned from the sender reports. While the sender
// provides reference NTP times relative to its own wall clock, the
// |reference_time| returned here has been translated to the local
// CastEnvironment clock.
bool GetLatestLipSyncTimes(RtpTimeTicks* rtp_timestamp,
base::TimeTicks* reference_time) const;
uint32_t last_report_truncated_ntp() const {
return last_report_truncated_ntp_;
}
base::TimeTicks time_last_report_received() const {
return time_last_report_received_;
}
private:
// Received NTP timestamps from RTCP SR packets.
void OnReceivedNtp(uint32_t ntp_seconds, uint32_t ntp_fraction);
// Received RTP and NTP timestamps from RTCP SR packets.
void OnReceivedLipSyncInfo(RtpTimeTicks rtp_timestamp,
uint32_t ntp_seconds,
uint32_t ntp_fraction);
const base::TickClock* const clock_; // Not owned.
const uint32_t local_ssrc_;
const uint32_t remote_ssrc_;
// The truncated (i.e., 64-->32-bit) NTP timestamp provided in the last report
// from the remote peer, along with the local time at which the report was
// received. These values are used for ping-pong'ing NTP timestamps between
// the peers so that they can estimate the network's round-trip time.
uint32_t last_report_truncated_ntp_;
base::TimeTicks time_last_report_received_;
// Maintains a smoothed offset between the local clock and the remote clock.
// Calling this member's Current() method is only valid if
// |time_last_report_received_| has a valid value.
ClockDriftSmoother local_clock_ahead_by_;
// Latest "lip sync" info from the sender. The sender provides the RTP
// timestamp of some frame of its choosing and also a corresponding reference
// NTP timestamp sampled from a clock common to all media streams. It is
// expected that the sender will update this data regularly and in a timely
// manner (e.g., about once per second).
RtpTimeTicks lip_sync_rtp_timestamp_;
uint64_t lip_sync_ntp_timestamp_;
// The RTCP packet parser is re-used when parsing each RTCP packet. It
// remembers state about prior RTP timestamps and other sequence values to
// re-construct "expanded" values.
RtcpParser parser_;
};
} // namespace cast
} // namespace media
#endif // MEDIA_CAST_NET_RTCP_RECEIVER_RTCP_SESSION_H_