*/
SWITCH_DECLARE(switch_status_t) switch_core_session_exec(_In_ switch_core_session_t *session,
_In_ const switch_application_interface_t *application_interface, _In_opt_z_ const char *arg);
+
+SWITCH_DECLARE(void) switch_core_session_video_reset(switch_core_session_t *session);
/*!
\brief Execute an application on a session
\param session the current session
switch_channel_set_app_flag_key("conf_silent", channel, CONF_SILENT_REQ);
}
+ switch_core_session_video_reset(session);
+
switch_channel_set_flag(channel, CF_CONFERENCE);
if (switch_channel_answer(channel) != SWITCH_STATUS_SUCCESS) {
switch_channel_clear_flag(channel, CF_CONFERENCE);
+ switch_core_session_video_reset(session);
}
/* Create a thread for the conference and launch it */
switch_assert(engine->rtp_session != NULL);
engine->read_frame.datalen = 0;
+ if (!switch_channel_up_nosig(session->channel) || !switch_rtp_ready(engine->rtp_session) || switch_channel_test_flag(session->channel, CF_NOT_READY)) {
+ return SWITCH_STATUS_FALSE;
+ }
+
if (switch_mutex_trylock(engine->read_mutex) != SWITCH_STATUS_SUCCESS) {
- /* return CNG for now */
+ /* return CNG, another thread is already reading */
*frame = &engine->read_frame;
switch_set_flag((*frame), SFF_CNG);
(*frame)->datalen = engine->read_impl.encoded_bytes_per_packet;
memset((*frame)->data, 0, (*frame)->datalen);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG1, "%s is already being read for %s\n",
+ switch_channel_get_name(session->channel), type2str(type));
+ switch_yield(10000);
return SWITCH_STATUS_SUCCESS;
}
return SWITCH_STATUS_FALSE;
}
+SWITCH_DECLARE(void) switch_core_session_video_reset(switch_core_session_t *session)
+{
+ if (switch_channel_test_flag(session->channel, CF_VIDEO)) {
+ switch_channel_set_flag(session->channel, CF_VIDEO_ECHO);
+ switch_channel_clear_flag(session->channel, CF_VIDEO_PASSIVE);
+ switch_core_session_refresh_video(session);
+ }
+}
SWITCH_DECLARE(switch_status_t) switch_core_session_execute_application_get_flags(switch_core_session_t *session, const char *app,
const char *arg, int32_t *flags)
msg.string_array_arg[1] = expanded;
switch_core_session_receive_message(session, &msg);
- if (switch_channel_test_flag(channel, CF_VIDEO)) {
- switch_channel_set_flag(channel, CF_VIDEO_ECHO);
- switch_channel_clear_flag(channel, CF_VIDEO_PASSIVE);
- switch_core_session_refresh_video(session);
- }
-
application_interface->application_function(session, expanded);
- if (switch_channel_test_flag(channel, CF_VIDEO)) {
- switch_channel_set_flag(channel, CF_VIDEO_ECHO);
- switch_channel_clear_flag(channel, CF_VIDEO_PASSIVE);
- switch_core_session_refresh_video(session);
- }
if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE) == SWITCH_STATUS_SUCCESS) {
const char *resp = switch_channel_get_variable(session->channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE);
switch_channel_event_set_data(session->channel, event);
top:
switch_channel_clear_flag(session->channel, CF_RESET);
+
+ switch_core_session_video_reset(session);
if ((extension = switch_channel_get_caller_extension(session->channel)) == 0) {
switch_channel_hangup(session->channel, SWITCH_CAUSE_NORMAL_CLEARING);
if (!switch_stristr("loopback", source) && !switch_stristr("loopback", b_source)) {
switch_channel_set_flag(channel, CF_VIDEO_PASSIVE);
- switch_channel_set_flag(b_channel, CF_VIDEO_PASSIVE);
+ //switch_channel_set_flag(b_channel, CF_VIDEO_PASSIVE);
}
switch_core_session_refresh_video(vh->session_a);
}
switch_channel_clear_flag(channel, CF_VIDEO_PASSIVE);
- switch_channel_clear_flag(b_channel, CF_VIDEO_PASSIVE);
+ //switch_channel_clear_flag(b_channel, CF_VIDEO_PASSIVE);
switch_core_session_kill_channel(vh->session_b, SWITCH_SIG_BREAK);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(vh->session_a), SWITCH_LOG_DEBUG, "%s video thread ended.\n", switch_channel_get_name(channel));
if (vid_thread) {
switch_status_t st;
- if (vh.up) {
+ if (vh.up == 1) {
+ vh.up = -1;
switch_core_session_kill_channel(session_a, SWITCH_SIG_BREAK);
switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK);
}