8000 Add getStats for RTPSender/RTPReceiver. · next-coder/flutter-webrtc@bc8e3ce · GitHub
[go: up one dir, main page]

Skip to content

Commit bc8e3ce

Browse files
committed
Add getStats for RTPSender/RTPReceiver.
1 parent cb9e383 commit bc8e3ce

10 files changed

+113
-9
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# Flutter-WebRTC
2+
23
[![Financial Contributors on Open Collective](https://opencollective.com/flutter-webrtc/all/badge.svg?label=financial+contributors)](https://opencollective.com/flutter-webrtc) [![pub package](https://img.shields.io/pub/v/flutter_webrtc.svg)](https://pub.dartlang.org/packages/flutter_webrtc) [![Gitter](https://badges.gitter.im/flutter-webrtc/Lobby.svg)](https://gitter.im/flutter-webrtc/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
34

45
WebRTC plugin for Flutter Mobile/Desktop/Web
56

67
## Functionality
8+
79
| Feature | Android | iOS | [Web](https://flutter.dev/web) | macOS | Windows | Linux | [Fuchsia](https://fuchsia.googlesource.com/) |
810
| :-------------: | :-------------:| :-----: | :-----: | :-----: | :-----: | :-----: | :-----: |
911
| Audio/Video | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | [WIP] | [WIP] | |
@@ -14,6 +16,7 @@ WebRTC plugin for Flutter Mobile/Desktop/Web
1416
| MediaRecorder| :warning: | :warning: | :heavy_check_mark: | | | | |
1517

1618
## Usage
19+
1720
Add `flutter_webrtc` as a [dependency in your pubspec.yaml file](https://flutter.io/using-packages/).
1821

1922
### iOS
@@ -44,6 +47,7 @@ Ensure the following permission is present in your Android Manifest file, locate
4447
```
4548

4649
If you need to use a Bluetooth device, please add:
50+
4751
```xml
4852
<uses-permission android:name="android.permission.BLUETOOTH" />
4953
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
@@ -52,6 +56,7 @@ If you need to use a Bluetooth device, please add:
5256
The Flutter project template adds it, so it may already be there.
5357

5458
Also you will need to set your build settings to Java 8, because official WebRTC jar now uses static methods in `EglBase` interface. Just add this to your app level `build.gradle`:
59+
5560
```groovy
5661
android {
5762
//...
@@ -65,13 +70,16 @@ android {
6570
If necessary, in the same `build.gradle` you will need to increase `minSdkVersion` of `defaultConfig` up to `18` (currently default Flutter generator set it to `16`).
6671

6772
## Contributing
73+
6874
The project is inseparable from the contributors of the community.
75+
6976
- [CloudWebRTC](https://github.com/cloudwebrtc) - Original Author
7077
- [RainwayApp](https://github.com/rainwayapp) - Sponsor
7178
- [亢少军](https://github.com/kangshaojun) - Sponsor
7279
- [ION](https://github.com/pion/ion) - Sponsor
7380

7481
### Example
82+
7583
For more examples, please refer to [flutter-webrtc-demo](https://github.com/cloudwebrtc/flutter-webrtc-demo/).
7684

7785
## Contributors

lib/src/interface/rtc_rtp_receiver.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import 'enums.dart';
22
import 'media_stream_track.dart';
33
import 'rtc_rtp_parameters.dart';
4+
import 'rtc_stats_report.dart';
45

< 9E88 /td>
56
typedef OnFirstPacketReceivedCallback = void Function(
67
RTCRtpReceiver rtpReceiver, RTCRtpMediaType mediaType);
78

89
abstract class RTCRtpReceiver {
910
RTCRtpReceiver();
1011

12+
Future<List<StatsReport>> getStats();
13+
1114
/// public:
1215
OnFirstPacketReceivedCallback onFirstPacketReceived;
1316

lib/src/interface/rtc_rtp_sender.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
55
import 'media_stream_track.dart';
66
import 'rtc_dtmf_sender.dart';
77
import 'rtc_rtp_parameters.dart';
8+
import 'rtc_stats_report.dart';
89

910
abstract class RTCRtpSender {
1011
RTCRtpSender();
@@ -15,6 +16,8 @@ abstract class RTCRtpSender {
1516

1617
Future<void> setTrack(MediaStreamTrack track, {bool takeOwnership = true});
1718

19+
Future<List<StatsReport>> getStats();
20+
1821
RTCRtpParameters get parameters;
1922

2023
MediaStreamTrack get track;

lib/src/native/rtc_peerconnection_impl.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ class RTCPeerConnectionNative extends RTCPeerConnection {
180180
peerConnectionId: _peerConnectionId)
181181
: null;
182182
onTrack?.call(RTCTrackEvent(
183-
receiver: RTCRtpReceiverNative.fromMap(map['receiver']),
183+
receiver: RTCRtpReceiverNative.fromMap(map['receiver'],
184+
peerConnectionId: _peerConnectionId),
184185
streams: streams,
185186
track: MediaStreamTrackNative.fromMap(map['track']),
186187
transceiver: transceiver));
@@ -447,7 +448,8 @@ class RTCPeerConnectionNative extends RTCPeerConnection {
447448
try {
448449
final response = await _channel.invokeMethod('getReceivers',
449450
<String, dynamic>{'peerConnectionId': _peerConnectionId});
450-
return RTCRtpReceiverNative.fromMaps(response['receivers']);
451+
return RTCRtpReceiverNative.fromMaps(response['receivers'],
452+
peerConnectionId: _peerConnectionId);
451453
} on PlatformException catch (e) {
452454
throw 'Unable to RTCPeerConnection::addTrack: ${e.message}';
453455
}

lib/src/native/rtc_rtp_receiver_impl.dart

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,59 @@
1+
import 'package:flutter/services.dart';
2+
13
import '../interface/media_stream_track.dart';
24
import '../interface/rtc_rtp_parameters.dart';
35
import '../interface/rtc_rtp_receiver.dart';
6+
import '../interface/rtc_stats_report.dart';
7+
48
import 'media_stream_track_impl.dart';
9+
import 'utils.dart';
510

611
class RTCRtpReceiverNative extends RTCRtpReceiver {
7-
RTCRtpReceiverNative(this._id, this._track, this._parameters);
12+
RTCRtpReceiverNative(
13+
this._id, this._track, this._parameters, this._peerConnectionId);
814

9-
factory RTCRtpReceiverNative.fromMap(Map<dynamic, dynamic> map) {
15+
factory RTCRtpReceiverNative.fromMap(Map<dynamic, dynamic> map,
16+
{String peerConnectionId}) {
1017
var track = MediaStreamTrackNative.fromMap(map['track']);
1118
var parameters = RTCRtpParameters.fromMap(map['rtpParameters']);
12-
return RTCRtpReceiverNative(map['receiverId'], track, parameters);
19+
return RTCRtpReceiverNative(
20+
map['receiverId'], track, parameters, peerConnectionId);
1321
}
1422

15-
static List<RTCRtpReceiverNative> fromMaps(List<dynamic> map) {
16-
return map.map((e) => RTCRtpReceiverNative.fromMap(e)).toList();
23+
static List<RTCRtpReceiverNative> fromMaps(List<dynamic> map,
24+
{String peerConnectionId}) {
25+
return map
26+
.map((e) =>
27+
RTCRtpReceiverNative.fromMap(e, peerConnectionId: peerConnectionId))
28+
.toList();
29+
}
30+
31+
@override
32+
Future<List<StatsReport>> getStats() async {
33+
try {
34+
final response = await _channel.invokeMethod<Map<dynamic, dynamic>>(
35+
'getStats', <String, dynamic>{
36+
'peerConnectionId': _peerConnectionId,
37+
'track': track.id
38+
});
39+
var stats = <StatsReport>[];
40+
if (response != null) {
41+
List<dynamic> reports = response['stats'];
42+
reports.forEach((report) {
43+
stats.add(StatsReport(report['id'], report['type'],
44+
report['timestamp'], report['values']));
45+
});
46+
}
47+
return stats;
48+
} on PlatformException catch (e) {
49+
throw 'Unable to RTCPeerConnection::getStats: ${e.message}';
50+
}
1751
}
1852

1953
/// private:
54+
final _channel = WebRTC.methodChannel();
2055
String _id;
56+
String _peerConnectionId;
2157
MediaStreamTrack _track;
2258
RTCRtpParameters _parameters;
2359

lib/src/native/rtc_rtp_sender_impl.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import '../interface/media_stream_track.dart';
77
import '../interface/rtc_dtmf_sender.dart';
88
import '../interface/rtc_rtp_parameters.dart';
99
import '../interface/rtc_rtp_sender.dart';
10+
import '../interface/rtc_stats_report.dart';
1011
import 'media_stream_track_impl.dart';
1112
import 'rtc_dtmf_sender_impl.dart';
1213
import 'utils.dart';
@@ -41,6 +42,29 @@ class RTCRtpSenderNative extends RTCRtpSender {
4142
RTCDTMFSender _dtmf;
4243
RTCRtpParameters _parameters;
4344
bool _ownsTrack = false;
45+
46+
@override
47+
Future<List<StatsReport>> getStats() async {
48+
try {
49+
final response = await _channel.invokeMethod<Map<dynamic, dynamic>>(
50+
'getStats', <String, dynamic>{
51+
'peerConnectionId': _peerConnectionId,
52+
'track': track.id
53+
});
54+
var stats = <StatsReport>[];
55+
if (response != null) {
56+
List<dynamic> reports = response['stats'];
57+
reports.forEach((report) {
58+
stats.add(StatsReport(report['id'], report['type'],
59+
report['timestamp'], report['values']));
60+
});
61+
}
62+
return stats;
63+
} on PlatformException catch (e) {
64+
throw 'Unable to RTCPeerConnection::getStats: ${e.message}';
65+
}
66+
}
67+
4468
@override
4569
Future<bool> setParameters(RTCRtpParameters parameters) async {
4670
_parameters = parameters;

lib/src/native/rtc_rtp_transceiver_impl.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ class RTCRtpTransceiv E309 erNative extends RTCRtpTransceiver {
6666
map['mid'],
6767
RTCRtpSenderNative.fromMap(map['sender'],
6868
peerConnectionId: peerConnectionId),
69-
RTCRtpReceiverNative.fromMap(map['receiver']),
69+
RTCRtpReceiverNative.fromMap(map['receiver'],
70+
peerConnectionId: peerConnectionId),
7071
peerConnectionId);
7172
return transceiver;
7273
}

lib/src/native/rtc_track_event_impl.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ class RTCTrackEventNative extends RTCTrackEvent {
2323
var streams =
2424
streamsParams.map((e) => MediaStreamNative.fromMap(e)).toList();
2525
return RTCTrackEventNative(
26-
RTCRtpReceiverNative.fromMap(map['receiver']),
26+
RTCRtpReceiverNative.fromMap(map['receiver'],
27+
peerConnectionId: peerConnectionId),
2728
streams,
2829
MediaStreamTrackNative.fromMap(map['track']),
2930
RTCRtpTransceiverNative.fromMap(map['transceiver'],

lib/src/web/rtc_rtp_receiver_impl.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:js_util' as jsutil;
33
import '../interface/media_stream_track.dart';
44
import '../interface/rtc_rtp_parameters.dart';
55
import '../interface/rtc_rtp_receiver.dart';
6+
import '../interface/rtc_stats_report.dart';
67
import 'media_stream_track_impl.dart';
78
import 'rtc_rtp_parameters_impl.dart';
89

@@ -12,6 +13,18 @@ class RTCRtpReceiverWeb extends RTCRtpReceiver {
1213
/// private:
1314
final Object _jsRtpReceiver;
1415

16+
@override
17+
Future<List<StatsReport>> getStats() async {
18+
var stats = await jsutil.promiseToFuture<dynamic>(
19+
jsutil.callMethod(_jsRtpReceiver, 'getStats', []));
20+
var report = <StatsReport>[];
21+
stats.forEach((key, value) {
22+
report.add(
23+
StatsReport(value['id'], value['type'], value['timestamp'], value));
24+
});
25+
return report;
26+
}
27+
1528
/// The WebRTC specification only defines RTCRtpParameters in terms of senders,
1629
/// but this API also applies them to receivers, similar to ORTC:
1730
/// http://ortc.org/wp-content/uploads/2016/03/ortc.html#rtcrtpparameters*.

lib/src/web/rtc_rtp_sender_impl.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:html';
33
import 'dart:js_util' as jsutil;
44

55
import 'package:flutter/services.dart';
6+
import 'package:flutter_webrtc/flutter_webrtc.dart';
67

78
import '../interface/media_stream_track.dart';
89
import '../interface/rtc_dtmf_sender.dart';
@@ -62,6 +63,18 @@ class RTCRtpSenderWeb extends RTCRtpSender {
6263
}
6364
}
6465

66+
@override
67+
Future<List<StatsReport>> getStats() async {
68+
var stats = await jsutil.promiseToFuture<dynamic>(
69+
jsutil.callMethod(_jsRtpSender, 'getStats', []));
70+
var report = <StatsReport>[];
71+
stats.forEach((key, value) {
72+
report.add(
73+
StatsReport(value['id'], value['type'], value['timestamp'], value));
74+
});
75+
return report;
76+
}
77+
6578
@override
6679
MediaStreamTrack get track =>
6780
MediaStreamTrackWeb(jsutil.getProperty(_jsRtpSender, 'track'));

0 commit comments

Comments
 (0)
0