4
4
import java .nio .ByteBuffer ;
5
5
import java .util .HashMap ;
6
6
import java .util .Iterator ;
7
+ import java .util .List ;
7
8
import java .util .Map ;
8
9
9
10
import android .util .Base64 ;
17
18
18
19
import org .webrtc .AudioTrack ;
19
20
import org .webrtc .DataChannel ;
21
+ import org .webrtc .DtmfSender ;
20
22
import org .webrtc .IceCandidate ;
21
23
import org .webrtc .MediaStream ;
22
24
import org .webrtc .MediaStreamTrack ;
23
25
import org .webrtc .PeerConnection ;
26
+ import org .webrtc .RtpParameters ;
24
27
import org .webrtc .RtpReceiver ;
28
+ import org .webrtc .RtpSender ;
29
+ import org .webrtc .RtpTransceiver ;
25
30
import org .webrtc .StatsObserver ;
26
31
import org .webrtc .StatsReport ;
27
32
import org .webrtc .VideoTrack ;
@@ -38,6 +43,9 @@ class PeerConnectionObserver implements PeerConnection.Observer, EventChannel.St
38
43
private PeerConnection peerConnection ;
39
44
final Map <String , MediaStream > remoteStreams ;
40
45
final Map <String , MediaStreamTrack > remoteTracks ;
46
+ final Map <String , RtpTransceiver > transceivers ;
47
+ final Map <String , RtpSender > senders ;
48
+ final Map <String , RtpReceiver > receivers ;
41
49
private final FlutterWebRTCPlugin plugin ;
42
50
43
51
EventChannel eventChannel ;
@@ -48,7 +56,9 @@ class PeerConnectionObserver implements PeerConnection.Observer, EventChannel.St
48
56
this .id = id ;
49
57
this .remoteStreams = new HashMap <String , MediaStream >();
50
58
this .remoteTracks = new HashMap <String , MediaStreamTrack >();
51
-
59
+ this .transceivers = new HashMap <String , RtpTransceiver >();
60
+ this .senders = new HashMap <String , RtpSender >();
61
+ this .receivers = new HashMap <String , RtpReceiver >();
52
62
53
63
this .eventChannel =
54
64
new EventChannel (
@@ -81,6 +91,9 @@ void close() {
81
91
remoteStreams .clear ();
82
92
remoteTracks .clear ();
83
93
dataChannels .clear ();
94
+ transceivers .clear ();
95
+ senders .clear ();;
96
+ receivers .clear ();;
84
97
}
85
98
void dispose (){
86
99
this .close ();
@@ -201,7 +214,7 @@ public void onComplete(StatsReport[] reports) {
201
214
202
215
@ Override
203
216
public void onIceCandidate (final IceCandidate candidate ) {
204
- Log .d (TAG , "onIceCandidate" );
217
+ Log .d (TAG , "onIceCandidate => " + candidate . toString () );
205
218
ConstraintsMap params = new ConstraintsMap ();
206
219
params .putString ("event" , "onCandidate" );
207
220
ConstraintsMap candidateParams = new ConstraintsMap ();
@@ -474,4 +487,194 @@ private String signalingStateString(PeerConnection.SignalingState signalingState
474
487
}
475
488
return null ;
476
489
}
490
+
491
+ @ Nullable
492
+ private String transceiverDirectionString (RtpTransceiver .RtpTransceiverDirection direction ) {
493
+ switch (direction ) {
494
+ case SEND_RECV :
495
+ return "sendrecv" ;
496
+ case SEND_ONLY :
497
+ return "sendonly" ;
498
+ case RECV_ONLY :
499
+ return "recvonly" ;
500
+ case INACTIVE :
501
+ return "inactive" ;
502
+ }
503
+ return null ;
504
+ }
505
+
506
+ private RtpTransceiver .RtpTransceiverDirection typStringToTransceiverDirection (String direction ) {
507
+ switch (direction ) {
508
+ case "sendrecv" :
509
+ return RtpTransceiver .RtpTransceiverDirection .SEND_RECV ;
510
+ case "sendonly" :
511
+ return RtpTransceiver .RtpTransceiverDirection .SEND_ONLY ;
512
+ case "recvonly" :
513
+ return RtpTransceiver .RtpTransceiverDirection .RECV_ONLY ;
514
+ case "inactive" :
515
+ return RtpTransceiver .RtpTransceiverDirection .INACTIVE ;
516
+ }
517
+ return RtpTransceiver .RtpTransceiverDirection .INACTIVE ;
518
+ }
519
+
520
+ private Map <String , Object > rtpParametersToMap (RtpParameters rtpParameters ){
521
+ ConstraintsMap info = new ConstraintsMap ();
522
+ info .putString ("transactionId" , rtpParameters .transactionId );
523
+
524
+ ConstraintsMap rtcp = new ConstraintsMap ();
525
+ rtcp .putString ("cname" , rtpParameters .getRtcp ().getCname ());
526
+ rtcp .putBoolean ("reducedSize" , rtpParameters .getRtcp ().getReducedSize ());
527
+ info .putMap ("rtcp" , rtcp .toMap ());
528
+
529
+ ConstraintsArray headerExtensions = new ConstraintsArray ();
530
+ for (RtpParameters .HeaderExtension extension : rtpParameters .getHeaderExtensions ()){
531
+ ConstraintsMap map = new ConstraintsMap ();
532
+ map .putString ("uri" ,extension .getUri ());
533
+ map .putInt ("id" , extension .getId ());
534
+ map .putBoolean ("encrypted" , extension .getEncrypted ());
535
+ headerExtensions .pushMap (map );
536
+ }
537
+ info .putArray ("headerExtensions" , headerExtensions .toArrayList ());
538
+
539
+ ConstraintsArray encodings = new ConstraintsArray ();
540
+ for (RtpParameters .Encoding encoding : rtpParameters .encodings ){
541
+ ConstraintsMap map = new ConstraintsMap ();
542
+ map .putBoolean ("active" ,encoding .active );
543
+ map .putInt ("maxBitrateBps" , encoding .maxBitrateBps );
544
+ map .putInt ("minBitrateBps" , encoding .minBitrateBps );
545
+ map .putInt ("maxFramerate" , encoding .maxFramerate );
546
+ map .putInt ("numTemporalLayers" , encoding .numTemporalLayers );
547
+ map .putDouble ("scaleResolutionDownBy" , encoding .scaleResolutionDownBy );
548
+ map .putLong ("ssrc" , encoding .ssrc );
549
+ encodings .pushMap (map );
550
+ }
551
+ info .putArray ("encodings" , encodings .toArrayList ());
552
+
553
+ ConstraintsArray codecs = new ConstraintsArray ();
554
+ for (RtpParameters .Codec codec : rtpParameters .codecs ){
555
+ ConstraintsMap map = new ConstraintsMap ();
556
+ map .putString ("name" ,codec .name );
557
+ map .putInt ("payloadType" , codec .payloadType );
558
+ map .putInt ("clockRate" , codec .clockRate );
559
+ map .putInt ("numChannels" , codec .numChannels );
560
+ map .putMap ("numTemporalLayers" , new HashMap <String , Object >(codec .parameters ));
561
+ //map.putString("kind", codec.kind);
562
+ codecs .pushMap (map );
563
+ }
564
+
565
+ info .putArray ("codecs" , codecs .toArrayList ());
566
+ return info .toMap ();
567
+ }
568
+
569
+ @ Nullable
570
+ private Map <String , Object > mediaTrackToMap (MediaStreamTrack track ){
571
+ ConstraintsMap info = new ConstraintsMap ();
572
+ if (track != null ){
573
+ info .putString ("trackId" , track .id ());
574
+ info .putString ("label" ,track .id ());
575
+ info .putString ("kind" ,track .kind ());
576
+ info .putBoolean ("enabled" , track .enabled ());
577
+ }
578
+ return info .toMap ();
579
+ }
580
+
581
+ private Map <String , Object > dtmfSenderToMap (DtmfSender dtmfSender , String id ){
582
+ ConstraintsMap info = new ConstraintsMap ();
583
+ info .putString ("dtmfSenderId" ,id );
584
+ info .putInt ("interToneGap" , dtmfSender .interToneGap ());
585
+ info .putInt ("duration" ,dtmfSender .duration ());
586
+ return info .toMap ();
587
+ }
588
+
589
+ private Map <String , Object > rtpSenderToMap (RtpSender sender ){
590
+ ConstraintsMap info = new ConstraintsMap ();
591
+ info .putString ("senderId" , sender .id ());
592
+ info .putBoolean ("ownsTrack" , true );
593
+ info .putMap ("dtmfSender" , dtmfSenderToMap (sender .dtmf (), sender .id ()));
594
+ info .putMap ("rtpParameters" , rtpParametersToMap (sender .getParameters ()));
595
+ info .putMap ("track" , mediaTrackToMap (sender .track ()));
596
+ return info .toMap ();
597
+ }
598
+
599
+ private Map <String , Object > rtpReceiverToMap (RtpReceiver receiver ){
600
+ ConstraintsMap info = new ConstraintsMap ();
601
+ info .putString ("receiverId" , receiver .id ());
602
+ info .putMap ("track" , mediaTrackToMap (receiver .track ()));
603
+ return info .toMap ();
604
+ }
605
+
606
+ Map <String , Object > transceiverToMap (RtpTransceiver transceiver ){
607
+ ConstraintsMap info = new ConstraintsMap ();
608
+ info .putString ("transceiverId" , transceiver .getMid ());
609
+ info .putString ("mid" , transceiver .getMid ());
610
+ info .putString ("direction" , transceiverDirectionString (transceiver .getDirection ()));
611
+ info .putMap ("sender" , rtpSenderToMap (transceiver .getSender ()));
612
+ info .putMap ("receiver" , rtpReceiverToMap (transceiver .getReceiver ()));
613
+ return info .toMap ();
614
+ }
615
+
616
+ @ Override
617
+ public void onTrack (RtpTransceiver transceiver ) {
618
+ ConstraintsMap params = new ConstraintsMap ();
619
+ params .putString ("event" , "onTrack" );
620
+ params .putMap ("transceiver" , transceiverToMap (transceiver ));
621
+ sendEvent (params );
622
+ }
623
+
624
+ public void createSender (String kind , String streamId , Result result ){
625
+ RtpSender sender = peerConnection .createSender (kind , streamId );
626
+ senders .put (sender .id (),sender );
627
+ result .success (rtpSenderToMap (sender ));
628
+ }
629
+
630
+ public void addTrack (MediaStreamTrack track , List <String > streamIds , Result result ){
631
+ RtpSender sender = peerConnection .addTrack (track , streamIds );
632
+ senders .put (sender .id (),sender );
633
+ result .success (rtpSenderToMap (sender ));
634
+ }
635
+
636
+ public void removeTrack (String senderId , Result result ){
637
+ RtpSender sender = senders .get (senderId );
638
+ if (sender == null ){
639
+ result .error ("removeTrack" , "removeTrack() sender is null" , null );
640
+ return ;
641
+ }
642
+ boolean res = peerConnection .removeTrack (sender );
643
+ ConstraintsMap params = new ConstraintsMap ();
644
+ params .putBoolean ("result" , res );
645
+ result .success (params );
646
+ }
647
+
648
+ public void addTransceiver (MediaStreamTrack track , Map <String , Object > transceiverInit , Result result ) {
649
+ RtpTransceiver transceiver ;
650
+ if (transceiverInit != null ){
651
+ List <String > streamIds = (List )transceiverInit .get ("streamIds" );
652
+ String direction = (String )transceiverInit .get ("direction" );
653
+ RtpTransceiver .RtpTransceiverInit init = new RtpTransceiver .RtpTransceiverInit (typStringToTransceiverDirection (direction ) ,streamIds );
654
+ transceiver = peerConnection .addTransceiver (track , init );
655
+ } else {
656
+ transceiver = peerConnection .addTransceiver (track );
657
+ }
658
+ transceivers .put (transceiver .getMid (), transceiver );
659
+ result .success (transceiverToMap (transceiver ));
660
+ }
661
+
662
+ public void addTransceiverOfType (String mediaType , Map <String , Object > transceiverInit , Result result ) {
663
+ MediaStreamTrack .MediaType type = MediaStreamTrack .MediaType .MEDIA_TYPE_AUDIO ;
664
+ if (mediaType == "audio" )
665
+ type = MediaStreamTrack .MediaType .MEDIA_TYPE_AUDIO ;
666
+ else if (mediaType == "video" )
667
+ type = MediaStreamTrack .MediaType .MEDIA_TYPE_VIDEO ;
668
+ RtpTransceiver transceiver ;
669
+ if (transceiverInit != null ){
670
+ List <String > streamIds = (List )transceiverInit .get ("streamIds" );
671
+ String direction = (String )transceiverInit .get ("direction" );
672
+ RtpTransceiver .RtpTransceiverInit init = new RtpTransceiver .RtpTransceiverInit (typStringToTransceiverDirection (direction ) ,streamIds );
673
+ transceiver = peerConnection .addTransceiver (type , init );
674
+ } else {
675
+ transceiver = peerConnection .addTransceiver (type );
676
+ }
677
+ transceivers .put (transceiver .getMid (), transceiver );
678
+ result .success (transceiverToMap (transceiver ));
679
+ }
477
680
}
0 commit comments