Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
jami-daemon
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
savoirfairelinux
jami-daemon
Commits
52d11593
Commit
52d11593
authored
11 years ago
by
Adrien Béraud
Browse files
Options
Downloads
Patches
Plain Diff
sdp: use two lists of codecs and prefer using the intersection
Issue: #45447
parent
bba79fe8
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
daemon/src/sip/sdp.cpp
+34
-23
34 additions, 23 deletions
daemon/src/sip/sdp.cpp
daemon/src/sip/sdp.h
+2
-2
2 additions, 2 deletions
daemon/src/sip/sdp.h
with
36 additions
and
25 deletions
daemon/src/sip/sdp.cpp
+
34
−
23
View file @
52d11593
...
...
@@ -60,7 +60,8 @@ Sdp::Sdp(pj_pool_t *pool)
,
activeRemoteSession_
(
nullptr
)
,
audio_codec_list_
()
,
video_codec_list_
()
,
sessionAudioMedia_
()
,
sessionAudioMediaLocal_
()
,
sessionAudioMediaRemote_
()
,
sessionVideoMedia_
()
,
publishedIpAddr_
()
,
publishedIpAddrType_
()
...
...
@@ -123,6 +124,8 @@ void Sdp::setActiveLocalSdpSession(const pjmedia_sdp_session *sdp)
{
activeLocalSession_
=
(
pjmedia_sdp_session
*
)
sdp
;
sessionAudioMediaLocal_
.
clear
();
for
(
unsigned
i
=
0
;
i
<
activeLocalSession_
->
media_count
;
++
i
)
{
pjmedia_sdp_media
*
current
=
activeLocalSession_
->
media
[
i
];
...
...
@@ -140,14 +143,14 @@ void Sdp::setActiveLocalSdpSession(const pjmedia_sdp_session *sdp)
if
(
!
pj_stricmp2
(
&
current
->
desc
.
media
,
"audio"
))
{
const
unsigned
long
pt
=
pj_strtoul
(
&
current
->
desc
.
fmt
[
fmt
]);
if
(
pt
!=
telephoneEventPayload_
and
not
hasPayload
(
sessionAudioMedia_
,
pt
))
{
if
(
pt
!=
telephoneEventPayload_
and
not
hasPayload
(
sessionAudioMedia
Local
_
,
pt
))
{
sfl
::
AudioCodec
*
codec
=
Manager
::
instance
().
audioCodecFactory
.
getCodec
(
pt
);
if
(
codec
)
sessionAudioMedia_
.
push_back
(
codec
);
sessionAudioMedia
Local
_
.
push_back
(
codec
);
else
{
codec
=
findCodecByName
(
rtpmapToString
(
rtpmap
));
if
(
codec
)
sessionAudioMedia_
.
push_back
(
codec
);
sessionAudioMedia
Local
_
.
push_back
(
codec
);
else
ERROR
(
"Could not get codec for name %.*s"
,
rtpmap
->
enc_name
.
slen
,
rtpmap
->
enc_name
.
ptr
);
}
...
...
@@ -171,6 +174,8 @@ void Sdp::setActiveRemoteSdpSession(const pjmedia_sdp_session *sdp)
activeRemoteSession_
=
(
pjmedia_sdp_session
*
)
sdp
;
sessionAudioMediaRemote_
.
clear
();
bool
parsedTelelphoneEvent
=
false
;
for
(
unsigned
i
=
0
;
i
<
sdp
->
media_count
;
i
++
)
{
pjmedia_sdp_media
*
r_media
=
sdp
->
media
[
i
];
...
...
@@ -202,16 +207,16 @@ void Sdp::setActiveRemoteSdpSession(const pjmedia_sdp_session *sdp)
pjmedia_sdp_attr_to_rtpmap
(
memPool_
,
rtpMapAttribute
,
&
rtpmap
);
const
unsigned
long
pt
=
pj_strtoul
(
&
r_media
->
desc
.
fmt
[
fmt
]);
if
(
pt
!=
telephoneEventPayload_
and
not
hasPayload
(
sessionAudioMedia_
,
pt
))
{
if
(
pt
!=
telephoneEventPayload_
and
not
hasPayload
(
sessionAudioMedia
Remote
_
,
pt
))
{
sfl
::
AudioCodec
*
codec
=
Manager
::
instance
().
audioCodecFactory
.
getCodec
(
pt
);
if
(
codec
)
{
DEBUG
(
"Adding codec with new payload type %d"
,
pt
);
sessionAudioMedia_
.
push_back
(
codec
);
sessionAudioMedia
Remote
_
.
push_back
(
codec
);
}
else
{
// Search by codec name, clock rate and param (channel count)
codec
=
findCodecByName
(
rtpmapToString
(
rtpmap
));
if
(
codec
)
sessionAudioMedia_
.
push_back
(
codec
);
sessionAudioMedia
Remote
_
.
push_back
(
codec
);
else
ERROR
(
"Could not get codec for name %.*s"
,
rtpmap
->
enc_name
.
slen
,
rtpmap
->
enc_name
.
ptr
);
}
...
...
@@ -219,7 +224,6 @@ void Sdp::setActiveRemoteSdpSession(const pjmedia_sdp_session *sdp)
}
}
}
DEBUG
(
"Ready to decode %u audio codecs"
,
sessionAudioMedia_
.
size
());
}
string
Sdp
::
getSessionVideoCodec
()
const
...
...
@@ -231,24 +235,31 @@ string Sdp::getSessionVideoCodec() const
return
sessionVideoMedia_
[
0
];
}
string
Sdp
::
getAudioCodecNames
()
const
std
::
vector
<
sfl
::
AudioCodec
*>
Sdp
::
getSessionAudioMedia
()
const
{
std
::
string
result
;
char
sep
=
' '
;
for
(
std
::
vector
<
sfl
::
AudioCodec
*>::
const_iterator
i
=
sessionAudioMedia_
.
begin
();
i
!=
sessionAudioMedia_
.
end
();
++
i
)
{
if
(
i
==
sessionAudioMedia_
.
end
()
-
1
)
sep
=
'\0'
;
if
(
*
i
)
result
+=
(
*
i
)
->
getMimeSubtype
()
+
sep
;
vector
<
sfl
::
AudioCodec
*>
codecs
;
// Common codecs first
for
(
auto
c
:
sessionAudioMediaLocal_
)
{
if
(
std
::
find
(
sessionAudioMediaRemote_
.
begin
(),
sessionAudioMediaRemote_
.
end
(),
c
)
!=
sessionAudioMediaRemote_
.
end
())
codecs
.
push_back
(
c
);
}
return
result
;
DEBUG
(
"%u common audio codecs"
,
codecs
.
size
());
// Next, the other codecs we declared to be able to encode
for
(
auto
c
:
sessionAudioMediaLocal_
)
{
if
(
std
::
find
(
codecs
.
begin
(),
codecs
.
end
(),
c
)
==
codecs
.
end
())
codecs
.
push_back
(
c
);
}
// Finally, the remote codecs so we can decode them
for
(
auto
c
:
sessionAudioMediaRemote_
)
{
if
(
std
::
find
(
codecs
.
begin
(),
codecs
.
end
(),
c
)
==
codecs
.
end
())
codecs
.
push_back
(
c
);
}
DEBUG
(
"Ready to decode %u audio codecs"
,
codecs
.
size
());
std
::
vector
<
sfl
::
AudioCodec
*>
Sdp
::
getSessionAudioMedia
()
const
{
return
sessionAudioMedia_
;
return
codecs
;
}
...
...
This diff is collapsed.
Click to expand it.
daemon/src/sip/sdp.h
+
2
−
2
View file @
52d11593
...
...
@@ -253,7 +253,6 @@ class Sdp {
void
setMediaTransportInfoFromRemoteSdp
();
std
::
string
getAudioCodecNames
()
const
;
std
::
string
getSessionVideoCodec
()
const
;
std
::
vector
<
sfl
::
AudioCodec
*>
getSessionAudioMedia
()
const
;
// Sets @param settings with appropriate values and returns true if
...
...
@@ -313,7 +312,8 @@ class Sdp {
/**
* The codecs that will be used by the session (after the SDP negotiation)
*/
std
::
vector
<
sfl
::
AudioCodec
*>
sessionAudioMedia_
;
std
::
vector
<
sfl
::
AudioCodec
*>
sessionAudioMediaLocal_
;
std
::
vector
<
sfl
::
AudioCodec
*>
sessionAudioMediaRemote_
;
std
::
vector
<
std
::
string
>
sessionVideoMedia_
;
std
::
string
publishedIpAddr_
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment