Index: webrtc/logging/rtc_event_log/rtc_event_log_parser.cc |
diff --git a/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc b/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc |
index d2cdcd5b5dda623aeee6444cfb909b1f7a336b31..78dd4fdce782428e6c24d267f1a7a655f6136030 100644 |
--- a/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc |
+++ b/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc |
@@ -158,6 +158,12 @@ bool ParsedRtcEventLog::ParseStream(std::istream& stream) { |
// Check whether we have reached end of file. |
stream.peek(); |
if (stream.eof()) { |
+ // Process all extensions maps for faster look-up later. |
+ for (auto& event_stream : streams_) { |
+ rtp_extensions_maps_[StreamId(event_stream.ssrc, |
+ event_stream.direction)] = |
+ &event_stream.rtp_extensions_map; |
+ } |
return true; |
} |
@@ -204,34 +210,41 @@ bool ParsedRtcEventLog::ParseStream(std::istream& stream) { |
case VIDEO_RECEIVER_CONFIG_EVENT: { |
rtclog::StreamConfig config = GetVideoReceiveConfig(event); |
streams_.emplace_back(config.remote_ssrc, MediaType::VIDEO, |
- kIncomingPacket); |
+ kIncomingPacket, |
+ RtpHeaderExtensionMap(config.rtp_extensions)); |
streams_.emplace_back(config.local_ssrc, MediaType::VIDEO, |
- kOutgoingPacket); |
+ kOutgoingPacket, |
+ RtpHeaderExtensionMap(config.rtp_extensions)); |
break; |
} |
case VIDEO_SENDER_CONFIG_EVENT: { |
std::vector<rtclog::StreamConfig> configs = GetVideoSendConfig(event); |
for (size_t i = 0; i < configs.size(); i++) { |
- streams_.emplace_back(configs[i].local_ssrc, MediaType::VIDEO, |
- kOutgoingPacket); |
+ streams_.emplace_back( |
+ configs[i].local_ssrc, MediaType::VIDEO, kOutgoingPacket, |
+ RtpHeaderExtensionMap(configs[i].rtp_extensions)); |
- streams_.emplace_back(configs[i].rtx_ssrc, MediaType::VIDEO, |
- kOutgoingPacket); |
+ streams_.emplace_back( |
+ configs[i].rtx_ssrc, MediaType::VIDEO, kOutgoingPacket, |
+ RtpHeaderExtensionMap(configs[i].rtp_extensions)); |
} |
break; |
} |
case AUDIO_RECEIVER_CONFIG_EVENT: { |
rtclog::StreamConfig config = GetAudioReceiveConfig(event); |
streams_.emplace_back(config.remote_ssrc, MediaType::AUDIO, |
- kIncomingPacket); |
+ kIncomingPacket, |
+ RtpHeaderExtensionMap(config.rtp_extensions)); |
streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, |
- kOutgoingPacket); |
+ kOutgoingPacket, |
+ RtpHeaderExtensionMap(config.rtp_extensions)); |
break; |
} |
case AUDIO_SENDER_CONFIG_EVENT: { |
rtclog::StreamConfig config = GetAudioSendConfig(event); |
streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, |
- kOutgoingPacket); |
+ kOutgoingPacket, |
+ RtpHeaderExtensionMap(config.rtp_extensions)); |
break; |
} |
default: |
@@ -262,11 +275,12 @@ ParsedRtcEventLog::EventType ParsedRtcEventLog::GetEventType( |
} |
// The header must have space for at least IP_PACKET_SIZE bytes. |
-void ParsedRtcEventLog::GetRtpHeader(size_t index, |
- PacketDirection* incoming, |
- uint8_t* header, |
- size_t* header_length, |
- size_t* total_length) const { |
+webrtc::RtpHeaderExtensionMap* ParsedRtcEventLog::GetRtpHeader( |
+ size_t index, |
+ PacketDirection* incoming, |
+ uint8_t* header, |
+ size_t* header_length, |
+ size_t* total_length) const { |
RTC_CHECK_LT(index, GetNumberOfEvents()); |
const rtclog::Event& event = events_[index]; |
RTC_CHECK(event.has_type()); |
@@ -295,7 +309,15 @@ void ParsedRtcEventLog::GetRtpHeader(size_t index, |
RTC_CHECK_LE(rtp_packet.header().size(), |
static_cast<size_t>(IP_PACKET_SIZE)); |
memcpy(header, rtp_packet.header().data(), rtp_packet.header().size()); |
+ uint32_t ssrc = ByteReader<uint32_t>::ReadBigEndian(header + 8); |
+ StreamId stream_id( |
+ ssrc, rtp_packet.incoming() ? kIncomingPacket : kOutgoingPacket); |
+ auto it = rtp_extensions_maps_.find(stream_id); |
+ if (it != rtp_extensions_maps_.end()) { |
+ return it->second; |
+ } |
} |
+ return nullptr; |
} |
// The packet must have space for at least IP_PACKET_SIZE bytes. |