From 7c294f242f155c15fa08929194ab020f135523b4 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 19 Mar 2015 14:26:47 -0500 Subject: [PATCH] FS-7504: allow . support so multiple modules can exist for the same codec --- libs/freetdm/mod_freetdm/mod_freetdm.c | 2 + libs/freetdm/mod_freetdm/tdm.c | 2 + src/fs_encode.c | 6 +- src/include/switch_core.h | 23 ++-- src/include/switch_core_media.h | 1 + src/include/switch_loadable_module.h | 7 +- src/include/switch_module_interfaces.h | 2 + src/include/switch_types.h | 1 + src/mod/applications/mod_av/mod_av.c | 1 + .../applications/mod_cluechoo/mod_cluechoo.c | 2 +- .../mod_conference/mod_conference.c | 3 +- src/mod/applications/mod_esf/mod_esf.c | 2 + src/mod/applications/mod_fsv/mod_fsv.c | 3 + src/mod/applications/mod_mp4/mod_mp4.cpp | 39 +++--- src/mod/applications/mod_mp4v2/mod_mp4v2.c | 15 ++- src/mod/applications/mod_rss/mod_rss.c | 1 + .../mod_spandsp/mod_spandsp_dsp.c | 25 ++-- .../mod_spandsp/mod_spandsp_fax.c | 4 + .../mod_spandsp/mod_spandsp_modem.c | 2 + src/mod/codecs/mod_openh264/mod_openh264.cpp | 1 + src/mod/endpoints/mod_alsa/mod_alsa.c | 5 +- .../endpoints/mod_dingaling/mod_dingaling.c | 4 + .../mod_gsmopen/mod_gsmopen.c | 4 +- src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp | 4 +- src/mod/endpoints/mod_h323/mod_h323.cpp | 4 +- src/mod/endpoints/mod_khomp/src/khomp_pvt.cpp | 4 +- src/mod/endpoints/mod_loopback/mod_loopback.c | 5 +- src/mod/endpoints/mod_opal/mod_opal.cpp | 4 +- .../endpoints/mod_portaudio/mod_portaudio.c | 10 +- src/mod/endpoints/mod_rtmp/mod_rtmp.c | 4 +- src/mod/endpoints/mod_skinny/mod_skinny.c | 30 ++--- src/mod/endpoints/mod_skypopen/mod_skypopen.c | 4 +- src/mod/endpoints/mod_sofia/rtp.c | 28 +++-- src/mod/formats/mod_avformat/mod_avformat.c | 1 + .../mod_portaudio_stream.c | 4 +- src/mod/formats/mod_vlc/mod_vlc.c | 16 ++- src/mod/formats/mod_webm/mod_webm.cpp | 2 + src/mod/languages/mod_v8/src/fssession.cpp | 1 + src/mod/languages/mod_v8/src/fsteletone.cpp | 1 + src/switch_core_codec.c | 17 ++- src/switch_core_media.c | 37 ++++-- src/switch_core_session.c | 1 + src/switch_ivr.c | 5 + src/switch_ivr_async.c | 1 + src/switch_ivr_bridge.c | 1 + src/switch_ivr_originate.c | 3 + src/switch_ivr_play_say.c | 6 + src/switch_loadable_module.c | 115 +++++++++++++----- src/switch_rtp.c | 1 + 49 files changed, 307 insertions(+), 157 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index e8468c0394..7ed2606fe6 100644 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -378,6 +378,7 @@ init_codecs: if (switch_core_codec_init(&tech_pvt->read_codec, dname, NULL, + NULL, srate, interval, 1, @@ -389,6 +390,7 @@ init_codecs: if (switch_core_codec_init(&tech_pvt->write_codec, dname, NULL, + NULL, srate, interval, 1, diff --git a/libs/freetdm/mod_freetdm/tdm.c b/libs/freetdm/mod_freetdm/tdm.c index ab49ece7ae..415e1efdcc 100644 --- a/libs/freetdm/mod_freetdm/tdm.c +++ b/libs/freetdm/mod_freetdm/tdm.c @@ -435,6 +435,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (switch_core_codec_init(&tech_pvt->read_codec, dname, NULL, + NULL, 8000, interval, 1, @@ -446,6 +447,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (switch_core_codec_init(&tech_pvt->write_codec, dname, NULL, + NULL, 8000, interval, 1, diff --git a/src/fs_encode.c b/src/fs_encode.c index 91eb33ef8e..33811ebfe6 100644 --- a/src/fs_encode.c +++ b/src/fs_encode.c @@ -205,7 +205,7 @@ int main(int argc, char *argv[]) if (out_asis) { - if (switch_core_codec_init_with_bitrate(&codec, format, fmtp, rate, ptime, channels, bitrate, SWITCH_CODEC_FLAG_ENCODE, NULL, pool) != SWITCH_STATUS_SUCCESS) { + if (switch_core_codec_init_with_bitrate(&codec, format, NULL, fmtp, rate, ptime, channels, bitrate, SWITCH_CODEC_FLAG_ENCODE, NULL, pool) != SWITCH_STATUS_SUCCESS) { fprintf(stderr, "Couldn't initialize codec for %s@%dh@%di\n", format, rate, ptime); goto end; } @@ -215,12 +215,12 @@ int main(int argc, char *argv[]) if ((p = strchr(input, '.'))) { p++; } - if (!p || switch_core_codec_init_with_bitrate(&codec, p, fmtp, rate, ptime, channels, bitrate, SWITCH_CODEC_FLAG_ENCODE|SWITCH_CODEC_FLAG_DECODE, NULL, pool) != SWITCH_STATUS_SUCCESS) { + if (!p || switch_core_codec_init_with_bitrate(&codec, p, NULL, fmtp, rate, ptime, channels, bitrate, SWITCH_CODEC_FLAG_ENCODE|SWITCH_CODEC_FLAG_DECODE, NULL, pool) != SWITCH_STATUS_SUCCESS) { fprintf(stderr, "Couldn't initialize codec for %s@%dh@%di\n", p, rate, ptime); goto end; } - if (switch_core_codec_init_with_bitrate(&raw_codec, "L16", fmtp, rate, ptime, channels, bitrate, SWITCH_CODEC_FLAG_ENCODE|SWITCH_CODEC_FLAG_DECODE, NULL, pool) != SWITCH_STATUS_SUCCESS) { + if (switch_core_codec_init_with_bitrate(&raw_codec, "L16", NULL, fmtp, rate, ptime, channels, bitrate, SWITCH_CODEC_FLAG_ENCODE|SWITCH_CODEC_FLAG_DECODE, NULL, pool) != SWITCH_STATUS_SUCCESS) { fprintf(stderr, "Couldn't initialize codec for %s@%dh@%di\n", "L16", rate, ptime); goto end; } diff --git a/src/include/switch_core.h b/src/include/switch_core.h index a2dddab6ee..e379cc8ff4 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -1567,17 +1567,20 @@ SWITCH_DECLARE(switch_status_t) switch_core_timer_destroy(switch_timer_t *timer) \param pool the memory pool to use \return SWITCH_STATUS_SUCCESS if the handle is allocated */ -#define switch_core_codec_init(_codec, _codec_name, _fmtp, _rate, _ms, _channels, _flags, _codec_settings, _pool) \ - switch_core_codec_init_with_bitrate(_codec, _codec_name, _fmtp, _rate, _ms, _channels, 0, _flags, _codec_settings, _pool) +#define switch_core_codec_init(_codec, _codec_name, _modname, _fmtp, _rate, _ms, _channels, _flags, _codec_settings, _pool) \ + switch_core_codec_init_with_bitrate(_codec, _codec_name, _modname, _fmtp, _rate, _ms, _channels, 0, _flags, _codec_settings, _pool) SWITCH_DECLARE(switch_status_t) switch_core_codec_init_with_bitrate(switch_codec_t *codec, - const char *codec_name, - const char *fmtp, - uint32_t rate, - int ms, - int channels, - uint32_t bitrate, - uint32_t flags, const switch_codec_settings_t *codec_settings, switch_memory_pool_t *pool); - + const char *codec_name, + const char *fmtp, + const char *modname, + uint32_t rate, + int ms, + int channels, + uint32_t bitrate, + uint32_t flags, + const switch_codec_settings_t *codec_settings, + switch_memory_pool_t *pool); + SWITCH_DECLARE(switch_status_t) switch_core_codec_copy(switch_codec_t *codec, switch_codec_t *new_codec, const switch_codec_settings_t *codec_settings, switch_memory_pool_t *pool); SWITCH_DECLARE(switch_status_t) switch_core_codec_parse_fmtp(const char *codec_name, const char *fmtp, uint32_t rate, switch_codec_fmtp_t *codec_fmtp); diff --git a/src/include/switch_core_media.h b/src/include/switch_core_media.h index 46167543af..2238fc14b1 100644 --- a/src/include/switch_core_media.h +++ b/src/include/switch_core_media.h @@ -278,6 +278,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_get_payload_code(switch_core SWITCH_DECLARE(payload_map_t *) switch_core_media_add_payload_map(switch_core_session_t *session, switch_media_type_t type, const char *name, + const char *modname, const char *fmtp, switch_sdp_type_t sdp_type, uint32_t pt, diff --git a/src/include/switch_loadable_module.h b/src/include/switch_loadable_module.h index f0ae57901c..54e51d95d6 100644 --- a/src/include/switch_loadable_module.h +++ b/src/include/switch_loadable_module.h @@ -115,9 +115,9 @@ SWITCH_DECLARE(switch_endpoint_interface_t *) switch_loadable_module_get_endpoin \param name the name of the codec \return the desired codec interface */ -SWITCH_DECLARE(switch_codec_interface_t *) switch_loadable_module_get_codec_interface(const char *name); +SWITCH_DECLARE(switch_codec_interface_t *) switch_loadable_module_get_codec_interface(const char *name, const char *modname); -SWITCH_DECLARE(char *) switch_parse_codec_buf(char *buf, uint32_t *interval, uint32_t *rate, uint32_t *bit, uint32_t *channels); +SWITCH_DECLARE(char *) switch_parse_codec_buf(char *buf, uint32_t *interval, uint32_t *rate, uint32_t *bit, uint32_t *channels, char **modname); /*! \brief Retrieve the dialplan interface by it's registered name @@ -415,6 +415,7 @@ SWITCH_DECLARE(uint32_t) switch_core_codec_next_id(void); #define SWITCH_ADD_CODEC(codec_int, int_name) \ for (;;) { \ codec_int = (switch_codec_interface_t *)switch_loadable_module_create_interface(*module_interface, SWITCH_CODEC_INTERFACE); \ + codec_int->modname = switch_core_strdup(pool, (*module_interface)->module_name); \ codec_int->interface_name = switch_core_strdup(pool, int_name); \ codec_int->codec_id = switch_core_codec_next_id(); \ break; \ @@ -523,6 +524,7 @@ static inline void switch_core_codec_add_implementation(switch_memory_pool_t *po impl->codec_id = codec_interface->codec_id; impl->next = codec_interface->implementations; impl->impl_id = switch_core_codec_next_id(); + impl->modname = codec_interface->modname; codec_interface->implementations = impl; } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Rejected codec name: %s rate: %u ptime: %d channels: %d\n", @@ -571,6 +573,7 @@ static inline void switch_core_codec_add_video_implementation(switch_memory_pool impl->codec_id = codec_interface->codec_id; impl->next = codec_interface->implementations; impl->impl_id = switch_core_codec_next_id(); + impl->modname = codec_interface->modname; codec_interface->implementations = impl; } diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h index 49328503c0..3a50709b4d 100644 --- a/src/include/switch_module_interfaces.h +++ b/src/include/switch_module_interfaces.h @@ -709,6 +709,7 @@ struct switch_codec_implementation { switch_core_codec_destroy_func_t destroy; uint32_t codec_id; uint32_t impl_id; + char *modname; struct switch_codec_implementation *next; }; @@ -724,6 +725,7 @@ struct switch_codec_interface { switch_thread_rwlock_t *rwlock; int refs; switch_mutex_t *reflock; + char *modname; switch_loadable_module_interface_t *parent; struct switch_codec_interface *next; }; diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 848643916c..7ee80e771a 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -2469,6 +2469,7 @@ typedef struct payload_map_s { char *rm_encoding; char *iananame; + char *modname; switch_payload_t pt; unsigned long rm_rate; unsigned long adv_rm_rate; diff --git a/src/mod/applications/mod_av/mod_av.c b/src/mod/applications/mod_av/mod_av.c index ed6639a9f2..adf02da48a 100644 --- a/src/mod/applications/mod_av/mod_av.c +++ b/src/mod/applications/mod_av/mod_av.c @@ -1129,6 +1129,7 @@ SWITCH_STANDARD_APP(record_av_function) if (switch_core_codec_init(&codec, "L16", NULL, + NULL, // read_impl.samples_per_second, 44100, // todo: not hard coded? read_impl.microseconds_per_packet / 1000, diff --git a/src/mod/applications/mod_cluechoo/mod_cluechoo.c b/src/mod/applications/mod_cluechoo/mod_cluechoo.c index c1012f127b..36395d2427 100644 --- a/src/mod/applications/mod_cluechoo/mod_cluechoo.c +++ b/src/mod/applications/mod_cluechoo/mod_cluechoo.c @@ -246,7 +246,7 @@ int vgo(int i, switch_core_session_t *session) if (switch_core_codec_init(&codec, "L16", - NULL, (int) read_impl.samples_per_second, read_impl.microseconds_per_packet / 1000, + NULL, NULL, (int) read_impl.samples_per_second, read_impl.microseconds_per_packet / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { return -1; diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 4fa8a57121..10bf4fa961 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -11049,7 +11049,7 @@ static int setup_media(conference_member_t *member, conference_obj_t *conference /* Setup a Signed Linear codec for reading audio. */ if (switch_core_codec_init(&member->read_codec, "L16", - NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, + NULL, NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, member->pool) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_DEBUG, @@ -11094,6 +11094,7 @@ static int setup_media(conference_member_t *member, conference_obj_t *conference if (switch_core_codec_init(&member->write_codec, "L16", NULL, + NULL, conference->rate, read_impl.microseconds_per_packet / 1000, read_impl.number_of_channels, diff --git a/src/mod/applications/mod_esf/mod_esf.c b/src/mod/applications/mod_esf/mod_esf.c index 82e50c21c0..87cfba30fa 100644 --- a/src/mod/applications/mod_esf/mod_esf.c +++ b/src/mod/applications/mod_esf/mod_esf.c @@ -352,6 +352,7 @@ SWITCH_STANDARD_APP(bcast_function) if (switch_core_codec_init(&codec, "L16", NULL, + NULL, read_rate, 20, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, @@ -366,6 +367,7 @@ SWITCH_STANDARD_APP(bcast_function) if (switch_core_codec_init(&write_codec, codec_name, NULL, + NULL, 8000, 20, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, diff --git a/src/mod/applications/mod_fsv/mod_fsv.c b/src/mod/applications/mod_fsv/mod_fsv.c index bc16bedca0..9d5c8064e7 100644 --- a/src/mod/applications/mod_fsv/mod_fsv.c +++ b/src/mod/applications/mod_fsv/mod_fsv.c @@ -147,6 +147,7 @@ SWITCH_STANDARD_APP(record_fsv_function) if (switch_core_codec_init(&codec, "L16", NULL, + NULL, read_impl.samples_per_second, read_impl.microseconds_per_packet / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, @@ -339,6 +340,7 @@ SWITCH_STANDARD_APP(play_fsv_function) if (switch_core_codec_init(&codec, "L16", NULL, + NULL, h.audio_rate, h.audio_ptime, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, @@ -353,6 +355,7 @@ SWITCH_STANDARD_APP(play_fsv_function) if (switch_core_codec_init(&vid_codec, h.video_codec_name, NULL, + NULL, 0, 0, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, diff --git a/src/mod/applications/mod_mp4/mod_mp4.cpp b/src/mod/applications/mod_mp4/mod_mp4.cpp index 7a39f8b9ab..6617b8be29 100644 --- a/src/mod/applications/mod_mp4/mod_mp4.cpp +++ b/src/mod/applications/mod_mp4/mod_mp4.cpp @@ -168,12 +168,13 @@ SWITCH_STANDARD_APP(record_mp4_function) MP4::Context ctx(reinterpret_cast(data), true); if (switch_core_codec_init(&codec, - "L16", - NULL, - read_impl.samples_per_second, - read_impl.microseconds_per_packet / 1000, - 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, - NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) + "L16", + NULL, + NULL, + read_impl.samples_per_second, + read_impl.microseconds_per_packet / 1000, + 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Audio Codec Activation Success\n"); } else { @@ -440,24 +441,26 @@ SWITCH_STANDARD_APP(play_mp4_function) } if (switch_core_codec_init(&codec, - vc.audioTrack().codecName, - NULL, - vc.audioTrack().clock, - vc.audioTrack().packetLength, - 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, - NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { + vc.audioTrack().codecName, + NULL, + NULL, + vc.audioTrack().clock, + vc.audioTrack().packetLength, + 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Audio Codec Activation Success\n"); } else { throw Exception("Audio Codec Activation Fail"); } if (switch_core_codec_init(&vid_codec, - vc.videoTrack().track.codecName, - NULL, - 0, - 0, - 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, - NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { + vc.videoTrack().track.codecName, + NULL, + NULL, + 0, + 0, + 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Video Codec Activation Success\n"); } else { diff --git a/src/mod/applications/mod_mp4v2/mod_mp4v2.c b/src/mod/applications/mod_mp4v2/mod_mp4v2.c index 22b6b4c0f7..69b611c2a3 100644 --- a/src/mod/applications/mod_mp4v2/mod_mp4v2.c +++ b/src/mod/applications/mod_mp4v2/mod_mp4v2.c @@ -369,6 +369,7 @@ SWITCH_STANDARD_APP(record_mp4_function) if (switch_core_codec_init(&codec, "PCMU", NULL, + NULL, read_impl.samples_per_second, read_impl.microseconds_per_packet / 1000, read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, @@ -669,6 +670,7 @@ static switch_status_t mp4_file_open(switch_file_handle_t *handle, const char *p if (switch_core_codec_init(&context->audio_codec, get_audio_codec_name(context->audio_type), NULL, + NULL, handle->samplerate, 20,//ms handle->channels, SWITCH_CODEC_FLAG_ENCODE, @@ -681,12 +683,13 @@ static switch_status_t mp4_file_open(switch_file_handle_t *handle, const char *p if (switch_test_flag(handle, SWITCH_FILE_FLAG_VIDEO)) { if (switch_core_codec_init(&context->video_codec, - "H264", - NULL, - 90000, - 0,//ms - 1, SWITCH_CODEC_FLAG_ENCODE, - NULL, handle->memory_pool) == SWITCH_STATUS_SUCCESS) { + "H264", + NULL, + NULL, + 90000, + 0,//ms + 1, SWITCH_CODEC_FLAG_ENCODE, + NULL, handle->memory_pool) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Video Codec H264 Activation Success\n"); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Video Codec H264 Activation Fail\n"); diff --git a/src/mod/applications/mod_rss/mod_rss.c b/src/mod/applications/mod_rss/mod_rss.c index c17e0a53aa..c1e1e2803d 100644 --- a/src/mod/applications/mod_rss/mod_rss.c +++ b/src/mod/applications/mod_rss/mod_rss.c @@ -272,6 +272,7 @@ SWITCH_STANDARD_APP(rss_function) if (switch_core_codec_init(&speech_codec, "L16", NULL, + NULL, (int) rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c b/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c index b2fb98313a..561b9ad6f6 100644 --- a/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c +++ b/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c @@ -189,18 +189,19 @@ switch_status_t spandsp_tdd_send_session(switch_core_session_t *session, const c switch_core_session_get_read_impl(session, &read_impl); if (switch_core_codec_init(&write_codec, - "L16", - NULL, - read_impl.actual_samples_per_second, - read_impl.microseconds_per_packet / 1000, - read_impl.number_of_channels, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, - switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { - write_frame.data = write_buf; - write_frame.buflen = sizeof(write_buf); - write_frame.datalen = read_impl.decoded_bytes_per_packet; - write_frame.samples = write_frame.datalen / 2; - write_frame.codec = &write_codec; + "L16", + NULL, + NULL, + read_impl.actual_samples_per_second, + read_impl.microseconds_per_packet / 1000, + read_impl.number_of_channels, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, + switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) { + write_frame.data = write_buf; + write_frame.buflen = sizeof(write_buf); + write_frame.datalen = read_impl.decoded_bytes_per_packet; + write_frame.samples = write_frame.datalen / 2; + write_frame.codec = &write_codec; switch_core_session_set_read_codec(session, &write_codec); } else { return SWITCH_STATUS_FALSE; diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c index 4a75b803ee..969a83abc3 100644 --- a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c +++ b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c @@ -1440,6 +1440,7 @@ void mod_spandsp_fax_process_fax(switch_core_session_t *session, const char *dat */ if (switch_core_codec_init(&read_codec, "L16", + NULL, NULL, read_impl.samples_per_second, read_impl.microseconds_per_packet / 1000, @@ -1457,6 +1458,7 @@ void mod_spandsp_fax_process_fax(switch_core_session_t *session, const char *dat if (switch_core_codec_init(&write_codec, "L16", + NULL, NULL, read_impl.samples_per_second, read_impl.microseconds_per_packet / 1000, @@ -1864,6 +1866,7 @@ static switch_status_t t38_gateway_on_consume_media(switch_core_session_t *sessi if (switch_core_codec_init(&read_codec, "L16", + NULL, NULL, read_impl.samples_per_second, read_impl.microseconds_per_packet / 1000, @@ -1880,6 +1883,7 @@ static switch_status_t t38_gateway_on_consume_media(switch_core_session_t *sessi if (switch_core_codec_init(&write_codec, "L16", + NULL, NULL, read_impl.samples_per_second, read_impl.microseconds_per_packet / 1000, diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_modem.c b/src/mod/applications/mod_spandsp/mod_spandsp_modem.c index ee7405f90a..5ef01cd5c4 100644 --- a/src/mod/applications/mod_spandsp/mod_spandsp_modem.c +++ b/src/mod/applications/mod_spandsp/mod_spandsp_modem.c @@ -770,6 +770,7 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses status = switch_core_codec_init(&tech_pvt->read_codec, iananame, + NULL, NULL, rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session)); @@ -779,6 +780,7 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses status = switch_core_codec_init(&tech_pvt->write_codec, iananame, + NULL, NULL, rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session)); diff --git a/src/mod/codecs/mod_openh264/mod_openh264.cpp b/src/mod/codecs/mod_openh264/mod_openh264.cpp index 3e110c39d3..5847e32c7b 100644 --- a/src/mod/codecs/mod_openh264/mod_openh264.cpp +++ b/src/mod/codecs/mod_openh264/mod_openh264.cpp @@ -756,6 +756,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_openh264_load) switch_core_codec_add_video_implementation(pool, codec_interface, 99, "H264", NULL, switch_h264_init, switch_h264_encode, switch_h264_decode, switch_h264_control, switch_h264_destroy); + /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/endpoints/mod_alsa/mod_alsa.c b/src/mod/endpoints/mod_alsa/mod_alsa.c index 61f2e38d97..f7d933b29e 100644 --- a/src/mod/endpoints/mod_alsa/mod_alsa.c +++ b/src/mod/endpoints/mod_alsa/mod_alsa.c @@ -562,6 +562,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch if (switch_core_codec_init(&tech_pvt->write_codec, "L16", NULL, + NULL, sample_rate, codec_ms, 1, @@ -989,13 +990,13 @@ static switch_status_t engage_device(unsigned int sample_rate, int codec_ms) if (switch_core_codec_init(&globals.read_codec, "L16", - NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { + NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); return SWITCH_STATUS_FALSE; } else { if (switch_core_codec_init(&globals.write_codec, "L16", - NULL, + NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); switch_core_codec_destroy(&globals.read_codec); diff --git a/src/mod/endpoints/mod_dingaling/mod_dingaling.c b/src/mod/endpoints/mod_dingaling/mod_dingaling.c index 05012fb3b5..e92ea57c1c 100644 --- a/src/mod/endpoints/mod_dingaling/mod_dingaling.c +++ b/src/mod/endpoints/mod_dingaling/mod_dingaling.c @@ -1167,6 +1167,7 @@ static int activate_audio_rtp(struct private_object *tech_pvt) if (switch_core_codec_init(&tech_pvt->transports[LDL_TPORT_RTP].read_codec, tech_pvt->transports[LDL_TPORT_RTP].codec_name, NULL, + NULL, tech_pvt->transports[LDL_TPORT_RTP].codec_rate, ms, 1, @@ -1188,6 +1189,7 @@ static int activate_audio_rtp(struct private_object *tech_pvt) if (switch_core_codec_init(&tech_pvt->transports[LDL_TPORT_RTP].write_codec, tech_pvt->transports[LDL_TPORT_RTP].codec_name, NULL, + NULL, tech_pvt->transports[LDL_TPORT_RTP].codec_rate, ms, 1, @@ -1366,6 +1368,7 @@ static int activate_video_rtp(struct private_object *tech_pvt) if (switch_core_codec_init(&tech_pvt->transports[LDL_TPORT_VIDEO_RTP].read_codec, tech_pvt->transports[LDL_TPORT_VIDEO_RTP].codec_name, NULL, + NULL, tech_pvt->transports[LDL_TPORT_VIDEO_RTP].codec_rate, ms, 1, @@ -1384,6 +1387,7 @@ static int activate_video_rtp(struct private_object *tech_pvt) if (switch_core_codec_init(&tech_pvt->transports[LDL_TPORT_VIDEO_RTP].write_codec, tech_pvt->transports[LDL_TPORT_VIDEO_RTP].codec_name, NULL, + NULL, tech_pvt->transports[LDL_TPORT_VIDEO_RTP].codec_rate, ms, 1, diff --git a/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/mod_gsmopen.c b/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/mod_gsmopen.c index fc45ab9294..16c83fa29c 100644 --- a/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/mod_gsmopen.c +++ b/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/mod_gsmopen.c @@ -217,14 +217,14 @@ static switch_status_t gsmopen_codec(private_t * tech_pvt, int sample_rate, int switch_core_session_t *session = NULL; if (switch_core_codec_init - (&tech_pvt->read_codec, "L16", NULL, sample_rate, codec_ms, 1, + (&tech_pvt->read_codec, "L16", NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { ERRORA("Can't load codec?\n", GSMOPEN_P_LOG); return SWITCH_STATUS_FALSE; } if (switch_core_codec_init - (&tech_pvt->write_codec, "L16", NULL, sample_rate, codec_ms, 1, + (&tech_pvt->write_codec, "L16", NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { ERRORA("Can't load codec?\n", GSMOPEN_P_LOG); switch_core_codec_destroy(&tech_pvt->read_codec); diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp index 7ad50e65e9..c1cf2800e2 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp @@ -156,14 +156,14 @@ static switch_status_t gsmopen_codec(private_t *tech_pvt, int sample_rate, int c switch_core_session_t *session = NULL; if (switch_core_codec_init - (&tech_pvt->read_codec, "L16", NULL, sample_rate, codec_ms, 1, + (&tech_pvt->read_codec, "L16", NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { ERRORA("Can't load codec?\n", GSMOPEN_P_LOG); return SWITCH_STATUS_FALSE; } if (switch_core_codec_init - (&tech_pvt->write_codec, "L16", NULL, sample_rate, codec_ms, 1, + (&tech_pvt->write_codec, "L16", NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { ERRORA("Can't load codec?\n", GSMOPEN_P_LOG); switch_core_codec_destroy(&tech_pvt->read_codec); diff --git a/src/mod/endpoints/mod_h323/mod_h323.cpp b/src/mod/endpoints/mod_h323/mod_h323.cpp index a44de1407f..514bff5a6e 100644 --- a/src/mod/endpoints/mod_h323/mod_h323.cpp +++ b/src/mod/endpoints/mod_h323/mod_h323.cpp @@ -2071,12 +2071,12 @@ PBoolean FSH323_ExternalRTPChannel::Start() tech_pvt->read_frame.codec = &tech_pvt->read_codec; /* Set codec here - no need to set it every time a frame is read */ - if (switch_core_codec_init(codec, GetH245CodecName(m_capability), NULL, // FMTP + if (switch_core_codec_init(codec, GetH245CodecName(m_capability), NULL, NULL, // FMTP 8000, m_codec_ms, 1, // Channels SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) { - if (switch_core_codec_init(codec, GetH245CodecName(m_capability), NULL, // FMTP + if (switch_core_codec_init(codec, GetH245CodecName(m_capability), NULL, NULL, // FMTP 8000, 0, 1, // Channels SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings switch_core_session_get_pool(m_fsSession)) != SWITCH_STATUS_SUCCESS) { diff --git a/src/mod/endpoints/mod_khomp/src/khomp_pvt.cpp b/src/mod/endpoints/mod_khomp/src/khomp_pvt.cpp index e093d68501..e60056fb9f 100644 --- a/src/mod/endpoints/mod_khomp/src/khomp_pvt.cpp +++ b/src/mod/endpoints/mod_khomp/src/khomp_pvt.cpp @@ -713,7 +713,7 @@ switch_status_t Board::KhompPvt::justAlloc(bool is_answering, switch_memory_pool switch_core_session_add_stream(session(), NULL); - if (switch_core_codec_init(&_read_codec, "PCMA", NULL, 8000, Globals::switch_packet_duration, 1, + if (switch_core_codec_init(&_read_codec, "PCMA", NULL, NULL, 8000, Globals::switch_packet_duration, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, (pool ? *pool : NULL)) != SWITCH_STATUS_SUCCESS) { @@ -722,7 +722,7 @@ switch_status_t Board::KhompPvt::justAlloc(bool is_answering, switch_memory_pool return SWITCH_STATUS_FALSE; } - if (switch_core_codec_init(&_write_codec, "PCMA", NULL, 8000, Globals::switch_packet_duration, 1, + if (switch_core_codec_init(&_write_codec, "PCMA", NULL, NULL, 8000, Globals::switch_packet_duration, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, (pool ? *pool : NULL)) != SWITCH_STATUS_SUCCESS) { diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index b0cde67f07..6724b0cea2 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -137,11 +137,12 @@ static switch_status_t tech_init(loopback_private_t *tech_pvt, switch_core_sessi interval = codec->implementation->microseconds_per_packet / 1000; } else { const char *var; + char *modname = NULL; if ((var = switch_channel_get_variable(channel, "loopback_initial_codec"))) { char *dup = switch_core_session_strdup(session, var); uint32_t bit, channels; - iananame = switch_parse_codec_buf(dup, &interval, &rate, &bit, &channels); + iananame = switch_parse_codec_buf(dup, &interval, &rate, &bit, &channels, &modname); } } @@ -160,6 +161,7 @@ static switch_status_t tech_init(loopback_private_t *tech_pvt, switch_core_sessi status = switch_core_codec_init(&tech_pvt->read_codec, iananame, NULL, + NULL, rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session)); if (status != SWITCH_STATUS_SUCCESS || !tech_pvt->read_codec.implementation || !switch_core_codec_ready(&tech_pvt->read_codec)) { @@ -169,6 +171,7 @@ static switch_status_t tech_init(loopback_private_t *tech_pvt, switch_core_sessi status = switch_core_codec_init(&tech_pvt->write_codec, iananame, NULL, + NULL, rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(session)); diff --git a/src/mod/endpoints/mod_opal/mod_opal.cpp b/src/mod/endpoints/mod_opal/mod_opal.cpp index c844df7052..70b540eddb 100644 --- a/src/mod/endpoints/mod_opal/mod_opal.cpp +++ b/src/mod/endpoints/mod_opal/mod_opal.cpp @@ -1287,12 +1287,12 @@ PBoolean FSMediaStream::Open() } // The following is performed on two different instances of this object. - if (switch_core_codec_init(m_switchCodec, mediaFormat.GetEncodingName(), NULL, // FMTP + if (switch_core_codec_init(m_switchCodec, mediaFormat.GetEncodingName(), NULL, NULL, // FMTP mediaFormat.GetClockRate(), ptime, 1, // Channels SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings switch_core_session_get_pool(fsSession)) != SWITCH_STATUS_SUCCESS) { // Could not select a codecs using negotiated frames/packet, so try using default. - if (switch_core_codec_init(m_switchCodec, mediaFormat.GetEncodingName(), NULL, // FMTP + if (switch_core_codec_init(m_switchCodec, mediaFormat.GetEncodingName(), NULL, NULL, // FMTP mediaFormat.GetClockRate(), 0, 1, // Channels SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, // Settings switch_core_session_get_pool(fsSession)) != SWITCH_STATUS_SUCCESS) { diff --git a/src/mod/endpoints/mod_portaudio/mod_portaudio.c b/src/mod/endpoints/mod_portaudio/mod_portaudio.c index 4329be4cd3..2dc4046420 100644 --- a/src/mod/endpoints/mod_portaudio/mod_portaudio.c +++ b/src/mod/endpoints/mod_portaudio/mod_portaudio.c @@ -1217,15 +1217,15 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi } if (switch_core_codec_init(&endpoint->read_codec, - "L16", NULL, sample_rate, codec_ms, 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { + "L16", NULL, NULL, sample_rate, codec_ms, 1, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto error; } if (switch_core_codec_init(&endpoint->write_codec, - "L16", NULL, sample_rate, codec_ms, 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { + "L16", NULL, NULL, sample_rate, codec_ms, 1, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto error; } @@ -2222,6 +2222,7 @@ static switch_status_t create_codecs(int restart) if (!switch_core_codec_ready(&globals.read_codec)) { if (switch_core_codec_init(&globals.read_codec, "L16", + NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); @@ -2235,6 +2236,7 @@ static switch_status_t create_codecs(int restart) if (switch_core_codec_init(&globals.write_codec, "L16", NULL, + NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); switch_core_codec_destroy(&globals.read_codec); diff --git a/src/mod/endpoints/mod_rtmp/mod_rtmp.c b/src/mod/endpoints/mod_rtmp/mod_rtmp.c index 2ec48628ae..cbd276a71a 100644 --- a/src/mod/endpoints/mod_rtmp/mod_rtmp.c +++ b/src/mod/endpoints/mod_rtmp/mod_rtmp.c @@ -109,7 +109,7 @@ switch_status_t rtmp_tech_init(rtmp_private_t *tech_pvt, rtmp_session_t *rsessio tech_pvt->channel = switch_core_session_get_channel(session); /* Initialize read & write codecs */ - if (switch_core_codec_init(&tech_pvt->read_codec, /* name */ "SPEEX", + if (switch_core_codec_init(&tech_pvt->read_codec, /* name */ "SPEEX", /* modname */ NULL, /* fmtp */ NULL, /* rate */ 16000, /* ms */ 20, /* channels */ 1, /* flags */ SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, /* codec settings */ NULL, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { @@ -118,7 +118,7 @@ switch_status_t rtmp_tech_init(rtmp_private_t *tech_pvt, rtmp_session_t *rsessio return SWITCH_STATUS_FALSE; } - if (switch_core_codec_init(&tech_pvt->write_codec, /* name */ "SPEEX", + if (switch_core_codec_init(&tech_pvt->write_codec, /* name */ "SPEEX", /* modname */ NULL, /* fmtp */ NULL, /* rate */ 16000, /* ms */ 20, /* channels */ 1, /* flags */ SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, /* codec settings */ NULL, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { diff --git a/src/mod/endpoints/mod_skinny/mod_skinny.c b/src/mod/endpoints/mod_skinny/mod_skinny.c index 5925abebe4..7ef5aec3e2 100644 --- a/src/mod/endpoints/mod_skinny/mod_skinny.c +++ b/src/mod/endpoints/mod_skinny/mod_skinny.c @@ -574,25 +574,27 @@ switch_status_t skinny_tech_set_codec(private_t *tech_pvt, int force) } if (switch_core_codec_init(&tech_pvt->read_codec, - tech_pvt->iananame, - tech_pvt->rm_fmtp, - tech_pvt->rm_rate, - tech_pvt->codec_ms, - 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE | 0 /* TODO tech_pvt->profile->codec_flags */, - NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { + tech_pvt->iananame, + NULL, + tech_pvt->rm_fmtp, + tech_pvt->rm_rate, + tech_pvt->codec_ms, + 1, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE | 0 /* TODO tech_pvt->profile->codec_flags */, + NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_ERROR, "Can't load codec?\n"); switch_goto_status(SWITCH_STATUS_FALSE, end); } if (switch_core_codec_init(&tech_pvt->write_codec, - tech_pvt->iananame, - tech_pvt->rm_fmtp, - tech_pvt->rm_rate, - tech_pvt->codec_ms, - 1, - SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE | 0 /* TODO tech_pvt->profile->codec_flags */, - NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { + tech_pvt->iananame, + NULL, + tech_pvt->rm_fmtp, + tech_pvt->rm_rate, + tech_pvt->codec_ms, + 1, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE | 0 /* TODO tech_pvt->profile->codec_flags */, + NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_ERROR, "Can't load codec?\n"); switch_goto_status(SWITCH_STATUS_FALSE, end); } diff --git a/src/mod/endpoints/mod_skypopen/mod_skypopen.c b/src/mod/endpoints/mod_skypopen/mod_skypopen.c index 277dc8c428..d50f372776 100644 --- a/src/mod/endpoints/mod_skypopen/mod_skypopen.c +++ b/src/mod/endpoints/mod_skypopen/mod_skypopen.c @@ -212,14 +212,14 @@ static switch_status_t skypopen_codec(private_t *tech_pvt, int sample_rate, int switch_core_session_t *session = NULL; if (switch_core_codec_init - (&tech_pvt->read_codec, "L16", NULL, sample_rate, codec_ms, 1, + (&tech_pvt->read_codec, "L16", NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { ERRORA("skypopen_codec: Can't load codec?\n", SKYPOPEN_P_LOG); return SWITCH_STATUS_FALSE; } if (switch_core_codec_init - (&tech_pvt->write_codec, "L16", NULL, sample_rate, codec_ms, 1, + (&tech_pvt->write_codec, "L16", NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { ERRORA("skypopen_codec: Can't load codec?\n", SKYPOPEN_P_LOG); switch_core_codec_destroy(&tech_pvt->read_codec); diff --git a/src/mod/endpoints/mod_sofia/rtp.c b/src/mod/endpoints/mod_sofia/rtp.c index 897534970e..b6a14974b0 100644 --- a/src/mod/endpoints/mod_sofia/rtp.c +++ b/src/mod/endpoints/mod_sofia/rtp.c @@ -229,6 +229,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (switch_core_codec_init(&tech_pvt->read_codec, codec, NULL, + NULL, rate, ptime, 1, @@ -240,6 +241,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi if (switch_core_codec_init(&tech_pvt->write_codec, codec, NULL, + NULL, rate, ptime, 1, @@ -479,24 +481,26 @@ static switch_status_t channel_receive_event(switch_core_session_t *session, swi switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Switching codec updating \n"); if (switch_core_codec_init(&tech_pvt->read_codec, - codec, - NULL, - rate, - ptime, - 1, + codec, + NULL, + NULL, + rate, + ptime, + 1, /*SWITCH_CODEC_FLAG_ENCODE |*/ SWITCH_CODEC_FLAG_DECODE, NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto fail; } else { if (switch_core_codec_init(&tech_pvt->write_codec, - codec, - NULL, - rate, - ptime, - 1, - SWITCH_CODEC_FLAG_ENCODE /*| SWITCH_CODEC_FLAG_DECODE*/, - NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { + codec, + NULL, + NULL, + rate, + ptime, + 1, + SWITCH_CODEC_FLAG_ENCODE /*| SWITCH_CODEC_FLAG_DECODE*/, + NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); goto fail; } diff --git a/src/mod/formats/mod_avformat/mod_avformat.c b/src/mod/formats/mod_avformat/mod_avformat.c index 5c65df1d52..ab011b9730 100644 --- a/src/mod/formats/mod_avformat/mod_avformat.c +++ b/src/mod/formats/mod_avformat/mod_avformat.c @@ -550,6 +550,7 @@ SWITCH_STANDARD_APP(record_av_function) if (switch_core_codec_init(&codec, "L16", NULL, + NULL, force_sample_rate, read_impl.microseconds_per_packet / 1000, read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, diff --git a/src/mod/formats/mod_portaudio_stream/mod_portaudio_stream.c b/src/mod/formats/mod_portaudio_stream/mod_portaudio_stream.c index 29137754b2..1d2882ca74 100644 --- a/src/mod/formats/mod_portaudio_stream/mod_portaudio_stream.c +++ b/src/mod/formats/mod_portaudio_stream/mod_portaudio_stream.c @@ -174,7 +174,7 @@ static switch_status_t engage_device(portaudio_stream_source_t *source, int rest if (!switch_core_codec_ready(&source->read_codec)) { if (switch_core_codec_init(&source->read_codec, "L16", - NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, + NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); return SWITCH_STATUS_FALSE; @@ -186,7 +186,7 @@ static switch_status_t engage_device(portaudio_stream_source_t *source, int rest if (!switch_core_codec_ready(&source->write_codec)) { if (switch_core_codec_init(&source->write_codec, "L16", - NULL, + NULL, NULL, sample_rate, codec_ms, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); switch_core_codec_destroy(&source->read_codec); diff --git a/src/mod/formats/mod_vlc/mod_vlc.c b/src/mod/formats/mod_vlc/mod_vlc.c index 3edfcdd29f..a0313a4703 100644 --- a/src/mod/formats/mod_vlc/mod_vlc.c +++ b/src/mod/formats/mod_vlc/mod_vlc.c @@ -1417,6 +1417,7 @@ SWITCH_STANDARD_APP(play_video_function) if (switch_core_codec_init(&codec, "L16", NULL, + NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet/1000, read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, @@ -2301,6 +2302,7 @@ static switch_call_cause_t vlc_outgoing_channel(switch_core_session_t *session, if (switch_core_codec_init(&tech_pvt->read_codec, "L16", NULL, + NULL, tech_pvt->read_impl.actual_samples_per_second, tech_pvt->read_impl.microseconds_per_packet / 1000, tech_pvt->read_impl.number_of_channels, @@ -2312,6 +2314,7 @@ static switch_call_cause_t vlc_outgoing_channel(switch_core_session_t *session, if (switch_core_codec_init(&tech_pvt->write_codec, tech_pvt->read_impl.iananame, + tech_pvt->read_impl.modname, NULL, tech_pvt->read_impl.actual_samples_per_second, tech_pvt->read_impl.microseconds_per_packet / 1000, @@ -2337,12 +2340,13 @@ static switch_call_cause_t vlc_outgoing_channel(switch_core_session_t *session, } if (switch_core_codec_init(&tech_pvt->video_codec, - codec_str, - NULL, - 90000, - 0, - 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, - NULL, switch_core_session_get_pool(tech_pvt->session)) == SWITCH_STATUS_SUCCESS) { + codec_str, + NULL, + NULL, + 90000, + 0, + 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + NULL, switch_core_session_get_pool(tech_pvt->session)) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(*new_session), SWITCH_LOG_DEBUG, "Video Codec Activation Success\n"); } else { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(*new_session), SWITCH_LOG_ERROR, "Video Codec Activation Fail\n"); diff --git a/src/mod/formats/mod_webm/mod_webm.cpp b/src/mod/formats/mod_webm/mod_webm.cpp index 4d9c4ae416..da804eac24 100644 --- a/src/mod/formats/mod_webm/mod_webm.cpp +++ b/src/mod/formats/mod_webm/mod_webm.cpp @@ -171,6 +171,7 @@ static switch_status_t webm_file_open(switch_file_handle_t *handle, const char * if (switch_core_codec_init(&context->audio_codec, AUDIO_CODEC, + NULL, fmtp, handle->samplerate, 20,//ms @@ -186,6 +187,7 @@ static switch_status_t webm_file_open(switch_file_handle_t *handle, const char * if (switch_core_codec_init(&context->video_codec, "VP8", NULL, + NULL, 90000, 0,//ms 1, SWITCH_CODEC_FLAG_ENCODE, diff --git a/src/mod/languages/mod_v8/src/fssession.cpp b/src/mod/languages/mod_v8/src/fssession.cpp index dce66a053d..260e529696 100644 --- a/src/mod/languages/mod_v8/src/fssession.cpp +++ b/src/mod/languages/mod_v8/src/fssession.cpp @@ -972,6 +972,7 @@ switch_status_t FSSession::InitSpeechEngine(const char *engine, const char *voic if (switch_core_codec_init(&this->_speech->codec, "L16", NULL, + NULL, rate, interval, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, diff --git a/src/mod/languages/mod_v8/src/fsteletone.cpp b/src/mod/languages/mod_v8/src/fsteletone.cpp index c77edd5db5..aad8dc4bd8 100644 --- a/src/mod/languages/mod_v8/src/fsteletone.cpp +++ b/src/mod/languages/mod_v8/src/fsteletone.cpp @@ -137,6 +137,7 @@ void *FSTeleTone::Construct(const v8::FunctionCallbackInfo& info) if (switch_core_codec_init(&tto->_codec, "L16", NULL, + NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, pool) == SWITCH_STATUS_SUCCESS) { diff --git a/src/switch_core_codec.c b/src/switch_core_codec.c index 97a93fc29c..8f1b921380 100644 --- a/src/switch_core_codec.c +++ b/src/switch_core_codec.c @@ -593,7 +593,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_parse_fmtp(const char *codec_n memset(codec_fmtp, 0, sizeof(*codec_fmtp)); - if ((codec_interface = switch_loadable_module_get_codec_interface(codec_name))) { + if ((codec_interface = switch_loadable_module_get_codec_interface(codec_name, NULL))) { if (codec_interface->parse_fmtp) { codec_fmtp->actual_samples_per_second = rate; status = codec_interface->parse_fmtp(fmtp, codec_fmtp); @@ -624,6 +624,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_copy(switch_codec_t *codec, sw return switch_core_codec_init(new_codec, codec->implementation->iananame, + codec->implementation->modname, codec->fmtp_in, codec->implementation->samples_per_second, codec->implementation->microseconds_per_packet / 1000, @@ -634,7 +635,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_copy(switch_codec_t *codec, sw } -SWITCH_DECLARE(switch_status_t) switch_core_codec_init_with_bitrate(switch_codec_t *codec, const char *codec_name, const char *fmtp, +SWITCH_DECLARE(switch_status_t) switch_core_codec_init_with_bitrate(switch_codec_t *codec, const char *codec_name, const char *modname, const char *fmtp, uint32_t rate, int ms, int channels, uint32_t bitrate, uint32_t flags, const switch_codec_settings_t *codec_settings, switch_memory_pool_t *pool) { @@ -650,7 +651,17 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_init_with_bitrate(switch_codec codec->session = switch_core_memory_pool_get_data(pool, "__session"); } - if ((codec_interface = switch_loadable_module_get_codec_interface(codec_name)) == 0) { + if (strchr(codec_name, '.')) { + char *p = NULL; + codec_name = switch_core_strdup(pool, codec_name); + if ((p = strchr(codec_name, '.'))) { + *p++ = '\0'; + modname = codec_name; + codec_name = p; + } + } + + if ((codec_interface = switch_loadable_module_get_codec_interface(codec_name, modname)) == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid codec %s!\n", codec_name); return SWITCH_STATUS_GENERR; } diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 557ba8365a..0e7ec59e5f 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -656,6 +656,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_get_payload_code(switch_core SWITCH_DECLARE(payload_map_t *) switch_core_media_add_payload_map(switch_core_session_t *session, switch_media_type_t type, const char *name, + const char *modname, const char *fmtp, switch_sdp_type_t sdp_type, uint32_t pt, @@ -728,6 +729,10 @@ SWITCH_DECLARE(payload_map_t *) switch_core_media_add_payload_map(switch_core_se pmap->channels = channels; } + if (modname) { + pmap->modname = switch_core_strdup(session->pool, modname); + } + if (!zstr(fmtp) && (zstr(pmap->rm_fmtp) || strcmp(pmap->rm_fmtp, fmtp))) { pmap->rm_fmtp = switch_core_strdup(session->pool, fmtp); } @@ -780,7 +785,7 @@ SWITCH_DECLARE(const char *)switch_core_media_get_codec_string(switch_core_sessi if (!(preferred = switch_channel_get_variable(session->channel, "absolute_codec_string"))) { preferred = switch_channel_get_variable(session->channel, "codec_string"); } - + if (!preferred) { if (switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND) { preferred = smh->mparams->outbound_codec_string; @@ -2491,6 +2496,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_video_codec(switch_core_se if (switch_core_codec_init(&v_engine->read_codec, v_engine->cur_payload_map->rm_encoding, + v_engine->cur_payload_map->modname, v_engine->cur_payload_map->rm_fmtp, v_engine->cur_payload_map->rm_rate, 0, @@ -2502,6 +2508,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_video_codec(switch_core_se } else { if (switch_core_codec_init(&v_engine->write_codec, v_engine->cur_payload_map->rm_encoding, + v_engine->cur_payload_map->modname, v_engine->cur_payload_map->rm_fmtp, v_engine->cur_payload_map->rm_rate, 0, @@ -2628,6 +2635,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_codec(switch_core_session_ if (switch_core_codec_init_with_bitrate(&a_engine->read_codec, a_engine->cur_payload_map->iananame, + a_engine->cur_payload_map->modname, a_engine->cur_payload_map->rm_fmtp, a_engine->cur_payload_map->rm_rate, a_engine->cur_payload_map->codec_ms, @@ -2645,6 +2653,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_codec(switch_core_session_ if (switch_core_codec_init_with_bitrate(&a_engine->write_codec, a_engine->cur_payload_map->iananame, + a_engine->cur_payload_map->modname, a_engine->cur_payload_map->rm_fmtp, a_engine->cur_payload_map->rm_rate, a_engine->cur_payload_map->codec_ms, @@ -4030,6 +4039,7 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s payload_map_t *pmap = switch_core_media_add_payload_map(session, SWITCH_MEDIA_TYPE_AUDIO, matches[j].map->rm_encoding, + matches[j].imp->modname, matches[j].map->rm_fmtp, sdp_type, matches[j].map->rm_pt, @@ -4342,6 +4352,7 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s payload_map_t *pmap = switch_core_media_add_payload_map(session, SWITCH_MEDIA_TYPE_VIDEO, matches[j].map->rm_encoding, + matches[j].imp->modname, matches[j].map->rm_fmtp, sdp_type, matches[j].map->rm_pt, @@ -4349,6 +4360,7 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s matches[j].imp->microseconds_per_packet / 1000, matches[j].imp->number_of_channels, SWITCH_TRUE); + if (j == 0) { v_engine->cur_payload_map = pmap; v_engine->cur_payload_map->current = 1; @@ -6900,6 +6912,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess switch_core_media_add_payload_map(session, imp->codec_type == SWITCH_CODEC_TYPE_AUDIO ? SWITCH_MEDIA_TYPE_AUDIO : SWITCH_MEDIA_TYPE_VIDEO, imp->iananame, + imp->modname, NULL, sdp_type, smh->ianacodes[i], @@ -7957,6 +7970,7 @@ SWITCH_DECLARE(void) switch_core_media_patch_sdp(switch_core_session_t *session) SWITCH_MEDIA_TYPE_AUDIO, "PROXY", NULL, + NULL, SDP_TYPE_RESPONSE, 0, 8000, @@ -8113,6 +8127,7 @@ SWITCH_DECLARE(void) switch_core_media_patch_sdp(switch_core_session_t *session) SWITCH_MEDIA_TYPE_AUDIO, "PROXY-VID", NULL, + NULL, SDP_TYPE_RESPONSE, 0, 90000, @@ -8949,7 +8964,7 @@ SWITCH_DECLARE(void) switch_core_media_set_sdp_codec_string(switch_core_session_ } -static void add_audio_codec(sdp_rtpmap_t *map, int ptime, char *buf, switch_size_t buflen) +static void add_audio_codec(sdp_rtpmap_t *map, const switch_codec_implementation_t *imp, int ptime, char *buf, switch_size_t buflen) { int codec_ms = ptime; uint32_t map_bit_rate = 0, map_channels = 1; @@ -9004,7 +9019,7 @@ static void add_audio_codec(sdp_rtpmap_t *map, int ptime, char *buf, switch_size switch_snprintf(bitstr, sizeof(bitstr), "@%dc", map_channels); } - switch_snprintf(buf + strlen(buf), buflen - strlen(buf), ",%s%s%s%s", map->rm_encoding, ratestr, ptstr, bitstr); + switch_snprintf(buf + strlen(buf), buflen - strlen(buf), ",%s.%s%s%s%s", imp->modname, map->rm_encoding, ratestr, ptstr, bitstr); } @@ -9084,6 +9099,7 @@ static void switch_core_media_set_r_sdp_codec_string(switch_core_session_t *sess switch_core_media_add_payload_map(session, m->m_type == sdp_media_audio ? SWITCH_MEDIA_TYPE_AUDIO : SWITCH_MEDIA_TYPE_VIDEO, map->rm_encoding, + NULL, map->rm_fmtp, sdp_type, map->rm_pt, @@ -9141,7 +9157,7 @@ static void switch_core_media_set_r_sdp_codec_string(switch_core_session_t *sess } if (match) { - add_audio_codec(map, ptime, buf, sizeof(buf)); + add_audio_codec(map, imp, ptime, buf, sizeof(buf)); break; } @@ -9171,7 +9187,7 @@ static void switch_core_media_set_r_sdp_codec_string(switch_core_session_t *sess } if (match) { - add_audio_codec(map, ptime, buf, sizeof(buf)); + add_audio_codec(map, imp, ptime, buf, sizeof(buf)); break; } } @@ -9190,7 +9206,6 @@ static void switch_core_media_set_r_sdp_codec_string(switch_core_session_t *sess } for (i = 0; i < num_codecs; i++) { const switch_codec_implementation_t *imp = codecs[i]; - int channels; if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO || imp->ianacode > 127 || already_did[imp->ianacode]) { continue; @@ -9218,13 +9233,7 @@ static void switch_core_media_set_r_sdp_codec_string(switch_core_session_t *sess } if (match) { - channels = map->rm_params ? atoi(map->rm_params) : 1; - if (ptime > 0) { - switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ",%s@%uh@%di@%dc", imp->iananame, (unsigned int) map->rm_rate, - ptime, channels); - } else { - switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ",%s@%uh@%dc", imp->iananame, (unsigned int) map->rm_rate, channels); - } + switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), ",%s.%s", imp->modname, imp->iananame); already_did[imp->ianacode] = 1; break; } @@ -9315,6 +9324,7 @@ SWITCH_DECLARE(void) switch_core_media_check_outgoing_proxy(switch_core_session_ SWITCH_MEDIA_TYPE_AUDIO, "PROXY", NULL, + NULL, SDP_TYPE_RESPONSE, 0, 8000, @@ -9330,6 +9340,7 @@ SWITCH_DECLARE(void) switch_core_media_check_outgoing_proxy(switch_core_session_ SWITCH_MEDIA_TYPE_AUDIO, "PROXY-VID", NULL, + NULL, SDP_TYPE_RESPONSE, 0, 90000, diff --git a/src/switch_core_session.c b/src/switch_core_session.c index e1ebce14d6..a3cfacd82e 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -97,6 +97,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_set_codec_slin(switch_core_s if (switch_core_codec_init(&data->codec, "L16", NULL, + NULL, read_impl.actual_samples_per_second, interval, read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, NULL) == SWITCH_STATUS_SUCCESS) { diff --git a/src/switch_ivr.c b/src/switch_ivr.c index c6e118abf9..beca50c3fa 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -62,6 +62,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_sound_test(switch_core_session_t *ses if (switch_core_codec_init(&codec, "L16", NULL, + NULL, imp.samples_per_second, imp.microseconds_per_packet / 1000, imp.number_of_channels, @@ -179,6 +180,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_sleep(switch_core_session_t *session, if (switch_core_codec_init(&codec, "L16", NULL, + NULL, imp.actual_samples_per_second, imp.microseconds_per_packet / 1000, imp.number_of_channels, @@ -436,6 +438,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_activate_unicast(switch_core_session_ if (switch_core_codec_init(&conninfo->read_codec, "L16", NULL, + NULL, read_codec->implementation->actual_samples_per_second, read_codec->implementation->microseconds_per_packet / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, @@ -953,6 +956,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_park(switch_core_session_t *session, if (switch_core_codec_init(&codec, "L16", NULL, + NULL, imp.actual_samples_per_second, imp.microseconds_per_packet / 1000, imp.number_of_channels, @@ -1297,6 +1301,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_sess if (switch_core_codec_init(&codec, "L16", NULL, + NULL, imp.samples_per_second, imp.microseconds_per_packet / 1000, imp.number_of_channels, diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index cb38710d31..76a9be6dd8 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -1843,6 +1843,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_eavesdrop_session(switch_core_session if (switch_core_codec_init(&codec, "L16", NULL, + NULL, tread_impl.actual_samples_per_second, tread_impl.microseconds_per_packet / 1000, tread_impl.number_of_channels, diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index f4089a195a..22bf827f26 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -312,6 +312,7 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj) if (switch_core_codec_init(&silence_codec, "L16", NULL, + NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, 1, diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 9e25ba0aef..cacab48fc1 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -922,6 +922,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_wait_for_answer(switch_core_session_t if (switch_core_codec_init(&write_codec, "L16", NULL, + NULL, read_codec->implementation->actual_samples_per_second, read_codec->implementation->microseconds_per_packet / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, @@ -1240,6 +1241,7 @@ static switch_status_t setup_ringback(originate_global_t *oglobals, originate_st if (switch_core_codec_init(write_codec, "L16", NULL, + NULL, peer_read_impl.actual_samples_per_second, peer_read_impl.microseconds_per_packet / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, @@ -1776,6 +1778,7 @@ static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void * if (switch_core_codec_init(&read_codecs[i], "L16", NULL, + NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, diff --git a/src/switch_ivr_play_say.c b/src/switch_ivr_play_say.c index 8ca3769a79..a691583a00 100644 --- a/src/switch_ivr_play_say.c +++ b/src/switch_ivr_play_say.c @@ -453,6 +453,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_file(switch_core_session_t *se if (switch_core_codec_init(&write_codec, "L16", NULL, + NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, read_impl.number_of_channels, @@ -600,6 +601,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_file(switch_core_session_t *se if (switch_core_codec_init(&codec, codec_name, NULL, + NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, read_impl.number_of_channels, @@ -873,6 +875,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_gentones(switch_core_session_t *sessi if (switch_core_codec_init(&write_codec, "L16", NULL, + NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, @@ -1336,6 +1339,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess if (switch_core_codec_init(&codec, codec_name, NULL, + NULL, fh->samplerate, interval, read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, pool) == SWITCH_STATUS_SUCCESS) { @@ -1896,6 +1900,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_wait_for_silence(switch_core_session_ if (switch_core_codec_init(&raw_codec, "L16", NULL, + NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, @@ -2605,6 +2610,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_speak_text(switch_core_session_t *ses if (need_create) { if (switch_core_codec_init(codec, codec_name, + NULL, NULL, (int) rate, interval, channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, pool) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Raw Codec Activated\n"); diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index de9a42d81b..193eb8fce0 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -46,6 +46,12 @@ typedef struct switch_file_node_s { const char *interface_name; struct switch_file_node_s *next; } switch_file_node_t; + +typedef struct switch_codec_node_s { + const switch_codec_interface_t *ptr; + const char *interface_name; + struct switch_codec_node_s *next; +} switch_codec_node_t; struct switch_loadable_module { @@ -176,6 +182,8 @@ static switch_status_t switch_loadable_module_process(char *key, switch_loadable switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Failed to load codec interface from %s due to no interface name.\n", key); } else { unsigned load_interface = 1; + switch_codec_node_t *node, *head; + for (impl = ptr->implementations; impl; impl = impl->next) { if (!impl->iananame) { load_interface = 0; @@ -207,15 +215,23 @@ static switch_status_t switch_loadable_module_process(char *key, switch_loadable impl->iananame, impl->ianacode, ptr->interface_name, impl->actual_samples_per_second, impl->microseconds_per_packet / 1000); } - if (!switch_core_hash_find(loadable_modules.codec_hash, impl->iananame)) { - switch_core_hash_insert(loadable_modules.codec_hash, impl->iananame, (const void *) ptr); + + node = switch_core_alloc(new_module->pool, sizeof(*node)); + node->ptr = ptr; + node->interface_name = switch_core_strdup(new_module->pool, new_module->module_interface->module_name); + if ((head = switch_core_hash_find(loadable_modules.codec_hash, impl->iananame))) { + node->next = head; } + + switch_core_hash_insert(loadable_modules.codec_hash, impl->iananame, (const void *) node); } + if (switch_event_create(&event, SWITCH_EVENT_MODULE_LOAD) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "type", "codec"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "name", ptr->interface_name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "key", new_module->key); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "filename", new_module->filename); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "module", new_module->module_interface->module_name); switch_event_fire(&event); added++; } @@ -946,6 +962,7 @@ static switch_status_t switch_loadable_module_unprocess(switch_loadable_module_t if (old_module->module_interface->codec_interface) { const switch_codec_implementation_t *impl; const switch_codec_interface_t *ptr; + switch_codec_node_t *node, *head, *last = NULL; for (ptr = old_module->module_interface->codec_interface; ptr; ptr = ptr->next) { if (ptr->interface_name) { @@ -964,13 +981,31 @@ static switch_status_t switch_loadable_module_unprocess(switch_loadable_module_t ptr->interface_name, impl->actual_samples_per_second, impl->microseconds_per_packet / 1000); switch_core_session_hupall_matching_var("read_codec", impl->iananame, SWITCH_CAUSE_MANAGER_REQUEST); switch_core_session_hupall_matching_var("write_codec", impl->iananame, SWITCH_CAUSE_MANAGER_REQUEST); - if (switch_core_hash_find(loadable_modules.codec_hash, impl->iananame)) { - switch_core_hash_delete(loadable_modules.codec_hash, impl->iananame); + + if ((head = switch_core_hash_find(loadable_modules.codec_hash, impl->iananame))) { + for(node = head; node; node = node->next) { + if (!strcmp(node->interface_name, old_module->module_interface->module_name)) { + if (node == head) { + if ((node = node->next)) { + switch_core_hash_insert(loadable_modules.codec_hash, impl->iananame, (const void *) node); + } else { + switch_core_hash_delete(loadable_modules.codec_hash, impl->iananame); + } + } else { + if (last) { + last->next = node->next; + } + } + break; + } + last = node; + } } } if (switch_event_create(&event, SWITCH_EVENT_MODULE_UNLOAD) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "type", "codec"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "name", ptr->interface_name); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "module", old_module->module_interface->module_name); switch_event_fire(&event); removed++; } @@ -2106,24 +2141,26 @@ SWITCH_DECLARE(switch_file_interface_t *) switch_loadable_module_get_file_interf return i; } -SWITCH_DECLARE(switch_codec_interface_t *) switch_loadable_module_get_codec_interface(const char *name) +SWITCH_DECLARE(switch_codec_interface_t *) switch_loadable_module_get_codec_interface(const char *name, const char *modname) { - char altname[256] = ""; - switch_codec_interface_t *codec; - switch_size_t x; + switch_codec_interface_t *codec = NULL; + switch_codec_node_t *node, *head; switch_mutex_lock(loadable_modules.mutex); - if (!(codec = switch_core_hash_find(loadable_modules.codec_hash, name))) { - for (x = 0; x < strlen(name); x++) { - altname[x] = (char) toupper((int) name[x]); - } - if (!(codec = switch_core_hash_find(loadable_modules.codec_hash, altname))) { - for (x = 0; x < strlen(name); x++) { - altname[x] = (char) tolower((int) name[x]); + + if ((head = switch_core_hash_find(loadable_modules.codec_hash, name))) { + if (modname) { + for (node = head; node; node = node->next) { + if (!strcasecmp(node->interface_name, modname)) { + codec = (switch_codec_interface_t *) node->ptr; + break; + } } - codec = switch_core_hash_find(loadable_modules.codec_hash, altname); + } else { + codec = (switch_codec_interface_t *) head->ptr; } } + switch_mutex_unlock(loadable_modules.mutex); if (codec) { @@ -2259,29 +2296,35 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs(const switch_codec_impleme switch_codec_interface_t *codec_interface; int i = 0; const switch_codec_implementation_t *imp; + switch_codec_node_t *node, *head; switch_mutex_lock(loadable_modules.mutex); for (hi = switch_core_hash_first(loadable_modules.codec_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); - codec_interface = (switch_codec_interface_t *) val; + head = (switch_codec_node_t *) val; - /* Look for the default ptime of the codec because it's the safest choice */ - for (imp = codec_interface->implementations; imp; imp = imp->next) { - uint32_t default_ptime = switch_default_ptime(imp->iananame, imp->ianacode); + for (node = head; node; node = node->next) { + codec_interface = (switch_codec_interface_t *) node->ptr; - if (imp->microseconds_per_packet / 1000 == (int)default_ptime) { - array[i++] = imp; - goto found; + /* Look for the default ptime of the codec because it's the safest choice */ + for (imp = codec_interface->implementations; imp; imp = imp->next) { + uint32_t default_ptime = switch_default_ptime(imp->iananame, imp->ianacode); + + if (imp->microseconds_per_packet / 1000 == (int)default_ptime) { + array[i++] = imp; + goto found; + } } + /* oh well we will use what we have */ + array[i++] = codec_interface->implementations; } - /* oh well we will use what we have */ - array[i++] = codec_interface->implementations; - - found: + found: + if (i > arraylen) { break; } + } switch_safe_free(hi); @@ -2293,7 +2336,7 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs(const switch_codec_impleme } -SWITCH_DECLARE(char *) switch_parse_codec_buf(char *buf, uint32_t *interval, uint32_t *rate, uint32_t *bit, uint32_t *channels) +SWITCH_DECLARE(char *) switch_parse_codec_buf(char *buf, uint32_t *interval, uint32_t *rate, uint32_t *bit, uint32_t *channels, char **modname) { char *cur, *next = NULL, *name, *p; @@ -2327,6 +2370,12 @@ SWITCH_DECLARE(char *) switch_parse_codec_buf(char *buf, uint32_t *interval, uin cur = next; } + if ((p = strchr(name, '.'))) { + *p++ = '\0'; + *modname = name; + name = p; + } + return name; } @@ -2339,14 +2388,14 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_ switch_mutex_lock(loadable_modules.mutex); for (x = 0; x < preflen; x++) { - char *name, buf[256], jbuf[256]; + char *name, buf[256], jbuf[256], *modname = NULL; uint32_t interval = 0, rate = 0, bit = 0, channels = 1; switch_copy_string(buf, prefs[x], sizeof(buf)); - name = switch_parse_codec_buf(buf, &interval, &rate, &bit, &channels); + name = switch_parse_codec_buf(buf, &interval, &rate, &bit, &channels, &modname); for(j = 0; j < x; j++) { - char *jname; + char *jname, *jmodname = NULL; uint32_t jinterval = 0, jrate = 0, jbit = 0, jchannels = 1; uint32_t ointerval = interval, orate = rate, ochannels = channels; @@ -2363,7 +2412,7 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_ } switch_copy_string(jbuf, prefs[j], sizeof(jbuf)); - jname = switch_parse_codec_buf(jbuf, &jinterval, &jrate, &jbit, &jchannels); + jname = switch_parse_codec_buf(jbuf, &jinterval, &jrate, &jbit, &jchannels, &jmodname); if (jinterval == 0) { jinterval = switch_default_ptime(jname, 0); @@ -2382,7 +2431,7 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs_sorted(const switch_codec_ } } - if ((codec_interface = switch_loadable_module_get_codec_interface(name)) != 0) { + if ((codec_interface = switch_loadable_module_get_codec_interface(name, modname)) != 0) { /* If no specific codec interval is requested opt for the default above all else because lots of stuff assumes it */ for (imp = codec_interface->implementations; imp; imp = imp->next) { uint32_t default_ptime = switch_default_ptime(imp->iananame, imp->ianacode); diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 60ad95a7ef..4ccc41cf5d 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -7107,6 +7107,7 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_enable_vad(switch_rtp_t *rtp_session, if (switch_core_codec_init(&rtp_session->vad_data.vad_codec, codec->implementation->iananame, + codec->implementation->modname, NULL, codec->implementation->samples_per_second, codec->implementation->microseconds_per_packet / 1000,