From ef6d92ae7db1b75606cb37a78e7b299a05bb717e Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 9 Feb 2006 17:01:32 +0000 Subject: [PATCH] fix bug 2 (core was hacking the buffer size value) git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@576 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/codecs/mod_gsm/mod_gsm.c | 318 ++++++++++++++++--------------- src/switch_core.c | 7 +- 2 files changed, 165 insertions(+), 160 deletions(-) diff --git a/src/mod/codecs/mod_gsm/mod_gsm.c b/src/mod/codecs/mod_gsm/mod_gsm.c index 8e5b819213..4623405f6f 100644 --- a/src/mod/codecs/mod_gsm/mod_gsm.c +++ b/src/mod/codecs/mod_gsm/mod_gsm.c @@ -1,175 +1,177 @@ -/* - * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005/2006, Anthony Minessale II - * - * 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 - * Portions created by the Initial Developer are Copyright (C) - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Anthony Minessale II - * Michael Jerris - * - * 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) +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005/2006, Anthony Minessale II + * + * 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 + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Anthony Minessale II + * Michael Jerris + * + * 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) { - 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) + 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(); - if (decoding) + if (decoding) context->decoder = gsm_create(); - } - codec->private = context; - return SWITCH_STATUS_SUCCESS; - } - static switch_status switch_gsm_destroy(switch_codec *codec) + } + codec->private = context; + return SWITCH_STATUS_SUCCESS; +} +static switch_status switch_gsm_destroy(switch_codec *codec) { - struct gsm_context *context = codec->private; - int encoding = (codec->flags & SWITCH_CODEC_FLAG_ENCODE); - int decoding = (codec->flags & SWITCH_CODEC_FLAG_DECODE); - if (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); - if (decoding) + if (decoding) gsm_destroy(context->decoder); - 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) + 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) { - 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) + 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) { - 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!!!\n"); - 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; - } + struct gsm_context *context = codec->private; + if (!context) { + return SWITCH_STATUS_FALSE; + } - -/* 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, + 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; +} + + +/* 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, }; - 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, +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, }; - 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 +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 }; - SWITCH_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) { - - /* connect my internal structure to the blank pointer passed to me */ + + /* connect my internal structure to the blank pointer passed to me */ *interface = &gsm_module_interface; - - /* indicate that the module should continue to be loaded */ + + /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_SUCCESS; - } +} + - diff --git a/src/switch_core.c b/src/switch_core.c index d67ba3689e..ab712075a6 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -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,