8000 Fixed getStats for windows. (#1075) · myname-caoben/flutter-webrtc@e3d650b · GitHub
[go: up one dir, main page]

Skip to content

Commit e3d650b

Browse files
authored
Fixed getStats for windows. (flutter-webrtc#1075)
1 parent a2a5c78 commit e3d650b

File tree

7 files changed

+456
-282
lines changed

7 files changed

+456
-282
lines changed

common/cpp/src/flutter_peerconnection.cc

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -742,11 +742,128 @@ void FlutterPeerConnection::AddIceCandidate(
742742
result->Success();
743743
}
744744

745+
746+
747+
EncodableMap statsToMap(const scoped_refptr<MediaRTCStats>& stats) {
748+
EncodableMap report_map;
749+
report_map[EncodableValue("id")] = EncodableValue(stats->id().std_string());
750+
report_map[EncodableValue("type")] = EncodableValue(stats->type().std_string());
751+
report_map[EncodableValue("timestamp")] =
752+
EncodableValue(stats->timestamp_us());
753+
EncodableMap values;
754+
auto members = stats->Members();
755+
for (int i = 0; i < members.size(); i++) {
756+
auto member = members[i];
757+
if(!member->IsDefined()) {
758+
continue;
759+
}
760+
switch (member->GetType())
761+
{
762+
case RTCStatsMember::Type::kBool:
763+
values[EncodableValue(member->GetName().std_string())] =
764+
EncodableValue(member->ValueBool());
765+
break;
766+
case RTCStatsMember::Type::kInt32:
767+
values[EncodableValue(member->GetName().std_string())] =
768+
EncodableValue(member->ValueInt32());
769+
break;
770+
case RTCStatsMember::Type::kUint32:
771+
values[EncodableValue(member->GetName().std_string())] =
772+
EncodableValue((int64_t)member->ValueUint32());
773+
break;
774+
case RTCStatsMember::Type::kInt64:
775+
values[EncodableValue(member->GetName().std_string())] =
776+
EncodableValue(member->ValueInt64());
777+
break;
778+
case RTCStatsMember::Type::kUint64:
779+
values[EncodableValue(member->GetName().std_string())] =
780+
EncodableValue((int64_t)member->ValueUint64());
781+
break;
782+
case RTCStatsMember::Type::kDouble:
783+
values[EncodableValue(member->GetName().std_string())] =
784+
EncodableValue(member->ValueDouble());
785+
break;
786+
case RTCStatsMember::Type::kString:
787+
values[EncodableValue(member->GetName().std_string())] =
788+
EncodableValue(member->ValueString().std_string());
789+
break;
790+
default:
791+
break;
792+
}
793+
}
794+
report_map[EncodableValue("values")] = EncodableValue(values);
795+
return report_map;
796+
}
797+
745798
void FlutterPeerConnection::GetStats(
746799
const std::string& track_id,
747800
RTCPeerConnection* pc,
748801
std::unique_ptr<MethodResult<EncodableValue>> result) {
749-
// TODO
802+
std::shared_ptr<MethodResult<EncodableValue>> result_ptr(result.release());
803+
scoped_refptr<RTCMediaTrack> track = base_->MediaTracksForId(track_id);
804+
if (track != nullptr) {
805+
bool found = false;
806+
auto receivers = pc->receivers();
807+
for (auto receiver : receivers.std_vector()) {
808+
if (receiver->track()->id().c_string() == track_id) {
809+
found = true;
810+
pc->GetStats(
811+
receiver,
812+
[result_ptr](const vector<scoped_refptr<MediaRTCStats>> reports) {
813+
EncodableList list;
814+
for (int i = 0; i < reports.size(); i++) {
815+
list.push_back(statsToMap(reports[i]));
816+
}
817+
EncodableMap params;
818+
params[EncodableValue("stats")] = list;
819+
result_ptr->Success(EncodableValue(params));
820+
},
821+
[result_ptr](const char* error) {
822+
result_ptr->Error("GetStats", error);
823+
});
824+
return;
825+
}
826+
}
827+
auto senders = pc->senders();
828+
for (auto sender : senders.std_vector()) {
829+
if (sender->track()->id().c_string() == track_id) {
830+
found = true;
831+
EncodableList list;
832+
pc->GetStats(
833+
sender,
834+
[result_ptr](const vector<scoped_refptr<MediaRTCStats>> reports) {
835+
EncodableList list;
836+
for (int i = 0; i < reports.size(); i++) {
837+
list.push_back(statsToMap(reports[i]));
838+
}
839+
EncodableMap params;
840+
params[EncodableValue("stats")] = list;
841+
result_ptr->Success(EncodableValue(params));
842+
},
843+
[result_ptr](const char* error) {
844+
result_ptr->Error("GetStats", error);
845+
});
846+
return;
847+
}
848+
}
849+
if(!found) {
850+
result_ptr->Error("GetStats", "Track not found");
851+
}
852+
} else {
853+
pc->GetStats(
854+
[result_ptr](const vector<scoped_refptr<MediaRTCStats>> reports) {
855+
EncodableList list;
856+
for (int i = 0; i < reports.size(); i++) {
857+
list.push_back(statsToMap(reports[i]));
858+
}
859+
EncodableMap params;
860+
params[EncodableValue("stats")] = list;
861+
result_ptr->Success(EncodableValue(params));
862+
},
863+
[result_ptr](const char* error) {
864+
result_ptr->Error("GetStats", error);
865+
});
866+
}
750867
}
751868

752869
void FlutterPeerConnection::MediaStreamAddTrack(

common/cpp/src/flutter_webrtc.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,21 @@ void FlutterWebRTC::HandleMethodCall(
268268

269269
AddIceCandidate(rtc_candidate.get(), pc, std::move(result));
270270
} else if (method_call.method_name().compare("getStats") == 0) {
271+
if (!method_call.arguments()) {
272+
result->Error("Bad Arguments", "Null constraints arguments received");
273+
return;
274+
}
275+
const EncodableMap params =
276+
GetValue<EncodableMap>(*method_call.arguments());
277+
const std::string peerConnectionId = findString(params, "peerConnectionId");
278+
const std::string track_id = findString(params, "track");
279+
RTCPeerConnection* pc = PeerConnectionForId(peerConnectionId);
280+
if (pc == nullptr) {
281+
result->Error("getStatsFailed",
282+
"getStats() peerConnection is null");
283+
return;
284+
}
285+
GetStats(track_id, pc, std::move(result));
271286
} else if (method_call.method_name().compare("createDataChannel") == 0) {
272287
if (!method_call.arguments()) {
273288
result->Error("Bad Arguments", "Null constraints arguments received");

example/lib/src/loopback_sample.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class _MyAppState extends State<LoopBackSample> {
1818
final _remoteRenderer = RTCVideoRenderer();
1919
bool _inCalling = false;
2020
Timer? _timer;
21-
List<RTCRtpSender> _senders = [];
21+
final List<RTCRtpSender> _senders = [];
2222
String get sdpSemantics => 'unified-plan';
2323

2424
@override
@@ -44,9 +44,8 @@ class _MyAppState extends State<LoopBackSample> {
4444

4545
void handleStatsReport(Timer timer) async {
4646
if (_peerConnection != null) {
47-
/*
48-
var reports = await _peerConnection.getStats();
49-
reports.forEach((report) {
47+
var reports = await _peerConnection?.getStats();
48+
reports?.forEach((report) {
5049
print('report => { ');
5150
print(' id: ' + report.id + ',');
5251
print(' type: ' + report.type + ',');
@@ -58,7 +57,7 @@ class _MyAppState extends State<LoopBackSample> {
5857
print(' }');
5958
print('}');
6059
});
61-
*/
60+
6261
/*
6362
var senders = await _peerConnection.getSenders();
6463
var canInsertDTMF = await senders[0].dtmfSender.canInsertDtmf();

example/lib/src/loopback_sample_unified_tracks.dart

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'dart:async';
12
import 'dart:core';
23

34
import 'package:flutter/material.dart';
@@ -23,6 +24,7 @@ class _MyAppState extends State<LoopBackSampleUnifiedTracks> {
2324
bool _cameraOn = false;
2425
bool _speakerOn = false;
2526
List<MediaDeviceInfo>? _mediaDevicesList;
27+
Timer? _timer;
2628
final _configuration = <String, dynamic>{
2729
'iceServers': [
2830
//{'url': 'stun:stun.l.google.com:19302'},
@@ -331,6 +333,11 @@ class _MyAppState extends State<LoopBackSampleUnifiedTracks> {
331333
_localRenderer.srcObject = _localStream;
332334
_cameraOn = true;
333335
});
336+
337+
_timer?.cancel();
338+
_timer = Timer.periodic(Duration(seconds: 1), (timer) async {
339+
handleStatsReport(timer);
340+
});
334341
}
335342

336343
void _stopVideo() async {
@@ -342,6 +349,8 @@ class _MyAppState extends State<LoopBackSampleUnifiedTracks> {
342349
_remoteRenderer.srcObject = null;
343350
_cameraOn = false;
344351
});
352+
_timer?.cancel();
353+
_timer = null;
345354
}
346355

347356
void _startAudio() async {
@@ -380,6 +389,39 @@ class _MyAppState extends State<LoopBackSampleUnifiedTracks> {
380389
});
381390
}
382391

392+
void handleStatsReport(Timer timer) async {
393+
if (_remotePeerConnection != null) {
394+
var reports = await _remotePeerConnection?.getStats();
395+
reports?.forEach((report) {
396+
if (report.type != 'inbound-rtp') {
397+
return;
398+
}
399+
print('report => { ');
400+
print(' id: ' + report.id + ',');
401+
print(' type: ' + report.type + ',');
402+
print(' timestamp: ${report.timestamp},');
403+
print(' values => {');
404+
report.values.forEach((key, value) {
405+
print(' ' + key + ' : ' + value.toString() + ', ');
406+
});
407+
print(' }');
408+
print('}');
409+
});
410+
411+
/*
412+
var senders = await _peerConnection.getSenders();
413+
var canInsertDTMF = await senders[0].dtmfSender.canInsertDtmf();
414+
print(canInsertDTMF);
415+
await senders[0].dtmfSender.insertDTMF('1');
416+
var receivers = await _peerConnection.getReceivers();
417+
print(receivers[0].track.id);
418+
var transceivers = await _peerConnection.getTransceivers();
419+
print(transceivers[0].sender.parameters);
420+
print(transceivers[0].receiver.parameters);
421+
*/
422+
}
423+
}
424+
383425
Future<void> _removeExistingVideoTrack({bool fromConnection = false}) async {
384426
var tracks = _localStream!.getVideoTracks();
385427
for (var i = tracks.length - 1; i >= 0; i--) {

lib/src/native/rtc_peerconnection_impl.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ class RTCPeerConnectionNative extends RTCPeerConnection {
379379
List<dynamic> reports = response['stats'];
380380
reports.forEach((report) {
381381
stats.add(StatsReport(report['id'], report['type'],
382-
report['timestamp'], report['values']));
382+
(report['timestamp'] as num).toDouble(), report['values']));
383383
});
384384
}
385385
return stats;

0 commit comments

Comments
 (0)
0