From: Alexander Traud Date: Wed, 11 Nov 2015 13:00:42 +0000 (+0100) Subject: format: Register format-attribute module with cached formats. X-Git-Tag: 14.0.0-beta1~574^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd23d423d8e7be865112b8bda58f61ea6e3d0b8f;p=thirdparty%2Fasterisk.git 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 --- diff --git a/main/format.c b/main/format.c index b9931e5449..cc9ac45d73 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)