]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix bug 2 (core was hacking the buffer size value)
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 9 Feb 2006 17:01:32 +0000 (17:01 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 9 Feb 2006 17:01:32 +0000 (17:01 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@576 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/codecs/mod_gsm/mod_gsm.c
src/switch_core.c

index 8e5b81921305f2845e6e673725a26e866a96cf8f..4623405f6f613d46244b8f72a87a350d6d6ee3df 100644 (file)
-/* \r
- * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application\r
- * Copyright (C) 2005/2006, Anthony Minessale II <anthmct@yahoo.com>\r
- *\r
- * Version: MPL 1.1\r
- *\r
- * The contents of this file are subject to the Mozilla Public License Version\r
- * 1.1 (the "License"); you may not use this file except in compliance with\r
- * the License. You may obtain a copy of the License at\r
- * http://www.mozilla.org/MPL/\r
- *\r
- * Software distributed under the License is distributed on an "AS IS" basis,\r
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\r
- * for the specific language governing rights and limitations under the\r
- * License.\r
- *\r
- * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application\r
- *\r
- * The Initial Developer of the Original Code is\r
- * Anthony Minessale II <anthmct@yahoo.com>\r
- * Portions created by the Initial Developer are Copyright (C)\r
- * the Initial Developer. All Rights Reserved.\r
- *\r
- * Contributor(s):\r
- * \r
- * Anthony Minessale II <anthmct@yahoo.com>\r
- * Michael Jerris <mike@jerris.com>\r
- *\r
- * mod_codec_gsm.c -- gsm Codec Module\r
- *\r
- */  \r
-#include "switch.h"\r
-#include "gsm.h"\r
-\rstatic const char modname[] = "mod_codec_gsm";
-\r\rstruct gsm_context {
-       \rgsm encoder;
-       \rgsm decoder;
-\r};
-\r\rstatic switch_status switch_gsm_init(switch_codec *codec, switch_codec_flag flags,
-                                                                          const struct switch_codec_settings *codec_settings) \r
+/* 
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005/2006, Anthony Minessale II <anthmct@yahoo.com>
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II <anthmct@yahoo.com>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * 
+ * Anthony Minessale II <anthmct@yahoo.com>
+ * Michael Jerris <mike@jerris.com>
+ *
+ * mod_codec_gsm.c -- gsm Codec Module
+ *
+ */  
+#include "switch.h"
+#include "gsm.h"
+static const char modname[] = "mod_codec_gsm";
+struct gsm_context {
+       gsm encoder;
+       gsm decoder;
+};
+static switch_status switch_gsm_init(switch_codec *codec, switch_codec_flag flags,
+                                                                          const struct switch_codec_settings *codec_settings) 
 {
-       \rstruct gsm_context *context;
-       \rint encoding, decoding;
-       \r\rencoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
-       \rdecoding = (flags & SWITCH_CODEC_FLAG_DECODE);
-       \r\rif (!(encoding || decoding)) {
-               \rreturn SWITCH_STATUS_FALSE;
-       \r} else {
-               \rcontext = switch_core_alloc(codec->memory_pool, sizeof(*context));
-               \rif (encoding)
+       struct gsm_context *context;
+       int encoding, decoding;
+       encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
+       decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
+       if (!(encoding || decoding)) {
+               return SWITCH_STATUS_FALSE;
+       } else {
+               context = switch_core_alloc(codec->memory_pool, sizeof(*context));
+               if (encoding)
                        context->encoder = gsm_create();
-               \rif (decoding)
+               if (decoding)
                        context->decoder = gsm_create();
-       \r}
-       \r\rcodec->private = context;
-       \r\rreturn SWITCH_STATUS_SUCCESS;
-\r\r}
-\r\rstatic switch_status switch_gsm_destroy(switch_codec *codec) \r
+       }
+       codec->private = context;
+       return SWITCH_STATUS_SUCCESS;
+}
+static switch_status switch_gsm_destroy(switch_codec *codec) 
 {
-       \rstruct gsm_context *context = codec->private;
-       \rint encoding = (codec->flags & SWITCH_CODEC_FLAG_ENCODE);
-       \rint decoding = (codec->flags & SWITCH_CODEC_FLAG_DECODE);
-       \r\rif (encoding)
+       struct gsm_context *context = codec->private;
+       int encoding = (codec->flags & SWITCH_CODEC_FLAG_ENCODE);
+       int decoding = (codec->flags & SWITCH_CODEC_FLAG_DECODE);
+       if (encoding)
                gsm_destroy(context->encoder);
-       \rif (decoding)
+       if (decoding)
                gsm_destroy(context->decoder);
-       \r\rcodec->private = NULL;
-       \rreturn SWITCH_STATUS_SUCCESS;
-\r}
-\r\r\rstatic switch_status switch_gsm_encode(switch_codec *codec, \rswitch_codec *other_codec, \rvoid *decoded_data,
-                                                                                 \rsize_t decoded_data_len, \rint decoded_rate, \rvoid *encoded_data,
-                                                                                 \rsize_t *encoded_data_len, \rint *encoded_rate, \runsigned int *flag) \r
+       codec->private = NULL;
+       return SWITCH_STATUS_SUCCESS;
+}
+static switch_status switch_gsm_encode(switch_codec *codec, switch_codec *other_codec, void *decoded_data,
+                                                                                 size_t decoded_data_len, int decoded_rate, void *encoded_data,
+                                                                                 size_t *encoded_data_len, int *encoded_rate, unsigned int *flag) 
 {
-       \rstruct gsm_context *context = codec->private;
-       \rint cbret = 0;
-       \r\rif (!context) {
-               \rreturn SWITCH_STATUS_FALSE;
-       \r}
-       \rif (decoded_data_len % 320 == 0) {
-               \runsigned int new_len = 0;
-               \rgsm_signal * ddp = decoded_data;
-               \rgsm_byte * edp = encoded_data;
-               \rint x;
-               \rint loops = (int) decoded_data_len / 320;
-               \rfor (x = 0; x < loops && new_len < *encoded_data_len; x++) {
-                       \rgsm_encode(context->encoder, ddp, edp);
-                       \redp += 33;
-                       \rddp += 160;
-                       \rnew_len += 33;
-               \r}
-               \rif (new_len <= *encoded_data_len) {
-                       \r*encoded_data_len = new_len;
-               \r} else {
-                       \rswitch_console_printf(SWITCH_CHANNEL_CONSOLE, "buffer overflow!!! %u >= %u\n", new_len, *encoded_data_len);
-                       \rreturn SWITCH_STATUS_FALSE;
-               \r}
-       \r}
-       \r\rreturn SWITCH_STATUS_SUCCESS;
-\r}
-\r\r\rstatic switch_status switch_gsm_decode(switch_codec *codec, \rswitch_codec *other_codec, \rvoid *encoded_data,
-                                                                                 \rsize_t encoded_data_len, \rint encoded_rate, \rvoid *decoded_data,
-                                                                                 \rsize_t *decoded_data_len, \rint *decoded_rate, \runsigned int *flag) \r
+       struct gsm_context *context = codec->private;
+       int cbret = 0;
+       if (!context) {
+               return SWITCH_STATUS_FALSE;
+       }
+       if (decoded_data_len % 320 == 0) {
+               unsigned int new_len = 0;
+               gsm_signal * ddp = decoded_data;
+               gsm_byte * edp = encoded_data;
+               int x;
+               int loops = (int) decoded_data_len / 320;
+               for (x = 0; x < loops && new_len < *encoded_data_len; x++) {
+                       gsm_encode(context->encoder, ddp, edp);
+                       edp += 33;
+                       ddp += 160;
+                       new_len += 33;
+               }
+               if (new_len <= *encoded_data_len) {
+                       *encoded_data_len = new_len;
+               } else {
+                       switch_console_printf(SWITCH_CHANNEL_CONSOLE, "buffer overflow!!! %u >= %u\n", new_len, *encoded_data_len);
+                       return SWITCH_STATUS_FALSE;
+               }
+       }
+       return SWITCH_STATUS_SUCCESS;
+}
+static switch_status switch_gsm_decode(switch_codec *codec, switch_codec *other_codec, void *encoded_data,
+                                                                                 size_t encoded_data_len, int encoded_rate, void *decoded_data,
+                                                                                 size_t *decoded_data_len, int *decoded_rate, unsigned int *flag) 
 {
-       \rstruct gsm_context *context = codec->private;
-       \r\rif (!context) {
-               \rreturn SWITCH_STATUS_FALSE;
-       \r}
-       \r\r\rif (encoded_data_len % 33 == 0) {
-               \rint loops = (int) encoded_data_len / 33;
-               \rgsm_byte * edp = encoded_data;
-               \rgsm_signal * ddp = decoded_data;
-               \rint x;
-               \runsigned int new_len = 0;
-               \rfor (x = 0; x < loops && new_len < *decoded_data_len; x++) {
-                       \rgsm_decode(context->decoder, edp, ddp);
-                       \rddp += 160;
-                       \redp += 33;
-                       \rnew_len += 320;
-               \r}
-               \rif (new_len <= *decoded_data_len) {
-                       \r*decoded_data_len = new_len;
-               \r} else {
-                       \rswitch_console_printf(SWITCH_CHANNEL_CONSOLE, "buffer overflow!!!\n");
-                       \rreturn SWITCH_STATUS_FALSE;
-               \r}
-       \r} else {
-               \rswitch_console_printf(SWITCH_CHANNEL_CONSOLE, "yo this frame is an odd size [%d]\n", encoded_data_len);
-       \r}
-       \r\rreturn SWITCH_STATUS_SUCCESS;
-\r}
+       struct gsm_context *context = codec->private;
+       if (!context) {
+               return SWITCH_STATUS_FALSE;
+       }
+
+       if (encoded_data_len % 33 == 0) {
+               int loops = (int) encoded_data_len / 33;
+               gsm_byte * edp = encoded_data;
+               gsm_signal * ddp = decoded_data;
+               int x;
+               unsigned int new_len = 0;
+
+               for (x = 0; x < loops && new_len < *decoded_data_len; x++) {
+                       gsm_decode(context->decoder, edp, ddp);
+                       ddp += 160;
+                       edp += 33;
+                       new_len += 320;
+               }
+               if (new_len <= *decoded_data_len) {
+                       *decoded_data_len = new_len;
+               } else {
+                       switch_console_printf(SWITCH_CHANNEL_CONSOLE, "buffer overflow!!! %d %d\n", new_len, *decoded_data_len);
+                       return SWITCH_STATUS_FALSE;
+               }
+       } else {
+               switch_console_printf(SWITCH_CHANNEL_CONSOLE, "yo this frame is an odd size [%d]\n", encoded_data_len);
+       }
+       return SWITCH_STATUS_SUCCESS;
+}
 
-\r\r
-/* Registration */ \r
-\rstatic const switch_codec_implementation gsm_8k_implementation = { \r
-               /*.samples_per_second */ 8000, \r
-               /*.bits_per_second */ 13200, \r
-               /*.microseconds_per_frame */ 20000, \r
-               /*.samples_per_frame */ 160, \r
-               /*.bytes_per_frame */ 320, \r
-               /*.encoded_bytes_per_frame */ 33, \r
-               /*.number_of_channels */ 1, \r
-               /*.pref_frames_per_packet */ 1, \r
-               /*.max_frames_per_packet */ 1, \r
-               /*.init */ switch_gsm_init, \r
-               /*.encode */ switch_gsm_encode, \r
-               /*.decode */ switch_gsm_decode, \r
-               /*.destroy */ switch_gsm_destroy, \r
+
+/* Registration */ 
+static const switch_codec_implementation gsm_8k_implementation = { 
+               /*.samples_per_second */ 8000, 
+               /*.bits_per_second */ 13200, 
+               /*.microseconds_per_frame */ 20000, 
+               /*.samples_per_frame */ 160, 
+               /*.bytes_per_frame */ 320, 
+               /*.encoded_bytes_per_frame */ 33, 
+               /*.number_of_channels */ 1, 
+               /*.pref_frames_per_packet */ 1, 
+               /*.max_frames_per_packet */ 1, 
+               /*.init */ switch_gsm_init, 
+               /*.encode */ switch_gsm_encode, 
+               /*.decode */ switch_gsm_decode, 
+               /*.destroy */ switch_gsm_destroy, 
 };
-\r\rstatic const switch_codec_interface gsm_codec_interface = { \r
-               /*.interface_name */ "gsm", \r
-               /*.codec_type */ SWITCH_CODEC_TYPE_AUDIO, \r
-               /*.ianacode */ 3, \r
-               /*.iananame */ "gsm", \r
-               /*.implementations */ &gsm_8k_implementation, \r
+static const switch_codec_interface gsm_codec_interface = { 
+               /*.interface_name */ "gsm", 
+               /*.codec_type */ SWITCH_CODEC_TYPE_AUDIO, 
+               /*.ianacode */ 3, 
+               /*.iananame */ "gsm", 
+               /*.implementations */ &gsm_8k_implementation, 
 };
-\r\rstatic switch_loadable_module_interface gsm_module_interface = { \r
-               /*.module_name */ modname, \r
-               /*.endpoint_interface */ NULL, \r
-               /*.timer_interface */ NULL, \r
-               /*.dialplan_interface */ NULL, \r
-               /*.codec_interface */ &gsm_codec_interface, \r
-               /*.application_interface */ NULL \r
+static switch_loadable_module_interface gsm_module_interface = { 
+               /*.module_name */ modname, 
+               /*.endpoint_interface */ NULL, 
+               /*.timer_interface */ NULL, 
+               /*.dialplan_interface */ NULL, 
+               /*.codec_interface */ &gsm_codec_interface, 
+               /*.application_interface */ NULL 
 };
-\r\r\rSWITCH_MOD_DECLARE(switch_status) switch_module_load(const switch_loadable_module_interface **interface,
+SWITCH_MOD_DECLARE(switch_status) switch_module_load(const switch_loadable_module_interface **interface,
                                                                                                                char *filename)
 {
-       \r
-               /* connect my internal structure to the blank pointer passed to me */ \r
+       
+               /* connect my internal structure to the blank pointer passed to me */ 
                *interface = &gsm_module_interface;
-       \r\r
-               /* indicate that the module should continue to be loaded */ \r
+       
+               /* indicate that the module should continue to be loaded */ 
                return SWITCH_STATUS_SUCCESS;
-\r}
+}
+
 
-\r\r\r\r\r\r
index d67ba3689e8538da2ba1bfbbf939eba12c523196..ab712075a6df76457bd2933724700dbe70c963cf 100644 (file)
@@ -330,7 +330,7 @@ SWITCH_DECLARE(switch_status) switch_core_codec_encode(switch_codec *codec,
                return SWITCH_STATUS_GENERR;
        }
 
-       *encoded_data_len = decoded_data_len;
+
        return codec->implementation->encode(codec,
                                                                                 other_codec,
                                                                                 decoded_data,
@@ -352,6 +352,8 @@ SWITCH_DECLARE(switch_status) switch_core_codec_decode(switch_codec *codec,
        assert(encoded_data != NULL);
        assert(decoded_data != NULL);
 
+
+
        if (!codec->implementation) {
                switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Codec is not initilized!\n");
                return SWITCH_STATUS_GENERR;
@@ -362,7 +364,7 @@ SWITCH_DECLARE(switch_status) switch_core_codec_decode(switch_codec *codec,
                return SWITCH_STATUS_GENERR;
        }
 
-       *decoded_data_len = encoded_data_len;
+
        return codec->implementation->decode(codec,
                                                                                 other_codec,
                                                                                 encoded_data,
@@ -1090,6 +1092,7 @@ SWITCH_DECLARE(switch_status) switch_core_session_write_frame(switch_core_sessio
        if (need_codec) {
                if (frame->codec) {
                        session->raw_write_frame.datalen = session->raw_write_frame.buflen;
+
                        status = switch_core_codec_decode(frame->codec,
                                                                                          session->write_codec,
                                                                                          frame->data,