From 5a130b2e1730467cd209d3b3c929ff5f24a2aa02 Mon Sep 17 00:00:00 2001 From: Mark Michelson Date: Tue, 14 Feb 2017 09:54:43 -0600 Subject: Add SDP translator and PJMEDIA implementation. This creates the following: * Asterisk's internal representation of an SDP * An API for translating SDPs from one format to another * An implementation of a translator for PJMEDIA Change-Id: Ie2ecd3cbebe76756577be9b133e84d2ee356d46b --- main/sdp_translator.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 main/sdp_translator.c (limited to 'main/sdp_translator.c') diff --git a/main/sdp_translator.c b/main/sdp_translator.c new file mode 100644 index 000000000..5426ae954 --- /dev/null +++ b/main/sdp_translator.c @@ -0,0 +1,99 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 2017, Digium, Inc. + * + * Mark Michelson + * + * See http://www.asterisk.org for more information about + * the Asterisk project. Please do not directly contact + * any of the maintainers of this project for assistance; + * the project provides a web site, mailing lists and IRC + * channels for your use. + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. + */ + +#include "asterisk.h" +#include "asterisk/sdp_options.h" +#include "asterisk/sdp_translator.h" +#include "asterisk/logger.h" +#include "asterisk/utils.h" +#include "asterisk/lock.h" + +AST_RWLOCK_DEFINE_STATIC(registered_ops_lock); +static struct ast_sdp_translator_ops *registered_ops[AST_SDP_REPR_END]; + +int ast_sdp_register_translator(struct ast_sdp_translator_ops *ops) +{ + SCOPED_WRLOCK(lock, ®istered_ops_lock); + + if (ops->repr >= AST_SDP_REPR_END) { + ast_log(LOG_ERROR, "SDP translator has unrecognized representation\n"); + return -1; + } + + if (registered_ops[ops->repr] != NULL) { + ast_log(LOG_ERROR, "SDP_translator with this representation already registered\n"); + return -1; + } + + registered_ops[ops->repr] = ops; + ast_log(LOG_NOTICE, "Placed ops %p at slot %d\n", ops, ops->repr); + return 0; +} + +void ast_sdp_unregister_translator(struct ast_sdp_translator_ops *ops) +{ + SCOPED_WRLOCK(lock, ®istered_ops_lock); + + if (ops->repr >= AST_SDP_REPR_END) { + return; + } + + registered_ops[ops->repr] = NULL; +} + +struct ast_sdp_translator *ast_sdp_translator_new(enum ast_sdp_options_repr repr) +{ + struct ast_sdp_translator *translator; + SCOPED_RDLOCK(lock, ®istered_ops_lock); + + if (registered_ops[repr] == NULL) { + ast_log(LOG_NOTICE, "No registered SDP translator with representation %d\n", repr); + return NULL; + } + + translator = ast_calloc(1, sizeof(*translator)); + if (!translator) { + return NULL; + } + + translator->ops = registered_ops[repr]; + + translator->translator_priv = translator->ops->translator_new(); + if (!translator->translator_priv) { + ast_free(translator); + return NULL; + } + + return translator; +} + +void ast_sdp_translator_free(struct ast_sdp_translator *translator) +{ + translator->ops->translator_free(translator->translator_priv); + ast_free(translator); +} + +struct ast_sdp *ast_sdp_translator_to_sdp(struct ast_sdp_translator *translator, void *native_sdp) +{ + return translator->ops->to_sdp(native_sdp, translator->translator_priv); +} + +void *ast_sdp_translator_from_sdp(struct ast_sdp_translator *translator, struct ast_sdp *ast_sdp) +{ + return translator->ops->from_sdp(ast_sdp, translator->translator_priv); +} -- cgit v1.2.3