// Copyright 2013 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_RTCP_RTCP_DEFINES_H_
#define MEDIA_CAST_RTCP_RTCP_DEFINES_H_
#include <list>
#include <map>
#include <set>
#include "media/cast/cast_config.h"
#include "media/cast/cast_defines.h"
#include "media/cast/logging/logging_defines.h"
namespace media {
namespace cast {
// Handle the per frame ACK and NACK messages.
class RtcpCastMessage {
public:
explicit RtcpCastMessage(uint32 media_ssrc);
~RtcpCastMessage();
uint32 media_ssrc_;
uint32 ack_frame_id_;
MissingFramesAndPacketsMap missing_frames_and_packets_;
};
// Log messages form sender to receiver.
enum RtcpSenderFrameStatus {
kRtcpSenderFrameStatusUnknown = 0,
kRtcpSenderFrameStatusDroppedByEncoder = 1,
kRtcpSenderFrameStatusDroppedByFlowControl = 2,
kRtcpSenderFrameStatusSentToNetwork = 3,
};
struct RtcpSenderFrameLogMessage {
RtcpSenderFrameStatus frame_status;
uint32 rtp_timestamp;
};
typedef std::list<RtcpSenderFrameLogMessage> RtcpSenderLogMessage;
// Log messages from receiver to sender.
struct RtcpReceiverEventLogMessage {
CastLoggingEvent type;
base::TimeTicks event_timestamp;
base::TimeDelta delay_delta;
uint16 packet_id;
};
typedef std::list<RtcpReceiverEventLogMessage> RtcpReceiverEventLogMessages;
class RtcpReceiverFrameLogMessage {
public:
explicit RtcpReceiverFrameLogMessage(uint32 rtp_timestamp);
~RtcpReceiverFrameLogMessage();
uint32 rtp_timestamp_;
RtcpReceiverEventLogMessages event_log_messages_;
};
typedef std::list<RtcpReceiverFrameLogMessage> RtcpReceiverLogMessage;
struct RtcpSenderInfo {
// First three members are used for lipsync.
// First two members are used for rtt.
uint32 ntp_seconds;
uint32 ntp_fraction;
uint32 rtp_timestamp;
uint32 send_packet_count;
size_t send_octet_count;
};
struct RtcpReportBlock {
uint32 remote_ssrc; // SSRC of sender of this report.
uint32 media_ssrc; // SSRC of the RTP packet sender.
uint8 fraction_lost;
uint32 cumulative_lost; // 24 bits valid.
uint32 extended_high_sequence_number;
uint32 jitter;
uint32 last_sr;
uint32 delay_since_last_sr;
};
struct RtcpRpsiMessage {
uint32 remote_ssrc;
uint8 payload_type;
uint64 picture_id;
};
class RtcpNackMessage {
public:
RtcpNackMessage();
~RtcpNackMessage();
uint32 remote_ssrc;
std::list<uint16> nack_list;
};
class RtcpRembMessage {
public:
RtcpRembMessage();
~RtcpRembMessage();
uint32 remb_bitrate;
std::list<uint32> remb_ssrcs;
};
struct RtcpReceiverReferenceTimeReport {
uint32 remote_ssrc;
uint32 ntp_seconds;
uint32 ntp_fraction;
};
struct RtcpDlrrReportBlock {
uint32 last_rr;
uint32 delay_since_last_rr;
};
inline bool operator==(RtcpReportBlock lhs, RtcpReportBlock rhs) {
return lhs.remote_ssrc == rhs.remote_ssrc &&
lhs.media_ssrc == rhs.media_ssrc &&
lhs.fraction_lost == rhs.fraction_lost &&
lhs.cumulative_lost == rhs.cumulative_lost &&
lhs.extended_high_sequence_number == rhs.extended_high_sequence_number &&
lhs.jitter == rhs.jitter &&
lhs.last_sr == rhs.last_sr &&
lhs.delay_since_last_sr == rhs.delay_since_last_sr;
}
inline bool operator==(RtcpSenderInfo lhs, RtcpSenderInfo rhs) {
return lhs.ntp_seconds == rhs.ntp_seconds &&
lhs.ntp_fraction == rhs.ntp_fraction &&
lhs.rtp_timestamp == rhs.rtp_timestamp &&
lhs.send_packet_count == rhs.send_packet_count &&
lhs.send_octet_count == rhs.send_octet_count;
}
inline bool operator==(RtcpReceiverReferenceTimeReport lhs,
RtcpReceiverReferenceTimeReport rhs) {
return lhs.remote_ssrc == rhs.remote_ssrc &&
lhs.ntp_seconds == rhs.ntp_seconds &&
lhs.ntp_fraction == rhs.ntp_fraction;
}
} // namespace cast
} // namespace media
#endif // MEDIA_CAST_RTCP_RTCP_DEFINES_H_