resource_channels.c: Explicit codec request when creating UnicastRTP.

Fixes #394

(cherry picked from commit a83c761c95)
This commit is contained in:
Sean Bright 2023-11-06 18:10:02 -05:00 committed by Asterisk Development Team
parent fb7d39db6d
commit da35b6a244
1 changed files with 15 additions and 7 deletions

View File

@ -2081,18 +2081,19 @@ void ast_ari_channels_rtpstatistics(struct ast_variable *headers,
return; return;
} }
static void external_media_rtp_udp(struct ast_ari_channels_external_media_args *args, static int external_media_rtp_udp(struct ast_ari_channels_external_media_args *args,
struct ast_variable *variables, struct ast_variable *variables,
struct ast_ari_response *response) struct ast_ari_response *response)
{ {
size_t endpoint_len;
char *endpoint; char *endpoint;
struct ast_channel *chan; struct ast_channel *chan;
struct varshead *vars; struct varshead *vars;
endpoint_len = strlen("UnicastRTP/") + strlen(args->external_host) + 1; if (ast_asprintf(&endpoint, "UnicastRTP/%s/c(%s)",
endpoint = ast_alloca(endpoint_len); args->external_host,
snprintf(endpoint, endpoint_len, "UnicastRTP/%s", args->external_host); args->format) == -1) {
return 1;
}
chan = ari_channels_handle_originate_with_id( chan = ari_channels_handle_originate_with_id(
endpoint, endpoint,
@ -2112,8 +2113,10 @@ static void external_media_rtp_udp(struct ast_ari_channels_external_media_args *
response); response);
ast_variables_destroy(variables); ast_variables_destroy(variables);
ast_free(endpoint);
if (!chan) { if (!chan) {
return; return 1;
} }
ast_channel_lock(chan); ast_channel_lock(chan);
@ -2123,6 +2126,7 @@ static void external_media_rtp_udp(struct ast_ari_channels_external_media_args *
} }
ast_channel_unlock(chan); ast_channel_unlock(chan);
ast_channel_unref(chan); ast_channel_unref(chan);
return 0;
} }
static void external_media_audiosocket_tcp(struct ast_ari_channels_external_media_args *args, static void external_media_audiosocket_tcp(struct ast_ari_channels_external_media_args *args,
@ -2235,7 +2239,11 @@ void ast_ari_channels_external_media(struct ast_variable *headers,
} }
if (strcasecmp(args->encapsulation, "rtp") == 0 && strcasecmp(args->transport, "udp") == 0) { if (strcasecmp(args->encapsulation, "rtp") == 0 && strcasecmp(args->transport, "udp") == 0) {
external_media_rtp_udp(args, variables, response); if (external_media_rtp_udp(args, variables, response)) {
ast_ari_response_error(
response, 500, "Internal Server Error",
"An internal error prevented this request from being handled");
}
} else if (strcasecmp(args->encapsulation, "audiosocket") == 0 && strcasecmp(args->transport, "tcp") == 0) { } else if (strcasecmp(args->encapsulation, "audiosocket") == 0 && strcasecmp(args->transport, "tcp") == 0) {
external_media_audiosocket_tcp(args, variables, response); external_media_audiosocket_tcp(args, variables, response);
} else { } else {