<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[Freeswitch-trunk][15036] </title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<div id="header">FreeSWITCH Subversion</div>
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://fisheye.freeswitch.org/changelog/FreeSWITCH?cs=15036">15036</a></dd>
<dt>Author</dt> <dd>mikej</dd>
<dt>Date</dt> <dd>2009-10-01 17:22:33 -0500 (Thu, 01 Oct 2009)</dd>
</dl>
<h3>Log Message</h3>
<pre>move mod_voipcodecs to use spandsp instead of libvoipcodecs (windows build to follow)</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#freeswitchtrunksrcmodcodecsmod_voipcodecsMakefile">freeswitch/trunk/src/mod/codecs/mod_voipcodecs/Makefile</a></li>
<li><a href="#freeswitchtrunksrcmodcodecsmod_voipcodecsmod_voipcodecsc">freeswitch/trunk/src/mod/codecs/mod_voipcodecs/mod_voipcodecs.c</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="freeswitchtrunksrcmodcodecsmod_voipcodecsMakefile"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/codecs/mod_voipcodecs/Makefile (15035 => 15036)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/codecs/mod_voipcodecs/Makefile        2009-10-01 22:20:17 UTC (rev 15035)
+++ freeswitch/trunk/src/mod/codecs/mod_voipcodecs/Makefile        2009-10-01 22:22:33 UTC (rev 15036)
</span><span class="lines">@@ -1,13 +1,28 @@
</span><span class="cx"> BASE=../../../..
</span><span class="cx">
</span><del>-VOIPCODECS_DIR=$(BASE)/libs/voipcodecs
-VOIPCODECS_LA=$(VOIPCODECS_DIR)/src/libvoipcodecs.la
</del><ins>+TIFF_DIR=$(BASE)/libs/tiff-3.8.2
+TIFF_LA=$(TIFF_DIR)/libtiff/libtiff.la
</ins><span class="cx">
</span><del>-LOCAL_CFLAGS=-I$(VOIPCODECS_DIR)/src
-LOCAL_LIBADD=$(VOIPCODECS_LA)
</del><ins>+SPANDSP_DIR=$(BASE)/libs/spandsp
+SPANDSP_LA=$(SPANDSP_DIR)/src/libspandsp.la
</ins><span class="cx">
</span><ins>+LOCAL_CFLAGS=-I$(SPANDSP_DIR)/src -I$(TIFF_DIR)/libtiff
+LOCAL_LIBADD=$(SPANDSP_LA)
+
</ins><span class="cx"> include $(BASE)/build/modmake.rules
</span><span class="cx">
</span><del>-$(VOIPCODECS_LA): $(VOIPCODECS_DIR) $(VOIPCODECS_DIR)/.update
-        cd $(VOIPCODECS_DIR) && $(MAKE)
</del><ins>+$(SPANDSP_LA): $(TIFF_LA) $(SPANDSP_DIR) $(SPANDSP_DIR)/.update
+        cd $(SPANDSP_DIR) && $(MAKE)
</ins><span class="cx">         $(TOUCH_TARGET)
</span><ins>+
+$(TIFF_LA): $(TIFF_DIR) $(TIFF_DIR)/.update
+        cd $(TIFF_DIR) && $(MAKE)
+        $(TOUCH_TARGET)
+
+
+depend_install: $(DESTDIR)$(libdir)/libspandsp.la
+
+$(DESTDIR)$(libdir)/libspandsp.la: $(SPANDSP_LA)
+        cd $(SPANDSP_DIR) && $(MAKE) install
+
+
</ins></span></pre></div>
<a id="freeswitchtrunksrcmodcodecsmod_voipcodecsmod_voipcodecsc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/codecs/mod_voipcodecs/mod_voipcodecs.c (15035 => 15036)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/codecs/mod_voipcodecs/mod_voipcodecs.c        2009-10-01 22:20:17 UTC (rev 15035)
+++ freeswitch/trunk/src/mod/codecs/mod_voipcodecs/mod_voipcodecs.c        2009-10-01 22:22:33 UTC (rev 15036)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx"> */
</span><span class="cx">
</span><span class="cx"> #include <switch.h>
</span><del>-#include "voipcodecs.h"
</del><ins>+#include "spandsp.h"
</ins><span class="cx">
</span><span class="cx"> SWITCH_MODULE_LOAD_FUNCTION(mod_voipcodecs_load);
</span><span class="cx"> SWITCH_MODULE_DEFINITION(mod_voipcodecs, mod_voipcodecs_load, NULL, NULL);
</span><span class="lines">@@ -41,8 +41,8 @@
</span><span class="cx"> /* LPC10 - START */
</span><span class="cx">
</span><span class="cx"> struct lpc10_context {
</span><del>-        lpc10_encode_state_t encoder_object;
-        lpc10_decode_state_t decoder_object;
</del><ins>+        lpc10_encode_state_t *encoder_object;
+        lpc10_decode_state_t *decoder_object;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> static switch_status_t switch_lpc10_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
</span><span class="lines">@@ -58,11 +58,11 @@
</span><span class="cx">         } else {
</span><span class="cx">
</span><span class="cx">                 if (encoding) {
</span><del>-                        lpc10_encode_init(&context->encoder_object, TRUE);
</del><ins>+                        context->encoder_object = lpc10_encode_init(context->encoder_object, TRUE);
</ins><span class="cx">                 }
</span><span class="cx">
</span><span class="cx">                 if (decoding) {
</span><del>-                        lpc10_decode_init(&context->decoder_object, TRUE);
</del><ins>+                        context->decoder_object = lpc10_decode_init(context->decoder_object, TRUE);
</ins><span class="cx">                 }
</span><span class="cx">
</span><span class="cx">                 codec->private_info = context;
</span><span class="lines">@@ -73,7 +73,18 @@
</span><span class="cx">
</span><span class="cx"> static switch_status_t switch_lpc10_destroy(switch_codec_t *codec)
</span><span class="cx"> {
</span><ins>+        struct lpc10_context *context = codec->private_info;
</ins><span class="cx">         codec->private_info = NULL;
</span><ins>+
+        if (!context) {
+                return SWITCH_STATUS_FALSE;
+        }
+
+        if (context->encoder_object) lpc10_encode_free(context->encoder_object);
+        context->encoder_object = NULL;
+        if (context->decoder_object) lpc10_decode_free(context->decoder_object);
+        context->decoder_object = NULL;
+
</ins><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -90,7 +101,7 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        *encoded_data_len = lpc10_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
</del><ins>+        *encoded_data_len = lpc10_encode(context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
</ins><span class="cx">
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="lines">@@ -108,7 +119,7 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        *decoded_data_len = (2 * lpc10_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
</del><ins>+        *decoded_data_len = (2 * lpc10_decode(context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
</ins><span class="cx">
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="lines">@@ -118,8 +129,8 @@
</span><span class="cx">
</span><span class="cx"> /* GSM - START */
</span><span class="cx"> struct gsm_context {
</span><del>-        gsm0610_state_t decoder_object;
-        gsm0610_state_t encoder_object;
</del><ins>+        gsm0610_state_t *decoder_object;
+        gsm0610_state_t *encoder_object;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> static switch_status_t switch_gsm_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
</span><span class="lines">@@ -134,10 +145,10 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         } else {
</span><span class="cx">                 if (encoding) {
</span><del>-                        gsm0610_init(&context->encoder_object, GSM0610_PACKING_VOIP);
</del><ins>+                        context->encoder_object = gsm0610_init(context->encoder_object, GSM0610_PACKING_VOIP);
</ins><span class="cx">                 }
</span><span class="cx">                 if (decoding) {
</span><del>-                        gsm0610_init(&context->decoder_object, GSM0610_PACKING_VOIP);
</del><ins>+                        context->decoder_object = gsm0610_init(context->decoder_object, GSM0610_PACKING_VOIP);
</ins><span class="cx">                 }
</span><span class="cx">
</span><span class="cx">                 codec->private_info = context;
</span><span class="lines">@@ -157,7 +168,7 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        *encoded_data_len = gsm0610_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
</del><ins>+        *encoded_data_len = gsm0610_encode(context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
</ins><span class="cx">
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="lines">@@ -174,15 +185,26 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        *decoded_data_len = (2 * gsm0610_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
</del><ins>+        *decoded_data_len = (2 * gsm0610_decode(context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
</ins><span class="cx">
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static switch_status_t switch_gsm_destroy(switch_codec_t *codec)
</span><span class="cx"> {
</span><del>-        /* We do not need to use release here as the pool memory is taken care of for us */
</del><ins>+        struct gsm_context *context = codec->private_info;
+
</ins><span class="cx">         codec->private_info = NULL;
</span><ins>+
+        if (!context) {
+                return SWITCH_STATUS_FALSE;
+        }
+
+        if (context->decoder_object) gsm0610_free(context->decoder_object);
+        context->decoder_object = NULL;
+        if (context->encoder_object) gsm0610_free(context->encoder_object);
+        context->encoder_object = NULL;
+
</ins><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -338,8 +360,8 @@
</span><span class="cx"> /* G722 - START */
</span><span class="cx">
</span><span class="cx"> struct g722_context {
</span><del>-        g722_decode_state_t decoder_object;
-        g722_encode_state_t encoder_object;
</del><ins>+        g722_decode_state_t *decoder_object;
+        g722_encode_state_t *encoder_object;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> static switch_status_t switch_g722_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
</span><span class="lines">@@ -354,10 +376,10 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         } else {
</span><span class="cx">                 if (encoding) {
</span><del>-                        g722_encode_init(&context->encoder_object, 64000, G722_PACKED);
</del><ins>+                        context->encoder_object = g722_encode_init(context->encoder_object, 64000, G722_PACKED);
</ins><span class="cx">                 }
</span><span class="cx">                 if (decoding) {
</span><del>-                        g722_decode_init(&context->decoder_object, 64000, G722_PACKED);
</del><ins>+                        context->decoder_object = g722_decode_init(context->decoder_object, 64000, G722_PACKED);
</ins><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span><span class="lines">@@ -378,7 +400,7 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        *encoded_data_len = g722_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
</del><ins>+        *encoded_data_len = g722_encode(context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
</ins><span class="cx">
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="lines">@@ -396,15 +418,26 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        *decoded_data_len = (2 * g722_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
</del><ins>+        *decoded_data_len = (2 * g722_decode(context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
</ins><span class="cx">
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static switch_status_t switch_g722_destroy(switch_codec_t *codec)
</span><span class="cx"> {
</span><del>-        /* We do not need to use release here as the pool memory is taken care of for us */
</del><ins>+        struct g722_context *context = codec->private_info;
+
</ins><span class="cx">         codec->private_info = NULL;
</span><ins>+
+        if (!context) {
+                return SWITCH_STATUS_FALSE;
+        }
+
+        if (context->decoder_object) g722_decode_free(context->decoder_object);
+        context->decoder_object = NULL;
+        if (context->encoder_object) g722_encode_free(context->encoder_object);
+        context->encoder_object = NULL;
+
</ins><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -416,27 +449,36 @@
</span><span class="cx"> {
</span><span class="cx">         uint32_t encoding, decoding;
</span><span class="cx">         int packing = G726_PACKING_RIGHT;
</span><del>-        g726_state_t *context;
</del><ins>+        g726_state_t *context = NULL;
</ins><span class="cx">
</span><span class="cx">         encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
</span><span class="cx">         decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
</span><span class="cx">
</span><del>-        if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(*context))))) {
</del><ins>+        if (!(encoding || decoding)) {
</ins><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><del>-        } else {
-                if ((flags & SWITCH_CODEC_FLAG_AAL2 || strstr(codec->implementation->iananame, "AAL2"))) {
-                        packing = G726_PACKING_LEFT;
-                }
</del><ins>+        }
</ins><span class="cx">
</span><del>-                g726_init(context, codec->implementation->bits_per_second, G726_ENCODING_LINEAR, packing);
</del><ins>+        if ((flags & SWITCH_CODEC_FLAG_AAL2 || strstr(codec->implementation->iananame, "AAL2"))) {
+                packing = G726_PACKING_LEFT;
+        }
+        
+        context = g726_init(context, codec->implementation->bits_per_second, G726_ENCODING_LINEAR, packing);
+        
+        codec->private_info = context;
+        return SWITCH_STATUS_SUCCESS;
</ins><span class="cx">
</span><del>-                codec->private_info = context;
-                return SWITCH_STATUS_SUCCESS;
-        }
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static switch_status_t switch_g726_destroy(switch_codec_t *codec)
</span><span class="cx"> {
</span><ins>+        g726_state_t *context = codec->private_info;
+
+        if (!context) {
+                return SWITCH_STATUS_FALSE;
+        }
+
+        g726_free(context);
+
</ins><span class="cx">         codec->private_info = NULL;
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="lines">@@ -482,8 +524,8 @@
</span><span class="cx"> /* IMA_ADPCM - START */
</span><span class="cx">
</span><span class="cx"> struct ima_adpcm_context {
</span><del>-        ima_adpcm_state_t decoder_object;
-        ima_adpcm_state_t encoder_object;
</del><ins>+        ima_adpcm_state_t *decoder_object;
+        ima_adpcm_state_t *encoder_object;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> static switch_status_t switch_adpcm_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
</span><span class="lines">@@ -498,10 +540,10 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         } else {
</span><span class="cx">                 if (encoding) {
</span><del>-                        ima_adpcm_init(&context->encoder_object, IMA_ADPCM_DVI4, 0);
</del><ins>+                        context->encoder_object = ima_adpcm_init(context->encoder_object, IMA_ADPCM_DVI4, 0);
</ins><span class="cx">                 }
</span><span class="cx">                 if (decoding) {
</span><del>-                        ima_adpcm_init(&context->decoder_object, IMA_ADPCM_DVI4, 0);
</del><ins>+                        context->decoder_object = ima_adpcm_init(context->decoder_object, IMA_ADPCM_DVI4, 0);
</ins><span class="cx">                 }
</span><span class="cx">
</span><span class="cx">                 codec->private_info = context;
</span><span class="lines">@@ -522,7 +564,7 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        *encoded_data_len = ima_adpcm_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
</del><ins>+        *encoded_data_len = ima_adpcm_encode(context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
</ins><span class="cx">
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="lines">@@ -540,15 +582,26 @@
</span><span class="cx">                 return SWITCH_STATUS_FALSE;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        *decoded_data_len = (2 * ima_adpcm_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
</del><ins>+        *decoded_data_len = (2 * ima_adpcm_decode(context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
</ins><span class="cx">
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static switch_status_t switch_adpcm_destroy(switch_codec_t *codec)
</span><span class="cx"> {
</span><del>-        /* We do not need to use release here as the pool memory is taken care of for us */
</del><ins>+        struct ima_adpcm_context *context = codec->private_info;
+
</ins><span class="cx">         codec->private_info = NULL;
</span><ins>+
+        if (!context) {
+                return SWITCH_STATUS_FALSE;
+        }
+
+        if (context->decoder_object) ima_adpcm_free(context->decoder_object);
+        context->decoder_object = NULL;
+        if (context->encoder_object) ima_adpcm_free(context->encoder_object);
+        context->encoder_object = NULL;
+
</ins><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre>
</div>
</div>
<div id="footer">See you at ClueCon</div>
</body>
</html>