switch_codec *codec;
void *data;
size_t datalen;
+ size_t buflen;
int samples;
};
if (!context) {\r
return SWITCH_STATUS_FALSE;\r
}\r
-\r
- g729_coder(&context->encoder_object, (short *) decoded_data, encoded_data, &cbret);\r
- \r
- *encoded_data_len = codec->implementation->encoded_bytes_per_frame;\r
-\r
+ if (decoded_data_len % 160 == 0) {\r
+ unsigned int new_len = 0;\r
+ INT16 *ddp = decoded_data;\r
+ char *edp = encoded_data;\r
+ int x;\r
+ int loops = (int) decoded_data_len / 160;\r
+ \r
+ for(x = 0; x < loops && new_len < *encoded_data_len; x++) {\r
+ g729_coder(&context->encoder_object, ddp, edp, &cbret);\r
+ edp += 10;\r
+ ddp += 80;\r
+ new_len += 10;\r
+ }\r
+ if( new_len <= *encoded_data_len ) {\r
+ *encoded_data_len = new_len;\r
+ } else {\r
+ switch_console_printf(SWITCH_CHANNEL_CONSOLE, "buffer overflow!!! %u >= %u\n", new_len, *encoded_data_len);\r
+ return SWITCH_STATUS_FALSE; \r
+ }\r
+ }\r
return SWITCH_STATUS_SUCCESS;\r
}\r
\r
unsigned int *flag) \r
{\r
struct g729_context *context = codec->private;\r
- short *dbuf;\r
- unsigned char *ebuf;\r
-\r
+ \r
if (!context) {\r
return SWITCH_STATUS_FALSE;\r
}\r
\r
- if (*flag & SWITCH_CODEC_FLAG_SILENCE) {\r
- memset(dbuf, 0, codec->implementation->bytes_per_frame);\r
- *decoded_data_len = codec->implementation->bytes_per_frame;\r
+\r
+ if (encoded_data_len % 10 == 0) {\r
+ int loops = (int) encoded_data_len / 10;\r
+ char *edp = encoded_data;\r
+ short *ddp = decoded_data;\r
+ int x;\r
+ unsigned int new_len = 0;\r
+ for(x = 0; x < loops && new_len < *decoded_data_len; x++) {\r
+ g729_decoder(&context->decoder_object, ddp, edp, 10);\r
+ ddp += 80;\r
+ edp += 10;\r
+ new_len += 160;\r
+ }\r
+ if (new_len <= *decoded_data_len) {\r
+ *decoded_data_len = new_len;\r
+ } else {\r
+ switch_console_printf(SWITCH_CHANNEL_CONSOLE, "buffer overflow!!!\n");\r
+ return SWITCH_STATUS_FALSE;\r
+ }\r
} else {\r
- g729_decoder(&context->decoder_object, decoded_data, encoded_data, encoded_data_len);\r
- *decoded_data_len = codec->implementation->bytes_per_frame;\r
+ switch_console_printf(SWITCH_CHANNEL_CONSOLE, "yo this frame is an odd size [%d]\n", encoded_data_len);\r
}\r
-\r
+ \r
+ \r
return SWITCH_STATUS_SUCCESS;\r
}\r
\r
/*.bytes_per_frame*/ 320,\r
/*.encoded_bytes_per_frame*/ 20,\r
/*.number_of_channels*/ 1,\r
- /*.pref_frames_per_packet*/ 6,\r
+ /*.pref_frames_per_packet*/ 1,\r
/*.max_frames_per_packet*/ 24,\r
/*.init*/ switch_g729_init,\r
/*.encode*/ switch_g729_encode,\r
assert(tech_pvt != NULL);
tech_pvt->read_frame.data = tech_pvt->read_buf;
+ tech_pvt->read_frame.buflen = sizeof(tech_pvt->read_buf);
switch_console_printf(SWITCH_CHANNEL_CONSOLE, "EXOSIP INIT\n");
assert(channel != NULL);
tech_pvt->read_frame.data = tech_pvt->databuf;
-
+ tech_pvt->read_frame.buflen = sizeof(tech_pvt->databuf);
iax_set_private(tech_pvt->iax_session, tech_pvt);
switch_set_flag(tech_pvt, TFLAG_IO);
if (switch_test_flag(tech_pvt, TFLAG_LINEAR)) {
switch_swap_linear(frame->data, (int)frame->datalen / 2);
}
-
iax_send_voice(tech_pvt->iax_session, tech_pvt->codec, frame->data, (int)frame->datalen, tech_pvt->write_codec.implementation->samples_per_frame);
return SWITCH_STATUS_SUCCESS;
switch_channel_answer(channel);
write_frame.data = buf;
-
+ write_frame.buflen = sizeof(buf);
if (switch_file_open(&fd, data, SWITCH_FOPEN_READ, SWITCH_FPROT_UREAD, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
switch_console_printf(SWITCH_CHANNEL_CONSOLE, "OPEN FILE FAILED\n");
assert(channel != NULL);
tech_pvt->read_frame.data = tech_pvt->databuf;
+ tech_pvt->read_frame.buflen = sizeof(tech_pvt->databuf);
switch_set_flag(tech_pvt, TFLAG_IO);
}
*/
+
WriteAudioStream(tech_pvt->audio_out, (short *)frame->data, (int)(frame->datalen / sizeof(SAMPLE)));
//XXX send voice
if (read_frame->codec) {
size_t flag = 0;
+ session->raw_read_frame.datalen = session->raw_read_frame.buflen;
status = switch_core_codec_decode(read_frame->codec,
session->read_codec,
read_frame->data,
if ((*frame)->datalen == session->read_codec->implementation->bytes_per_frame) {
perfect = TRUE;
} else {
- if (! session->raw_write_buffer) {
+ if (! session->raw_read_buffer) {
int bytes = session->read_codec->implementation->bytes_per_frame * 10;
switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Engaging Read Buffer at %d bytes\n", bytes);
switch_buffer_create(session->pool, &session->raw_read_buffer, bytes);
session->read_codec->implementation->bytes_per_frame);
enc_frame = &session->raw_read_frame;
}
-
+ session->enc_read_frame.datalen = session->enc_read_frame.buflen;
status = switch_core_codec_encode(session->read_codec,
(*frame)->codec,
session->raw_read_frame.data,
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,
if (perfect) {
enc_frame = write_frame;
+ session->enc_write_frame.datalen = session->enc_write_frame.buflen;
status = switch_core_codec_encode(session->write_codec,
frame->codec,
enc_frame->data,
bytes))) {
enc_frame = &session->raw_write_frame;
+ session->enc_write_frame.datalen = session->enc_write_frame.buflen;
status = switch_core_codec_encode(session->write_codec,
frame->codec,
enc_frame->data,
session->endpoint_interface = endpoint_interface;
session->raw_write_frame.data = session->raw_write_buf;
+ session->raw_write_frame.buflen = sizeof(session->raw_write_buf);
session->raw_read_frame.data = session->raw_read_buf;
+ session->raw_read_frame.buflen = sizeof(session->raw_read_buf);
+
session->enc_write_frame.data = session->enc_write_buf;
+ session->enc_write_frame.buflen = sizeof(session->enc_write_buf);
session->enc_read_frame.data = session->enc_read_buf;
+ session->enc_read_frame.buflen = sizeof(session->enc_read_buf);
switch_mutex_init(&session->mutex, SWITCH_MUTEX_NESTED ,session->pool);
switch_thread_cond_create(&session->cond, session->pool);