Modified: freeswitch/trunk/src/switch_ivr_bridge.c (15552 => 15553)
--- freeswitch/trunk/src/switch_ivr_bridge.c 2009-11-19 17:49:43 UTC (rev 15552)
+++ freeswitch/trunk/src/switch_ivr_bridge.c 2009-11-19 18:22:05 UTC (rev 15553)
@@ -48,13 +48,13 @@
{
struct vid_helper *vh = obj;
switch_channel_t *channel = switch_core_session_get_channel(vh->session_a);
+ switch_channel_t *b_channel = switch_core_session_get_channel(vh->session_b);
switch_status_t status;
switch_frame_t *read_frame;
vh->up = 1;
- while (switch_channel_ready(channel) && vh->up == 1) {
+ while (switch_channel_ready(channel) && switch_channel_ready(b_channel) && vh->up == 1) {
status = switch_core_session_read_video_frame(vh->session_a, &read_frame, SWITCH_IO_FLAG_NONE, 0);
-
if (!SWITCH_READ_ACCEPTABLE(status)) {
break;
}
@@ -67,8 +67,10 @@
}
+ switch_core_session_kill_channel(vh->session_b, SWITCH_SIG_BREAK);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s video thread ended.\n", switch_channel_get_name(channel));
+
vh->up = 0;
return NULL;
}
@@ -472,6 +474,18 @@
end_of_bridge_loop:
+#ifdef SWITCH_VIDEO_IN_THREADS
+ if (vid_thread) {
+ vh.up = -1;
+ switch_channel_set_flag(chan_a, CF_NOT_READY);
+ switch_channel_set_flag(chan_b, CF_NOT_READY);
+ switch_core_session_kill_channel(session_a, SWITCH_SIG_BREAK);
+ switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Ending video thread.\n");
+ }
+#endif
+
+
if (silence_val) {
switch_core_codec_destroy(&silence_codec);
}
@@ -530,11 +544,15 @@
#ifdef SWITCH_VIDEO_IN_THREADS
if (vid_thread) {
switch_status_t st;
- vh.up = -1;
- switch_core_session_kill_channel(session_a, SWITCH_SIG_BREAK);
- switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK);
+
+ if (vh.up) {
+ switch_core_session_kill_channel(session_a, SWITCH_SIG_BREAK);
+ switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK);
+ }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Ending video thread.\n");
switch_thread_join(&st, vid_thread);
+ switch_channel_clear_flag(chan_a, CF_NOT_READY);
+ switch_channel_clear_flag(chan_b, CF_NOT_READY);
}
#endif
Modified: freeswitch/trunk/src/switch_rtp.c (15552 => 15553)
--- freeswitch/trunk/src/switch_rtp.c 2009-11-19 17:49:43 UTC (rev 15552)
+++ freeswitch/trunk/src/switch_rtp.c 2009-11-19 18:22:05 UTC (rev 15553)
@@ -1861,6 +1861,9 @@
poll_loop = 1;
rtp_session->missed_count += (poll_sec * 1000 ) / (rtp_session->ms_per_packet ? rtp_session->ms_per_packet : 20 / 1000);
bytes = 0;
+ if (rtp_session->dtmf_data.out_digit_dur == 0 || switch_test_flag(rtp_session, SWITCH_RTP_FLAG_VIDEO)) {
+ return_cng_frame();
+ }
}
if (bytes < 0) {