@@ -199,6 +199,17 @@ srs_error_t SrsSSRCInfo::encode(std::ostringstream& os)
199
199
return srs_error_new (ERROR_RTC_SDP_DECODE, " invalid ssrc" );
200
200
}
201
201
202
+ // See AnnexF at page 101 of https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=469659DC56B9B8187671FF08748CEC89
203
+ // Encode the bellow format:
204
+ // a=ssrc:0100008888 cname:0100008888
205
+ // a=ssrc:0100008888 label:gb28181
206
+ // As GB28181 format:
207
+ // y=0100008888
208
+ if (label_ == " gb28181" ) {
209
+ os << " y=" << (cname_.empty () ? srs_fmt (" %u" , ssrc_) : cname_) << kCRLF ;
210
+ return err;
211
+ }
212
+
202
213
os << " a=ssrc:" << ssrc_ << " cname:" << cname_ << kCRLF ;
203
214
if (!msid_.empty ()) {
204
215
os << " a=ssrc:" << ssrc_ << " msid:" << msid_;
@@ -297,6 +308,8 @@ SrsMediaDesc::SrsMediaDesc(const std::string& type)
297
308
recvonly_ = false ;
298
309
sendonly_ = false ;
299
310
inactive_ = false ;
311
+
312
+ connection_ = " c=IN IP4 0.0.0.0" ;
300
313
}
301
314
302
315
SrsMediaDesc::~SrsMediaDesc ()
@@ -380,13 +393,13 @@ srs_error_t SrsMediaDesc::encode(std::ostringstream& os)
380
393
os << kCRLF ;
381
394
382
395
// TODO:nettype and address type
383
- os << " c=IN IP4 0.0.0.0 " << kCRLF ;
396
+ if (!connection_. empty ()) os << connection_ << kCRLF ;
384
397
385
398
if ((err = session_info_.encode (os)) != srs_success) {
386
399
return srs_error_wrap (err, " encode session info failed" );
387
400
}
388
401
389
- os << " a=mid:" << mid_ << kCRLF ;
402
+ if (!mid_. empty ()) os << " a=mid:" << mid_ << kCRLF ;
390
403
if (!msid_.empty ()) {
391
404
os << " a=msid:" << msid_;
392
405
@@ -738,6 +751,8 @@ SrsSdp::SrsSdp()
738
751
739
752
start_time_ = 0 ;
740
753
end_time_ = 0 ;
754
+
755
+ ice_lite_ = " a=ice-lite" ;
741
756
}
742
757
743
758
SrsSdp::~SrsSdp ()
@@ -818,9 +833,12 @@ srs_error_t SrsSdp::encode(std::ostringstream& os)
818
833
os << " v=" << version_ << kCRLF ;
819
834
os << " o=" << username_ << " " << session_id_ << " " << session_version_ << " " << nettype_ << " " << addrtype_ << " " << unicast_address_ << kCRLF ;
820
835
os << " s=" << session_name_ << kCRLF ;
836
+ // Session level connection data, see https://www.ietf.org/rfc/rfc4566.html#section-5.7
837
+ if (!connection_.empty ()) os << connection_ << kCRLF ;
838
+ // Timing, see https://www.ietf.org/rfc/rfc4566.html#section-5.9
821
839
os << " t=" << start_time_ << " " << end_time_ << kCRLF ;
822
840
// ice-lite is a minimal version of the ICE specification, intended for servers running on a public IP address.
823
- os << " a=ice-lite " << kCRLF ;
841
+ if (!ice_lite_. empty ()) os << ice_lite_ << kCRLF ;
824
842
825
843
if (!groups_.empty ()) {
826
844
os << " a=group:" << group_policy_;
@@ -830,11 +848,13 @@ srs_error_t SrsSdp::encode(std::ostringstream& os)
830
848
os << kCRLF ;
831
849
}
832
850
833
- os << " a=msid-semantic: " << msid_semantic_;
834
- for (std::vector<std::string>::iterator iter = msids_.begin (); iter != msids_.end (); ++iter) {
835
- os << " " << *iter;
851
+ if (!msid_semantic_.empty () || !msids_.empty ()) {
852
+ os << " a=msid-semantic: " << msid_semantic_;
853
+ for (std::vector<std::string>::iterator iter = msids_.begin (); iter != msids_.end (); ++iter) {
854
+ os << " " << *iter;
855
+ }
856
+ os << kCRLF ;
836
857
}
837
- os << kCRLF ;
838
858
839
859
if ((err = session_info_.encode (os)) != srs_success) {
840
860
return srs_error_wrap (err, " encode session info failed" );
@@ -976,6 +996,9 @@ srs_error_t SrsSdp::parse_line(const std::string& line)
976
996
}
977
997
return parse_attribute (content);
978
998
}
999
+ case ' y' : {
1000
+ return parse_gb28181_ssrc (content);
1001
+ }
979
1002
case ' m' : {
980
1003
return parse_media_description (content);
981
1004
}
@@ -1081,6 +1104,29 @@ srs_error_t SrsSdp::parse_attribute(const std::string& content)
1081
1104
return err;
1082
1105
}
1083
1106
1107
+ srs_error_t SrsSdp::parse_gb28181_ssrc (const std::string& content)
1108
+ {
1109
+ srs_error_t err = srs_success;
1110
+
1111
+ // See AnnexF at page 101 of https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=469659DC56B9B8187671FF08748CEC89
1112
+ // Convert SSRC of GB28181 from:
1113
+ // y=0100008888
1114
+ // to standard format:
1115
+ // a=ssrc:0100008888 cname:0100008888
1116
+ // a=ssrc:0100008888 label:gb28181
1117
+ string cname = srs_fmt (" a=ssrc:%s cname:%s" , content.c_str (), content.c_str ());
1118
+ if ((err = media_descs_.back ().parse_line (cname)) != srs_success) {
1119
+ return srs_error_wrap (err, " parse gb %s cname" , content.c_str ());
1120
+ }
1121
+
1122
+ string label = srs_fmt (" a=ssrc:%s label:gb28181" , content.c_str ());
1123
+ if ((err = media_descs_.back ().parse_line (label)) != srs_success) {
1124
+ return srs_error_wrap (err, " parse gb %s label" , content.c_str ());
1125
+ }
1126
+
1127
+ return err;
1128
+ }
1129
+
1084
1130
srs_error_t SrsSdp::parse_attr_group (const std::string& value)
1085
1131
{
1086
1132
srs_error_t err = srs_success;
0 commit comments