| Index: media/cast/rtcp/rtcp_receiver.cc
|
| diff --git a/media/cast/rtcp/rtcp_receiver.cc b/media/cast/rtcp/rtcp_receiver.cc
|
| index 8c0e593d6e22a2c7332ad8aa2d8b309466901b15..9345d5850ae2377698ff4deb2b8cbe761dcb80ad 100644
|
| --- a/media/cast/rtcp/rtcp_receiver.cc
|
| +++ b/media/cast/rtcp/rtcp_receiver.cc
|
| @@ -10,35 +10,11 @@
|
|
|
| namespace {
|
|
|
| -media::cast::CastLoggingEvent TranslateToLogEventFromWireFormat(uint8 event) {
|
| - switch (event) {
|
| - case 1:
|
| - return media::cast::kAudioAckSent;
|
| - case 2:
|
| - return media::cast::kAudioPlayoutDelay;
|
| - case 3:
|
| - return media::cast::kAudioFrameDecoded;
|
| - case 4:
|
| - return media::cast::kAudioPacketReceived;
|
| - case 5:
|
| - return media::cast::kVideoAckSent;
|
| - case 6:
|
| - return media::cast::kVideoFrameDecoded;
|
| - case 7:
|
| - return media::cast::kVideoRenderDelay;
|
| - case 8:
|
| - return media::cast::kVideoPacketReceived;
|
| - case 9:
|
| - return media::cast::kDuplicateAudioPacketReceived;
|
| - case 10:
|
| - return media::cast::kDuplicateVideoPacketReceived;
|
| - default:
|
| - // If the sender adds new log messages we will end up here until we add
|
| - // the new messages in the receiver.
|
| - VLOG(1) << "Unexpected log message received: " << static_cast<int>(event);
|
| - NOTREACHED();
|
| - return media::cast::kUnknown;
|
| - }
|
| +bool IsRtcpPacketEvent(media::cast::CastLoggingEvent event_type) {
|
| + return event_type == media::cast::kAudioPacketReceived ||
|
| + event_type == media::cast::kVideoPacketReceived ||
|
| + event_type == media::cast::kDuplicateAudioPacketReceived ||
|
| + event_type == media::cast::kDuplicateVideoPacketReceived;
|
| }
|
|
|
| media::cast::transport::RtcpSenderFrameStatus
|
| @@ -61,15 +37,26 @@ TranslateToFrameStatusFromWireFormat(uint8 status) {
|
| }
|
| }
|
|
|
| -// A receiver event is identified by frame RTP timestamp, event timestamp and
|
| -// event type.
|
| -size_t HashReceiverEvent(uint32 frame_rtp_timestamp,
|
| - const base::TimeTicks& event_timestamp,
|
| - media::cast::CastLoggingEvent event_type) {
|
| +// A receiver frame event is identified by frame RTP timestamp, event timestamp
|
| +// and event type.
|
| +// A receiver packet event is identified by all of the above plus packet id.
|
| +// The key format is as follows:
|
| +// First uint64:
|
| +// bits 0-11: zeroes (unused).
|
| +// bits 12-15: event type ID.
|
| +// bits 16-31: packet ID if packet event, 0 otherwise.
|
| +// bits 32-63: RTP timestamp.
|
| +// Second uint64:
|
| +// bits 0-63: event TimeTicks internal value.
|
| +std::pair<uint64, uint64> GetReceiverEventKey(
|
| + uint32 frame_rtp_timestamp, const base::TimeTicks& event_timestamp,
|
| + uint8 event_type, uint16 packet_id_or_zero) {
|
| uint64 value1 = event_type;
|
| + value1 <<= 16;
|
| + value1 |= packet_id_or_zero;
|
| value1 <<= 32;
|
| value1 |= frame_rtp_timestamp;
|
| - return base::HashInts64(
|
| + return std::make_pair(
|
| value1, static_cast<uint64>(event_timestamp.ToInternalValue()));
|
| }
|
|
|
| @@ -490,8 +477,10 @@ void RtcpReceiver::HandleApplicationSpecificCastReceiverEventLog(
|
| RtcpReceiverEventLogMessages* event_log_messages) {
|
| const RtcpField& rtcp_field = rtcp_parser->Field();
|
|
|
| - const CastLoggingEvent event_type =
|
| - TranslateToLogEventFromWireFormat(rtcp_field.cast_receiver_log.event);
|
| + const uint8 event = rtcp_field.cast_receiver_log.event;
|
| + const CastLoggingEvent event_type = TranslateToLogEventFromWireFormat(event);
|
| + uint16 packet_id = IsRtcpPacketEvent(event_type) ?
|
| + rtcp_field.cast_receiver_log.delay_delta_or_packet_id.packet_id : 0;
|
| const base::TimeTicks event_timestamp =
|
| base::TimeTicks() +
|
| base::TimeDelta::FromMilliseconds(
|
| @@ -503,21 +492,19 @@ void RtcpReceiver::HandleApplicationSpecificCastReceiverEventLog(
|
| // a queue and a set of events. We enqueue every new event and insert it
|
| // into the set. When the queue becomes too big we remove the oldest event
|
| // from both the queue and the set.
|
| - // Different events may have the same hash value. That's okay because full
|
| - // accuracy is not important in this case.
|
| - const size_t event_hash =
|
| - HashReceiverEvent(frame_rtp_timestamp, event_timestamp, event_type);
|
| - if (receiver_event_hash_set_.find(event_hash) !=
|
| - receiver_event_hash_set_.end()) {
|
| + ReceiverEventKey key =
|
| + GetReceiverEventKey(
|
| + frame_rtp_timestamp, event_timestamp, event, packet_id);
|
| + if (receiver_event_key_set_.find(key) != receiver_event_key_set_.end()) {
|
| return;
|
| } else {
|
| - receiver_event_hash_set_.insert(event_hash);
|
| - receiver_event_hash_queue_.push(event_hash);
|
| + receiver_event_key_set_.insert(key);
|
| + receiver_event_key_queue_.push(key);
|
|
|
| - if (receiver_event_hash_queue_.size() > receiver_event_history_size_) {
|
| - const size_t oldest_hash = receiver_event_hash_queue_.front();
|
| - receiver_event_hash_queue_.pop();
|
| - receiver_event_hash_set_.erase(oldest_hash);
|
| + if (receiver_event_key_queue_.size() > receiver_event_history_size_) {
|
| + const ReceiverEventKey oldest_key = receiver_event_key_queue_.front();
|
| + receiver_event_key_queue_.pop();
|
| + receiver_event_key_set_.erase(oldest_key);
|
| }
|
| }
|
|
|
|
|