From bce387e537e9fad0bf329ff640d7d128b986ec56 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 24 Oct 2016 13:36:15 -0500 Subject: [PATCH] FS-9665 #resolve [Add video_pre_call_banner feature] Conflicts: src/switch_ivr_bridge.c --- src/include/switch_types.h | 3 +- src/mod/formats/mod_png/mod_png.c | 16 ++++++---- src/switch_core_io.c | 4 +-- src/switch_core_media.c | 6 ++-- src/switch_ivr_bridge.c | 50 +++++++++++++++++++++++++++++-- 5 files changed, 65 insertions(+), 14 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index cdd7cc58c1..576c614935 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1498,7 +1498,8 @@ typedef enum { CF_VIDEO_WRITING, CF_SLA_INTERCEPT, CF_VIDEO_BREAK, - CF_AUDIO_PAUSE, + CF_AUDIO_PAUSE_READ, + CF_AUDIO_PAUSE_WRITE, CF_VIDEO_PAUSE_READ, CF_VIDEO_PAUSE_WRITE, CF_BYPASS_MEDIA_AFTER_HOLD, diff --git a/src/mod/formats/mod_png/mod_png.c b/src/mod/formats/mod_png/mod_png.c index 644e2bda4f..a7edbdf129 100644 --- a/src/mod/formats/mod_png/mod_png.c +++ b/src/mod/formats/mod_png/mod_png.c @@ -181,6 +181,7 @@ static switch_status_t png_file_read_video(switch_file_handle_t *handle, switch_ { png_file_context_t *context = (png_file_context_t *)handle->private_info; switch_image_t *dup = NULL; + int have_frame = 0; if ((flags & SVR_CHECK)) { return SWITCH_STATUS_BREAK; @@ -190,18 +191,21 @@ static switch_status_t png_file_read_video(switch_file_handle_t *handle, switch_ return SWITCH_STATUS_FALSE; } - if ((context->reads++ % 20) == 0) { + if ((flags && SVR_BLOCK)) { + switch_yield(33000); + have_frame = 1; + } else if ((context->reads++ % 20) == 0) { + have_frame = 1; + } + + if (have_frame) { switch_img_copy(context->img, &dup); frame->img = dup; context->sent++; + return SWITCH_STATUS_SUCCESS; } else { - if ((flags && SVR_BLOCK)) { - switch_yield(5000); - } return SWITCH_STATUS_BREAK; } - - return SWITCH_STATUS_SUCCESS; } typedef struct { diff --git a/src/switch_core_io.c b/src/switch_core_io.c index 924b358af6..3532ea2141 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -97,7 +97,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi return SWITCH_STATUS_SUCCESS; } - if (switch_channel_test_flag(session->channel, CF_AUDIO_PAUSE)) { + if (switch_channel_test_flag(session->channel, CF_AUDIO_PAUSE_READ)) { switch_yield(20000); *frame = &runtime.dummy_cng_frame; // switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Media Paused!!!!\n"); @@ -1039,7 +1039,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess } } - if (switch_channel_test_flag(session->channel, CF_AUDIO_PAUSE)) { + if (switch_channel_test_flag(session->channel, CF_AUDIO_PAUSE_WRITE)) { return SWITCH_STATUS_SUCCESS; } diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 9957ad8cdc..aecc8a6296 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -3790,7 +3790,8 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s return 0; } - switch_channel_clear_flag(channel, CF_AUDIO_PAUSE); + switch_channel_clear_flag(channel, CF_AUDIO_PAUSE_READ); + switch_channel_clear_flag(channel, CF_AUDIO_PAUSE_WRITE); if (dtls_ok(session) && (tmp = switch_channel_get_variable(smh->session->channel, "webrtc_enable_dtls")) && switch_false(tmp)) { switch_channel_clear_flag(smh->session->channel, CF_DTLS_OK); @@ -5025,7 +5026,8 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s pmap->recv_pt = 97; pmap->codec_ms = 20; a_engine->cur_payload_map = pmap; - switch_channel_set_flag(channel, CF_AUDIO_PAUSE); + switch_channel_set_flag(channel, CF_AUDIO_PAUSE_READ); + switch_channel_set_flag(channel, CF_AUDIO_PAUSE_WRITE); } diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index bc42bcf8f2..21214b6263 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -55,7 +55,7 @@ static void video_bridge_thread(switch_core_session_t *session, void *obj) switch_frame_t *read_frame = 0; int set_decoded_read = 0, refresh_timer = 0; int refresh_cnt = 300; - + vh->up = 1; switch_core_session_read_lock(vh->session_a); @@ -107,13 +107,14 @@ static void video_bridge_thread(switch_core_session_t *session, void *obj) } status = switch_core_session_read_video_frame(vh->session_a, &read_frame, SWITCH_IO_FLAG_NONE, 0); - + if (!SWITCH_READ_ACCEPTABLE(status)) { switch_cond_next(); continue; } } + if (switch_test_flag(read_frame, SFF_CNG) || switch_channel_test_flag(channel, CF_LEG_HOLDING) || switch_channel_test_flag(b_channel, CF_VIDEO_READ_FILE_ATTACHED)) { continue; @@ -257,6 +258,8 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj) const char *exec_app = NULL; const char *exec_data = NULL; switch_codec_implementation_t read_impl = { 0 }; + const char *banner_file = NULL; + int played_banner = 0, banner_counter = 0; #ifdef SWITCH_VIDEO_IN_THREADS struct vid_helper vh = { 0 }; @@ -271,7 +274,6 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj) switch_core_session_get_read_impl(session_a, &read_impl); - input_callback = data->input_callback; user_data = data->session_data; stream_id = data->stream_id; @@ -318,6 +320,17 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj) goto end_of_bridge_loop; } + + if (switch_channel_test_flag(chan_a, CF_BRIDGE_ORIGINATOR) && (banner_file = switch_channel_get_variable(chan_a, "video_pre_call_banner"))) { + switch_channel_set_flag(chan_a, CF_AUDIO_PAUSE_READ); + switch_channel_set_flag(chan_b, CF_AUDIO_PAUSE_READ); + switch_channel_set_flag(chan_a, CF_AUDIO_PAUSE_WRITE); + switch_channel_set_flag(chan_b, CF_AUDIO_PAUSE_WRITE); + switch_channel_set_flag(chan_a, CF_VIDEO_PAUSE_READ); + switch_channel_set_flag(chan_b, CF_VIDEO_PAUSE_READ); + } + + if (bypass_media_after_bridge) { const char *source_a = switch_channel_get_variable(chan_a, "source"); const char *source_b = switch_channel_get_variable(chan_b, "source"); @@ -455,6 +468,37 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj) #endif if (read_frame_count >= DEFAULT_LEAD_FRAMES && switch_channel_media_ack(chan_a)) { + if (!played_banner && switch_channel_test_flag(chan_a, CF_VIDEO) && switch_channel_test_flag(chan_b, CF_VIDEO) && + switch_channel_test_flag(chan_a, CF_ANSWERED) && switch_channel_test_flag(chan_b, CF_ANSWERED) && + ++banner_counter > 100 && + switch_channel_test_flag(chan_a, CF_VIDEO_READY) && switch_channel_test_flag(chan_b, CF_VIDEO_READY) && + switch_channel_test_flag(chan_a, CF_BRIDGE_ORIGINATOR) && banner_file) { + const char *b_banner_file = switch_channel_get_variable(chan_b, "video_pre_call_banner"); + + if (!b_banner_file) { + b_banner_file = switch_channel_get_variable(chan_a, "video_pre_call_banner_bleg"); + } + + + switch_channel_clear_flag(chan_a, CF_VIDEO_PAUSE_READ); + switch_channel_clear_flag(chan_b, CF_VIDEO_PAUSE_READ); + + if (b_banner_file) { + switch_ivr_broadcast(switch_core_session_get_uuid(session_a), banner_file, SMF_ECHO_ALEG); + switch_ivr_broadcast(switch_core_session_get_uuid(session_b), b_banner_file, SMF_ECHO_ALEG); + } else { + switch_ivr_broadcast(switch_core_session_get_uuid(session_a), banner_file, SMF_ECHO_ALEG | SMF_ECHO_BLEG); + } + + played_banner = 1; + + switch_channel_clear_flag(chan_a, CF_AUDIO_PAUSE_READ); + switch_channel_clear_flag(chan_b, CF_AUDIO_PAUSE_READ); + switch_channel_clear_flag(chan_a, CF_AUDIO_PAUSE_WRITE); + switch_channel_clear_flag(chan_b, CF_AUDIO_PAUSE_WRITE); + } + + if (!exec_check) { switch_channel_execute_on(chan_a, SWITCH_CHANNEL_EXECUTE_ON_PRE_BRIDGE_VARIABLE);