diff options
Diffstat (limited to 'codecs/codecs.c')
-rw-r--r-- | codecs/codecs.c | 172 |
1 files changed, 113 insertions, 59 deletions
diff --git a/codecs/codecs.c b/codecs/codecs.c index 6f622bbe16..68def22dc4 100644 --- a/codecs/codecs.c +++ b/codecs/codecs.c @@ -26,6 +26,14 @@ #include <glib.h> #include "codecs.h" +#include "config.h" + +#include "G711a/G711adecode.h" +#include "G711u/G711udecode.h" + +#ifdef HAVE_SBC +#include "sbc/sbc_private.h" +#endif #ifdef HAVE_PLUGINS @@ -37,7 +45,7 @@ * List of codec plugins. */ typedef struct { - void (*register_codec_module)(void); /* routine to call to register a codec */ + void (*register_codec_module)(void); /* routine to call to register a codec */ } codec_plugin; static GSList *codec_plugins = NULL; @@ -48,44 +56,44 @@ static GSList *codec_plugins = NULL; static gboolean check_for_codec_plugin(GModule *handle) { - gpointer gp; - void (*register_codec_module)(void); - codec_plugin *plugin; - - /* - * Do we have a register_codec_module routine? - */ - if (!g_module_symbol(handle, "register_codec_module", &gp)) { - /* No, so this isn't a codec plugin. */ - return FALSE; - } - - /* - * Yes - this plugin includes one or more codecs. - */ - register_codec_module = (void (*)(void))gp; - - /* - * Add this one to the list of codec plugins. - */ - plugin = (codec_plugin *)g_malloc(sizeof (codec_plugin)); - plugin->register_codec_module = register_codec_module; - codec_plugins = g_slist_append(codec_plugins, plugin); - return TRUE; + gpointer gp; + void (*register_codec_module)(void); + codec_plugin *plugin; + + /* + * Do we have a register_codec_module routine? + */ + if (!g_module_symbol(handle, "register_codec_module", &gp)) { + /* No, so this isn't a codec plugin. */ + return FALSE; + } + + /* + * Yes - this plugin includes one or more codecs. + */ + register_codec_module = (void (*)(void))gp; + + /* + * Add this one to the list of codec plugins. + */ + plugin = (codec_plugin *)g_malloc(sizeof (codec_plugin)); + plugin->register_codec_module = register_codec_module; + codec_plugins = g_slist_append(codec_plugins, plugin); + return TRUE; } void codec_register_plugin_types(void) { - add_plugin_type("codec", check_for_codec_plugin); + add_plugin_type("codec", check_for_codec_plugin); } static void register_codec_plugin(gpointer data, gpointer user_data _U_) { - codec_plugin *plugin = (codec_plugin *)data; + codec_plugin *plugin = (codec_plugin *)data; - (plugin->register_codec_module)(); + (plugin->register_codec_module)(); } /* @@ -94,15 +102,32 @@ register_codec_plugin(gpointer data, gpointer user_data _U_) void register_all_codecs(void) { - g_slist_foreach(codec_plugins, register_codec_plugin, NULL); + register_codec("g711U", codec_g711u_init, codec_g711u_release, + codec_g711u_get_channels, codec_g711u_get_frequency, codec_g711u_decode); + register_codec("g711A", codec_g711a_init, codec_g711a_release, + codec_g711a_get_channels, codec_g711a_get_frequency, codec_g711a_decode); +#ifdef HAVE_SPANDSP + register_codec("g722", codec_g722_init, codec_g722_release, + codec_g722_get_channels, codec_g722_get_frequency, codec_g722_decode); + register_codec("g726", codec_g726_init, codec_g726_release, + codec_g726_get_channels, codec_g726_get_frequency, codec_g726_decode); +#endif +#ifdef HAVE_SBC + register_codec("SBC", codec_sbc_init, codec_sbc_release, + codec_sbc_get_channels, codec_sbc_get_frequency, codec_sbc_decode); +#endif + + g_slist_foreach(codec_plugins, register_codec_plugin, NULL); } #endif /* HAVE_PLUGINS */ struct codec_handle { - const char *name; - codec_init_fn init_fn; - codec_release_fn release_fn; - codec_decode_fn decode_fn; + const char *name; + codec_init_fn init_fn; + codec_release_fn release_fn; + codec_get_channels_fn channels_fn; + codec_get_frequency_fn frequency_fn; + codec_decode_fn decode_fn; }; /* @@ -115,47 +140,76 @@ static GHashTable *registered_codecs = NULL; codec_handle_t find_codec(const char *name) { - return (registered_codecs) ? (codec_handle_t)g_hash_table_lookup(registered_codecs, name) : NULL; + return (registered_codecs) ? (codec_handle_t)g_hash_table_lookup(registered_codecs, name) : NULL; } /* Register a codec by name. */ gboolean -register_codec(const char *name, codec_init_fn init_fn, codec_release_fn release_fn, codec_decode_fn decode_fn) +register_codec(const char *name, codec_init_fn init_fn, codec_release_fn release_fn, + codec_get_channels_fn channels_fn, codec_get_frequency_fn frequency_fn, + codec_decode_fn decode_fn) { - struct codec_handle *handle; - - /* Create our hash table if it doesn't already exist */ - if (registered_codecs == NULL) - registered_codecs = g_hash_table_new(g_str_hash, g_str_equal); - - /* Make sure the registration is unique */ - if (g_hash_table_lookup(registered_codecs, name) != NULL) - return FALSE; /* report an error, or have our caller do it? */ - - handle = (struct codec_handle *)g_malloc(sizeof (struct codec_handle)); - handle->name = name; - handle->init_fn = init_fn; - handle->release_fn = release_fn; - handle->decode_fn = decode_fn; - - g_hash_table_insert(registered_codecs, (gpointer)name, (gpointer) handle); - return TRUE; + struct codec_handle *handle; + + /* Create our hash table if it doesn't already exist */ + if (registered_codecs == NULL) + registered_codecs = g_hash_table_new(g_str_hash, g_str_equal); + + /* Make sure the registration is unique */ + if (g_hash_table_lookup(registered_codecs, name) != NULL) + return FALSE; /* report an error, or have our caller do it? */ + + handle = (struct codec_handle *)g_malloc(sizeof (struct codec_handle)); + handle->name = name; + handle->init_fn = init_fn; + handle->release_fn = release_fn; + handle->channels_fn = channels_fn; + handle->frequency_fn = frequency_fn; + handle->decode_fn = decode_fn; + + g_hash_table_insert(registered_codecs, (gpointer)name, (gpointer) handle); + return TRUE; } void *codec_init(codec_handle_t codec) { - if (!codec) return NULL; - return (codec->init_fn)(); + if (!codec) return NULL; + return (codec->init_fn)(); } void codec_release(codec_handle_t codec, void *context) { - if (!codec) return; - (codec->release_fn)(context); + if (!codec) return; + (codec->release_fn)(context); +} + +int codec_get_channels(codec_handle_t codec, void *context) +{ + if (!codec) return 0; + return (codec->channels_fn)(context); +} + +int codec_get_frequency(codec_handle_t codec, void *context) +{ + if (!codec) return 0; + return (codec->frequency_fn)(context); } int codec_decode(codec_handle_t codec, void *context, const void *input, int inputSizeBytes, void *output, int *outputSizeBytes) { - if (!codec) return 0; - return (codec->decode_fn)(context, input, inputSizeBytes, output, outputSizeBytes); + if (!codec) return 0; + return (codec->decode_fn)(context, input, inputSizeBytes, output, outputSizeBytes); } + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |