]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
delay init of resources until the first time they are actually used to avoid unnecess...
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 9 Apr 2009 17:40:19 +0000 (17:40 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 9 Apr 2009 17:40:19 +0000 (17:40 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@12962 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/codecs/mod_dahdi_codec/mod_dahdi_codec.c

index f44aaf0d748f16a49b4828f832bebb7d63a0a42b..03d89635e148be6b9e34d6d78d36f55f3942cfbe 100644 (file)
@@ -117,11 +117,63 @@ static int32_t switch_dahdi_get_transcoder(struct dahdi_transcoder_formats *fmts
        return fd;
 }
 
+static switch_status_t init_encoder(switch_codec_t *codec)
+{
+       struct dahdi_transcoder_formats fmts;
+       struct dahdi_context *context = codec->private_info;
+
+       fmts.srcfmt = DAHDI_FORMAT_ULAW;
+       fmts.dstfmt = (codec->implementation->ianacode == CODEC_G729_IANA_CODE) 
+               ? DAHDI_FORMAT_G729A : DAHDI_FORMAT_G723_1;
+       context->encoding_fd = switch_dahdi_get_transcoder(&fmts);
+       if (context->decoding_fd < 0) {
+#ifdef DEBUG_DAHDI_CODEC
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "encoding requested and denied with %d/%d.\n",
+                                                 fmts.srcfmt, fmts.dstfmt);
+#endif
+               return SWITCH_STATUS_FALSE;
+       }
+       /* ulaw requires 8 times more storage than g729 and 12 times more than G723, right? */
+       context->codec_r = (codec->implementation->ianacode == CODEC_G729_IANA_CODE) 
+               ? 8 : 12;
+#ifdef DEBUG_DAHDI_CODEC
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Encoding requested and granted with %d/%d.\n",
+                                         fmts.srcfmt, fmts.dstfmt);
+#endif
+
+
+       return SWITCH_STATUS_SUCCESS;
+}
+
+
+static switch_status_t init_decoder(switch_codec_t *codec)
+{
+    struct dahdi_transcoder_formats fmts;
+    struct dahdi_context *context = codec->private_info;
+
+       fmts.dstfmt = DAHDI_FORMAT_ULAW;
+       fmts.srcfmt = (codec->implementation->ianacode == CODEC_G729_IANA_CODE) 
+               ? DAHDI_FORMAT_G729A : DAHDI_FORMAT_G723_1;
+       context->decoding_fd = switch_dahdi_get_transcoder(&fmts);
+       if (context->decoding_fd < 0) {
+#ifdef DEBUG_DAHDI_CODEC
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Decoding requested and denied with %d/%d.\n",
+                               fmts.srcfmt, fmts.dstfmt);
+#endif
+               return SWITCH_STATUS_FALSE;
+       }
+#ifdef DEBUG_DAHDI_CODEC
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Decoding requested and granted with %d/%d.\n",
+                               fmts.srcfmt, fmts.dstfmt);
+#endif
+
+       return SWITCH_STATUS_SUCCESS;
+}
+
 static switch_status_t switch_dahdi_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
 {
        uint32_t encoding, decoding;
        struct dahdi_context *context = NULL;
-       struct dahdi_transcoder_formats fmts;
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Switch DAHDI init called.\n");
 
        encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
@@ -141,44 +193,10 @@ static switch_status_t switch_dahdi_init(switch_codec_t *codec, switch_codec_fla
                return SWITCH_STATUS_FALSE;
        }
 
-       if (encoding) {
-               fmts.srcfmt = DAHDI_FORMAT_ULAW;
-               fmts.dstfmt = (codec->implementation->ianacode == CODEC_G729_IANA_CODE) 
-                       ? DAHDI_FORMAT_G729A : DAHDI_FORMAT_G723_1;
-               context->encoding_fd = switch_dahdi_get_transcoder(&fmts);
-               if (context->decoding_fd < 0) {
-#ifdef DEBUG_DAHDI_CODEC
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "encoding requested and denied with %d/%d.\n",
-                               fmts.srcfmt, fmts.dstfmt);
-#endif
-                       return SWITCH_STATUS_FALSE;
-               }
-               /* ulaw requires 8 times more storage than g729 and 12 times more than G723, right? */
-               context->codec_r = (codec->implementation->ianacode == CODEC_G729_IANA_CODE) 
-                       ? 8 : 12;
-#ifdef DEBUG_DAHDI_CODEC
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Encoding requested and granted with %d/%d.\n",
-                               fmts.srcfmt, fmts.dstfmt);
-#endif
-       }
-       if (decoding) {
-               fmts.dstfmt = DAHDI_FORMAT_ULAW;
-               fmts.srcfmt = (codec->implementation->ianacode == CODEC_G729_IANA_CODE) 
-                       ? DAHDI_FORMAT_G729A : DAHDI_FORMAT_G723_1;
-               context->decoding_fd = switch_dahdi_get_transcoder(&fmts);
-               if (context->decoding_fd < 0) {
-#ifdef DEBUG_DAHDI_CODEC
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Decoding requested and denied with %d/%d.\n",
-                               fmts.srcfmt, fmts.dstfmt);
-#endif
-                       return SWITCH_STATUS_FALSE;
-               }
-#ifdef DEBUG_DAHDI_CODEC
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Decoding requested and granted with %d/%d.\n",
-                               fmts.srcfmt, fmts.dstfmt);
-#endif
-       }
        codec->private_info = context;
+       context->encoding_fd = -1;
+       context->decoding_fd = -1;
+
        return SWITCH_STATUS_SUCCESS;
 }
 
@@ -195,10 +213,19 @@ static switch_status_t switch_dahdi_encode(switch_codec_t *codec,
        unsigned char ebuf_ulaw[decoded_data_len/2];
        uint32_t i;
        struct dahdi_context *context = NULL;
+       switch_status_t status;
+
 #ifdef DEBUG_DAHDI_CODEC
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Switch DAHDI encode called to encode %d bytes.\n", decoded_data_len);
 #endif
        context = codec->private_info;
+
+       if (context->encoding_fd == -1) {
+               if ((status = init_encoder(codec)) != SWITCH_STATUS_SUCCESS) {
+                       return status;
+               }
+       }
+
        dbuf_linear = decoded_data;
        ebuf_g729 = encoded_data;
        for (i = 0; i < decoded_data_len / sizeof(short); i++) {
@@ -245,6 +272,8 @@ static switch_status_t switch_dahdi_decode(switch_codec_t *codec,
        unsigned char *ebuf_g729;
        uint32_t i;
        struct dahdi_context *context;
+       switch_status_t status;
+
 #ifdef DEBUG_DAHDI_CODEC
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Switch DAHDI decode called to decode %d bytes.\n", encoded_data_len);
 #endif
@@ -253,6 +282,12 @@ static switch_status_t switch_dahdi_decode(switch_codec_t *codec,
        dbuf_linear = decoded_data;
        ebuf_g729 = encoded_data;
 
+       if (context->decoding_fd == -1) {
+               if ((status = init_decoder(codec)) != SWITCH_STATUS_SUCCESS) {
+                       return status;
+               }
+       }
+
        if (*flag & SWITCH_CODEC_FLAG_SILENCE) {
                memset(dbuf_linear, 0, codec->implementation->decoded_bytes_per_packet);
                *decoded_data_len = codec->implementation->decoded_bytes_per_packet;