OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 uint64_t tag; | 151 uint64_t tag; |
152 uint64_t message_length; | 152 uint64_t message_length; |
153 bool success; | 153 bool success; |
154 | 154 |
155 RTC_DCHECK(stream.good()); | 155 RTC_DCHECK(stream.good()); |
156 | 156 |
157 while (1) { | 157 while (1) { |
158 // Check whether we have reached end of file. | 158 // Check whether we have reached end of file. |
159 stream.peek(); | 159 stream.peek(); |
160 if (stream.eof()) { | 160 if (stream.eof()) { |
| 161 // Process all extensions maps for faster look-up later. |
| 162 for (auto& event_stream : streams_) { |
| 163 rtp_extensions_maps_[StreamId(event_stream.ssrc, |
| 164 event_stream.direction)] = |
| 165 &event_stream.rtp_extensions_map; |
| 166 } |
161 return true; | 167 return true; |
162 } | 168 } |
163 | 169 |
164 // Read the next message tag. The tag number is defined as | 170 // Read the next message tag. The tag number is defined as |
165 // (fieldnumber << 3) | wire_type. In our case, the field number is | 171 // (fieldnumber << 3) | wire_type. In our case, the field number is |
166 // supposed to be 1 and the wire type for an | 172 // supposed to be 1 and the wire type for an |
167 // length-delimited field is 2. | 173 // length-delimited field is 2. |
168 const uint64_t kExpectedTag = (1 << 3) | 2; | 174 const uint64_t kExpectedTag = (1 << 3) | 2; |
169 std::tie(tag, success) = ParseVarInt(stream); | 175 std::tie(tag, success) = ParseVarInt(stream); |
170 if (!success) { | 176 if (!success) { |
(...skipping 26 matching lines...) Expand all Loading... |
197 if (!event.ParseFromArray(tmp_buffer.data(), message_length)) { | 203 if (!event.ParseFromArray(tmp_buffer.data(), message_length)) { |
198 LOG(LS_WARNING) << "Failed to parse protobuf message."; | 204 LOG(LS_WARNING) << "Failed to parse protobuf message."; |
199 return false; | 205 return false; |
200 } | 206 } |
201 | 207 |
202 EventType type = GetRuntimeEventType(event.type()); | 208 EventType type = GetRuntimeEventType(event.type()); |
203 switch (type) { | 209 switch (type) { |
204 case VIDEO_RECEIVER_CONFIG_EVENT: { | 210 case VIDEO_RECEIVER_CONFIG_EVENT: { |
205 rtclog::StreamConfig config = GetVideoReceiveConfig(event); | 211 rtclog::StreamConfig config = GetVideoReceiveConfig(event); |
206 streams_.emplace_back(config.remote_ssrc, MediaType::VIDEO, | 212 streams_.emplace_back(config.remote_ssrc, MediaType::VIDEO, |
207 kIncomingPacket); | 213 kIncomingPacket, |
| 214 RtpHeaderExtensionMap(config.rtp_extensions)); |
208 streams_.emplace_back(config.local_ssrc, MediaType::VIDEO, | 215 streams_.emplace_back(config.local_ssrc, MediaType::VIDEO, |
209 kOutgoingPacket); | 216 kOutgoingPacket, |
| 217 RtpHeaderExtensionMap(config.rtp_extensions)); |
210 break; | 218 break; |
211 } | 219 } |
212 case VIDEO_SENDER_CONFIG_EVENT: { | 220 case VIDEO_SENDER_CONFIG_EVENT: { |
213 std::vector<rtclog::StreamConfig> configs = GetVideoSendConfig(event); | 221 std::vector<rtclog::StreamConfig> configs = GetVideoSendConfig(event); |
214 for (size_t i = 0; i < configs.size(); i++) { | 222 for (size_t i = 0; i < configs.size(); i++) { |
215 streams_.emplace_back(configs[i].local_ssrc, MediaType::VIDEO, | 223 streams_.emplace_back( |
216 kOutgoingPacket); | 224 configs[i].local_ssrc, MediaType::VIDEO, kOutgoingPacket, |
| 225 RtpHeaderExtensionMap(configs[i].rtp_extensions)); |
217 | 226 |
218 streams_.emplace_back(configs[i].rtx_ssrc, MediaType::VIDEO, | 227 streams_.emplace_back( |
219 kOutgoingPacket); | 228 configs[i].rtx_ssrc, MediaType::VIDEO, kOutgoingPacket, |
| 229 RtpHeaderExtensionMap(configs[i].rtp_extensions)); |
220 } | 230 } |
221 break; | 231 break; |
222 } | 232 } |
223 case AUDIO_RECEIVER_CONFIG_EVENT: { | 233 case AUDIO_RECEIVER_CONFIG_EVENT: { |
224 rtclog::StreamConfig config = GetAudioReceiveConfig(event); | 234 rtclog::StreamConfig config = GetAudioReceiveConfig(event); |
225 streams_.emplace_back(config.remote_ssrc, MediaType::AUDIO, | 235 streams_.emplace_back(config.remote_ssrc, MediaType::AUDIO, |
226 kIncomingPacket); | 236 kIncomingPacket, |
| 237 RtpHeaderExtensionMap(config.rtp_extensions)); |
227 streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, | 238 streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, |
228 kOutgoingPacket); | 239 kOutgoingPacket, |
| 240 RtpHeaderExtensionMap(config.rtp_extensions)); |
229 break; | 241 break; |
230 } | 242 } |
231 case AUDIO_SENDER_CONFIG_EVENT: { | 243 case AUDIO_SENDER_CONFIG_EVENT: { |
232 rtclog::StreamConfig config = GetAudioSendConfig(event); | 244 rtclog::StreamConfig config = GetAudioSendConfig(event); |
233 streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, | 245 streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, |
234 kOutgoingPacket); | 246 kOutgoingPacket, |
| 247 RtpHeaderExtensionMap(config.rtp_extensions)); |
235 break; | 248 break; |
236 } | 249 } |
237 default: | 250 default: |
238 break; | 251 break; |
239 } | 252 } |
240 | 253 |
241 events_.push_back(event); | 254 events_.push_back(event); |
242 } | 255 } |
243 } | 256 } |
244 | 257 |
(...skipping 10 matching lines...) Expand all Loading... |
255 | 268 |
256 ParsedRtcEventLog::EventType ParsedRtcEventLog::GetEventType( | 269 ParsedRtcEventLog::EventType ParsedRtcEventLog::GetEventType( |
257 size_t index) const { | 270 size_t index) const { |
258 RTC_CHECK_LT(index, GetNumberOfEvents()); | 271 RTC_CHECK_LT(index, GetNumberOfEvents()); |
259 const rtclog::Event& event = events_[index]; | 272 const rtclog::Event& event = events_[index]; |
260 RTC_CHECK(event.has_type()); | 273 RTC_CHECK(event.has_type()); |
261 return GetRuntimeEventType(event.type()); | 274 return GetRuntimeEventType(event.type()); |
262 } | 275 } |
263 | 276 |
264 // The header must have space for at least IP_PACKET_SIZE bytes. | 277 // The header must have space for at least IP_PACKET_SIZE bytes. |
265 void ParsedRtcEventLog::GetRtpHeader(size_t index, | 278 webrtc::RtpHeaderExtensionMap* ParsedRtcEventLog::GetRtpHeader( |
266 PacketDirection* incoming, | 279 size_t index, |
267 uint8_t* header, | 280 PacketDirection* incoming, |
268 size_t* header_length, | 281 uint8_t* header, |
269 size_t* total_length) const { | 282 size_t* header_length, |
| 283 size_t* total_length) const { |
270 RTC_CHECK_LT(index, GetNumberOfEvents()); | 284 RTC_CHECK_LT(index, GetNumberOfEvents()); |
271 const rtclog::Event& event = events_[index]; | 285 const rtclog::Event& event = events_[index]; |
272 RTC_CHECK(event.has_type()); | 286 RTC_CHECK(event.has_type()); |
273 RTC_CHECK_EQ(event.type(), rtclog::Event::RTP_EVENT); | 287 RTC_CHECK_EQ(event.type(), rtclog::Event::RTP_EVENT); |
274 RTC_CHECK(event.has_rtp_packet()); | 288 RTC_CHECK(event.has_rtp_packet()); |
275 const rtclog::RtpPacket& rtp_packet = event.rtp_packet(); | 289 const rtclog::RtpPacket& rtp_packet = event.rtp_packet(); |
276 // Get direction of packet. | 290 // Get direction of packet. |
277 RTC_CHECK(rtp_packet.has_incoming()); | 291 RTC_CHECK(rtp_packet.has_incoming()); |
278 if (incoming != nullptr) { | 292 if (incoming != nullptr) { |
279 *incoming = rtp_packet.incoming() ? kIncomingPacket : kOutgoingPacket; | 293 *incoming = rtp_packet.incoming() ? kIncomingPacket : kOutgoingPacket; |
280 } | 294 } |
281 // Get packet length. | 295 // Get packet length. |
282 RTC_CHECK(rtp_packet.has_packet_length()); | 296 RTC_CHECK(rtp_packet.has_packet_length()); |
283 if (total_length != nullptr) { | 297 if (total_length != nullptr) { |
284 *total_length = rtp_packet.packet_length(); | 298 *total_length = rtp_packet.packet_length(); |
285 } | 299 } |
286 // Get header length. | 300 // Get header length. |
287 RTC_CHECK(rtp_packet.has_header()); | 301 RTC_CHECK(rtp_packet.has_header()); |
288 if (header_length != nullptr) { | 302 if (header_length != nullptr) { |
289 *header_length = rtp_packet.header().size(); | 303 *header_length = rtp_packet.header().size(); |
290 } | 304 } |
291 // Get header contents. | 305 // Get header contents. |
292 if (header != nullptr) { | 306 if (header != nullptr) { |
293 const size_t kMinRtpHeaderSize = 12; | 307 const size_t kMinRtpHeaderSize = 12; |
294 RTC_CHECK_GE(rtp_packet.header().size(), kMinRtpHeaderSize); | 308 RTC_CHECK_GE(rtp_packet.header().size(), kMinRtpHeaderSize); |
295 RTC_CHECK_LE(rtp_packet.header().size(), | 309 RTC_CHECK_LE(rtp_packet.header().size(), |
296 static_cast<size_t>(IP_PACKET_SIZE)); | 310 static_cast<size_t>(IP_PACKET_SIZE)); |
297 memcpy(header, rtp_packet.header().data(), rtp_packet.header().size()); | 311 memcpy(header, rtp_packet.header().data(), rtp_packet.header().size()); |
| 312 uint32_t ssrc = ByteReader<uint32_t>::ReadBigEndian(header + 8); |
| 313 StreamId stream_id( |
| 314 ssrc, rtp_packet.incoming() ? kIncomingPacket : kOutgoingPacket); |
| 315 auto it = rtp_extensions_maps_.find(stream_id); |
| 316 if (it != rtp_extensions_maps_.end()) { |
| 317 return it->second; |
| 318 } |
298 } | 319 } |
| 320 return nullptr; |
299 } | 321 } |
300 | 322 |
301 // The packet must have space for at least IP_PACKET_SIZE bytes. | 323 // The packet must have space for at least IP_PACKET_SIZE bytes. |
302 void ParsedRtcEventLog::GetRtcpPacket(size_t index, | 324 void ParsedRtcEventLog::GetRtcpPacket(size_t index, |
303 PacketDirection* incoming, | 325 PacketDirection* incoming, |
304 uint8_t* packet, | 326 uint8_t* packet, |
305 size_t* length) const { | 327 size_t* length) const { |
306 RTC_CHECK_LT(index, GetNumberOfEvents()); | 328 RTC_CHECK_LT(index, GetNumberOfEvents()); |
307 const rtclog::Event& event = events_[index]; | 329 const rtclog::Event& event = events_[index]; |
308 RTC_CHECK(event.has_type()); | 330 RTC_CHECK(event.has_type()); |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 ParsedRtcEventLog::MediaType ParsedRtcEventLog::GetMediaType( | 647 ParsedRtcEventLog::MediaType ParsedRtcEventLog::GetMediaType( |
626 uint32_t ssrc, | 648 uint32_t ssrc, |
627 PacketDirection direction) const { | 649 PacketDirection direction) const { |
628 for (auto rit = streams_.rbegin(); rit != streams_.rend(); ++rit) { | 650 for (auto rit = streams_.rbegin(); rit != streams_.rend(); ++rit) { |
629 if (rit->ssrc == ssrc && rit->direction == direction) | 651 if (rit->ssrc == ssrc && rit->direction == direction) |
630 return rit->media_type; | 652 return rit->media_type; |
631 } | 653 } |
632 return MediaType::ANY; | 654 return MediaType::ANY; |
633 } | 655 } |
634 } // namespace webrtc | 656 } // namespace webrtc |
OLD | NEW |