@@ -538,6 +538,7 @@ async fn fingerprint_test(
538
538
is_icelite : false ,
539
539
connection_role : ConnectionRole :: Active ,
540
540
ice_gathering_state : RTCIceGatheringState :: New ,
541
+ match_bundle_group : None ,
541
542
} ;
542
543
543
544
let s = populate_sdp (
@@ -732,6 +733,7 @@ async fn test_populate_sdp() -> Result<()> {
732
733
is_icelite : se. candidates . ice_lite ,
733
734
connection_role : DEFAULT_DTLS_ROLE_OFFER . to_connection_role ( ) ,
734
735
ice_gathering_state : RTCIceGatheringState :: Complete ,
736
+ match_bundle_group : None ,
735
737
} ;
736
738
let offer_sdp = populate_sdp (
737
739
d,
@@ -836,6 +838,7 @@ async fn test_populate_sdp() -> Result<()> {
836
838
is_icelite : se. candidates . ice_lite ,
837
839
connection_role : DEFAULT_DTLS_ROLE_OFFER . to_connection_role ( ) ,
838
840
ice_gathering_state : RTCIceGatheringState :: Complete ,
841
+ match_bundle_group : None ,
839
842
} ;
840
843
let offer_sdp = populate_sdp (
841
844
d,
@@ -869,6 +872,228 @@ async fn test_populate_sdp() -> Result<()> {
869
872
assert ! ( found_vp8, "vp8 should be present in sdp" ) ;
870
873
}
871
874
875
+ //"Bundle all"
876
+ {
877
+ let se = SettingEngine :: default ( ) ;
878
+ let mut me = MediaEngine :: default ( ) ;
879
+ me. register_default_codecs ( ) ?;
880
+
881
+ let api = APIBuilder :: new ( ) . with_media_engine ( me) . build ( ) ;
882
+ let interceptor = api. interceptor_registry . build ( "" ) ?;
883
+ let transport = Arc :: new ( RTCDtlsTransport :: default ( ) ) ;
884
+ let receiver = Arc :: new ( api. new_rtp_receiver (
885
+ RTPCodecType :: Video ,
886
+ Arc :: clone ( & transport) ,
887
+ Arc :: clone ( & interceptor) ,
888
+ ) ) ;
889
+
890
+ let sender = Arc :: new (
891
+ api. new_rtp_sender ( None , Arc :: clone ( & transport) , Arc :: clone ( & interceptor) )
892
+ . await ,
893
+ ) ;
894
+
895
+ let tr = RTCRtpTransceiver :: new (
896
+ receiver,
897
+ sender,
898
+ RTCRtpTransceiverDirection :: Recvonly ,
899
+ RTPCodecType :: Video ,
900
+ api. media_engine . video_codecs . clone ( ) ,
901
+ Arc :: clone ( & api. media_engine ) ,
902
+ None ,
903
+ )
904
+ . await ;
905
+
906
+ let media_sections = vec ! [ MediaSection {
907
+ id: "video" . to_owned( ) ,
908
+ transceivers: vec![ tr] ,
909
+ data: false ,
910
+ rid_map: vec![ ] ,
911
+ ..Default :: default ( )
912
+ } ] ;
913
+
914
+ let d = SessionDescription :: default ( ) ;
915
+
916
+ let params = PopulateSdpParams {
917
+ media_description_fingerprint : se. sdp_media_level_fingerprints ,
918
+ is_icelite : se. candidates . ice_lite ,
919
+ connection_role : DEFAULT_DTLS_ROLE_OFFER . to_connection_role ( ) ,
920
+ ice_gathering_state : RTCIceGatheringState :: Complete ,
921
+ match_bundle_group : None ,
922
+ } ;
923
+ let offer_sdp = populate_sdp (
924
+ d,
925
+ & [ ] ,
926
+ & api. media_engine ,
927
+ & [ ] ,
928
+ & RTCIceParameters :: default ( ) ,
929
+ & media_sections,
930
+ params,
931
+ )
932
+ . await ?;
933
+
934
+ assert_eq ! (
935
+ offer_sdp. attribute( ATTR_KEY_GROUP ) ,
936
+ Some ( & "BUNDLE video" . to_owned( ) )
937
+ ) ;
938
+ }
939
+
940
+ //"Bundle matched"
941
+ {
942
+ let se = SettingEngine :: default ( ) ;
943
+ let mut me = MediaEngine :: default ( ) ;
944
+ me. register_default_codecs ( ) ?;
945
+
946
+ let api = APIBuilder :: new ( ) . with_media_engine ( me) . build ( ) ;
947
+ let interceptor = api. interceptor_registry . build ( "" ) ?;
948
+ let transport = Arc :: new ( RTCDtlsTransport :: default ( ) ) ;
949
+
950
+ let video_receiver = Arc :: new ( api. new_rtp_receiver (
951
+ RTPCodecType :: Video ,
952
+ Arc :: clone ( & transport) ,
953
+ Arc :: clone ( & interceptor) ,
954
+ ) ) ;
955
+ let audio_receiver = Arc :: new ( api. new_rtp_receiver (
956
+ RTPCodecType :: Audio ,
957
+ Arc :: clone ( & transport) ,
958
+ Arc :: clone ( & interceptor) ,
959
+ ) ) ;
960
+
961
+ let video_sender = Arc :: new (
962
+ api. new_rtp_sender ( None , Arc :: clone ( & transport) , Arc :: clone ( & interceptor) )
963
+ . await ,
964
+ ) ;
965
+ let audio_sender = Arc :: new (
966
+ api. new_rtp_sender ( None , Arc :: clone ( & transport) , Arc :: clone ( & interceptor) )
967
+ . await ,
968
+ ) ;
969
+
970
+ let trv = RTCRtpTransceiver :: new (
971
+ video_receiver,
972
+ video_sender,
973
+ RTCRtpTransceiverDirection :: Recvonly ,
974
+ RTPCodecType :: Video ,
975
+ api. media_engine . video_codecs . clone ( ) ,
976
+ Arc :: clone ( & api. media_engine ) ,
977
+ None ,
978
+ )
979
+ . await ;
980
+
981
+ let tra = RTCRtpTransceiver :: new (
982
+ audio_receiver,
983
+ audio_sender,
984
+ RTCRtpTransceiverDirection :: Recvonly ,
985
+ RTPCodecType :: Audio ,
986
+ api. media_engine . audio_codecs . clone ( ) ,
987
+ Arc :: clone ( & api. media_engine ) ,
988
+ None ,
989
+ )
990
+ . await ;
991
+
992
+ let media_sections = vec ! [
993
+ MediaSection {
994
+ id: "video" . to_owned( ) ,
995
+ transceivers: vec![ trv] ,
996
+ data: false ,
997
+ rid_map: vec![ ] ,
998
+ ..Default :: default ( )
999
+ } ,
1000
+ MediaSection {
1001
+ id: "audio" . to_owned( ) ,
1002
+ transceivers: vec![ tra] ,
1003
+ data: false ,
1004
+ rid_map: vec![ ] ,
1005
+ ..Default :: default ( )
1006
+ } ,
1007
+ ] ;
1008
+
1009
+ let d = SessionDescription :: default ( ) ;
1010
+
1011
+ let params = PopulateSdpParams {
1012
+ media_description_fingerprint : se. sdp_media_level_fingerprints ,
1013
+ is_icelite : se. candidates . ice_lite ,
1014
+ connection_role : DEFAULT_DTLS_ROLE_OFFER . to_connection_role ( ) ,
1015
+ ice_gathering_state : RTCIceGatheringState :: Complete ,
1016
+ match_bundle_group : Some ( "audio" . to_owned ( ) ) ,
1017
+ } ;
1018
+ let offer_sdp = populate_sdp (
1019
+ d,
1020
+ & [ ] ,
1021
+ & api. media_engine ,
1022
+ & [ ] ,
1023
+ & RTCIceParameters :: default ( ) ,
1024
+ & media_sections,
1025
+ params,
1026
+ )
1027
+ . await ?;
1028
+
1029
+ assert_eq ! (
1030
+ offer_sdp. attribute( ATTR_KEY_GROUP ) ,
1031
+ Some ( & "BUNDLE audio" . to_owned( ) )
1032
+ ) ;
1033
+ }
1034
+
1035
+ //"empty bundle group"
1036
+ {
1037
+ let se = SettingEngine :: default ( ) ;
1038
+ let mut me = MediaEngine :: default ( ) ;
1039
+ me. register_default_codecs ( ) ?;
1040
+
1041
+ let api = APIBuilder :: new ( ) . with_media_engine ( me) . build ( ) ;
1042
+ let interceptor = api. interceptor_registry . build ( "" ) ?;
1043
+ let transport = Arc :: new ( RTCDtlsTransport :: default ( ) ) ;
1044
+ let receiver = Arc :: new ( api. new_rtp_receiver (
1045
+ RTPCodecType :: Video ,
1046
+ Arc :: clone ( & transport) ,
1047
+ Arc :: clone ( & interceptor) ,
1048
+ ) ) ;
1049
+
1050
+ let sender = Arc :: new (
1051
+ api. new_rtp_sender ( None , Arc :: clone ( & transport) , Arc :: clone ( & interceptor) )
1052
+ . await ,
1053
+ ) ;
1054
+
1055
+ let tr = RTCRtpTransceiver :: new (
1056
+ receiver,
1057
+ sender,
1058
+ RTCRtpTransceiverDirection :: Recvonly ,
1059
+ RTPCodecType :: Video ,
1060
+ api. media_engine . video_codecs . clone ( ) ,
1061
+ Arc :: clone ( & api. media_engine ) ,
1062
+ None ,
1063
+ )
1064
+ . await ;
1065
+
1066
+ let media_sections = vec ! [ MediaSection {
1067
+ id: "video" . to_owned( ) ,
1068
+ transceivers: vec![ tr] ,
1069
+ data: false ,
1070
+ rid_map: vec![ ] ,
1071
+ ..Default :: default ( )
1072
+ } ] ;
1073
+
1074
+ let d = SessionDescription :: default ( ) ;
1075
+
1076
+ let params = PopulateSdpParams {
1077
+ media_description_fingerprint : se. sdp_media_level_fingerprints ,
1078
+ is_icelite : se. candidates . ice_lite ,
1079
+ connection_role : DEFAULT_DTLS_ROLE_OFFER . to_connection_role ( ) ,
1080
+ ice_gathering_state : RTCIceGatheringState :: Complete ,
1081
+ match_bundle_group : Some ( "" . to_owned ( ) ) ,
1082
+ } ;
1083
+ let offer_sdp = populate_sdp (
1084
+ d,
1085
+ & [ ] ,
1086
+ & api. media_engine ,
1087
+ & [ ] ,
1088
+ & RTCIceParameters :: default ( ) ,
1089
+ & media_sections,
1090
+ params,
1091
+ )
1092
+ . await ?;
1093
+
1094
+ assert_eq ! ( offer_sdp. attribute( ATTR_KEY_GROUP ) , None ) ;
1095
+ }
1096
+
872
1097
Ok ( ( ) )
873
1098
}
874
1099
@@ -962,6 +1187,7 @@ async fn test_populate_sdp_reject() -> Result<()> {
962
1187
is_icelite : se. candidates . ice_lite ,
963
1188
connection_role : DEFAULT_DTLS_ROLE_OFFER . to_connection_role ( ) ,
964
1189
ice_gathering_state : RTCIceGatheringState :: Complete ,
1190
+ match_bundle_group : None ,
965
1191
} ;
966
1192
let offer_sdp = populate_sdp (
967
1193
d,
0 commit comments