OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 |
11 #include "webrtc/call/rtc_event_log.h" | 11 #include "webrtc/call/rtc_event_log.h" |
12 | 12 |
13 #include <deque> | 13 #include <deque> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
17 #include "webrtc/base/criticalsection.h" | 17 #include "webrtc/base/criticalsection.h" |
18 #include "webrtc/base/thread_annotations.h" | 18 #include "webrtc/base/thread_annotations.h" |
19 #include "webrtc/call.h" | 19 #include "webrtc/call.h" |
20 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 20 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| 21 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" |
| 22 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
21 #include "webrtc/system_wrappers/interface/clock.h" | 23 #include "webrtc/system_wrappers/interface/clock.h" |
22 #include "webrtc/system_wrappers/interface/file_wrapper.h" | 24 #include "webrtc/system_wrappers/interface/file_wrapper.h" |
23 | 25 |
24 #ifdef ENABLE_RTC_EVENT_LOG | 26 #ifdef ENABLE_RTC_EVENT_LOG |
25 // Files generated at build-time by the protobuf compiler. | 27 // Files generated at build-time by the protobuf compiler. |
26 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD | 28 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD |
27 #include "external/webrtc/webrtc/call/rtc_event_log.pb.h" | 29 #include "external/webrtc/webrtc/call/rtc_event_log.pb.h" |
28 #else | 30 #else |
29 #include "webrtc/call/rtc_event_log.pb.h" | 31 #include "webrtc/call/rtc_event_log.pb.h" |
30 #endif | 32 #endif |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 const int64_t timestamp = clock_->TimeInMicroseconds(); | 259 const int64_t timestamp = clock_->TimeInMicroseconds(); |
258 event.set_timestamp_us(timestamp); | 260 event.set_timestamp_us(timestamp); |
259 event.set_type(rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT); | 261 event.set_type(rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT); |
260 | 262 |
261 rtclog::VideoReceiveConfig* receiver_config = | 263 rtclog::VideoReceiveConfig* receiver_config = |
262 event.mutable_video_receiver_config(); | 264 event.mutable_video_receiver_config(); |
263 receiver_config->set_remote_ssrc(config.rtp.remote_ssrc); | 265 receiver_config->set_remote_ssrc(config.rtp.remote_ssrc); |
264 receiver_config->set_local_ssrc(config.rtp.local_ssrc); | 266 receiver_config->set_local_ssrc(config.rtp.local_ssrc); |
265 | 267 |
266 receiver_config->set_rtcp_mode(ConvertRtcpMode(config.rtp.rtcp_mode)); | 268 receiver_config->set_rtcp_mode(ConvertRtcpMode(config.rtp.rtcp_mode)); |
267 | |
268 receiver_config->set_receiver_reference_time_report( | |
269 config.rtp.rtcp_xr.receiver_reference_time_report); | |
270 receiver_config->set_remb(config.rtp.remb); | 269 receiver_config->set_remb(config.rtp.remb); |
271 | 270 |
272 for (const auto& kv : config.rtp.rtx) { | 271 for (const auto& kv : config.rtp.rtx) { |
273 rtclog::RtxMap* rtx = receiver_config->add_rtx_map(); | 272 rtclog::RtxMap* rtx = receiver_config->add_rtx_map(); |
274 rtx->set_payload_type(kv.first); | 273 rtx->set_payload_type(kv.first); |
275 rtx->mutable_config()->set_rtx_ssrc(kv.second.ssrc); | 274 rtx->mutable_config()->set_rtx_ssrc(kv.second.ssrc); |
276 rtx->mutable_config()->set_rtx_payload_type(kv.second.payload_type); | 275 rtx->mutable_config()->set_rtx_payload_type(kv.second.payload_type); |
277 } | 276 } |
278 | 277 |
279 for (const auto& e : config.rtp.extensions) { | 278 for (const auto& e : config.rtp.extensions) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 sender_config->add_header_extensions(); | 310 sender_config->add_header_extensions(); |
312 extension->set_name(e.name); | 311 extension->set_name(e.name); |
313 extension->set_id(e.id); | 312 extension->set_id(e.id); |
314 } | 313 } |
315 | 314 |
316 for (const auto& rtx_ssrc : config.rtp.rtx.ssrcs) { | 315 for (const auto& rtx_ssrc : config.rtp.rtx.ssrcs) { |
317 sender_config->add_rtx_ssrcs(rtx_ssrc); | 316 sender_config->add_rtx_ssrcs(rtx_ssrc); |
318 } | 317 } |
319 sender_config->set_rtx_payload_type(config.rtp.rtx.payload_type); | 318 sender_config->set_rtx_payload_type(config.rtp.rtx.payload_type); |
320 | 319 |
321 sender_config->set_c_name(config.rtp.c_name); | |
322 | |
323 rtclog::EncoderConfig* encoder = sender_config->mutable_encoder(); | 320 rtclog::EncoderConfig* encoder = sender_config->mutable_encoder(); |
324 encoder->set_name(config.encoder_settings.payload_name); | 321 encoder->set_name(config.encoder_settings.payload_name); |
325 encoder->set_payload_type(config.encoder_settings.payload_type); | 322 encoder->set_payload_type(config.encoder_settings.payload_type); |
326 HandleEvent(&event); | 323 HandleEvent(&event); |
327 } | 324 } |
328 | 325 |
329 void RtcEventLogImpl::LogRtpHeader(bool incoming, | 326 void RtcEventLogImpl::LogRtpHeader(bool incoming, |
330 MediaType media_type, | 327 MediaType media_type, |
331 const uint8_t* header, | 328 const uint8_t* header, |
332 size_t packet_length) { | 329 size_t packet_length) { |
(...skipping 29 matching lines...) Expand all Loading... |
362 MediaType media_type, | 359 MediaType media_type, |
363 const uint8_t* packet, | 360 const uint8_t* packet, |
364 size_t length) { | 361 size_t length) { |
365 rtc::CritScope lock(&crit_); | 362 rtc::CritScope lock(&crit_); |
366 rtclog::Event rtcp_event; | 363 rtclog::Event rtcp_event; |
367 const int64_t timestamp = clock_->TimeInMicroseconds(); | 364 const int64_t timestamp = clock_->TimeInMicroseconds(); |
368 rtcp_event.set_timestamp_us(timestamp); | 365 rtcp_event.set_timestamp_us(timestamp); |
369 rtcp_event.set_type(rtclog::Event::RTCP_EVENT); | 366 rtcp_event.set_type(rtclog::Event::RTCP_EVENT); |
370 rtcp_event.mutable_rtcp_packet()->set_incoming(incoming); | 367 rtcp_event.mutable_rtcp_packet()->set_incoming(incoming); |
371 rtcp_event.mutable_rtcp_packet()->set_type(ConvertMediaType(media_type)); | 368 rtcp_event.mutable_rtcp_packet()->set_type(ConvertMediaType(media_type)); |
372 rtcp_event.mutable_rtcp_packet()->set_packet_data(packet, length); | 369 |
| 370 RTCPUtility::RtcpCommonHeader header; |
| 371 const uint8_t* block_begin = packet; |
| 372 const uint8_t* packet_end = packet + length; |
| 373 RTC_DCHECK(length <= IP_PACKET_SIZE); |
| 374 uint8_t buffer[IP_PACKET_SIZE]; |
| 375 uint32_t buffer_length = 0; |
| 376 while (block_begin < packet_end) { |
| 377 if (!RtcpParseCommonHeader(block_begin, packet_end - block_begin, |
| 378 &header)) { |
| 379 break; // Incorrect message header. |
| 380 } |
| 381 uint32_t block_size = header.BlockSize(); |
| 382 if (block_begin + block_size > packet_end) { |
| 383 break; // Faulty header; block would extend outside packet. |
| 384 } |
| 385 switch (header.packet_type) { |
| 386 case RTCPUtility::PT_SR: |
| 387 FALLTHROUGH(); |
| 388 case RTCPUtility::PT_RR: |
| 389 FALLTHROUGH(); |
| 390 case RTCPUtility::PT_BYE: |
| 391 FALLTHROUGH(); |
| 392 case RTCPUtility::PT_IJ: |
| 393 FALLTHROUGH(); |
| 394 case RTCPUtility::PT_RTPFB: |
| 395 FALLTHROUGH(); |
| 396 case RTCPUtility::PT_PSFB: |
| 397 FALLTHROUGH(); |
| 398 case RTCPUtility::PT_XR: |
| 399 // We log sender reports, receiver reports, bye messages |
| 400 // inter-arrival jitter, third-party loss reports, payload-specific |
| 401 // feedback and extended reports. |
| 402 memcpy(buffer + buffer_length, block_begin, block_size); |
| 403 buffer_length += block_size; |
| 404 break; |
| 405 case RTCPUtility::PT_SDES: |
| 406 FALLTHROUGH(); |
| 407 case RTCPUtility::PT_APP: |
| 408 FALLTHROUGH(); |
| 409 default: |
| 410 // We don't log sender descriptions, application defined messages |
| 411 // or message blocks of unknown type. |
| 412 break; |
| 413 } |
| 414 |
| 415 block_begin += block_size; |
| 416 } |
| 417 rtcp_event.mutable_rtcp_packet()->set_packet_data(buffer, buffer_length); |
373 HandleEvent(&rtcp_event); | 418 HandleEvent(&rtcp_event); |
374 } | 419 } |
375 | 420 |
376 void RtcEventLogImpl::LogAudioPlayout(uint32_t ssrc) { | 421 void RtcEventLogImpl::LogAudioPlayout(uint32_t ssrc) { |
377 rtc::CritScope lock(&crit_); | 422 rtc::CritScope lock(&crit_); |
378 rtclog::Event event; | 423 rtclog::Event event; |
379 const int64_t timestamp = clock_->TimeInMicroseconds(); | 424 const int64_t timestamp = clock_->TimeInMicroseconds(); |
380 event.set_timestamp_us(timestamp); | 425 event.set_timestamp_us(timestamp); |
381 event.set_type(rtclog::Event::AUDIO_PLAYOUT_EVENT); | 426 event.set_type(rtclog::Event::AUDIO_PLAYOUT_EVENT); |
382 auto playout_event = event.mutable_audio_playout_event(); | 427 auto playout_event = event.mutable_audio_playout_event(); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 } | 503 } |
459 | 504 |
460 #endif // ENABLE_RTC_EVENT_LOG | 505 #endif // ENABLE_RTC_EVENT_LOG |
461 | 506 |
462 // RtcEventLog member functions. | 507 // RtcEventLog member functions. |
463 rtc::scoped_ptr<RtcEventLog> RtcEventLog::Create() { | 508 rtc::scoped_ptr<RtcEventLog> RtcEventLog::Create() { |
464 return rtc::scoped_ptr<RtcEventLog>(new RtcEventLogImpl()); | 509 return rtc::scoped_ptr<RtcEventLog>(new RtcEventLogImpl()); |
465 } | 510 } |
466 | 511 |
467 } // namespace webrtc | 512 } // namespace webrtc |
OLD | NEW |