<h1>Project "FreeSWITCH Source" received a push.</h1>
<h2>branch: master updated</h2>
<pre>
via: 8f565277e3a9e814c12779f3d51f2527a081ef99 (commit)
from: 20976da4114c2c5fc0213fa4cda91f7f4bf8a136 (commit)
</pre>= COMMIT LOG ===========================================================
<div class="highlight"><pre>committer: Anthony Minessale
comments:
add mod_opus
<span style="color: #000080; font-weight: bold">diff --git a/build/modules.conf.in b/build/modules.conf.in</span>
<span style="color: #000080; font-weight: bold">index 84a9e9a..8d3dfaa 100644</span>
<span style="color: #A00000">--- a/build/modules.conf.in</span>
<span style="color: #00A000">+++ b/build/modules.conf.in</span>
<span style="color: #800080; font-weight: bold">@@ -48,6 +48,7 @@ codecs/mod_ilbc</span>
codecs/mod_speex
codecs/mod_siren
#codecs/mod_celt
<span style="color: #00A000">+#codecs/mod_opus</span>
#codecs/mod_sangoma_codec
#codecs/mod_dahdi_codec
#dialplans/mod_dialplan_directory
<span style="color: #000080; font-weight: bold">diff --git a/conf/autoload_configs/modules.conf.xml b/conf/autoload_configs/modules.conf.xml</span>
<span style="color: #000080; font-weight: bold">index 2e7ebfa..8b4a4e7 100644</span>
<span style="color: #A00000">--- a/conf/autoload_configs/modules.conf.xml</span>
<span style="color: #00A000">+++ b/conf/autoload_configs/modules.conf.xml</span>
<span style="color: #800080; font-weight: bold">@@ -78,6 +78,7 @@</span>
<load module="mod_h26x"/>
<load module="mod_siren"/>
<!--<load module="mod_celt"/>-->
<span style="color: #00A000">+ <!--<load module="mod_opus"/>--></span>
<!-- File Format Interfaces -->
<load module="mod_sndfile"/>
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/codecs/mod_opus/Makefile b/src/mod/codecs/mod_opus/Makefile</span>
new file mode 100644
<span style="color: #000080; font-weight: bold">index 0000000..a346956</span>
<span style="color: #A00000">--- /dev/null</span>
<span style="color: #00A000">+++ b/src/mod/codecs/mod_opus/Makefile</span>
<span style="color: #800080; font-weight: bold">@@ -0,0 +1,28 @@</span>
<span style="color: #00A000">+BASE=../../../..</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+OPUS=opus-0.9.0</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+OPUS_DIR=$(switch_srcdir)/libs/$(OPUS)</span>
<span style="color: #00A000">+OPUS_BUILDDIR=$(switch_builddir)/libs/$(OPUS)</span>
<span style="color: #00A000">+LOCAL_CFLAGS=-I$(OPUS_DIR)/src -g -O2</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+IETF_LA=$(OPUS_BUILDDIR)/src/.libs/libietfcodec.a</span>
<span style="color: #00A000">+CELT_LA=$(OPUS_BUILDDIR)/celt/libcelt/.libs/libcelt0.a</span>
<span style="color: #00A000">+SILK_LA=$(OPUS_BUILDDIR)/silk/.libs/libSKP_SILK_SDK.a</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+LOCAL_LIBADD=$(IETF_LA) $(CELT_LA) $(SILK_LA) -lm -lz</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+include $(BASE)/build/modmake.rules</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+$(OPUS_DIR):</span>
<span style="color: #00A000">+        $(GETLIB) $(OPUS).tar.gz</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+$(OPUS_BUILDDIR)/Makefile: $(OPUS_DIR)</span>
<span style="color: #00A000">+        mkdir -p $(OPUS_BUILDDIR)</span>
<span style="color: #00A000">+        cd $(OPUS_BUILDDIR) && $(DEFAULT_VARS) $(OPUS_DIR)/configure --disable-shared --with-pic --srcdir=$(OPUS_DIR)</span>
<span style="color: #00A000">+        $(TOUCH_TARGET)</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+$(IETF_LA): $(OPUS_BUILDDIR)/Makefile</span>
<span style="color: #00A000">+        cd $(OPUS_BUILDDIR) && $(MAKE)</span>
<span style="color: #00A000">+        $(TOUCH_TARGET)</span>
<span style="color: #00A000">+</span>
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/codecs/mod_opus/mod_opus.c b/src/mod/codecs/mod_opus/mod_opus.c</span>
new file mode 100644
<span style="color: #000080; font-weight: bold">index 0000000..341254f</span>
<span style="color: #A00000">--- /dev/null</span>
<span style="color: #00A000">+++ b/src/mod/codecs/mod_opus/mod_opus.c</span>
<span style="color: #800080; font-weight: bold">@@ -0,0 +1,209 @@</span>
<span style="color: #00A000">+/* </span>
<span style="color: #00A000">+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application</span>
<span style="color: #00A000">+ * Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org></span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * Version: MPL 1.1</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * The contents of this file are subject to the Mozilla Public License Version</span>
<span style="color: #00A000">+ * 1.1 (the "License"); you may not use this file except in compliance with</span>
<span style="color: #00A000">+ * the License. You may obtain a copy of the License at</span>
<span style="color: #00A000">+ * http://www.mozilla.org/MPL/</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * Software distributed under the License is distributed on an "AS IS" basis,</span>
<span style="color: #00A000">+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License</span>
<span style="color: #00A000">+ * for the specific language governing rights and limitations under the</span>
<span style="color: #00A000">+ * License.</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * The Initial Developer of the Original Code is</span>
<span style="color: #00A000">+ * Anthony Minessale II <anthm@freeswitch.org></span>
<span style="color: #00A000">+ * Portions created by the Initial Developer are Copyright (C)</span>
<span style="color: #00A000">+ * the Initial Developer. All Rights Reserved.</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * Contributor(s):</span>
<span style="color: #00A000">+ * </span>
<span style="color: #00A000">+ * Brian K. West <brian@freeswitch.org></span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * mod_opus.c -- The OPUS ultra-low delay audio codec (http://www.opus-codec.org/)</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ */</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+#include "switch.h"</span>
<span style="color: #00A000">+#include "opus.h"</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWITCH_MODULE_LOAD_FUNCTION(mod_opus_load);</span>
<span style="color: #00A000">+SWITCH_MODULE_DEFINITION(mod_opus, mod_opus_load, NULL, NULL);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+struct opus_context {</span>
<span style="color: #00A000">+        OpusEncoder *encoder_object;</span>
<span style="color: #00A000">+        OpusDecoder *decoder_object;</span>
<span style="color: #00A000">+        int frame_size;</span>
<span style="color: #00A000">+};</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+static switch_status_t switch_opus_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        struct opus_context *context = NULL;</span>
<span style="color: #00A000">+        int encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);</span>
<span style="color: #00A000">+        int decoding = (flags & SWITCH_CODEC_FLAG_DECODE);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(*context))))) {</span>
<span style="color: #00A000">+                return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        context->frame_size = codec->implementation->samples_per_packet;</span>
<span style="color: #00A000">+        </span>
<span style="color: #00A000">+        if (encoding) {</span>
<span style="color: #00A000">+                /* come up with a way to specify these */</span>
<span style="color: #00A000">+                int bitrate_bps = codec->implementation->bits_per_second;</span>
<span style="color: #00A000">+                int mode = MODE_HYBRID;</span>
<span style="color: #00A000">+                int use_vbr = 1;</span>
<span style="color: #00A000">+                int complexity = 10;</span>
<span style="color: #00A000">+                int use_inbandfec = 1;</span>
<span style="color: #00A000">+                int use_dtx = 1;</span>
<span style="color: #00A000">+                int bandwidth = BANDWIDTH_FULLBAND;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                context->encoder_object = opus_encoder_create(codec->implementation->actual_samples_per_second, codec->implementation->number_of_channels);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                opus_encoder_ctl(context->encoder_object, OPUS_SET_MODE(mode));</span>
<span style="color: #00A000">+                opus_encoder_ctl(context->encoder_object, OPUS_SET_BITRATE(bitrate_bps));</span>
<span style="color: #00A000">+                opus_encoder_ctl(context->encoder_object, OPUS_SET_BANDWIDTH(bandwidth));</span>
<span style="color: #00A000">+                opus_encoder_ctl(context->encoder_object, OPUS_SET_VBR_FLAG(use_vbr));</span>
<span style="color: #00A000">+                opus_encoder_ctl(context->encoder_object, OPUS_SET_COMPLEXITY(complexity));</span>
<span style="color: #00A000">+                opus_encoder_ctl(context->encoder_object, OPUS_SET_INBAND_FEC_FLAG(use_inbandfec));</span>
<span style="color: #00A000">+                opus_encoder_ctl(context->encoder_object, OPUS_SET_DTX_FLAG(use_dtx));</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        </span>
<span style="color: #00A000">+        if (decoding) {</span>
<span style="color: #00A000">+                context->decoder_object = opus_decoder_create(codec->implementation->actual_samples_per_second, codec->implementation->number_of_channels);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        codec->private_info = context;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+static switch_status_t switch_opus_destroy(switch_codec_t *codec)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        codec->private_info = NULL;</span>
<span style="color: #00A000">+        return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+static switch_status_t switch_opus_encode(switch_codec_t *codec,</span>
<span style="color: #00A000">+                                                                                 switch_codec_t *other_codec,</span>
<span style="color: #00A000">+                                                                                 void *decoded_data,</span>
<span style="color: #00A000">+                                                                                 uint32_t decoded_data_len,</span>
<span style="color: #00A000">+                                                                                 uint32_t decoded_rate, void *encoded_data, uint32_t *encoded_data_len, uint32_t *encoded_rate,</span>
<span style="color: #00A000">+                                                                                 unsigned int *flag)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        struct opus_context *context = codec->private_info;</span>
<span style="color: #00A000">+        int bytes = 0;</span>
<span style="color: #00A000">+        int len = (int) *encoded_data_len;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (!context) {</span>
<span style="color: #00A000">+                return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (len > 1275) len = 1275;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        bytes = opus_encode(context->encoder_object, (void *) decoded_data, decoded_data_len / 2, (unsigned char *) encoded_data, len);</span>
<span style="color: #00A000">+        </span>
<span style="color: #00A000">+        if (bytes > 0) {</span>
<span style="color: #00A000">+                *encoded_data_len = (uint32_t) bytes;</span>
<span style="color: #00A000">+                return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Encoder Error!\n");</span>
<span style="color: #00A000">+        return SWITCH_STATUS_GENERR;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+static switch_status_t switch_opus_decode(switch_codec_t *codec,</span>
<span style="color: #00A000">+                                                                                 switch_codec_t *other_codec,</span>
<span style="color: #00A000">+                                                                                 void *encoded_data,</span>
<span style="color: #00A000">+                                                                                 uint32_t encoded_data_len,</span>
<span style="color: #00A000">+                                                                                 uint32_t encoded_rate, void *decoded_data, uint32_t *decoded_data_len, uint32_t *decoded_rate,</span>
<span style="color: #00A000">+                                                                                 unsigned int *flag)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        struct opus_context *context = codec->private_info;</span>
<span style="color: #00A000">+        int samples = 0;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (!context) {</span>
<span style="color: #00A000">+                return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        </span>
<span style="color: #00A000">+        samples = opus_decode(context->decoder_object, encoded_data, encoded_data_len, decoded_data, *decoded_data_len);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (samples < 0) {</span>
<span style="color: #00A000">+                return SWITCH_STATUS_GENERR;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        *decoded_data_len = samples * 2;</span>
<span style="color: #00A000">+        </span>
<span style="color: #00A000">+        return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWITCH_MODULE_LOAD_FUNCTION(mod_opus_load)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_codec_interface_t *codec_interface;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        /* connect my internal structure to the blank pointer passed to me */</span>
<span style="color: #00A000">+        *module_interface = switch_loadable_module_create_module_interface(pool, modname);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        SWITCH_ADD_CODEC(codec_interface, "OPUS (BETA)");</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_core_codec_add_implementation(pool, codec_interface, SWITCH_CODEC_TYPE_AUDIO,        /* enumeration defining the type of the codec */</span>
<span style="color: #00A000">+                                                                                 115,        /* the IANA code number */</span>
<span style="color: #00A000">+                                                                                 "OPUS",        /* the IANA code name */</span>
<span style="color: #00A000">+                                                                                 NULL,        /* default fmtp to send (can be overridden by the init function) */</span>
<span style="color: #00A000">+                                                                                 48000,        /* samples transferred per second */</span>
<span style="color: #00A000">+                                                                                 48000,        /* actual samples transferred per second */</span>
<span style="color: #00A000">+                                                                                 32000,        /* bits transferred per second */</span>
<span style="color: #00A000">+                                                                                 10000,        /* number of microseconds per frame */</span>
<span style="color: #00A000">+                                                                                 80,        /* number of samples per frame */</span>
<span style="color: #00A000">+                                                                                 960,        /* number of bytes per frame decompressed */</span>
<span style="color: #00A000">+                                                                                 0,        /* number of bytes per frame compressed */</span>
<span style="color: #00A000">+                                                                                 1,        /* number of channels represented */</span>
<span style="color: #00A000">+                                                                                 1,        /* number of frames per network packet */</span>
<span style="color: #00A000">+                                                                                 switch_opus_init,        /* function to initialize a codec handle using this implementation */</span>
<span style="color: #00A000">+                                                                                 switch_opus_encode,        /* function to encode raw data into encoded data */</span>
<span style="color: #00A000">+                                                                                 switch_opus_decode,        /* function to decode encoded data into raw data */</span>
<span style="color: #00A000">+                                                                                 switch_opus_destroy);        /* deinitalize a codec handle using this implementation */</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_core_codec_add_implementation(pool, codec_interface, SWITCH_CODEC_TYPE_AUDIO,        /* enumeration defining the type of the codec */</span>
<span style="color: #00A000">+                                                                                 115,        /* the IANA code number */</span>
<span style="color: #00A000">+                                                                                 "OPUS",        /* the IANA code name */</span>
<span style="color: #00A000">+                                                                                 NULL,        /* default fmtp to send (can be overridden by the init function) */</span>
<span style="color: #00A000">+                                                                                 48000,        /* samples transferred per second */</span>
<span style="color: #00A000">+                                                                                 48000,        /* actual samples transferred per second */</span>
<span style="color: #00A000">+                                                                                 32000,        /* bits transferred per second */</span>
<span style="color: #00A000">+                                                                                 20000,        /* number of microseconds per frame */</span>
<span style="color: #00A000">+                                                                                 160,        /* number of samples per frame */</span>
<span style="color: #00A000">+                                                                                 1920,        /* number of bytes per frame decompressed */</span>
<span style="color: #00A000">+                                                                                 0,        /* number of bytes per frame compressed */</span>
<span style="color: #00A000">+                                                                                 1,        /* number of channels represented */</span>
<span style="color: #00A000">+                                                                                 1,        /* number of frames per network packet */</span>
<span style="color: #00A000">+                                                                                 switch_opus_init,        /* function to initialize a codec handle using this implementation */</span>
<span style="color: #00A000">+                                                                                 switch_opus_encode,        /* function to encode raw data into encoded data */</span>
<span style="color: #00A000">+                                                                                 switch_opus_decode,        /* function to decode encoded data into raw data */</span>
<span style="color: #00A000">+                                                                                 switch_opus_destroy);        /* deinitalize a codec handle using this implementation */</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        /* indicate that the module should continue to be loaded */</span>
<span style="color: #00A000">+        return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/* For Emacs:</span>
<span style="color: #00A000">+ * Local Variables:</span>
<span style="color: #00A000">+ * mode:c</span>
<span style="color: #00A000">+ * indent-tabs-mode:t</span>
<span style="color: #00A000">+ * tab-width:4</span>
<span style="color: #00A000">+ * c-basic-offset:4</span>
<span style="color: #00A000">+ * End:</span>
<span style="color: #00A000">+ * For VIM:</span>
<span style="color: #00A000">+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4:</span>
<span style="color: #00A000">+ */</span>
</pre></div>
========================================================================<pre>
Summary of changes:
build/modules.conf.in | 1 +
conf/autoload_configs/modules.conf.xml | 1 +
src/mod/codecs/mod_opus/Makefile | 28 +++++
src/mod/codecs/mod_opus/mod_opus.c | 209 ++++++++++++++++++++++++++++++++
4 files changed, 239 insertions(+), 0 deletions(-)
create mode 100644 src/mod/codecs/mod_opus/Makefile
create mode 100644 src/mod/codecs/mod_opus/mod_opus.c
</pre>
<p>this email was generated because of /git/your-repo.git/hooks/post-receive by the file /git-core/contrib/hooks/post-receive-email<br />
For more info, see <a href="http://blog.chomperstomp.com/?p=630">http://blog.chomperstomp.com/?p=630</a>
-- <br />
FreeSWITCH Source</p>