OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 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 |
11 #include "webrtc/api/rtcstatscollector.h" | 11 #include "webrtc/api/rtcstatscollector.h" |
12 | 12 |
13 #include <memory> | 13 #include <memory> |
14 #include <sstream> | |
14 #include <utility> | 15 #include <utility> |
15 #include <vector> | 16 #include <vector> |
16 | 17 |
17 #include "webrtc/api/peerconnection.h" | 18 #include "webrtc/api/peerconnection.h" |
18 #include "webrtc/api/peerconnectioninterface.h" | 19 #include "webrtc/api/peerconnectioninterface.h" |
19 #include "webrtc/api/mediastreaminterface.h" | 20 #include "webrtc/api/mediastreaminterface.h" |
20 #include "webrtc/api/webrtcsession.h" | 21 #include "webrtc/api/webrtcsession.h" |
21 #include "webrtc/base/checks.h" | 22 #include "webrtc/base/checks.h" |
22 #include "webrtc/base/timeutils.h" | 23 #include "webrtc/base/timeutils.h" |
23 #include "webrtc/media/base/mediachannel.h" | 24 #include "webrtc/media/base/mediachannel.h" |
(...skipping 22 matching lines...) Expand all Loading... | |
46 return audio ? "RTCCodec_OutboundAudio_" + rtc::ToString<>(payload_type) | 47 return audio ? "RTCCodec_OutboundAudio_" + rtc::ToString<>(payload_type) |
47 : "RTCCodec_OutboundVideo_" + rtc::ToString<>(payload_type); | 48 : "RTCCodec_OutboundVideo_" + rtc::ToString<>(payload_type); |
48 } | 49 } |
49 | 50 |
50 std::string RTCIceCandidatePairStatsIDFromConnectionInfo( | 51 std::string RTCIceCandidatePairStatsIDFromConnectionInfo( |
51 const cricket::ConnectionInfo& info) { | 52 const cricket::ConnectionInfo& info) { |
52 return "RTCIceCandidatePair_" + info.local_candidate.id() + "_" + | 53 return "RTCIceCandidatePair_" + info.local_candidate.id() + "_" + |
53 info.remote_candidate.id(); | 54 info.remote_candidate.id(); |
54 } | 55 } |
55 | 56 |
56 std::string RTCMediaStreamTrackStatsIDFromTrackID( | 57 std::string RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
57 const std::string& id, bool is_local) { | 58 bool is_local, const char* kind, const std::string& id, uint32_t ssrc) { |
58 return (is_local ? "RTCMediaStreamTrack_local_" + id | 59 RTC_DCHECK(kind == MediaStreamTrackInterface::kAudioKind || |
59 : "RTCMediaStreamTrack_remote_" + id); | 60 kind == MediaStreamTrackInterface::kVideoKind); |
61 std::ostringstream oss; | |
62 oss << (is_local ? "RTCMediaStreamTrack_local_" | |
63 : "RTCMediaStreamTrack_remote_"); | |
64 oss << kind << "_"; | |
65 oss << id << "_"; | |
66 oss << ssrc; | |
67 return oss.str(); | |
60 } | 68 } |
61 | 69 |
62 std::string RTCTransportStatsIDFromTransportChannel( | 70 std::string RTCTransportStatsIDFromTransportChannel( |
63 const std::string& transport_name, int channel_component) { | 71 const std::string& transport_name, int channel_component) { |
64 return "RTCTransport_" + transport_name + "_" + | 72 return "RTCTransport_" + transport_name + "_" + |
65 rtc::ToString<>(channel_component); | 73 rtc::ToString<>(channel_component); |
66 } | 74 } |
67 | 75 |
68 std::string RTCTransportStatsIDFromBaseChannel( | 76 std::string RTCTransportStatsIDFromBaseChannel( |
69 const ProxyTransportMap& proxy_to_transport, | 77 const ProxyTransportMap& proxy_to_transport, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
144 case cricket::DTLS_TRANSPORT_CLOSED: | 152 case cricket::DTLS_TRANSPORT_CLOSED: |
145 return RTCDtlsTransportState::kClosed; | 153 return RTCDtlsTransportState::kClosed; |
146 case cricket::DTLS_TRANSPORT_FAILED: | 154 case cricket::DTLS_TRANSPORT_FAILED: |
147 return RTCDtlsTransportState::kFailed; | 155 return RTCDtlsTransportState::kFailed; |
148 default: | 156 default: |
149 RTC_NOTREACHED(); | 157 RTC_NOTREACHED(); |
150 return nullptr; | 158 return nullptr; |
151 } | 159 } |
152 } | 160 } |
153 | 161 |
162 double DoubleAudioLevelFromIntAudioLevel(int audio_level) { | |
163 RTC_DCHECK_GE(audio_level, 0); | |
164 RTC_DCHECK_LE(audio_level, 32767); | |
165 return audio_level / 32767.0; | |
166 } | |
167 | |
154 std::unique_ptr<RTCCodecStats> CodecStatsFromRtpCodecParameters( | 168 std::unique_ptr<RTCCodecStats> CodecStatsFromRtpCodecParameters( |
155 uint64_t timestamp_us, bool inbound, bool audio, | 169 uint64_t timestamp_us, bool inbound, bool audio, |
156 const RtpCodecParameters& codec_params) { | 170 const RtpCodecParameters& codec_params) { |
157 RTC_DCHECK_GE(codec_params.payload_type, 0); | 171 RTC_DCHECK_GE(codec_params.payload_type, 0); |
158 RTC_DCHECK_LE(codec_params.payload_type, 127); | 172 RTC_DCHECK_LE(codec_params.payload_type, 127); |
159 uint32_t payload_type = static_cast<uint32_t>(codec_params.payload_type); | 173 uint32_t payload_type = static_cast<uint32_t>(codec_params.payload_type); |
160 std::unique_ptr<RTCCodecStats> codec_stats(new RTCCodecStats( | 174 std::unique_ptr<RTCCodecStats> codec_stats(new RTCCodecStats( |
161 RTCCodecStatsIDFromDirectionMediaAndPayload(inbound, audio, payload_type), | 175 RTCCodecStatsIDFromDirectionMediaAndPayload(inbound, audio, payload_type), |
162 timestamp_us)); | 176 timestamp_us)); |
163 codec_stats->payload_type = payload_type; | 177 codec_stats->payload_type = payload_type; |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
315 candidate_stats->priority = static_cast<int32_t>(candidate.priority()); | 329 candidate_stats->priority = static_cast<int32_t>(candidate.priority()); |
316 | 330 |
317 stats = candidate_stats.get(); | 331 stats = candidate_stats.get(); |
318 report->AddStats(std::move(candidate_stats)); | 332 report->AddStats(std::move(candidate_stats)); |
319 } | 333 } |
320 RTC_DCHECK_EQ(stats->type(), is_local ? RTCLocalIceCandidateStats::kType | 334 RTC_DCHECK_EQ(stats->type(), is_local ? RTCLocalIceCandidateStats::kType |
321 : RTCRemoteIceCandidateStats::kType); | 335 : RTCRemoteIceCandidateStats::kType); |
322 return stats->id(); | 336 return stats->id(); |
323 } | 337 } |
324 | 338 |
339 std::unique_ptr<RTCMediaStreamTrackStats> | |
340 ProduceMediaStreamTrackStatsFromVoiceSenderInfo( | |
341 int64_t timestamp_us, | |
342 const AudioTrackInterface& audio_track, | |
343 const cricket::VoiceSenderInfo& voice_sender_info) { | |
344 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats( | |
345 new RTCMediaStreamTrackStats( | |
346 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( | |
347 true, MediaStreamTrackInterface::kAudioKind, audio_track.id(), | |
348 voice_sender_info.ssrc()), | |
349 timestamp_us, | |
350 RTCMediaStreamTrackKind::kAudio)); | |
351 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( | |
352 audio_track, audio_track_stats.get()); | |
353 audio_track_stats->remote_source = false; | |
354 audio_track_stats->detached = false; | |
355 if (voice_sender_info.audio_level >= 0) { | |
356 audio_track_stats->audio_level = DoubleAudioLevelFromIntAudioLevel( | |
357 voice_sender_info.audio_level); | |
358 } | |
359 if (voice_sender_info.echo_return_loss != -100) { | |
360 audio_track_stats->echo_return_loss = static_cast<double>( | |
361 voice_sender_info.echo_return_loss); | |
362 } | |
363 if (voice_sender_info.echo_return_loss_enhancement != -100) { | |
364 audio_track_stats->echo_return_loss_enhancement = static_cast<double>( | |
365 voice_sender_info.echo_return_loss_enhancement); | |
366 } | |
367 return audio_track_stats; | |
368 } | |
369 | |
370 std::unique_ptr<RTCMediaStreamTrackStats> | |
371 ProduceMediaStreamTrackStatsFromVoiceReceiverInfo( | |
372 int64_t timestamp_us, | |
373 const AudioTrackInterface& audio_track, | |
374 const cricket::VoiceReceiverInfo& voice_receiver_info) { | |
375 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats( | |
376 new RTCMediaStreamTrackStats( | |
377 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( | |
378 false, MediaStreamTrackInterface::kAudioKind, audio_track.id(), | |
379 voice_receiver_info.ssrc()), | |
380 timestamp_us, | |
381 RTCMediaStreamTrackKind::kAudio)); | |
382 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( | |
383 audio_track, audio_track_stats.get()); | |
384 audio_track_stats->remote_source = true; | |
385 audio_track_stats->detached = false; | |
386 if (voice_receiver_info.audio_level >= 0) { | |
387 audio_track_stats->audio_level = DoubleAudioLevelFromIntAudioLevel( | |
388 voice_receiver_info.audio_level); | |
389 } | |
390 return audio_track_stats; | |
391 } | |
392 | |
393 std::unique_ptr<RTCMediaStreamTrackStats> | |
394 ProduceMediaStreamTrackStatsFromVideoSenderInfo( | |
395 int64_t timestamp_us, | |
396 const VideoTrackInterface& video_track, | |
397 const cricket::VideoSenderInfo& video_sender_info) { | |
398 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats( | |
399 new RTCMediaStreamTrackStats( | |
400 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( | |
401 true, MediaStreamTrackInterface::kVideoKind, video_track.id(), | |
402 video_sender_info.ssrc()), | |
403 timestamp_us, | |
404 RTCMediaStreamTrackKind::kVideo)); | |
405 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( | |
406 video_track, video_track_stats.get()); | |
407 video_track_stats->remote_source = false; | |
408 video_track_stats->detached = false; | |
409 video_track_stats->frame_width = static_cast<uint32_t>( | |
410 video_sender_info.send_frame_width); | |
411 video_track_stats->frame_height = static_cast<uint32_t>( | |
412 video_sender_info.send_frame_height); | |
413 return video_track_stats; | |
414 } | |
415 | |
416 std::unique_ptr<RTCMediaStreamTrackStats> | |
417 ProduceMediaStreamTrackStatsFromVideoReceiverInfo( | |
418 int64_t timestamp_us, | |
419 const VideoTrackInterface& video_track, | |
420 const cricket::VideoReceiverInfo& video_receiver_info) { | |
421 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats( | |
422 new RTCMediaStreamTrackStats( | |
423 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( | |
424 false, MediaStreamTrackInterface::kVideoKind, video_track.id(), | |
425 video_receiver_info.ssrc()), | |
426 timestamp_us, | |
427 RTCMediaStreamTrackKind::kVideo)); | |
428 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( | |
429 video_track, video_track_stats.get()); | |
430 video_track_stats->remote_source = true; | |
431 video_track_stats->detached = false; | |
432 video_track_stats->frame_width = static_cast<uint32_t>( | |
433 video_receiver_info.frame_width); | |
Taylor Brandstetter
2017/01/18 20:10:27
If a frame hasn't been decoded yet, the width and
hbos
2017/01/19 10:00:00
Done. Also testing the default in a unittest.
| |
434 video_track_stats->frame_height = static_cast<uint32_t>( | |
435 video_receiver_info.frame_height); | |
436 return video_track_stats; | |
437 } | |
438 | |
325 void ProduceMediaStreamAndTrackStats( | 439 void ProduceMediaStreamAndTrackStats( |
326 int64_t timestamp_us, | 440 int64_t timestamp_us, |
441 const TrackMediaInfoMap& track_media_info_map, | |
327 rtc::scoped_refptr<StreamCollectionInterface> streams, | 442 rtc::scoped_refptr<StreamCollectionInterface> streams, |
328 bool is_local, | 443 bool is_local, |
329 RTCStatsReport* report) { | 444 RTCStatsReport* report) { |
330 // TODO(hbos): When "AddTrack" is implemented we should iterate tracks to | 445 // TODO(hbos): When "AddTrack" is implemented we should iterate tracks to |
331 // find which streams exist, not iterate streams to find tracks. | 446 // find which streams exist, not iterate streams to find tracks. |
332 // crbug.com/659137 | 447 // crbug.com/659137 |
333 // TODO(hbos): Return stats of detached tracks. We have to perform stats | 448 // TODO(hbos): Return stats of detached tracks. We have to perform stats |
334 // gathering at the time of detachment to get accurate stats and timestamps. | 449 // gathering at the time of detachment to get accurate stats and timestamps. |
335 // crbug.com/659137 | 450 // crbug.com/659137 |
336 if (!streams) | 451 if (!streams) |
337 return; | 452 return; |
338 for (size_t i = 0; i < streams->count(); ++i) { | 453 for (size_t i = 0; i < streams->count(); ++i) { |
339 MediaStreamInterface* stream = streams->at(i); | 454 MediaStreamInterface* stream = streams->at(i); |
340 | 455 |
341 std::unique_ptr<RTCMediaStreamStats> stream_stats( | 456 std::unique_ptr<RTCMediaStreamStats> stream_stats( |
342 new RTCMediaStreamStats( | 457 new RTCMediaStreamStats( |
343 (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") + | 458 (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") + |
344 stream->label(), timestamp_us)); | 459 stream->label(), timestamp_us)); |
345 stream_stats->stream_identifier = stream->label(); | 460 stream_stats->stream_identifier = stream->label(); |
346 stream_stats->track_ids = std::vector<std::string>(); | 461 stream_stats->track_ids = std::vector<std::string>(); |
347 // Audio Tracks | 462 // The track stats are per-attachment to the connection. There can be one |
348 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track : | 463 // for receiving (remote) tracks and multiple attachments for sending |
349 stream->GetAudioTracks()) { | 464 // (local) tracks. |
350 std::string id = RTCMediaStreamTrackStatsIDFromTrackID( | 465 if (is_local) { |
351 audio_track->id(), is_local); | 466 // Local Audio Tracks |
352 if (report->Get(id)) { | 467 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track : |
353 // Skip track, stats already exist for it. | 468 stream->GetAudioTracks()) { |
354 continue; | 469 const std::vector<cricket::VoiceSenderInfo*>* voice_sender_infos = |
355 } | 470 track_media_info_map.GetVoiceSenderInfos(*audio_track); |
356 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats( | 471 if (!voice_sender_infos) { |
357 new RTCMediaStreamTrackStats(id, timestamp_us, | 472 continue; |
358 RTCMediaStreamTrackKind::kAudio)); | |
359 stream_stats->track_ids->push_back(audio_track_stats->id()); | |
360 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( | |
361 *audio_track.get(), | |
362 audio_track_stats.get()); | |
363 audio_track_stats->remote_source = !is_local; | |
364 audio_track_stats->detached = false; | |
365 int signal_level; | |
366 if (audio_track->GetSignalLevel(&signal_level)) { | |
367 // Convert signal level from [0,32767] int to [0,1] double. | |
368 RTC_DCHECK_GE(signal_level, 0); | |
369 RTC_DCHECK_LE(signal_level, 32767); | |
370 audio_track_stats->audio_level = signal_level / 32767.0; | |
371 } | |
372 if (audio_track->GetAudioProcessor()) { | |
373 AudioProcessorInterface::AudioProcessorStats audio_processor_stats; | |
374 audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); | |
375 if (audio_processor_stats.echo_return_loss != -100) { | |
376 audio_track_stats->echo_return_loss = static_cast<double>( | |
377 audio_processor_stats.echo_return_loss); | |
378 } | 473 } |
379 if (audio_processor_stats.echo_return_loss_enhancement != -100) { | 474 for (const auto& voice_sender_info : *voice_sender_infos) { |
380 audio_track_stats->echo_return_loss_enhancement = static_cast<double>( | 475 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats = |
381 audio_processor_stats.echo_return_loss_enhancement); | 476 ProduceMediaStreamTrackStatsFromVoiceSenderInfo( |
477 timestamp_us, *audio_track, *voice_sender_info); | |
478 stream_stats->track_ids->push_back(audio_track_stats->id()); | |
479 report->AddStats(std::move(audio_track_stats)); | |
382 } | 480 } |
383 } | 481 } |
384 report->AddStats(std::move(audio_track_stats)); | 482 // Local Video Tracks |
385 } | 483 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track : |
386 // Video Tracks | 484 stream->GetVideoTracks()) { |
387 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track : | 485 const std::vector<cricket::VideoSenderInfo*>* video_sender_infos = |
388 stream->GetVideoTracks()) { | 486 track_media_info_map.GetVideoSenderInfos(*video_track); |
389 std::string id = RTCMediaStreamTrackStatsIDFromTrackID( | 487 if (!video_sender_infos) { |
390 video_track->id(), is_local); | 488 continue; |
391 if (report->Get(id)) { | 489 } |
392 // Skip track, stats already exist for it. | 490 for (const auto& video_sender_info : *video_sender_infos) { |
393 continue; | 491 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats = |
394 } | 492 ProduceMediaStreamTrackStatsFromVideoSenderInfo( |
395 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats( | 493 timestamp_us, *video_track, *video_sender_info); |
396 new RTCMediaStreamTrackStats(id, timestamp_us, | 494 stream_stats->track_ids->push_back(video_track_stats->id()); |
397 RTCMediaStreamTrackKind::kVideo)); | 495 report->AddStats(std::move(video_track_stats)); |
398 stream_stats->track_ids->push_back(video_track_stats->id()); | |
399 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( | |
400 *video_track.get(), | |
401 video_track_stats.get()); | |
402 video_track_stats->remote_source = !is_local; | |
403 video_track_stats->detached = false; | |
404 if (video_track->GetSource()) { | |
405 VideoTrackSourceInterface::Stats video_track_source_stats; | |
406 if (video_track->GetSource()->GetStats(&video_track_source_stats)) { | |
407 video_track_stats->frame_width = static_cast<uint32_t>( | |
408 video_track_source_stats.input_width); | |
409 video_track_stats->frame_height = static_cast<uint32_t>( | |
410 video_track_source_stats.input_height); | |
411 } | 496 } |
412 } | 497 } |
413 report->AddStats(std::move(video_track_stats)); | 498 } else { |
499 // Remote Audio Tracks | |
500 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track : | |
501 stream->GetAudioTracks()) { | |
502 const cricket::VoiceReceiverInfo* voice_receiver_info = | |
503 track_media_info_map.GetVoiceReceiverInfo(*audio_track); | |
504 if (!voice_receiver_info) { | |
505 continue; | |
506 } | |
507 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats = | |
508 ProduceMediaStreamTrackStatsFromVoiceReceiverInfo( | |
509 timestamp_us, *audio_track, *voice_receiver_info); | |
510 stream_stats->track_ids->push_back(audio_track_stats->id()); | |
511 report->AddStats(std::move(audio_track_stats)); | |
512 } | |
513 // Remote Video Tracks | |
514 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track : | |
515 stream->GetVideoTracks()) { | |
516 const cricket::VideoReceiverInfo* video_receiver_info = | |
517 track_media_info_map.GetVideoReceiverInfo(*video_track); | |
518 if (!video_receiver_info) { | |
519 continue; | |
520 } | |
521 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats = | |
522 ProduceMediaStreamTrackStatsFromVideoReceiverInfo( | |
523 timestamp_us, *video_track, *video_receiver_info); | |
524 stream_stats->track_ids->push_back(video_track_stats->id()); | |
525 report->AddStats(std::move(video_track_stats)); | |
526 } | |
414 } | 527 } |
415 report->AddStats(std::move(stream_stats)); | 528 report->AddStats(std::move(stream_stats)); |
416 } | 529 } |
417 } | 530 } |
418 | 531 |
419 } // namespace | 532 } // namespace |
420 | 533 |
421 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create( | 534 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create( |
422 PeerConnection* pc, int64_t cache_lifetime_us) { | 535 PeerConnection* pc, int64_t cache_lifetime_us) { |
423 return rtc::scoped_refptr<RTCStatsCollector>( | 536 return rtc::scoped_refptr<RTCStatsCollector>( |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
742 | 855 |
743 report->AddStats(std::move(candidate_pair_stats)); | 856 report->AddStats(std::move(candidate_pair_stats)); |
744 } | 857 } |
745 } | 858 } |
746 } | 859 } |
747 } | 860 } |
748 | 861 |
749 void RTCStatsCollector::ProduceMediaStreamAndTrackStats_s( | 862 void RTCStatsCollector::ProduceMediaStreamAndTrackStats_s( |
750 int64_t timestamp_us, RTCStatsReport* report) const { | 863 int64_t timestamp_us, RTCStatsReport* report) const { |
751 RTC_DCHECK(signaling_thread_->IsCurrent()); | 864 RTC_DCHECK(signaling_thread_->IsCurrent()); |
752 ProduceMediaStreamAndTrackStats( | 865 RTC_DCHECK(track_media_info_map_); |
753 timestamp_us, pc_->local_streams(), true, report); | 866 ProduceMediaStreamAndTrackStats(timestamp_us, |
754 ProduceMediaStreamAndTrackStats( | 867 *track_media_info_map_, |
755 timestamp_us, pc_->remote_streams(), false, report); | 868 pc_->local_streams(), |
869 true, | |
870 report); | |
871 ProduceMediaStreamAndTrackStats(timestamp_us, | |
872 *track_media_info_map_, | |
873 pc_->remote_streams(), | |
874 false, | |
875 report); | |
756 } | 876 } |
757 | 877 |
758 void RTCStatsCollector::ProducePeerConnectionStats_s( | 878 void RTCStatsCollector::ProducePeerConnectionStats_s( |
759 int64_t timestamp_us, RTCStatsReport* report) const { | 879 int64_t timestamp_us, RTCStatsReport* report) const { |
760 RTC_DCHECK(signaling_thread_->IsCurrent()); | 880 RTC_DCHECK(signaling_thread_->IsCurrent()); |
761 std::unique_ptr<RTCPeerConnectionStats> stats( | 881 std::unique_ptr<RTCPeerConnectionStats> stats( |
762 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); | 882 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); |
763 stats->data_channels_opened = internal_record_.data_channels_opened; | 883 stats->data_channels_opened = internal_record_.data_channels_opened; |
764 stats->data_channels_closed = internal_record_.data_channels_closed; | 884 stats->data_channels_closed = internal_record_.data_channels_closed; |
765 report->AddStats(std::move(stats)); | 885 report->AddStats(std::move(stats)); |
(...skipping 22 matching lines...) Expand all Loading... | |
788 RTCInboundRTPStreamStatsIDFromSSRC( | 908 RTCInboundRTPStreamStatsIDFromSSRC( |
789 true, voice_receiver_info.ssrc()), | 909 true, voice_receiver_info.ssrc()), |
790 timestamp_us)); | 910 timestamp_us)); |
791 SetInboundRTPStreamStatsFromVoiceReceiverInfo( | 911 SetInboundRTPStreamStatsFromVoiceReceiverInfo( |
792 voice_receiver_info, inbound_audio.get()); | 912 voice_receiver_info, inbound_audio.get()); |
793 rtc::scoped_refptr<AudioTrackInterface> audio_track = | 913 rtc::scoped_refptr<AudioTrackInterface> audio_track = |
794 track_media_info_map_->GetAudioTrack(voice_receiver_info); | 914 track_media_info_map_->GetAudioTrack(voice_receiver_info); |
795 if (audio_track) { | 915 if (audio_track) { |
796 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); | 916 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); |
797 inbound_audio->media_track_id = | 917 inbound_audio->media_track_id = |
798 RTCMediaStreamTrackStatsIDFromTrackID( | 918 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
799 track_to_id_.find(audio_track.get())->second, false); | 919 false, |
920 MediaStreamTrackInterface::kAudioKind, | |
921 track_to_id_.find(audio_track.get())->second, | |
922 voice_receiver_info.ssrc()); | |
800 } | 923 } |
801 inbound_audio->transport_id = transport_id; | 924 inbound_audio->transport_id = transport_id; |
802 if (voice_receiver_info.codec_payload_type) { | 925 if (voice_receiver_info.codec_payload_type) { |
803 inbound_audio->codec_id = | 926 inbound_audio->codec_id = |
804 RTCCodecStatsIDFromDirectionMediaAndPayload( | 927 RTCCodecStatsIDFromDirectionMediaAndPayload( |
805 true, true, *voice_receiver_info.codec_payload_type); | 928 true, true, *voice_receiver_info.codec_payload_type); |
806 } | 929 } |
807 report->AddStats(std::move(inbound_audio)); | 930 report->AddStats(std::move(inbound_audio)); |
808 } | 931 } |
809 // Outbound | 932 // Outbound |
810 for (const cricket::VoiceSenderInfo& voice_sender_info : | 933 for (const cricket::VoiceSenderInfo& voice_sender_info : |
811 track_media_info_map.voice_media_info()->senders) { | 934 track_media_info_map.voice_media_info()->senders) { |
812 // TODO(nisse): SSRC == 0 currently means none. Delete check when that | 935 // TODO(nisse): SSRC == 0 currently means none. Delete check when that |
813 // is fixed. | 936 // is fixed. |
814 if (voice_sender_info.ssrc() == 0) | 937 if (voice_sender_info.ssrc() == 0) |
815 continue; | 938 continue; |
816 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio( | 939 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio( |
817 new RTCOutboundRTPStreamStats( | 940 new RTCOutboundRTPStreamStats( |
818 RTCOutboundRTPStreamStatsIDFromSSRC( | 941 RTCOutboundRTPStreamStatsIDFromSSRC( |
819 true, voice_sender_info.ssrc()), | 942 true, voice_sender_info.ssrc()), |
820 timestamp_us)); | 943 timestamp_us)); |
821 SetOutboundRTPStreamStatsFromVoiceSenderInfo( | 944 SetOutboundRTPStreamStatsFromVoiceSenderInfo( |
822 voice_sender_info, outbound_audio.get()); | 945 voice_sender_info, outbound_audio.get()); |
823 rtc::scoped_refptr<AudioTrackInterface> audio_track = | 946 rtc::scoped_refptr<AudioTrackInterface> audio_track = |
824 track_media_info_map_->GetAudioTrack(voice_sender_info); | 947 track_media_info_map_->GetAudioTrack(voice_sender_info); |
825 if (audio_track) { | 948 if (audio_track) { |
826 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); | 949 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); |
827 outbound_audio->media_track_id = | 950 outbound_audio->media_track_id = |
828 RTCMediaStreamTrackStatsIDFromTrackID( | 951 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
829 track_to_id_.find(audio_track.get())->second, true); | 952 true, |
953 MediaStreamTrackInterface::kAudioKind, | |
954 track_to_id_.find(audio_track.get())->second, | |
955 voice_sender_info.ssrc()); | |
830 } | 956 } |
831 outbound_audio->transport_id = transport_id; | 957 outbound_audio->transport_id = transport_id; |
832 if (voice_sender_info.codec_payload_type) { | 958 if (voice_sender_info.codec_payload_type) { |
833 outbound_audio->codec_id = | 959 outbound_audio->codec_id = |
834 RTCCodecStatsIDFromDirectionMediaAndPayload( | 960 RTCCodecStatsIDFromDirectionMediaAndPayload( |
835 false, true, *voice_sender_info.codec_payload_type); | 961 false, true, *voice_sender_info.codec_payload_type); |
836 } | 962 } |
837 report->AddStats(std::move(outbound_audio)); | 963 report->AddStats(std::move(outbound_audio)); |
838 } | 964 } |
839 } | 965 } |
(...skipping 14 matching lines...) Expand all Loading... | |
854 RTCInboundRTPStreamStatsIDFromSSRC( | 980 RTCInboundRTPStreamStatsIDFromSSRC( |
855 false, video_receiver_info.ssrc()), | 981 false, video_receiver_info.ssrc()), |
856 timestamp_us)); | 982 timestamp_us)); |
857 SetInboundRTPStreamStatsFromVideoReceiverInfo( | 983 SetInboundRTPStreamStatsFromVideoReceiverInfo( |
858 video_receiver_info, inbound_video.get()); | 984 video_receiver_info, inbound_video.get()); |
859 rtc::scoped_refptr<VideoTrackInterface> video_track = | 985 rtc::scoped_refptr<VideoTrackInterface> video_track = |
860 track_media_info_map_->GetVideoTrack(video_receiver_info); | 986 track_media_info_map_->GetVideoTrack(video_receiver_info); |
861 if (video_track) { | 987 if (video_track) { |
862 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); | 988 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); |
863 inbound_video->media_track_id = | 989 inbound_video->media_track_id = |
864 RTCMediaStreamTrackStatsIDFromTrackID( | 990 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
865 track_to_id_.find(video_track.get())->second, false); | 991 false, |
992 MediaStreamTrackInterface::kVideoKind, | |
993 track_to_id_.find(video_track.get())->second, | |
994 video_receiver_info.ssrc()); | |
866 } | 995 } |
867 inbound_video->transport_id = transport_id; | 996 inbound_video->transport_id = transport_id; |
868 if (video_receiver_info.codec_payload_type) { | 997 if (video_receiver_info.codec_payload_type) { |
869 inbound_video->codec_id = | 998 inbound_video->codec_id = |
870 RTCCodecStatsIDFromDirectionMediaAndPayload( | 999 RTCCodecStatsIDFromDirectionMediaAndPayload( |
871 true, false, *video_receiver_info.codec_payload_type); | 1000 true, false, *video_receiver_info.codec_payload_type); |
872 } | 1001 } |
873 report->AddStats(std::move(inbound_video)); | 1002 report->AddStats(std::move(inbound_video)); |
874 } | 1003 } |
875 // Outbound | 1004 // Outbound |
876 for (const cricket::VideoSenderInfo& video_sender_info : | 1005 for (const cricket::VideoSenderInfo& video_sender_info : |
877 track_media_info_map.video_media_info()->senders) { | 1006 track_media_info_map.video_media_info()->senders) { |
878 // TODO(nisse): SSRC == 0 currently means none. Delete check when that | 1007 // TODO(nisse): SSRC == 0 currently means none. Delete check when that |
879 // is fixed. | 1008 // is fixed. |
880 if (video_sender_info.ssrc() == 0) | 1009 if (video_sender_info.ssrc() == 0) |
881 continue; | 1010 continue; |
882 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video( | 1011 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video( |
883 new RTCOutboundRTPStreamStats( | 1012 new RTCOutboundRTPStreamStats( |
884 RTCOutboundRTPStreamStatsIDFromSSRC( | 1013 RTCOutboundRTPStreamStatsIDFromSSRC( |
885 false, video_sender_info.ssrc()), | 1014 false, video_sender_info.ssrc()), |
886 timestamp_us)); | 1015 timestamp_us)); |
887 SetOutboundRTPStreamStatsFromVideoSenderInfo( | 1016 SetOutboundRTPStreamStatsFromVideoSenderInfo( |
888 video_sender_info, outbound_video.get()); | 1017 video_sender_info, outbound_video.get()); |
889 rtc::scoped_refptr<VideoTrackInterface> video_track = | 1018 rtc::scoped_refptr<VideoTrackInterface> video_track = |
890 track_media_info_map_->GetVideoTrack(video_sender_info); | 1019 track_media_info_map_->GetVideoTrack(video_sender_info); |
891 if (video_track) { | 1020 if (video_track) { |
892 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); | 1021 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); |
893 outbound_video->media_track_id = | 1022 outbound_video->media_track_id = |
894 RTCMediaStreamTrackStatsIDFromTrackID( | 1023 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
895 track_to_id_.find(video_track.get())->second, true); | 1024 true, |
1025 MediaStreamTrackInterface::kVideoKind, | |
1026 track_to_id_.find(video_track.get())->second, | |
1027 video_sender_info.ssrc()); | |
896 } | 1028 } |
897 outbound_video->transport_id = transport_id; | 1029 outbound_video->transport_id = transport_id; |
898 if (video_sender_info.codec_payload_type) { | 1030 if (video_sender_info.codec_payload_type) { |
899 outbound_video->codec_id = | 1031 outbound_video->codec_id = |
900 RTCCodecStatsIDFromDirectionMediaAndPayload( | 1032 RTCCodecStatsIDFromDirectionMediaAndPayload( |
901 false, false, *video_sender_info.codec_payload_type); | 1033 false, false, *video_sender_info.codec_payload_type); |
902 } | 1034 } |
903 report->AddStats(std::move(outbound_video)); | 1035 report->AddStats(std::move(outbound_video)); |
904 } | 1036 } |
905 } | 1037 } |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1074 const std::string& type) { | 1206 const std::string& type) { |
1075 return CandidateTypeToRTCIceCandidateType(type); | 1207 return CandidateTypeToRTCIceCandidateType(type); |
1076 } | 1208 } |
1077 | 1209 |
1078 const char* DataStateToRTCDataChannelStateForTesting( | 1210 const char* DataStateToRTCDataChannelStateForTesting( |
1079 DataChannelInterface::DataState state) { | 1211 DataChannelInterface::DataState state) { |
1080 return DataStateToRTCDataChannelState(state); | 1212 return DataStateToRTCDataChannelState(state); |
1081 } | 1213 } |
1082 | 1214 |
1083 } // namespace webrtc | 1215 } // namespace webrtc |
OLD | NEW |