提交 615932e1 authored 作者: Anthony Minessale's avatar Anthony Minessale

delay init of resources until the first time they are actually used to avoid…

delay init of resources until the first time they are actually used to avoid unnecessary waste of resources in hardware codec

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@12962 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 68b0359c
......@@ -117,31 +117,11 @@ static int32_t switch_dahdi_get_transcoder(struct dahdi_transcoder_formats *fmts
return fd;
}
static switch_status_t switch_dahdi_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
static switch_status_t init_encoder(switch_codec_t *codec)
{
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);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding)) {
#ifdef DEBUG_DAHDI_CODEC
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No encoding or decoding requested for DAHDI transcoder?.\n");
#endif
return SWITCH_STATUS_FALSE;
}
if (!(context = switch_core_alloc(codec->memory_pool, sizeof(*context)))) {
#ifdef DEBUG_DAHDI_CODEC
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to allocate memory for dahdi codec context.\n");
#endif
return SWITCH_STATUS_FALSE;
}
struct dahdi_context *context = codec->private_info;
if (encoding) {
fmts.srcfmt = DAHDI_FORMAT_ULAW;
fmts.dstfmt = (codec->implementation->ianacode == CODEC_G729_IANA_CODE)
? DAHDI_FORMAT_G729A : DAHDI_FORMAT_G723_1;
......@@ -160,8 +140,17 @@ static switch_status_t switch_dahdi_init(switch_codec_t *codec, switch_codec_fla
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Encoding requested and granted with %d/%d.\n",
fmts.srcfmt, fmts.dstfmt);
#endif
}
if (decoding) {
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;
......@@ -177,8 +166,37 @@ static switch_status_t switch_dahdi_init(switch_codec_t *codec, switch_codec_fla
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;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Switch DAHDI init called.\n");
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
if (!(encoding || decoding)) {
#ifdef DEBUG_DAHDI_CODEC
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No encoding or decoding requested for DAHDI transcoder?.\n");
#endif
return SWITCH_STATUS_FALSE;
}
if (!(context = switch_core_alloc(codec->memory_pool, sizeof(*context)))) {
#ifdef DEBUG_DAHDI_CODEC
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to allocate memory for dahdi codec context.\n");
#endif
return SWITCH_STATUS_FALSE;
}
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;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论