From 27fc3518bd81aafcd2b4bc68141fadd8e5ae489a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 4 May 2010 16:03:15 -0500 Subject: [PATCH] reset codecs after media bugs --- src/include/private/switch_core_pvt.h | 6 +++- src/include/switch_core.h | 1 + src/switch_core_codec.c | 11 ++++++ src/switch_core_io.c | 49 +++++++++++++++++++++++++-- src/switch_core_media_bug.c | 5 +++ 5 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/include/private/switch_core_pvt.h b/src/include/private/switch_core_pvt.h index 12fd3209c6..882c3c331a 100644 --- a/src/include/private/switch_core_pvt.h +++ b/src/include/private/switch_core_pvt.h @@ -94,7 +94,11 @@ typedef enum { SSF_WARN_TRANSCODE = (1 << 1), SSF_HANGUP = (1 << 2), SSF_THREAD_STARTED = (1 << 3), - SSF_THREAD_RUNNING = (1 << 4) + SSF_THREAD_RUNNING = (1 << 4), + SSF_READ_TRANSCODE = (1 << 5), + SSF_WRITE_TRANSCODE = (1 << 6), + SSF_READ_CODEC_RESET = (1 << 7), + SSF_WRITE_CODEC_RESET = (1 << 8) } switch_session_flag_t; diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 7cfc102dad..c75b1868d5 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -1329,6 +1329,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_init(switch_codec_t *codec, 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, switch_memory_pool_t *pool); +SWITCH_DECLARE(switch_status_t) switch_core_codec_reset(switch_codec_t *codec); /*! \brief Encode data using a codec handle diff --git a/src/switch_core_codec.c b/src/switch_core_codec.c index 9a78c5a5f3..d8fdeeca43 100644 --- a/src/switch_core_codec.c +++ b/src/switch_core_codec.c @@ -455,6 +455,17 @@ SWITCH_DECLARE(switch_codec_t *) switch_core_session_get_video_write_codec(switc } +SWITCH_DECLARE(switch_status_t) switch_core_codec_reset(switch_codec_t *codec) +{ + switch_assert(codec != NULL); + + codec->implementation->destroy(codec); + codec->implementation->init(codec, codec->flags, NULL); + + return SWITCH_STATUS_SUCCESS; +} + + SWITCH_DECLARE(switch_status_t) switch_core_codec_copy(switch_codec_t *codec, switch_codec_t *new_codec, switch_memory_pool_t *pool) { switch_status_t status; diff --git a/src/switch_core_io.c b/src/switch_core_io.c index 4d7e0d52cf..b20ea0c4e9 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -214,8 +214,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi if (session->read_codec->implementation->impl_id != codec_impl.impl_id) { need_codec = TRUE; - } - + } + if (codec_impl.actual_samples_per_second != session->read_impl.actual_samples_per_second) { do_resample = 1; } @@ -225,9 +225,34 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi need_codec = 1; } + if (switch_test_flag(session, SSF_READ_TRANSCODE) && !need_codec && switch_core_codec_ready(session->read_codec)) { + switch_core_session_t *other_session; + const char *uuid = switch_channel_get_variable(switch_core_session_get_channel(session), SWITCH_SIGNAL_BOND_VARIABLE); + switch_clear_flag(session, SSF_READ_TRANSCODE); + + if (uuid && (other_session = switch_core_session_locate(uuid))) { + switch_set_flag(other_session, SSF_READ_CODEC_RESET); + switch_set_flag(other_session, SSF_READ_CODEC_RESET); + switch_set_flag(other_session, SSF_WRITE_CODEC_RESET); + switch_core_session_rwunlock(other_session); + } + } + + if (switch_test_flag(session, SSF_READ_CODEC_RESET)) { + switch_core_codec_reset(session->read_codec); + switch_clear_flag(session, SSF_READ_CODEC_RESET); + } + + + + + + if (status == SWITCH_STATUS_SUCCESS && need_codec) { switch_frame_t *enc_frame, *read_frame = *frame; + switch_set_flag(session, SSF_READ_TRANSCODE); + if (!switch_test_flag(session, SSF_WARN_TRANSCODE)) { switch_core_session_message_t msg = { 0 }; @@ -640,6 +665,26 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess do_resample = TRUE; } + if (switch_test_flag(session, SSF_WRITE_TRANSCODE) && !need_codec && switch_core_codec_ready(session->write_codec)) { + switch_core_session_t *other_session; + const char *uuid = switch_channel_get_variable(switch_core_session_get_channel(session), SWITCH_SIGNAL_BOND_VARIABLE); + + if (uuid && (other_session = switch_core_session_locate(uuid))) { + switch_set_flag(other_session, SSF_READ_CODEC_RESET); + switch_set_flag(other_session, SSF_READ_CODEC_RESET); + switch_set_flag(other_session, SSF_WRITE_CODEC_RESET); + switch_core_session_rwunlock(other_session); + } + + switch_clear_flag(session, SSF_WRITE_TRANSCODE); + } + + + if (switch_test_flag(session, SSF_WRITE_CODEC_RESET)) { + switch_core_codec_reset(session->write_codec); + switch_clear_flag(session, SSF_WRITE_CODEC_RESET); + } + if (!need_codec) { do_write = TRUE; write_frame = frame; diff --git a/src/switch_core_media_bug.c b/src/switch_core_media_bug.c index 0f6738fdd2..b2bf1d0e59 100644 --- a/src/switch_core_media_bug.c +++ b/src/switch_core_media_bug.c @@ -47,6 +47,11 @@ static void switch_core_media_bug_destroy(switch_media_bug_t *bug) switch_buffer_destroy(&bug->raw_write_buffer); } + if (switch_core_codec_ready(&bug->session->bug_codec)) { + switch_core_codec_destroy(&bug->session->bug_codec); + memset(&bug->session->bug_codec, 0, sizeof(bug->session->bug_codec)); + } + if (switch_event_create(&event, SWITCH_EVENT_MEDIA_BUG_STOP) == SWITCH_STATUS_SUCCESS) { switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Media-Bug-Function", "%s", bug->function); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Media-Bug-Target", "%s", bug->target);