|
|
|
@ -991,15 +991,15 @@ static int __codec_handler_eq(const void *a, const void *b) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// call must be locked in W
|
|
|
|
// call must be locked in W
|
|
|
|
void codec_handlers_update(struct call_media *receiver, struct call_media *sink,
|
|
|
|
void __codec_handlers_update(struct call_media *receiver, struct call_media *sink,
|
|
|
|
const struct sdp_ng_flags *flags, const struct stream_params *sp, struct call_subscription *sub)
|
|
|
|
struct chu_args a)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ilogs(codec, LOG_DEBUG, "Setting up codec handlers for " STR_FORMAT_M " #%u -> " STR_FORMAT_M " #%u",
|
|
|
|
ilogs(codec, LOG_DEBUG, "Setting up codec handlers for " STR_FORMAT_M " #%u -> " STR_FORMAT_M " #%u",
|
|
|
|
STR_FMT_M(&receiver->monologue->tag), receiver->index,
|
|
|
|
STR_FMT_M(&receiver->monologue->tag), receiver->index,
|
|
|
|
STR_FMT_M(&sink->monologue->tag), sink->index);
|
|
|
|
STR_FMT_M(&sink->monologue->tag), sink->index);
|
|
|
|
|
|
|
|
|
|
|
|
if (sub)
|
|
|
|
if (a.sub)
|
|
|
|
sub->attrs.transcoding = 0;
|
|
|
|
a.sub->attrs.transcoding = 0;
|
|
|
|
MEDIA_CLEAR(receiver, GENERATOR);
|
|
|
|
MEDIA_CLEAR(receiver, GENERATOR);
|
|
|
|
MEDIA_CLEAR(sink, GENERATOR);
|
|
|
|
MEDIA_CLEAR(sink, GENERATOR);
|
|
|
|
|
|
|
|
|
|
|
|
@ -1010,9 +1010,9 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink,
|
|
|
|
|
|
|
|
|
|
|
|
// non-RTP protocol?
|
|
|
|
// non-RTP protocol?
|
|
|
|
if (proto_is(receiver->protocol, PROTO_UDPTL)) {
|
|
|
|
if (proto_is(receiver->protocol, PROTO_UDPTL)) {
|
|
|
|
if (codec_handler_udptl_update(receiver, sink, flags)) {
|
|
|
|
if (codec_handler_udptl_update(receiver, sink, a.flags)) {
|
|
|
|
if (sub)
|
|
|
|
if (a.sub)
|
|
|
|
sub->attrs.transcoding = 1;
|
|
|
|
a.sub->attrs.transcoding = 1;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1026,9 +1026,9 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink,
|
|
|
|
|
|
|
|
|
|
|
|
// should we transcode to a non-RTP protocol?
|
|
|
|
// should we transcode to a non-RTP protocol?
|
|
|
|
if (proto_is_not_rtp(sink->protocol)) {
|
|
|
|
if (proto_is_not_rtp(sink->protocol)) {
|
|
|
|
if (codec_handler_non_rtp_update(receiver, sink, flags, sp)) {
|
|
|
|
if (codec_handler_non_rtp_update(receiver, sink, a.flags, a.sp)) {
|
|
|
|
if (sub)
|
|
|
|
if (a.sub)
|
|
|
|
sub->attrs.transcoding = 1;
|
|
|
|
a.sub->attrs.transcoding = 1;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1048,15 +1048,15 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink,
|
|
|
|
bool use_audio_player = !!MEDIA_ISSET(sink, AUDIO_PLAYER);
|
|
|
|
bool use_audio_player = !!MEDIA_ISSET(sink, AUDIO_PLAYER);
|
|
|
|
bool implicit_audio_player = false;
|
|
|
|
bool implicit_audio_player = false;
|
|
|
|
|
|
|
|
|
|
|
|
if (flags && flags->audio_player == AP_FORCE)
|
|
|
|
if (a.flags && a.flags->audio_player == AP_FORCE)
|
|
|
|
use_audio_player = true;
|
|
|
|
use_audio_player = true;
|
|
|
|
else if (flags && flags->audio_player == AP_OFF)
|
|
|
|
else if (a.flags && a.flags->audio_player == AP_OFF)
|
|
|
|
use_audio_player = false;
|
|
|
|
use_audio_player = false;
|
|
|
|
else if (rtpe_config.use_audio_player == UAP_ALWAYS)
|
|
|
|
else if (rtpe_config.use_audio_player == UAP_ALWAYS)
|
|
|
|
use_audio_player = true;
|
|
|
|
use_audio_player = true;
|
|
|
|
else if (rtpe_config.use_audio_player == UAP_PLAY_MEDIA) {
|
|
|
|
else if (rtpe_config.use_audio_player == UAP_PLAY_MEDIA) {
|
|
|
|
// check for implicitly enabled player
|
|
|
|
// check for implicitly enabled player
|
|
|
|
if ((flags && flags->opmode == OP_PLAY_MEDIA) || (media_player_is_active(sink->monologue))) {
|
|
|
|
if ((a.flags && a.flags->opmode == OP_PLAY_MEDIA) || (media_player_is_active(sink->monologue))) {
|
|
|
|
use_audio_player = true;
|
|
|
|
use_audio_player = true;
|
|
|
|
implicit_audio_player = true;
|
|
|
|
implicit_audio_player = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1088,7 +1088,7 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink,
|
|
|
|
if (receiver->monologue->dtmf_trigger.len)
|
|
|
|
if (receiver->monologue->dtmf_trigger.len)
|
|
|
|
do_dtmf_detect = true;
|
|
|
|
do_dtmf_detect = true;
|
|
|
|
|
|
|
|
|
|
|
|
if (flags && flags->inject_dtmf)
|
|
|
|
if (a.flags && a.flags->inject_dtmf)
|
|
|
|
sink->monologue->inject_dtmf = 1;
|
|
|
|
sink->monologue->inject_dtmf = 1;
|
|
|
|
|
|
|
|
|
|
|
|
bool use_ssrc_passthrough = MEDIA_ISSET(receiver, ECHO) || sink->monologue->inject_dtmf;
|
|
|
|
bool use_ssrc_passthrough = MEDIA_ISSET(receiver, ECHO) || sink->monologue->inject_dtmf;
|
|
|
|
@ -1195,7 +1195,7 @@ sink_pt_fixed:;
|
|
|
|
|
|
|
|
|
|
|
|
// XXX synthesise missing supp codecs according to codec tracker XXX needed?
|
|
|
|
// XXX synthesise missing supp codecs according to codec tracker XXX needed?
|
|
|
|
|
|
|
|
|
|
|
|
if (!flags) {
|
|
|
|
if (!a.flags) {
|
|
|
|
// second pass going through the offerer codecs during an answer:
|
|
|
|
// second pass going through the offerer codecs during an answer:
|
|
|
|
// if an answer rejected a supplemental codec that isn't marked for transcoding,
|
|
|
|
// if an answer rejected a supplemental codec that isn't marked for transcoding,
|
|
|
|
// reject it on the sink side as well
|
|
|
|
// reject it on the sink side as well
|
|
|
|
@ -1319,9 +1319,9 @@ sink_pt_fixed:;
|
|
|
|
|
|
|
|
|
|
|
|
transcode:
|
|
|
|
transcode:
|
|
|
|
// enable audio player if not explicitly disabled
|
|
|
|
// enable audio player if not explicitly disabled
|
|
|
|
if (rtpe_config.use_audio_player == UAP_TRANSCODING && (!flags || flags->audio_player != AP_OFF))
|
|
|
|
if (rtpe_config.use_audio_player == UAP_TRANSCODING && (!a.flags || a.flags->audio_player != AP_OFF))
|
|
|
|
use_audio_player = true;
|
|
|
|
use_audio_player = true;
|
|
|
|
else if (flags && flags->audio_player == AP_TRANSCODING)
|
|
|
|
else if (a.flags && a.flags->audio_player == AP_TRANSCODING)
|
|
|
|
use_audio_player = true;
|
|
|
|
use_audio_player = true;
|
|
|
|
|
|
|
|
|
|
|
|
if (use_audio_player) {
|
|
|
|
if (use_audio_player) {
|
|
|
|
@ -1377,8 +1377,8 @@ next:
|
|
|
|
MEDIA_SET(sink, AUDIO_PLAYER);
|
|
|
|
MEDIA_SET(sink, AUDIO_PLAYER);
|
|
|
|
|
|
|
|
|
|
|
|
if (is_transcoding) {
|
|
|
|
if (is_transcoding) {
|
|
|
|
if (sub)
|
|
|
|
if (a.sub)
|
|
|
|
sub->attrs.transcoding = 1;
|
|
|
|
a.sub->attrs.transcoding = 1;
|
|
|
|
|
|
|
|
|
|
|
|
if (!use_audio_player) {
|
|
|
|
if (!use_audio_player) {
|
|
|
|
// we have to translate RTCP packets
|
|
|
|
// we have to translate RTCP packets
|
|
|
|
@ -1427,7 +1427,7 @@ next:
|
|
|
|
|
|
|
|
|
|
|
|
audio_player_setup(sink, pref_dest_codec, rtpe_config.audio_buffer_length,
|
|
|
|
audio_player_setup(sink, pref_dest_codec, rtpe_config.audio_buffer_length,
|
|
|
|
rtpe_config.audio_buffer_delay);
|
|
|
|
rtpe_config.audio_buffer_delay);
|
|
|
|
if (flags && (flags->early_media || flags->opmode == OP_ANSWER))
|
|
|
|
if (a.flags && (a.flags->early_media || a.flags->opmode == OP_ANSWER))
|
|
|
|
audio_player_activate(sink);
|
|
|
|
audio_player_activate(sink);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -4148,7 +4148,7 @@ void codec_update_all_handlers(struct call_monologue *ml) {
|
|
|
|
struct call_media *sink_media = sink->medias->pdata[i];
|
|
|
|
struct call_media *sink_media = sink->medias->pdata[i];
|
|
|
|
if (!sink_media)
|
|
|
|
if (!sink_media)
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
codec_handlers_update(source_media, sink_media, NULL, NULL, NULL);
|
|
|
|
codec_handlers_update(source_media, sink_media);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -4168,7 +4168,7 @@ void codec_update_all_source_handlers(struct call_monologue *ml, const struct sd
|
|
|
|
struct call_media *sink_media = ml->medias->pdata[i];
|
|
|
|
struct call_media *sink_media = ml->medias->pdata[i];
|
|
|
|
if (!sink_media)
|
|
|
|
if (!sink_media)
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
codec_handlers_update(source_media, sink_media, flags, NULL, NULL);
|
|
|
|
codec_handlers_update(source_media, sink_media, .flags = flags);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|