Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
757001ad
Commit
757001ad
authored
May 20, 2022
by
xiongziliang
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'sdp_munging' of github.com:mtdxc/ZLMediaKit
parents
30dbac2c
2b29e58f
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
80 行增加
和
78 行删除
+80
-78
webrtc/Sdp.cpp
+57
-62
webrtc/Sdp.h
+23
-16
没有找到文件。
webrtc/Sdp.cpp
查看文件 @
757001ad
...
@@ -191,8 +191,8 @@ RtpDirection RtcSdpBase::getDirection() const{
...
@@ -191,8 +191,8 @@ RtpDirection RtcSdpBase::getDirection() const{
}
}
SdpItem
::
Ptr
RtcSdpBase
::
getItem
(
char
key_c
,
const
char
*
attr_key
)
const
{
SdpItem
::
Ptr
RtcSdpBase
::
getItem
(
char
key_c
,
const
char
*
attr_key
)
const
{
std
::
string
key
(
1
,
key_c
);
for
(
auto
item
:
items
)
{
for
(
auto
item
:
items
)
{
string
key
(
1
,
key_c
);
if
(
strcasecmp
(
item
->
getKey
(),
key
.
data
())
==
0
)
{
if
(
strcasecmp
(
item
->
getKey
(),
key
.
data
())
==
0
)
{
if
(
!
attr_key
)
{
if
(
!
attr_key
)
{
return
item
;
return
item
;
...
@@ -206,55 +206,56 @@ SdpItem::Ptr RtcSdpBase::getItem(char key_c, const char *attr_key) const {
...
@@ -206,55 +206,56 @@ SdpItem::Ptr RtcSdpBase::getItem(char key_c, const char *attr_key) const {
return
SdpItem
::
Ptr
();
return
SdpItem
::
Ptr
();
}
}
int
RtcSdpBase
::
getVersion
()
const
{
//////////////////////////////////////////////////////////////////////////
int
RtcSessionSdp
::
getVersion
()
const
{
return
atoi
(
getStringItem
(
'v'
).
data
());
return
atoi
(
getStringItem
(
'v'
).
data
());
}
}
SdpOrigin
RtcS
dpBase
::
getOrigin
()
const
{
SdpOrigin
RtcS
essionSdp
::
getOrigin
()
const
{
return
getItemClass
<
SdpOrigin
>
(
'o'
);
return
getItemClass
<
SdpOrigin
>
(
'o'
);
}
}
string
RtcS
dpBase
::
getSessionName
()
const
{
string
RtcS
essionSdp
::
getSessionName
()
const
{
return
getStringItem
(
's'
);
return
getStringItem
(
's'
);
}
}
string
RtcS
dpBase
::
getSessionInfo
()
const
{
string
RtcS
essionSdp
::
getSessionInfo
()
const
{
return
getStringItem
(
'i'
);
return
getStringItem
(
'i'
);
}
}
SdpTime
RtcS
dpBase
::
getSessionTime
()
const
{
SdpTime
RtcS
essionSdp
::
getSessionTime
()
const
{
return
getItemClass
<
SdpTime
>
(
't'
);
return
getItemClass
<
SdpTime
>
(
't'
);
}
}
SdpConnection
RtcS
dpBase
::
getConnection
()
const
{
SdpConnection
RtcS
essionSdp
::
getConnection
()
const
{
return
getItemClass
<
SdpConnection
>
(
'c'
);
return
getItemClass
<
SdpConnection
>
(
'c'
);
}
}
SdpBandwidth
RtcS
dpBase
::
getBandwidth
()
const
{
SdpBandwidth
RtcS
essionSdp
::
getBandwidth
()
const
{
return
getItemClass
<
SdpBandwidth
>
(
'b'
);
return
getItemClass
<
SdpBandwidth
>
(
'b'
);
}
}
string
RtcS
dpBase
::
getUri
()
const
{
string
RtcS
essionSdp
::
getUri
()
const
{
return
getStringItem
(
'u'
);
return
getStringItem
(
'u'
);
}
}
string
RtcS
dpBase
::
getEmail
()
const
{
string
RtcS
essionSdp
::
getEmail
()
const
{
return
getStringItem
(
'e'
);
return
getStringItem
(
'e'
);
}
}
string
RtcS
dpBase
::
getPhone
()
const
{
string
RtcS
essionSdp
::
getPhone
()
const
{
return
getStringItem
(
'p'
);
return
getStringItem
(
'p'
);
}
}
string
RtcS
dpBase
::
getTimeZone
()
const
{
string
RtcS
essionSdp
::
getTimeZone
()
const
{
return
getStringItem
(
'z'
);
return
getStringItem
(
'z'
);
}
}
string
RtcS
dpBase
::
getEncryptKey
()
const
{
string
RtcS
essionSdp
::
getEncryptKey
()
const
{
return
getStringItem
(
'k'
);
return
getStringItem
(
'k'
);
}
}
string
RtcS
dpBase
::
getRepeatTimes
()
const
{
string
RtcS
essionSdp
::
getRepeatTimes
()
const
{
return
getStringItem
(
'r'
);
return
getStringItem
(
'r'
);
}
}
...
@@ -952,12 +953,6 @@ void RtcSession::loadFrom(const string &str) {
...
@@ -952,12 +953,6 @@ void RtcSession::loadFrom(const string &str) {
group
=
sdp
.
getItemClass
<
SdpAttrGroup
>
(
'a'
,
"group"
);
group
=
sdp
.
getItemClass
<
SdpAttrGroup
>
(
'a'
,
"group"
);
}
}
std
::
shared_ptr
<
SdpItem
>
wrapSdpAttr
(
SdpItem
::
Ptr
item
){
auto
ret
=
std
::
make_shared
<
SdpAttr
>
();
ret
->
detail
=
std
::
move
(
item
);
return
ret
;
}
static
void
toRtsp
(
vector
<
SdpItem
::
Ptr
>
&
items
)
{
static
void
toRtsp
(
vector
<
SdpItem
::
Ptr
>
&
items
)
{
for
(
auto
it
=
items
.
begin
();
it
!=
items
.
end
();)
{
for
(
auto
it
=
items
.
begin
();
it
!=
items
.
end
();)
{
switch
((
*
it
)
->
getKey
()[
0
])
{
switch
((
*
it
)
->
getKey
()[
0
])
{
...
@@ -1019,57 +1014,57 @@ string RtcSession::toRtspSdp() const{
...
@@ -1019,57 +1014,57 @@ string RtcSession::toRtspSdp() const{
int
i
=
0
;
int
i
=
0
;
for
(
auto
&
m
:
sdp
->
medias
)
{
for
(
auto
&
m
:
sdp
->
medias
)
{
toRtsp
(
m
.
items
);
toRtsp
(
m
.
items
);
m
.
items
.
push_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpCommon
>
(
"control"
,
string
(
"trackID="
)
+
to_string
(
i
++
)
)));
m
.
addAttr
(
std
::
make_shared
<
SdpCommon
>
(
"control"
,
string
(
"trackID="
)
+
to_string
(
i
++
)));
}
}
return
sdp
->
toString
();
return
sdp
->
toString
();
}
}
void
addSdpAttrSSRC
(
const
RtcSSRC
&
rtp_ssrc
,
vector
<
SdpItem
::
Ptr
>
&
items
,
uint32_t
ssrc_num
)
{
void
addSdpAttrSSRC
(
const
RtcSSRC
&
rtp_ssrc
,
RtcSdpBase
&
media
,
uint32_t
ssrc_num
)
{
assert
(
ssrc_num
);
assert
(
ssrc_num
);
SdpAttrSSRC
ssrc
;
SdpAttrSSRC
ssrc
;
ssrc
.
ssrc
=
ssrc_num
;
ssrc
.
ssrc
=
ssrc_num
;
ssrc
.
attribute
=
"cname"
;
ssrc
.
attribute
=
"cname"
;
ssrc
.
attribute_value
=
rtp_ssrc
.
cname
;
ssrc
.
attribute_value
=
rtp_ssrc
.
cname
;
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrSSRC
>
(
ssrc
)
));
media
.
addAttr
(
std
::
make_shared
<
SdpAttrSSRC
>
(
ssrc
));
if
(
!
rtp_ssrc
.
msid
.
empty
())
{
if
(
!
rtp_ssrc
.
msid
.
empty
())
{
ssrc
.
attribute
=
"msid"
;
ssrc
.
attribute
=
"msid"
;
ssrc
.
attribute_value
=
rtp_ssrc
.
msid
;
ssrc
.
attribute_value
=
rtp_ssrc
.
msid
;
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrSSRC
>
(
ssrc
)
));
media
.
addAttr
(
std
::
make_shared
<
SdpAttrSSRC
>
(
ssrc
));
}
}
if
(
!
rtp_ssrc
.
mslabel
.
empty
())
{
if
(
!
rtp_ssrc
.
mslabel
.
empty
())
{
ssrc
.
attribute
=
"mslabel"
;
ssrc
.
attribute
=
"mslabel"
;
ssrc
.
attribute_value
=
rtp_ssrc
.
mslabel
;
ssrc
.
attribute_value
=
rtp_ssrc
.
mslabel
;
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrSSRC
>
(
ssrc
)
));
media
.
addAttr
(
std
::
make_shared
<
SdpAttrSSRC
>
(
ssrc
));
}
}
if
(
!
rtp_ssrc
.
label
.
empty
())
{
if
(
!
rtp_ssrc
.
label
.
empty
())
{
ssrc
.
attribute
=
"label"
;
ssrc
.
attribute
=
"label"
;
ssrc
.
attribute_value
=
rtp_ssrc
.
label
;
ssrc
.
attribute_value
=
rtp_ssrc
.
label
;
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrSSRC
>
(
ssrc
)
));
media
.
addAttr
(
std
::
make_shared
<
SdpAttrSSRC
>
(
ssrc
));
}
}
}
}
RtcSessionSdp
::
Ptr
RtcSession
::
toRtcSessionSdp
()
const
{
RtcSessionSdp
::
Ptr
RtcSession
::
toRtcSessionSdp
()
const
{
RtcSessionSdp
::
Ptr
ret
=
std
::
make_shared
<
RtcSessionSdp
>
();
RtcSessionSdp
::
Ptr
ret
=
std
::
make_shared
<
RtcSessionSdp
>
();
auto
&
sdp
=
*
ret
;
auto
&
sdp
=
*
ret
;
sdp
.
items
.
emplace_back
(
std
::
make_shared
<
SdpString
<
'v'
>
>
(
to_string
(
version
)));
sdp
.
addItem
(
std
::
make_shared
<
SdpString
<
'v'
>
>
(
to_string
(
version
)));
sdp
.
items
.
emplace_back
(
std
::
make_shared
<
SdpOrigin
>
(
origin
));
sdp
.
addItem
(
std
::
make_shared
<
SdpOrigin
>
(
origin
));
sdp
.
items
.
emplace_back
(
std
::
make_shared
<
SdpString
<
's'
>
>
(
session_name
));
sdp
.
addItem
(
std
::
make_shared
<
SdpString
<
's'
>
>
(
session_name
));
if
(
!
session_info
.
empty
())
{
if
(
!
session_info
.
empty
())
{
sdp
.
items
.
emplace_back
(
std
::
make_shared
<
SdpString
<
'i'
>
>
(
session_info
));
sdp
.
addItem
(
std
::
make_shared
<
SdpString
<
'i'
>
>
(
session_info
));
}
}
sdp
.
items
.
emplace_back
(
std
::
make_shared
<
SdpTime
>
(
time
));
sdp
.
addItem
(
std
::
make_shared
<
SdpTime
>
(
time
));
if
(
connection
.
empty
()){
if
(
connection
.
empty
()){
sdp
.
items
.
emplace_back
(
std
::
make_shared
<
SdpConnection
>
(
connection
));
sdp
.
addItem
(
std
::
make_shared
<
SdpConnection
>
(
connection
));
}
}
if
(
!
bandwidth
.
empty
())
{
if
(
!
bandwidth
.
empty
())
{
sdp
.
items
.
emplace_back
(
std
::
make_shared
<
SdpBandwidth
>
(
bandwidth
));
sdp
.
addItem
(
std
::
make_shared
<
SdpBandwidth
>
(
bandwidth
));
}
}
sdp
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrGroup
>
(
group
)
));
sdp
.
addAttr
(
std
::
make_shared
<
SdpAttrGroup
>
(
group
));
sdp
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrMsidSemantic
>
(
msid_semantic
)
));
sdp
.
addAttr
(
std
::
make_shared
<
SdpAttrMsidSemantic
>
(
msid_semantic
));
for
(
auto
&
m
:
media
)
{
for
(
auto
&
m
:
media
)
{
sdp
.
medias
.
emplace_back
();
sdp
.
medias
.
emplace_back
();
auto
&
sdp_media
=
sdp
.
medias
.
back
();
auto
&
sdp_media
=
sdp
.
medias
.
back
();
...
@@ -1083,37 +1078,37 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
...
@@ -1083,37 +1078,37 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
if
(
m
.
type
==
TrackApplication
)
{
if
(
m
.
type
==
TrackApplication
)
{
mline
->
fmts
.
emplace_back
(
"webrtc-datachannel"
);
mline
->
fmts
.
emplace_back
(
"webrtc-datachannel"
);
}
}
sdp_media
.
items
.
emplace_back
(
std
::
move
(
mline
));
sdp_media
.
addItem
(
std
::
move
(
mline
));
sdp_media
.
items
.
emplace_back
(
std
::
make_shared
<
SdpConnection
>
(
m
.
addr
));
sdp_media
.
addItem
(
std
::
make_shared
<
SdpConnection
>
(
m
.
addr
));
if
(
!
m
.
rtcp_addr
.
empty
())
{
if
(
!
m
.
rtcp_addr
.
empty
())
{
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrRtcp
>
(
m
.
rtcp_addr
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpAttrRtcp
>
(
m
.
rtcp_addr
));
}
}
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrIceUfrag
>
(
m
.
ice_ufrag
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpAttrIceUfrag
>
(
m
.
ice_ufrag
));
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrIcePwd
>
(
m
.
ice_pwd
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpAttrIcePwd
>
(
m
.
ice_pwd
));
if
(
m
.
ice_trickle
||
m
.
ice_renomination
)
{
if
(
m
.
ice_trickle
||
m
.
ice_renomination
)
{
auto
attr
=
std
::
make_shared
<
SdpAttrIceOption
>
();
auto
attr
=
std
::
make_shared
<
SdpAttrIceOption
>
();
attr
->
trickle
=
m
.
ice_trickle
;
attr
->
trickle
=
m
.
ice_trickle
;
attr
->
renomination
=
m
.
ice_renomination
;
attr
->
renomination
=
m
.
ice_renomination
;
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
attr
)
);
sdp_media
.
addAttr
(
attr
);
}
}
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrFingerprint
>
(
m
.
fingerprint
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpAttrFingerprint
>
(
m
.
fingerprint
));
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrSetup
>
(
m
.
role
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpAttrSetup
>
(
m
.
role
));
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrMid
>
(
m
.
mid
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpAttrMid
>
(
m
.
mid
));
if
(
m
.
ice_lite
)
{
if
(
m
.
ice_lite
)
{
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpCommon
>
(
"ice-lite"
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpCommon
>
(
"ice-lite"
));
}
}
for
(
auto
&
ext
:
m
.
extmap
)
{
for
(
auto
&
ext
:
m
.
extmap
)
{
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrExtmap
>
(
ext
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpAttrExtmap
>
(
ext
));
}
}
if
(
m
.
direction
!=
RtpDirection
::
invalid
)
{
if
(
m
.
direction
!=
RtpDirection
::
invalid
)
{
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
DirectionInterfaceImp
>
(
m
.
direction
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
DirectionInterfaceImp
>
(
m
.
direction
));
}
}
if
(
m
.
rtcp_mux
)
{
if
(
m
.
rtcp_mux
)
{
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpCommon
>
(
"rtcp-mux"
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpCommon
>
(
"rtcp-mux"
));
}
}
if
(
m
.
rtcp_rsize
)
{
if
(
m
.
rtcp_rsize
)
{
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpCommon
>
(
"rtcp-rsize"
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpCommon
>
(
"rtcp-rsize"
));
}
}
if
(
m
.
type
!=
TrackApplication
)
{
if
(
m
.
type
!=
TrackApplication
)
{
...
@@ -1124,14 +1119,14 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
...
@@ -1124,14 +1119,14 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
rtp_map
->
sample_rate
=
p
.
sample_rate
;
rtp_map
->
sample_rate
=
p
.
sample_rate
;
rtp_map
->
channel
=
p
.
channel
;
rtp_map
->
channel
=
p
.
channel
;
//添加a=rtpmap
//添加a=rtpmap
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
move
(
rtp_map
)
));
sdp_media
.
addAttr
(
std
::
move
(
rtp_map
));
for
(
auto
&
fb
:
p
.
rtcp_fb
)
{
for
(
auto
&
fb
:
p
.
rtcp_fb
)
{
auto
rtcp_fb
=
std
::
make_shared
<
SdpAttrRtcpFb
>
();
auto
rtcp_fb
=
std
::
make_shared
<
SdpAttrRtcpFb
>
();
rtcp_fb
->
pt
=
p
.
pt
;
rtcp_fb
->
pt
=
p
.
pt
;
rtcp_fb
->
rtcp_type
=
fb
;
rtcp_fb
->
rtcp_type
=
fb
;
//添加a=rtcp-fb
//添加a=rtcp-fb
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
move
(
rtcp_fb
)
));
sdp_media
.
addAttr
(
std
::
move
(
rtcp_fb
));
}
}
if
(
!
p
.
fmtp
.
empty
())
{
if
(
!
p
.
fmtp
.
empty
())
{
...
@@ -1139,7 +1134,7 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
...
@@ -1139,7 +1134,7 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
fmtp
->
pt
=
p
.
pt
;
fmtp
->
pt
=
p
.
pt
;
fmtp
->
fmtp
=
p
.
fmtp
;
fmtp
->
fmtp
=
p
.
fmtp
;
//添加a=fmtp
//添加a=fmtp
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
move
(
fmtp
)
));
sdp_media
.
addAttr
(
std
::
move
(
fmtp
));
}
}
}
}
...
@@ -1149,7 +1144,7 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
...
@@ -1149,7 +1144,7 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
if
(
!
m
.
rtp_rtx_ssrc
[
0
].
msid
.
empty
())
{
if
(
!
m
.
rtp_rtx_ssrc
[
0
].
msid
.
empty
())
{
auto
msid
=
std
::
make_shared
<
SdpAttrMsid
>
();
auto
msid
=
std
::
make_shared
<
SdpAttrMsid
>
();
msid
->
parse
(
m
.
rtp_rtx_ssrc
[
0
].
msid
);
msid
->
parse
(
m
.
rtp_rtx_ssrc
[
0
].
msid
);
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
move
(
msid
)
));
sdp_media
.
addAttr
(
std
::
move
(
msid
));
}
}
}
}
}
}
...
@@ -1158,9 +1153,9 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
...
@@ -1158,9 +1153,9 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
for
(
auto
&
ssrc
:
m
.
rtp_rtx_ssrc
)
{
for
(
auto
&
ssrc
:
m
.
rtp_rtx_ssrc
)
{
//添加a=ssrc字段
//添加a=ssrc字段
CHECK
(
!
ssrc
.
empty
());
CHECK
(
!
ssrc
.
empty
());
addSdpAttrSSRC
(
ssrc
,
sdp_media
.
items
,
ssrc
.
ssrc
);
addSdpAttrSSRC
(
ssrc
,
sdp_media
,
ssrc
.
ssrc
);
if
(
ssrc
.
rtx_ssrc
)
{
if
(
ssrc
.
rtx_ssrc
)
{
addSdpAttrSSRC
(
ssrc
,
sdp_media
.
items
,
ssrc
.
rtx_ssrc
);
addSdpAttrSSRC
(
ssrc
,
sdp_media
,
ssrc
.
rtx_ssrc
);
//生成a=ssrc-group:FID字段
//生成a=ssrc-group:FID字段
//有rtx ssrc
//有rtx ssrc
...
@@ -1168,7 +1163,7 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
...
@@ -1168,7 +1163,7 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
group
->
type
=
"FID"
;
group
->
type
=
"FID"
;
group
->
ssrcs
.
emplace_back
(
ssrc
.
ssrc
);
group
->
ssrcs
.
emplace_back
(
ssrc
.
ssrc
);
group
->
ssrcs
.
emplace_back
(
ssrc
.
rtx_ssrc
);
group
->
ssrcs
.
emplace_back
(
ssrc
.
rtx_ssrc
);
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
move
(
group
)
));
sdp_media
.
addAttr
(
std
::
move
(
group
));
}
}
}
}
}
}
...
@@ -1182,33 +1177,33 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
...
@@ -1182,33 +1177,33 @@ RtcSessionSdp::Ptr RtcSession::toRtcSessionSdp() const{
}
}
//添加a=ssrc-group:SIM字段
//添加a=ssrc-group:SIM字段
group
->
type
=
"SIM"
;
group
->
type
=
"SIM"
;
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
move
(
group
)
));
sdp_media
.
addAttr
(
std
::
move
(
group
));
}
}
if
(
m
.
rtp_rids
.
size
()
>=
2
)
{
if
(
m
.
rtp_rids
.
size
()
>=
2
)
{
auto
simulcast
=
std
::
make_shared
<
SdpAttrSimulcast
>
();
auto
simulcast
=
std
::
make_shared
<
SdpAttrSimulcast
>
();
simulcast
->
direction
=
"recv"
;
simulcast
->
direction
=
"recv"
;
simulcast
->
rids
=
m
.
rtp_rids
;
simulcast
->
rids
=
m
.
rtp_rids
;
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
move
(
simulcast
)
));
sdp_media
.
addAttr
(
std
::
move
(
simulcast
));
for
(
auto
&
rid
:
m
.
rtp_rids
)
{
for
(
auto
&
rid
:
m
.
rtp_rids
)
{
auto
attr_rid
=
std
::
make_shared
<
SdpAttrRid
>
();
auto
attr_rid
=
std
::
make_shared
<
SdpAttrRid
>
();
attr_rid
->
rid
=
rid
;
attr_rid
->
rid
=
rid
;
attr_rid
->
direction
=
"recv"
;
attr_rid
->
direction
=
"recv"
;
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
move
(
attr_rid
)
));
sdp_media
.
addAttr
(
std
::
move
(
attr_rid
));
}
}
}
}
}
}
}
else
{
}
else
{
if
(
!
m
.
sctpmap
.
empty
())
{
if
(
!
m
.
sctpmap
.
empty
())
{
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrSctpMap
>
(
m
.
sctpmap
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpAttrSctpMap
>
(
m
.
sctpmap
));
}
}
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpCommon
>
(
"sctp-port"
,
to_string
(
m
.
sctp_port
)
)));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpCommon
>
(
"sctp-port"
,
to_string
(
m
.
sctp_port
)));
}
}
for
(
auto
&
cand
:
m
.
candidate
)
{
for
(
auto
&
cand
:
m
.
candidate
)
{
sdp_media
.
items
.
emplace_back
(
wrapSdpAttr
(
std
::
make_shared
<
SdpAttrCandidate
>
(
cand
)
));
sdp_media
.
addAttr
(
std
::
make_shared
<
SdpAttrCandidate
>
(
cand
));
}
}
}
}
return
ret
;
return
ret
;
...
...
webrtc/Sdp.h
查看文件 @
757001ad
...
@@ -491,25 +491,18 @@ public:
...
@@ -491,25 +491,18 @@ public:
class
RtcSdpBase
{
class
RtcSdpBase
{
public
:
public
:
std
::
vector
<
SdpItem
::
Ptr
>
items
;
std
::
vector
<
SdpItem
::
Ptr
>
items
;
void
addItem
(
SdpItem
::
Ptr
item
)
{
items
.
push_back
(
item
);
}
void
addAttr
(
SdpItem
::
Ptr
attr
)
{
auto
item
=
std
::
make_shared
<
SdpAttr
>
();
item
->
detail
=
std
::
move
(
attr
);
items
.
push_back
(
item
);
}
SdpItem
::
Ptr
findItem
(
char
key
)
const
{
return
getItem
(
key
);}
SdpItem
::
Ptr
findAttr
(
const
char
*
key
)
const
{
return
getItem
(
'a'
,
key
);}
public
:
public
:
virtual
~
RtcSdpBase
()
=
default
;
virtual
~
RtcSdpBase
()
=
default
;
virtual
std
::
string
toString
()
const
;
virtual
std
::
string
toString
()
const
;
int
getVersion
()
const
;
SdpOrigin
getOrigin
()
const
;
std
::
string
getSessionName
()
const
;
std
::
string
getSessionInfo
()
const
;
SdpTime
getSessionTime
()
const
;
SdpConnection
getConnection
()
const
;
SdpBandwidth
getBandwidth
()
const
;
std
::
string
getUri
()
const
;
std
::
string
getEmail
()
const
;
std
::
string
getPhone
()
const
;
std
::
string
getTimeZone
()
const
;
std
::
string
getEncryptKey
()
const
;
std
::
string
getRepeatTimes
()
const
;
RtpDirection
getDirection
()
const
;
RtpDirection
getDirection
()
const
;
template
<
typename
cls
>
template
<
typename
cls
>
...
@@ -534,8 +527,8 @@ public:
...
@@ -534,8 +527,8 @@ public:
template
<
typename
cls
>
template
<
typename
cls
>
std
::
vector
<
cls
>
getAllItem
(
char
key_c
,
const
char
*
attr_key
=
nullptr
)
const
{
std
::
vector
<
cls
>
getAllItem
(
char
key_c
,
const
char
*
attr_key
=
nullptr
)
const
{
std
::
vector
<
cls
>
ret
;
std
::
vector
<
cls
>
ret
;
std
::
string
key
(
1
,
key_c
);
for
(
auto
item
:
items
)
{
for
(
auto
item
:
items
)
{
std
::
string
key
(
1
,
key_c
);
if
(
strcasecmp
(
item
->
getKey
(),
key
.
data
())
==
0
)
{
if
(
strcasecmp
(
item
->
getKey
(),
key
.
data
())
==
0
)
{
if
(
!
attr_key
)
{
if
(
!
attr_key
)
{
auto
c
=
std
::
dynamic_pointer_cast
<
cls
>
(
item
);
auto
c
=
std
::
dynamic_pointer_cast
<
cls
>
(
item
);
...
@@ -560,7 +553,21 @@ public:
...
@@ -560,7 +553,21 @@ public:
class
RtcSessionSdp
:
public
RtcSdpBase
{
class
RtcSessionSdp
:
public
RtcSdpBase
{
public
:
public
:
using
Ptr
=
std
::
shared_ptr
<
RtcSessionSdp
>
;
using
Ptr
=
std
::
shared_ptr
<
RtcSessionSdp
>
;
int
getVersion
()
const
;
SdpOrigin
getOrigin
()
const
;
std
::
string
getSessionName
()
const
;
std
::
string
getSessionInfo
()
const
;
SdpTime
getSessionTime
()
const
;
SdpConnection
getConnection
()
const
;
SdpBandwidth
getBandwidth
()
const
;
std
::
string
getUri
()
const
;
std
::
string
getEmail
()
const
;
std
::
string
getPhone
()
const
;
std
::
string
getTimeZone
()
const
;
std
::
string
getEncryptKey
()
const
;
std
::
string
getRepeatTimes
()
const
;
std
::
vector
<
RtcSdpBase
>
medias
;
std
::
vector
<
RtcSdpBase
>
medias
;
void
parse
(
const
std
::
string
&
str
);
void
parse
(
const
std
::
string
&
str
);
std
::
string
toString
()
const
override
;
std
::
string
toString
()
const
override
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论