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

Side by Side Diff: content/renderer/media/rtc_peer_connection_handler.cc

Issue 2186853002: WebRTCStats added, retaining type info when surfacing WebRTC stats into Blink (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed tommi's comments Created 4 years, 4 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 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/rtc_peer_connection_handler.h" 5 #include "content/renderer/media/rtc_peer_connection_handler.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 25 matching lines...) Expand all
36 #include "content/renderer/render_thread_impl.h" 36 #include "content/renderer/render_thread_impl.h"
37 #include "media/base/media_switches.h" 37 #include "media/base/media_switches.h"
38 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" 38 #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
39 #include "third_party/WebKit/public/platform/WebRTCAnswerOptions.h" 39 #include "third_party/WebKit/public/platform/WebRTCAnswerOptions.h"
40 #include "third_party/WebKit/public/platform/WebRTCConfiguration.h" 40 #include "third_party/WebKit/public/platform/WebRTCConfiguration.h"
41 #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h" 41 #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h"
42 #include "third_party/WebKit/public/platform/WebRTCICECandidate.h" 42 #include "third_party/WebKit/public/platform/WebRTCICECandidate.h"
43 #include "third_party/WebKit/public/platform/WebRTCOfferOptions.h" 43 #include "third_party/WebKit/public/platform/WebRTCOfferOptions.h"
44 #include "third_party/WebKit/public/platform/WebRTCSessionDescription.h" 44 #include "third_party/WebKit/public/platform/WebRTCSessionDescription.h"
45 #include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h" 45 #include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h"
46 #include "third_party/WebKit/public/platform/WebRTCStats.h"
46 #include "third_party/WebKit/public/platform/WebRTCVoidRequest.h" 47 #include "third_party/WebKit/public/platform/WebRTCVoidRequest.h"
47 #include "third_party/WebKit/public/platform/WebURL.h" 48 #include "third_party/WebKit/public/platform/WebURL.h"
48 #include "third_party/webrtc/pc/mediasession.h" 49 #include "third_party/webrtc/pc/mediasession.h"
49 50
50 using webrtc::DataChannelInterface; 51 using webrtc::DataChannelInterface;
51 using webrtc::IceCandidateInterface; 52 using webrtc::IceCandidateInterface;
52 using webrtc::MediaStreamInterface; 53 using webrtc::MediaStreamInterface;
53 using webrtc::PeerConnectionInterface; 54 using webrtc::PeerConnectionInterface;
54 using webrtc::PeerConnectionObserver; 55 using webrtc::PeerConnectionObserver;
55 using webrtc::StatsReport; 56 using webrtc::StatsReport;
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 DLOG_IF(ERROR, !webkit_request_.isNull()) 445 DLOG_IF(ERROR, !webkit_request_.isNull())
445 << "SetSessionDescriptionRequest not completed. Shutting down?"; 446 << "SetSessionDescriptionRequest not completed. Shutting down?";
446 } 447 }
447 448
448 private: 449 private:
449 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; 450 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
450 blink::WebRTCVoidRequest webkit_request_; 451 blink::WebRTCVoidRequest webkit_request_;
451 SessionDescriptionRequestTracker tracker_; 452 SessionDescriptionRequestTracker tracker_;
452 }; 453 };
453 454
455 blink::WebRTCStatsType WebRTCStatsTypeFromStatsType(
456 webrtc::StatsReport::StatsType name) {
457 // TODO(hbos): Translate StatsType -> WebRTCStatsType. crbug.com/627816
458 return blink::WebRTCStatsTypeUnknown;
459 }
460
461 blink::WebRTCStatsMemberName WebRTCStatsMemberNameFromStatsValueName(
462 webrtc::StatsReport::StatsValueName name) {
463 // TODO(hbos): Translate StatsValueName -> WebRTCStatsMemberName.
464 // crbug.com/627816
465 return blink::WebRTCStatsMemberNameUnknown;
466 }
467
468 blink::WebRTCStatsMemberType WebRTCStatsMemberTypeFromStatsValueType(
469 webrtc::StatsReport::Value::Type type) {
470 switch (type) {
471 case StatsReport::Value::kInt:
472 return blink::WebRTCStatsMemberTypeInt;
473 case StatsReport::Value::kInt64:
474 return blink::WebRTCStatsMemberTypeInt64;
475 case StatsReport::Value::kFloat:
476 return blink::WebRTCStatsMemberTypeFloat;
477 case StatsReport::Value::kString:
478 case StatsReport::Value::kStaticString:
479 return blink::WebRTCStatsMemberTypeString;
480 case StatsReport::Value::kBool:
481 return blink::WebRTCStatsMemberTypeBool;
482 case StatsReport::Value::kId:
483 return blink::WebRTCStatsMemberTypeId;
484 }
485 NOTREACHED();
486 return blink::WebRTCStatsMemberTypeInt;
487 }
488
454 // Class mapping responses from calls to libjingle 489 // Class mapping responses from calls to libjingle
455 // GetStats into a blink::WebRTCStatsCallback. 490 // GetStats into a blink::WebRTCStatsCallback.
456 class StatsResponse : public webrtc::StatsObserver { 491 class StatsResponse : public webrtc::StatsObserver {
457 public: 492 public:
458 explicit StatsResponse(const scoped_refptr<LocalRTCStatsRequest>& request) 493 explicit StatsResponse(const scoped_refptr<LocalRTCStatsRequest>& request)
459 : request_(request.get()), 494 : request_(request.get()),
460 main_thread_(base::ThreadTaskRunnerHandle::Get()) { 495 main_thread_(base::ThreadTaskRunnerHandle::Get()) {
461 // Measure the overall time it takes to satisfy a getStats request. 496 // Measure the overall time it takes to satisfy a getStats request.
462 TRACE_EVENT_ASYNC_BEGIN0("webrtc", "getStats_Native", this); 497 TRACE_EVENT_ASYNC_BEGIN0("webrtc", "getStats_Native", this);
463 signaling_thread_checker_.DetachFromThread(); 498 signaling_thread_checker_.DetachFromThread();
(...skipping 10 matching lines...) Expand all
474 report_copies->push_back(new Report(r)); 509 report_copies->push_back(new Report(r));
475 510
476 main_thread_->PostTaskAndReply(FROM_HERE, 511 main_thread_->PostTaskAndReply(FROM_HERE,
477 base::Bind(&StatsResponse::DeliverCallback, this, 512 base::Bind(&StatsResponse::DeliverCallback, this,
478 base::Unretained(report_copies)), 513 base::Unretained(report_copies)),
479 base::Bind(&StatsResponse::DeleteReports, 514 base::Bind(&StatsResponse::DeleteReports,
480 base::Unretained(report_copies))); 515 base::Unretained(report_copies)));
481 } 516 }
482 517
483 private: 518 private:
484 struct Report { 519 class Report : public blink::WebRTCStats {
520 public:
521 class MemberIterator : public blink::WebRTCStatsMemberIterator {
522 public:
523 MemberIterator(const StatsReport::Values::const_iterator& it,
524 const StatsReport::Values::const_iterator& end)
525 : it_(it), end_(end) {}
526
527 // blink::WebRTCStatsMemberIterator
528 bool isEnd() const override { return it_ == end_; }
529 void next() override { ++it_; }
530 blink::WebRTCStatsMemberName name() const override {
531 return WebRTCStatsMemberNameFromStatsValueName(it_->second->name);
532 }
533 blink::WebString displayName() const override {
534 return blink::WebString::fromUTF8(it_->second->display_name());
535 }
536 blink::WebRTCStatsMemberType type() const override {
537 return WebRTCStatsMemberTypeFromStatsValueType(it_->second->type());
538 }
539 int valueInt() const override {
540 return it_->second->int_val();
541 }
542 int64_t valueInt64() const override {
543 return it_->second->int64_val();
544 }
545 float valueFloat() const override {
546 return it_->second->float_val();
547 }
548 blink::WebString valueString() const override {
549 const StatsReport::ValuePtr& value = it_->second;
550 if (value->type() == StatsReport::Value::kString)
551 return blink::WebString::fromUTF8(value->string_val());
552 DCHECK_EQ(value->type(), StatsReport::Value::kStaticString);
553 return blink::WebString::fromUTF8(value->static_string_val());
554 }
555 bool valueBool() const override {
556 return it_->second->bool_val();
557 }
558 blink::WebString valueToString() const override {
559 const StatsReport::ValuePtr& value = it_->second;
560 if (value->type() == StatsReport::Value::kString)
561 return blink::WebString::fromUTF8(value->string_val());
562 if (value->type() == StatsReport::Value::kStaticString)
563 return blink::WebString::fromUTF8(value->static_string_val());
564 return blink::WebString::fromUTF8(value->ToString());
565 }
566
567 private:
568 StatsReport::Values::const_iterator it_;
569 StatsReport::Values::const_iterator end_;
570 };
571
485 Report(const StatsReport* report) 572 Report(const StatsReport* report)
486 : thread_checker(), id(report->id()->ToString()), 573 : thread_checker_(),
487 type(report->TypeToString()), timestamp(report->timestamp()), 574 id_(report->id()->ToString()),
488 values(report->values()) { 575 type_(report->type()),
576 type_name_(report->TypeToString()),
577 timestamp_(report->timestamp()),
578 values_(report->values()) {}
579
580 ~Report() override {
581 // Since the values vector holds pointers to const objects that are bound
582 // to the signaling thread, they must be released on the same thread.
583 DCHECK(thread_checker_.CalledOnValidThread());
489 } 584 }
490 585
491 ~Report() { 586 // blink::WebRTCStats
492 // Since the values vector holds pointers to const objects that are bound 587 blink::WebString id() const override {
493 // to the signaling thread, they must be released on the same thread. 588 return blink::WebString::fromUTF8(id_);
494 DCHECK(thread_checker.CalledOnValidThread()); 589 }
590 blink::WebRTCStatsType type() const override {
591 return WebRTCStatsTypeFromStatsType(type_);
592 }
593 blink::WebString typeToString() const override {
594 return blink::WebString::fromUTF8(type_name_);
595 }
596 double timestamp() const override {
597 return timestamp_;
598 }
599 blink::WebRTCStatsMemberIterator* iterator() const override {
600 return new MemberIterator(values_.cbegin(), values_.cend());
495 } 601 }
496 602
497 const base::ThreadChecker thread_checker; 603 bool HasValues() const {
498 const std::string id, type; 604 return values_.size() > 0;
499 const double timestamp; 605 }
500 const StatsReport::Values values; 606
607 private:
608 const base::ThreadChecker thread_checker_;
609 const std::string id_;
610 const StatsReport::StatsType type_;
611 const std::string type_name_;
612 const double timestamp_;
613 const StatsReport::Values values_;
501 }; 614 };
502 615
503 static void DeleteReports(std::vector<Report*>* reports) { 616 static void DeleteReports(std::vector<Report*>* reports) {
504 TRACE_EVENT0("webrtc", "StatsResponse::DeleteReports"); 617 TRACE_EVENT0("webrtc", "StatsResponse::DeleteReports");
505 for (auto* p : *reports) 618 for (auto* p : *reports)
506 delete p; 619 delete p;
507 delete reports; 620 delete reports;
508 } 621 }
509 622
510 void DeliverCallback(const std::vector<Report*>* reports) { 623 void DeliverCallback(const std::vector<Report*>* reports) {
511 DCHECK(main_thread_->BelongsToCurrentThread()); 624 DCHECK(main_thread_->BelongsToCurrentThread());
512 TRACE_EVENT0("webrtc", "StatsResponse::DeliverCallback"); 625 TRACE_EVENT0("webrtc", "StatsResponse::DeliverCallback");
513 626
514 rtc::scoped_refptr<LocalRTCStatsResponse> response( 627 rtc::scoped_refptr<LocalRTCStatsResponse> response(
515 request_->createResponse().get()); 628 request_->createResponse().get());
516 for (const auto* report : *reports) { 629 for (const auto* report : *reports) {
517 if (report->values.size() > 0) 630 if (report->HasValues())
518 AddReport(response.get(), *report); 631 AddReport(response.get(), *report);
519 } 632 }
520 633
521 // Record the getStats operation as done before calling into Blink so that 634 // Record the getStats operation as done before calling into Blink so that
522 // we don't skew the perf measurements of the native code with whatever the 635 // we don't skew the perf measurements of the native code with whatever the
523 // callback might be doing. 636 // callback might be doing.
524 TRACE_EVENT_ASYNC_END0("webrtc", "getStats_Native", this); 637 TRACE_EVENT_ASYNC_END0("webrtc", "getStats_Native", this);
525 request_->requestSucceeded(response); 638 request_->requestSucceeded(response);
526 request_ = nullptr; // must be freed on the main thread. 639 request_ = nullptr; // must be freed on the main thread.
527 } 640 }
528 641
529 void AddReport(LocalRTCStatsResponse* response, const Report& report) { 642 void AddReport(LocalRTCStatsResponse* response, const Report& report) {
530 int idx = response->addReport(blink::WebString::fromUTF8(report.id), 643 response->addStats(report);
531 blink::WebString::fromUTF8(report.type),
532 report.timestamp);
533 blink::WebString name, value_str;
534 for (const auto& value : report.values) {
535 const StatsReport::ValuePtr& v = value.second;
536 name = blink::WebString::fromUTF8(value.second->display_name());
537
538 if (v->type() == StatsReport::Value::kString)
539 value_str = blink::WebString::fromUTF8(v->string_val());
540 if (v->type() == StatsReport::Value::kStaticString)
541 value_str = blink::WebString::fromUTF8(v->static_string_val());
542 else
543 value_str = blink::WebString::fromUTF8(v->ToString());
544
545 response->addStatistic(idx, name, value_str);
546 }
547 } 644 }
548 645
549 rtc::scoped_refptr<LocalRTCStatsRequest> request_; 646 rtc::scoped_refptr<LocalRTCStatsRequest> request_;
550 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; 647 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
551 base::ThreadChecker signaling_thread_checker_; 648 base::ThreadChecker signaling_thread_checker_;
552 }; 649 };
553 650
554 void GetStatsOnSignalingThread( 651 void GetStatsOnSignalingThread(
555 const scoped_refptr<webrtc::PeerConnectionInterface>& pc, 652 const scoped_refptr<webrtc::PeerConnectionInterface>& pc,
556 webrtc::PeerConnectionInterface::StatsOutputLevel level, 653 webrtc::PeerConnectionInterface::StatsOutputLevel level,
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 void LocalRTCStatsRequest::requestSucceeded( 845 void LocalRTCStatsRequest::requestSucceeded(
749 const LocalRTCStatsResponse* response) { 846 const LocalRTCStatsResponse* response) {
750 impl_.requestSucceeded(response->webKitStatsResponse()); 847 impl_.requestSucceeded(response->webKitStatsResponse());
751 } 848 }
752 849
753 // Implementation of LocalRTCStatsResponse. 850 // Implementation of LocalRTCStatsResponse.
754 blink::WebRTCStatsResponse LocalRTCStatsResponse::webKitStatsResponse() const { 851 blink::WebRTCStatsResponse LocalRTCStatsResponse::webKitStatsResponse() const {
755 return impl_; 852 return impl_;
756 } 853 }
757 854
758 size_t LocalRTCStatsResponse::addReport(blink::WebString type, 855 void LocalRTCStatsResponse::addStats(const blink::WebRTCStats& stats) {
759 blink::WebString id, 856 impl_.addStats(stats);
760 double timestamp) {
761 return impl_.addReport(type, id, timestamp);
762 }
763
764 void LocalRTCStatsResponse::addStatistic(size_t report,
765 blink::WebString name,
766 blink::WebString value) {
767 impl_.addStatistic(report, name, value);
768 } 857 }
769 858
770 // Receives notifications from a PeerConnection object about state changes, 859 // Receives notifications from a PeerConnection object about state changes,
771 // track addition/removal etc. The callbacks we receive here come on the 860 // track addition/removal etc. The callbacks we receive here come on the
772 // signaling thread, so this class takes care of delivering them to an 861 // signaling thread, so this class takes care of delivering them to an
773 // RTCPeerConnectionHandler instance on the main thread. 862 // RTCPeerConnectionHandler instance on the main thread.
774 // In order to do safe PostTask-ing, the class is reference counted and 863 // In order to do safe PostTask-ing, the class is reference counted and
775 // checks for the existence of the RTCPeerConnectionHandler instance before 864 // checks for the existence of the RTCPeerConnectionHandler instance before
776 // delivering callbacks on the main thread. 865 // delivering callbacks on the main thread.
777 class RTCPeerConnectionHandler::Observer 866 class RTCPeerConnectionHandler::Observer
(...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after
1805 } 1894 }
1806 1895
1807 void RTCPeerConnectionHandler::ResetUMAStats() { 1896 void RTCPeerConnectionHandler::ResetUMAStats() {
1808 DCHECK(thread_checker_.CalledOnValidThread()); 1897 DCHECK(thread_checker_.CalledOnValidThread());
1809 num_local_candidates_ipv6_ = 0; 1898 num_local_candidates_ipv6_ = 0;
1810 num_local_candidates_ipv4_ = 0; 1899 num_local_candidates_ipv4_ = 0;
1811 ice_connection_checking_start_ = base::TimeTicks(); 1900 ice_connection_checking_start_ = base::TimeTicks();
1812 memset(ice_state_seen_, 0, sizeof(ice_state_seen_)); 1901 memset(ice_state_seen_, 0, sizeof(ice_state_seen_));
1813 } 1902 }
1814 } // namespace content 1903 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/rtc_peer_connection_handler.h ('k') | content/renderer/media/rtc_peer_connection_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698