]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
move mod_voipcodecs to use spandsp instead of libvoipcodecs (windows build to follow)
authorMichael Jerris <mike@jerris.com>
Thu, 1 Oct 2009 22:22:33 +0000 (22:22 +0000)
committerMichael Jerris <mike@jerris.com>
Thu, 1 Oct 2009 22:22:33 +0000 (22:22 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15036 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/codecs/mod_voipcodecs/Makefile
src/mod/codecs/mod_voipcodecs/mod_voipcodecs.c

index 8f2bd2ad8a06d32c85e845e6f7957b421da1b41d..3ee8e67a36e5f41eb7cda2b4cac2ccaabd7cbe8a 100644 (file)
@@ -1,13 +1,28 @@
 BASE=../../../..
 
-VOIPCODECS_DIR=$(BASE)/libs/voipcodecs
-VOIPCODECS_LA=$(VOIPCODECS_DIR)/src/libvoipcodecs.la
+TIFF_DIR=$(BASE)/libs/tiff-3.8.2
+TIFF_LA=$(TIFF_DIR)/libtiff/libtiff.la
 
-LOCAL_CFLAGS=-I$(VOIPCODECS_DIR)/src
-LOCAL_LIBADD=$(VOIPCODECS_LA)
+SPANDSP_DIR=$(BASE)/libs/spandsp
+SPANDSP_LA=$(SPANDSP_DIR)/src/libspandsp.la
+
+LOCAL_CFLAGS=-I$(SPANDSP_DIR)/src -I$(TIFF_DIR)/libtiff
+LOCAL_LIBADD=$(SPANDSP_LA)
 
 include $(BASE)/build/modmake.rules
 
-$(VOIPCODECS_LA): $(VOIPCODECS_DIR) $(VOIPCODECS_DIR)/.update
-       cd $(VOIPCODECS_DIR) && $(MAKE)
+$(SPANDSP_LA): $(TIFF_LA) $(SPANDSP_DIR) $(SPANDSP_DIR)/.update
+       cd $(SPANDSP_DIR) && $(MAKE)
+       $(TOUCH_TARGET)
+
+$(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
+
+
index ccbbd2b828a0f29ac5dc0b9054b60236575eb218..73dab1129c4c105e46591610a6230668a2422b77 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #include <switch.h>
-#include "voipcodecs.h"
+#include "spandsp.h"
 
 SWITCH_MODULE_LOAD_FUNCTION(mod_voipcodecs_load);
 SWITCH_MODULE_DEFINITION(mod_voipcodecs, mod_voipcodecs_load, NULL, NULL);
@@ -41,8 +41,8 @@ SWITCH_MODULE_DEFINITION(mod_voipcodecs, mod_voipcodecs_load, NULL, NULL);
 /*  LPC10     - START */
 
 struct lpc10_context {
-       lpc10_encode_state_t encoder_object;
-       lpc10_decode_state_t decoder_object;
+       lpc10_encode_state_t *encoder_object;
+       lpc10_decode_state_t *decoder_object;
 };
 
 static switch_status_t switch_lpc10_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
@@ -58,11 +58,11 @@ static switch_status_t switch_lpc10_init(switch_codec_t *codec, switch_codec_fla
        } else {
 
                if (encoding) {
-                       lpc10_encode_init(&context->encoder_object, TRUE);
+                       context->encoder_object = lpc10_encode_init(context->encoder_object, TRUE);
                }
 
                if (decoding) {
-                       lpc10_decode_init(&context->decoder_object, TRUE);
+                       context->decoder_object = lpc10_decode_init(context->decoder_object, TRUE);
                }
 
                codec->private_info = context;
@@ -73,7 +73,18 @@ static switch_status_t switch_lpc10_init(switch_codec_t *codec, switch_codec_fla
 
 static switch_status_t switch_lpc10_destroy(switch_codec_t *codec)
 {
+       struct lpc10_context *context = codec->private_info;
        codec->private_info = NULL;
+
+       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;
+
        return SWITCH_STATUS_SUCCESS;
 }
 
@@ -90,7 +101,7 @@ static switch_status_t switch_lpc10_encode(switch_codec_t *codec,
                return SWITCH_STATUS_FALSE;
        }
 
-       *encoded_data_len = lpc10_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
+       *encoded_data_len = lpc10_encode(context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
 
        return SWITCH_STATUS_SUCCESS;
 }
@@ -108,7 +119,7 @@ static switch_status_t switch_lpc10_decode(switch_codec_t *codec,
                return SWITCH_STATUS_FALSE;
        }
 
-       *decoded_data_len = (2 * lpc10_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
+       *decoded_data_len = (2 * lpc10_decode(context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
 
        return SWITCH_STATUS_SUCCESS;
 }
@@ -118,8 +129,8 @@ static switch_status_t switch_lpc10_decode(switch_codec_t *codec,
 
 /*  GSM       - START */
 struct gsm_context {
-       gsm0610_state_t decoder_object;
-       gsm0610_state_t encoder_object;
+       gsm0610_state_t *decoder_object;
+       gsm0610_state_t *encoder_object;
 };
 
 static switch_status_t switch_gsm_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
@@ -134,10 +145,10 @@ static switch_status_t switch_gsm_init(switch_codec_t *codec, switch_codec_flag_
                return SWITCH_STATUS_FALSE;
        } else {
                if (encoding) {
-                       gsm0610_init(&context->encoder_object, GSM0610_PACKING_VOIP);
+                       context->encoder_object = gsm0610_init(context->encoder_object, GSM0610_PACKING_VOIP);
                }
                if (decoding) {
-                       gsm0610_init(&context->decoder_object, GSM0610_PACKING_VOIP);
+                       context->decoder_object = gsm0610_init(context->decoder_object, GSM0610_PACKING_VOIP);
                }
 
                codec->private_info = context;
@@ -157,7 +168,7 @@ static switch_status_t switch_gsm_encode(switch_codec_t *codec,
                return SWITCH_STATUS_FALSE;
        }
 
-       *encoded_data_len = gsm0610_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
+       *encoded_data_len = gsm0610_encode(context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
 
        return SWITCH_STATUS_SUCCESS;
 }
@@ -174,15 +185,26 @@ static switch_status_t switch_gsm_decode(switch_codec_t *codec,
                return SWITCH_STATUS_FALSE;
        }
 
-       *decoded_data_len = (2 * gsm0610_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
+       *decoded_data_len = (2 * gsm0610_decode(context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
 
        return SWITCH_STATUS_SUCCESS;
 }
 
 static switch_status_t switch_gsm_destroy(switch_codec_t *codec)
 {
-       /* We do not need to use release here as the pool memory is taken care of for us */
+       struct gsm_context *context = codec->private_info;
+
        codec->private_info = NULL;
+
+       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;
+
        return SWITCH_STATUS_SUCCESS;
 }
 
@@ -338,8 +360,8 @@ static switch_status_t switch_g711a_destroy(switch_codec_t *codec)
 /*  G722      - START */
 
 struct g722_context {
-       g722_decode_state_t decoder_object;
-       g722_encode_state_t encoder_object;
+       g722_decode_state_t *decoder_object;
+       g722_encode_state_t *encoder_object;
 };
 
 static switch_status_t switch_g722_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
@@ -354,10 +376,10 @@ static switch_status_t switch_g722_init(switch_codec_t *codec, switch_codec_flag
                return SWITCH_STATUS_FALSE;
        } else {
                if (encoding) {
-                       g722_encode_init(&context->encoder_object, 64000, G722_PACKED);
+                       context->encoder_object = g722_encode_init(context->encoder_object, 64000, G722_PACKED);
                }
                if (decoding) {
-                       g722_decode_init(&context->decoder_object, 64000, G722_PACKED);
+                       context->decoder_object = g722_decode_init(context->decoder_object, 64000, G722_PACKED);
                }
        }
 
@@ -378,7 +400,7 @@ static switch_status_t switch_g722_encode(switch_codec_t *codec,
                return SWITCH_STATUS_FALSE;
        }
 
-       *encoded_data_len = g722_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
+       *encoded_data_len = g722_encode(context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
 
        return SWITCH_STATUS_SUCCESS;
 }
@@ -396,15 +418,26 @@ static switch_status_t switch_g722_decode(switch_codec_t *codec,
                return SWITCH_STATUS_FALSE;
        }
 
-       *decoded_data_len = (2 * g722_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
+       *decoded_data_len = (2 * g722_decode(context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
 
        return SWITCH_STATUS_SUCCESS;
 }
 
 static switch_status_t switch_g722_destroy(switch_codec_t *codec)
 {
-       /* We do not need to use release here as the pool memory is taken care of for us */
+       struct g722_context *context = codec->private_info;
+
        codec->private_info = NULL;
+
+       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;
+
        return SWITCH_STATUS_SUCCESS;
 }
 
@@ -416,27 +449,36 @@ static switch_status_t switch_g726_init(switch_codec_t *codec, switch_codec_flag
 {
        uint32_t encoding, decoding;
        int packing = G726_PACKING_RIGHT;
-       g726_state_t *context;
+       g726_state_t *context = NULL;
 
        encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
        decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
 
-       if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(*context))))) {
+       if (!(encoding || decoding)) {
                return SWITCH_STATUS_FALSE;
-       } else {
-               if ((flags & SWITCH_CODEC_FLAG_AAL2 || strstr(codec->implementation->iananame, "AAL2"))) {
-                       packing = G726_PACKING_LEFT;
-               }
+       } 
 
-               g726_init(context, codec->implementation->bits_per_second, G726_ENCODING_LINEAR, packing);
-
-               codec->private_info = context;
-               return SWITCH_STATUS_SUCCESS;
+       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;
+
 }
 
 static switch_status_t switch_g726_destroy(switch_codec_t *codec)
 {
+       g726_state_t *context = codec->private_info;
+
+       if (!context) {
+               return SWITCH_STATUS_FALSE;
+       }
+
+       g726_free(context);
+
        codec->private_info = NULL;
        return SWITCH_STATUS_SUCCESS;
 }
@@ -482,8 +524,8 @@ static switch_status_t switch_g726_decode(switch_codec_t *codec,
 /*  IMA_ADPCM - START */
 
 struct ima_adpcm_context {
-       ima_adpcm_state_t decoder_object;
-       ima_adpcm_state_t encoder_object;
+       ima_adpcm_state_t *decoder_object;
+       ima_adpcm_state_t *encoder_object;
 };
 
 static switch_status_t switch_adpcm_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
@@ -498,10 +540,10 @@ static switch_status_t switch_adpcm_init(switch_codec_t *codec, switch_codec_fla
                return SWITCH_STATUS_FALSE;
        } else {
                if (encoding) {
-                       ima_adpcm_init(&context->encoder_object, IMA_ADPCM_DVI4, 0);
+                       context->encoder_object = ima_adpcm_init(context->encoder_object, IMA_ADPCM_DVI4, 0);
                }
                if (decoding) {
-                       ima_adpcm_init(&context->decoder_object, IMA_ADPCM_DVI4, 0);
+                       context->decoder_object = ima_adpcm_init(context->decoder_object, IMA_ADPCM_DVI4, 0);
                }
 
                codec->private_info = context;
@@ -522,7 +564,7 @@ static switch_status_t switch_adpcm_encode(switch_codec_t *codec,
                return SWITCH_STATUS_FALSE;
        }
 
-       *encoded_data_len = ima_adpcm_encode(&context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
+       *encoded_data_len = ima_adpcm_encode(context->encoder_object, (uint8_t *) encoded_data, (int16_t *) decoded_data, decoded_data_len / 2);
 
        return SWITCH_STATUS_SUCCESS;
 }
@@ -540,15 +582,26 @@ static switch_status_t switch_adpcm_decode(switch_codec_t *codec,
                return SWITCH_STATUS_FALSE;
        }
 
-       *decoded_data_len = (2 * ima_adpcm_decode(&context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
+       *decoded_data_len = (2 * ima_adpcm_decode(context->decoder_object, (int16_t *) decoded_data, (uint8_t *) encoded_data, encoded_data_len));
 
        return SWITCH_STATUS_SUCCESS;
 }
 
 static switch_status_t switch_adpcm_destroy(switch_codec_t *codec)
 {
-       /* We do not need to use release here as the pool memory is taken care of for us */
+       struct ima_adpcm_context *context = codec->private_info;
+
        codec->private_info = NULL;
+
+       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;
+
        return SWITCH_STATUS_SUCCESS;
 }