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

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

Issue 2641763003: RTCMediaStreamTrackStats collected on a per-attachment basis. (Closed)
Patch Set: 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
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 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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698