summaryrefslogtreecommitdiff
path: root/main/format.c
diff options
context:
space:
mode:
authorAlexander Traud <pabstraud@compuserve.com>2015-11-11 14:00:42 +0100
committerAlexander Traud <pabstraud@compuserve.com>2015-11-13 09:32:52 +0100
commitfd23d423d8e7be865112b8bda58f61ea6e3d0b8f (patch)
tree7905ec7c390cee2dc1a5ab0ce77fbfcf88c237f9 /main/format.c
parente4af14784ee086397e8400571b8ec551cb9d544f (diff)
format: Register format-attribute module with cached formats.
In Asterisk 13, cached formats are created before their corresponding format- attribute module is registered. Cached formats are involved when a local extension is called. Therefore, ast_format_generate_sdp_fmtp did not work on local extensions. This change affects the Opus Codec, H.263 (Plus), H.264, and format-attribute modules provided externally. ASTERISK-25160 #close Change-Id: I1ea1f0483e5261e2a050112e4ebdfc22057d1354
Diffstat (limited to 'main/format.c')
-rw-r--r--main/format.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/main/format.c b/main/format.c
index b9931e544..cc9ac45d7 100644
--- a/main/format.c
+++ b/main/format.c
@@ -302,6 +302,14 @@ const void *ast_format_attribute_get(const struct ast_format *format, const char
{
const struct ast_format_interface *interface = format->interface;
+ if (!interface) {
+ struct format_interface *format_interface = ao2_find(interfaces, format->codec->name, OBJ_SEARCH_KEY);
+ if (format_interface) {
+ interface = format_interface->interface;
+ ao2_ref(format_interface, -1);
+ }
+ }
+
if (!interface || !interface->format_attribute_get) {
return NULL;
}
@@ -330,11 +338,21 @@ struct ast_format *ast_format_parse_sdp_fmtp(const struct ast_format *format, co
void ast_format_generate_sdp_fmtp(const struct ast_format *format, unsigned int payload, struct ast_str **str)
{
- if (!format->interface || !format->interface->format_generate_sdp_fmtp) {
+ const struct ast_format_interface *interface = format->interface;
+
+ if (!interface) {
+ struct format_interface *format_interface = ao2_find(interfaces, format->codec->name, OBJ_SEARCH_KEY);
+ if (format_interface) {
+ interface = format_interface->interface;
+ ao2_ref(format_interface, -1);
+ }
+ }
+
+ if (!interface || !interface->format_generate_sdp_fmtp) {
return;
}
- format->interface->format_generate_sdp_fmtp(format, payload, str);
+ interface->format_generate_sdp_fmtp(format, payload, str);
}
struct ast_codec *ast_format_get_codec(const struct ast_format *format)