Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: webrtc/api/rtcstatscollector.cc

Issue 2641763003: RTCMediaStreamTrackStats collected on a per-attachment basis. (Closed)
Patch Set: Added comments Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/api/rtcstats_integrationtest.cc ('k') | webrtc/api/rtcstatscollector_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 if (video_receiver_info.frame_width > 0 &&
433 video_receiver_info.frame_height > 0) {
434 video_track_stats->frame_width = static_cast<uint32_t>(
435 video_receiver_info.frame_width);
436 video_track_stats->frame_height = static_cast<uint32_t>(
437 video_receiver_info.frame_height);
438 }
439 return video_track_stats;
440 }
441
325 void ProduceMediaStreamAndTrackStats( 442 void ProduceMediaStreamAndTrackStats(
326 int64_t timestamp_us, 443 int64_t timestamp_us,
444 const TrackMediaInfoMap& track_media_info_map,
327 rtc::scoped_refptr<StreamCollectionInterface> streams, 445 rtc::scoped_refptr<StreamCollectionInterface> streams,
328 bool is_local, 446 bool is_local,
329 RTCStatsReport* report) { 447 RTCStatsReport* report) {
330 // TODO(hbos): When "AddTrack" is implemented we should iterate tracks to 448 // TODO(hbos): When "AddTrack" is implemented we should iterate tracks to
331 // find which streams exist, not iterate streams to find tracks. 449 // find which streams exist, not iterate streams to find tracks.
332 // crbug.com/659137 450 // crbug.com/659137
333 // TODO(hbos): Return stats of detached tracks. We have to perform stats 451 // 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. 452 // gathering at the time of detachment to get accurate stats and timestamps.
335 // crbug.com/659137 453 // crbug.com/659137
336 if (!streams) 454 if (!streams)
337 return; 455 return;
338 for (size_t i = 0; i < streams->count(); ++i) { 456 for (size_t i = 0; i < streams->count(); ++i) {
339 MediaStreamInterface* stream = streams->at(i); 457 MediaStreamInterface* stream = streams->at(i);
340 458
341 std::unique_ptr<RTCMediaStreamStats> stream_stats( 459 std::unique_ptr<RTCMediaStreamStats> stream_stats(
342 new RTCMediaStreamStats( 460 new RTCMediaStreamStats(
343 (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") + 461 (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") +
344 stream->label(), timestamp_us)); 462 stream->label(), timestamp_us));
345 stream_stats->stream_identifier = stream->label(); 463 stream_stats->stream_identifier = stream->label();
346 stream_stats->track_ids = std::vector<std::string>(); 464 stream_stats->track_ids = std::vector<std::string>();
347 // Audio Tracks 465 // The track stats are per-attachment to the connection. There can be one
348 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track : 466 // for receiving (remote) tracks and multiple attachments for sending
349 stream->GetAudioTracks()) { 467 // (local) tracks.
350 std::string id = RTCMediaStreamTrackStatsIDFromTrackID( 468 if (is_local) {
351 audio_track->id(), is_local); 469 // Local Audio Tracks
352 if (report->Get(id)) { 470 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track :
353 // Skip track, stats already exist for it. 471 stream->GetAudioTracks()) {
354 continue; 472 const std::vector<cricket::VoiceSenderInfo*>* voice_sender_infos =
355 } 473 track_media_info_map.GetVoiceSenderInfos(*audio_track);
356 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats( 474 if (!voice_sender_infos) {
357 new RTCMediaStreamTrackStats(id, timestamp_us, 475 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 } 476 }
379 if (audio_processor_stats.echo_return_loss_enhancement != -100) { 477 for (const auto& voice_sender_info : *voice_sender_infos) {
380 audio_track_stats->echo_return_loss_enhancement = static_cast<double>( 478 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats =
381 audio_processor_stats.echo_return_loss_enhancement); 479 ProduceMediaStreamTrackStatsFromVoiceSenderInfo(
480 timestamp_us, *audio_track, *voice_sender_info);
481 stream_stats->track_ids->push_back(audio_track_stats->id());
482 report->AddStats(std::move(audio_track_stats));
382 } 483 }
383 } 484 }
384 report->AddStats(std::move(audio_track_stats)); 485 // Local Video Tracks
385 } 486 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track :
386 // Video Tracks 487 stream->GetVideoTracks()) {
387 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track : 488 const std::vector<cricket::VideoSenderInfo*>* video_sender_infos =
388 stream->GetVideoTracks()) { 489 track_media_info_map.GetVideoSenderInfos(*video_track);
389 std::string id = RTCMediaStreamTrackStatsIDFromTrackID( 490 if (!video_sender_infos) {
390 video_track->id(), is_local); 491 continue;
391 if (report->Get(id)) { 492 }
392 // Skip track, stats already exist for it. 493 for (const auto& video_sender_info : *video_sender_infos) {
393 continue; 494 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats =
394 } 495 ProduceMediaStreamTrackStatsFromVideoSenderInfo(
395 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats( 496 timestamp_us, *video_track, *video_sender_info);
396 new RTCMediaStreamTrackStats(id, timestamp_us, 497 stream_stats->track_ids->push_back(video_track_stats->id());
397 RTCMediaStreamTrackKind::kVideo)); 498 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 } 499 }
412 } 500 }
413 report->AddStats(std::move(video_track_stats)); 501 } else {
502 // Remote Audio Tracks
503 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track :
504 stream->GetAudioTracks()) {
505 const cricket::VoiceReceiverInfo* voice_receiver_info =
506 track_media_info_map.GetVoiceReceiverInfo(*audio_track);
507 if (!voice_receiver_info) {
508 continue;
509 }
510 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats =
511 ProduceMediaStreamTrackStatsFromVoiceReceiverInfo(
512 timestamp_us, *audio_track, *voice_receiver_info);
513 stream_stats->track_ids->push_back(audio_track_stats->id());
514 report->AddStats(std::move(audio_track_stats));
515 }
516 // Remote Video Tracks
517 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track :
518 stream->GetVideoTracks()) {
519 const cricket::VideoReceiverInfo* video_receiver_info =
520 track_media_info_map.GetVideoReceiverInfo(*video_track);
521 if (!video_receiver_info) {
522 continue;
523 }
524 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats =
525 ProduceMediaStreamTrackStatsFromVideoReceiverInfo(
526 timestamp_us, *video_track, *video_receiver_info);
527 stream_stats->track_ids->push_back(video_track_stats->id());
528 report->AddStats(std::move(video_track_stats));
529 }
414 } 530 }
415 report->AddStats(std::move(stream_stats)); 531 report->AddStats(std::move(stream_stats));
416 } 532 }
417 } 533 }
418 534
419 } // namespace 535 } // namespace
420 536
421 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create( 537 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create(
422 PeerConnection* pc, int64_t cache_lifetime_us) { 538 PeerConnection* pc, int64_t cache_lifetime_us) {
423 return rtc::scoped_refptr<RTCStatsCollector>( 539 return rtc::scoped_refptr<RTCStatsCollector>(
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 858
743 report->AddStats(std::move(candidate_pair_stats)); 859 report->AddStats(std::move(candidate_pair_stats));
744 } 860 }
745 } 861 }
746 } 862 }
747 } 863 }
748 864
749 void RTCStatsCollector::ProduceMediaStreamAndTrackStats_s( 865 void RTCStatsCollector::ProduceMediaStreamAndTrackStats_s(
750 int64_t timestamp_us, RTCStatsReport* report) const { 866 int64_t timestamp_us, RTCStatsReport* report) const {
751 RTC_DCHECK(signaling_thread_->IsCurrent()); 867 RTC_DCHECK(signaling_thread_->IsCurrent());
752 ProduceMediaStreamAndTrackStats( 868 RTC_DCHECK(track_media_info_map_);
753 timestamp_us, pc_->local_streams(), true, report); 869 ProduceMediaStreamAndTrackStats(timestamp_us,
754 ProduceMediaStreamAndTrackStats( 870 *track_media_info_map_,
755 timestamp_us, pc_->remote_streams(), false, report); 871 pc_->local_streams(),
872 true,
873 report);
874 ProduceMediaStreamAndTrackStats(timestamp_us,
875 *track_media_info_map_,
876 pc_->remote_streams(),
877 false,
878 report);
756 } 879 }
757 880
758 void RTCStatsCollector::ProducePeerConnectionStats_s( 881 void RTCStatsCollector::ProducePeerConnectionStats_s(
759 int64_t timestamp_us, RTCStatsReport* report) const { 882 int64_t timestamp_us, RTCStatsReport* report) const {
760 RTC_DCHECK(signaling_thread_->IsCurrent()); 883 RTC_DCHECK(signaling_thread_->IsCurrent());
761 std::unique_ptr<RTCPeerConnectionStats> stats( 884 std::unique_ptr<RTCPeerConnectionStats> stats(
762 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); 885 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us));
763 stats->data_channels_opened = internal_record_.data_channels_opened; 886 stats->data_channels_opened = internal_record_.data_channels_opened;
764 stats->data_channels_closed = internal_record_.data_channels_closed; 887 stats->data_channels_closed = internal_record_.data_channels_closed;
765 report->AddStats(std::move(stats)); 888 report->AddStats(std::move(stats));
(...skipping 22 matching lines...) Expand all
788 RTCInboundRTPStreamStatsIDFromSSRC( 911 RTCInboundRTPStreamStatsIDFromSSRC(
789 true, voice_receiver_info.ssrc()), 912 true, voice_receiver_info.ssrc()),
790 timestamp_us)); 913 timestamp_us));
791 SetInboundRTPStreamStatsFromVoiceReceiverInfo( 914 SetInboundRTPStreamStatsFromVoiceReceiverInfo(
792 voice_receiver_info, inbound_audio.get()); 915 voice_receiver_info, inbound_audio.get());
793 rtc::scoped_refptr<AudioTrackInterface> audio_track = 916 rtc::scoped_refptr<AudioTrackInterface> audio_track =
794 track_media_info_map_->GetAudioTrack(voice_receiver_info); 917 track_media_info_map_->GetAudioTrack(voice_receiver_info);
795 if (audio_track) { 918 if (audio_track) {
796 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); 919 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end());
797 inbound_audio->media_track_id = 920 inbound_audio->media_track_id =
798 RTCMediaStreamTrackStatsIDFromTrackID( 921 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
799 track_to_id_.find(audio_track.get())->second, false); 922 false,
923 MediaStreamTrackInterface::kAudioKind,
924 track_to_id_.find(audio_track.get())->second,
925 voice_receiver_info.ssrc());
800 } 926 }
801 inbound_audio->transport_id = transport_id; 927 inbound_audio->transport_id = transport_id;
802 if (voice_receiver_info.codec_payload_type) { 928 if (voice_receiver_info.codec_payload_type) {
803 inbound_audio->codec_id = 929 inbound_audio->codec_id =
804 RTCCodecStatsIDFromDirectionMediaAndPayload( 930 RTCCodecStatsIDFromDirectionMediaAndPayload(
805 true, true, *voice_receiver_info.codec_payload_type); 931 true, true, *voice_receiver_info.codec_payload_type);
806 } 932 }
807 report->AddStats(std::move(inbound_audio)); 933 report->AddStats(std::move(inbound_audio));
808 } 934 }
809 // Outbound 935 // Outbound
810 for (const cricket::VoiceSenderInfo& voice_sender_info : 936 for (const cricket::VoiceSenderInfo& voice_sender_info :
811 track_media_info_map.voice_media_info()->senders) { 937 track_media_info_map.voice_media_info()->senders) {
812 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 938 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
813 // is fixed. 939 // is fixed.
814 if (voice_sender_info.ssrc() == 0) 940 if (voice_sender_info.ssrc() == 0)
815 continue; 941 continue;
816 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio( 942 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio(
817 new RTCOutboundRTPStreamStats( 943 new RTCOutboundRTPStreamStats(
818 RTCOutboundRTPStreamStatsIDFromSSRC( 944 RTCOutboundRTPStreamStatsIDFromSSRC(
819 true, voice_sender_info.ssrc()), 945 true, voice_sender_info.ssrc()),
820 timestamp_us)); 946 timestamp_us));
821 SetOutboundRTPStreamStatsFromVoiceSenderInfo( 947 SetOutboundRTPStreamStatsFromVoiceSenderInfo(
822 voice_sender_info, outbound_audio.get()); 948 voice_sender_info, outbound_audio.get());
823 rtc::scoped_refptr<AudioTrackInterface> audio_track = 949 rtc::scoped_refptr<AudioTrackInterface> audio_track =
824 track_media_info_map_->GetAudioTrack(voice_sender_info); 950 track_media_info_map_->GetAudioTrack(voice_sender_info);
825 if (audio_track) { 951 if (audio_track) {
826 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); 952 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end());
827 outbound_audio->media_track_id = 953 outbound_audio->media_track_id =
828 RTCMediaStreamTrackStatsIDFromTrackID( 954 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
829 track_to_id_.find(audio_track.get())->second, true); 955 true,
956 MediaStreamTrackInterface::kAudioKind,
957 track_to_id_.find(audio_track.get())->second,
958 voice_sender_info.ssrc());
830 } 959 }
831 outbound_audio->transport_id = transport_id; 960 outbound_audio->transport_id = transport_id;
832 if (voice_sender_info.codec_payload_type) { 961 if (voice_sender_info.codec_payload_type) {
833 outbound_audio->codec_id = 962 outbound_audio->codec_id =
834 RTCCodecStatsIDFromDirectionMediaAndPayload( 963 RTCCodecStatsIDFromDirectionMediaAndPayload(
835 false, true, *voice_sender_info.codec_payload_type); 964 false, true, *voice_sender_info.codec_payload_type);
836 } 965 }
837 report->AddStats(std::move(outbound_audio)); 966 report->AddStats(std::move(outbound_audio));
838 } 967 }
839 } 968 }
(...skipping 14 matching lines...) Expand all
854 RTCInboundRTPStreamStatsIDFromSSRC( 983 RTCInboundRTPStreamStatsIDFromSSRC(
855 false, video_receiver_info.ssrc()), 984 false, video_receiver_info.ssrc()),
856 timestamp_us)); 985 timestamp_us));
857 SetInboundRTPStreamStatsFromVideoReceiverInfo( 986 SetInboundRTPStreamStatsFromVideoReceiverInfo(
858 video_receiver_info, inbound_video.get()); 987 video_receiver_info, inbound_video.get());
859 rtc::scoped_refptr<VideoTrackInterface> video_track = 988 rtc::scoped_refptr<VideoTrackInterface> video_track =
860 track_media_info_map_->GetVideoTrack(video_receiver_info); 989 track_media_info_map_->GetVideoTrack(video_receiver_info);
861 if (video_track) { 990 if (video_track) {
862 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); 991 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end());
863 inbound_video->media_track_id = 992 inbound_video->media_track_id =
864 RTCMediaStreamTrackStatsIDFromTrackID( 993 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
865 track_to_id_.find(video_track.get())->second, false); 994 false,
995 MediaStreamTrackInterface::kVideoKind,
996 track_to_id_.find(video_track.get())->second,
997 video_receiver_info.ssrc());
866 } 998 }
867 inbound_video->transport_id = transport_id; 999 inbound_video->transport_id = transport_id;
868 if (video_receiver_info.codec_payload_type) { 1000 if (video_receiver_info.codec_payload_type) {
869 inbound_video->codec_id = 1001 inbound_video->codec_id =
870 RTCCodecStatsIDFromDirectionMediaAndPayload( 1002 RTCCodecStatsIDFromDirectionMediaAndPayload(
871 true, false, *video_receiver_info.codec_payload_type); 1003 true, false, *video_receiver_info.codec_payload_type);
872 } 1004 }
873 report->AddStats(std::move(inbound_video)); 1005 report->AddStats(std::move(inbound_video));
874 } 1006 }
875 // Outbound 1007 // Outbound
876 for (const cricket::VideoSenderInfo& video_sender_info : 1008 for (const cricket::VideoSenderInfo& video_sender_info :
877 track_media_info_map.video_media_info()->senders) { 1009 track_media_info_map.video_media_info()->senders) {
878 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 1010 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
879 // is fixed. 1011 // is fixed.
880 if (video_sender_info.ssrc() == 0) 1012 if (video_sender_info.ssrc() == 0)
881 continue; 1013 continue;
882 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video( 1014 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video(
883 new RTCOutboundRTPStreamStats( 1015 new RTCOutboundRTPStreamStats(
884 RTCOutboundRTPStreamStatsIDFromSSRC( 1016 RTCOutboundRTPStreamStatsIDFromSSRC(
885 false, video_sender_info.ssrc()), 1017 false, video_sender_info.ssrc()),
886 timestamp_us)); 1018 timestamp_us));
887 SetOutboundRTPStreamStatsFromVideoSenderInfo( 1019 SetOutboundRTPStreamStatsFromVideoSenderInfo(
888 video_sender_info, outbound_video.get()); 1020 video_sender_info, outbound_video.get());
889 rtc::scoped_refptr<VideoTrackInterface> video_track = 1021 rtc::scoped_refptr<VideoTrackInterface> video_track =
890 track_media_info_map_->GetVideoTrack(video_sender_info); 1022 track_media_info_map_->GetVideoTrack(video_sender_info);
891 if (video_track) { 1023 if (video_track) {
892 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); 1024 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end());
893 outbound_video->media_track_id = 1025 outbound_video->media_track_id =
894 RTCMediaStreamTrackStatsIDFromTrackID( 1026 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
895 track_to_id_.find(video_track.get())->second, true); 1027 true,
1028 MediaStreamTrackInterface::kVideoKind,
1029 track_to_id_.find(video_track.get())->second,
1030 video_sender_info.ssrc());
896 } 1031 }
897 outbound_video->transport_id = transport_id; 1032 outbound_video->transport_id = transport_id;
898 if (video_sender_info.codec_payload_type) { 1033 if (video_sender_info.codec_payload_type) {
899 outbound_video->codec_id = 1034 outbound_video->codec_id =
900 RTCCodecStatsIDFromDirectionMediaAndPayload( 1035 RTCCodecStatsIDFromDirectionMediaAndPayload(
901 false, false, *video_sender_info.codec_payload_type); 1036 false, false, *video_sender_info.codec_payload_type);
902 } 1037 }
903 report->AddStats(std::move(outbound_video)); 1038 report->AddStats(std::move(outbound_video));
904 } 1039 }
905 } 1040 }
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 const std::string& type) { 1209 const std::string& type) {
1075 return CandidateTypeToRTCIceCandidateType(type); 1210 return CandidateTypeToRTCIceCandidateType(type);
1076 } 1211 }
1077 1212
1078 const char* DataStateToRTCDataChannelStateForTesting( 1213 const char* DataStateToRTCDataChannelStateForTesting(
1079 DataChannelInterface::DataState state) { 1214 DataChannelInterface::DataState state) {
1080 return DataStateToRTCDataChannelState(state); 1215 return DataStateToRTCDataChannelState(state);
1081 } 1216 }
1082 1217
1083 } // namespace webrtc 1218 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/api/rtcstats_integrationtest.cc ('k') | webrtc/api/rtcstatscollector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698