From de8c37975bd2ff913d54a556b73b20ced2ff0620 Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthm@freeswitch.org>
Date: Mon, 13 Mar 2017 14:50:28 -0500
Subject: [PATCH] FS-10131: [freeswitch-core] Incorrect video decode flags in
 some places #resolve

---
 src/mod/applications/mod_av/avformat.c               |  4 +++-
 src/mod/applications/mod_conference/mod_conference.c |  5 ++++-
 src/mod/applications/mod_cv/mod_cv.cpp               |  5 +++--
 src/mod/applications/mod_fsv/mod_fsv.c               |  5 ++++-
 .../applications/mod_video_filter/mod_video_filter.c |  2 --
 src/mod/formats/mod_vlc/mod_vlc.c                    |  3 ++-
 src/switch_ivr_async.c                               | 12 ++++++++----
 7 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/mod/applications/mod_av/avformat.c b/src/mod/applications/mod_av/avformat.c
index 2d2086d178..725c59fb5c 100644
--- a/src/mod/applications/mod_av/avformat.c
+++ b/src/mod/applications/mod_av/avformat.c
@@ -844,7 +844,7 @@ SWITCH_STANDARD_APP(record_av_function)
 		goto done;
 	}
 
-	switch_channel_set_flag(channel, CF_VIDEO_DECODED_READ);
+	switch_channel_set_flag_recursive(channel, CF_VIDEO_DECODED_READ);
 	switch_core_media_get_vid_params(session, &vid_params);
 	switch_channel_set_flag(channel, CF_VIDEO_ECHO);
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "video size: %dx%d\n", vid_params.width, vid_params.height);
@@ -1120,6 +1120,8 @@ SWITCH_STANDARD_APP(record_av_function)
 
   end:
 
+	switch_channel_clear_flag_recursive(channel, CF_VIDEO_DECODED_READ);
+
 	if (fc) {
 		if (has_video) close_stream(fc, &video_st);
 		if (has_audio) close_stream(fc, &audio_st);
diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c
index f2efabcdd5..c50a36955c 100644
--- a/src/mod/applications/mod_conference/mod_conference.c
+++ b/src/mod/applications/mod_conference/mod_conference.c
@@ -2357,7 +2357,7 @@ SWITCH_STANDARD_APP(conference_function)
 	switch_core_session_receive_message(session, &msg);
 
 	if (conference_utils_test_flag(conference, CFLAG_TRANSCODE_VIDEO)) {
-		switch_channel_set_flag(channel, CF_VIDEO_DECODED_READ);
+		switch_channel_set_flag_recursive(channel, CF_VIDEO_DECODED_READ);
 		switch_core_media_gen_key_frame(session);
 	}
 
@@ -2377,6 +2377,9 @@ SWITCH_STANDARD_APP(conference_function)
 		} while (member.loop_loop);
 	}
 
+	switch_core_session_video_reset(session);
+	switch_channel_clear_flag_recursive(channel, CF_VIDEO_DECODED_READ);
+
 	switch_core_session_set_video_read_callback(session, NULL, NULL);
 	switch_core_session_set_text_read_callback(session, NULL, NULL);
 
diff --git a/src/mod/applications/mod_cv/mod_cv.cpp b/src/mod/applications/mod_cv/mod_cv.cpp
index dfedd930de..b0ba33b974 100644
--- a/src/mod/applications/mod_cv/mod_cv.cpp
+++ b/src/mod/applications/mod_cv/mod_cv.cpp
@@ -1182,6 +1182,9 @@ SWITCH_STANDARD_APP(cv_start_function)
 
     switch_core_session_set_video_read_callback(session, NULL, NULL);
 
+    switch_channel_clear_flag_recursive(channel, CF_VIDEO_DECODED_READ);
+    switch_channel_clear_flag_recursive(channel, CF_VIDEO_ECHO);
+
     uninit_context(&context);
 
     switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
@@ -1200,13 +1203,11 @@ static switch_bool_t cv_bug_callback(switch_media_bug_t *bug, void *user_data, s
     switch (type) {
     case SWITCH_ABC_TYPE_INIT:
         {
-            switch_channel_set_flag_recursive(channel, CF_VIDEO_DECODED_READ);
         }
         break;
     case SWITCH_ABC_TYPE_CLOSE:
         {
             switch_thread_rwlock_unlock(MODULE_INTERFACE->rwlock);
-            switch_channel_clear_flag_recursive(channel, CF_VIDEO_DECODED_READ);
             uninit_context(context);
         }
         break;
diff --git a/src/mod/applications/mod_fsv/mod_fsv.c b/src/mod/applications/mod_fsv/mod_fsv.c
index 7408767719..9327c515dd 100644
--- a/src/mod/applications/mod_fsv/mod_fsv.c
+++ b/src/mod/applications/mod_fsv/mod_fsv.c
@@ -749,7 +749,7 @@ SWITCH_STANDARD_APP(decode_video_function)
 	switch_channel_answer(channel);
 	switch_core_session_request_video_refresh(session);
 
-	switch_channel_set_flag(channel, CF_VIDEO_DECODED_READ);
+	switch_channel_set_flag_recursive(channel, CF_VIDEO_DECODED_READ);
 
 	switch_core_media_start_engine_function(session, SWITCH_MEDIA_TYPE_VIDEO, decode_video_thread, &max_pictures);
 
@@ -764,6 +764,9 @@ SWITCH_STANDARD_APP(decode_video_function)
 
 	switch_core_media_end_engine_function(session, SWITCH_MEDIA_TYPE_VIDEO);
 	switch_core_session_video_reset(session);
+	switch_channel_clear_flag_recursive(channel, CF_VIDEO_DECODED_READ);
+
+
 }
 
 
diff --git a/src/mod/applications/mod_video_filter/mod_video_filter.c b/src/mod/applications/mod_video_filter/mod_video_filter.c
index 070f4add93..0410c1ac83 100644
--- a/src/mod/applications/mod_video_filter/mod_video_filter.c
+++ b/src/mod/applications/mod_video_filter/mod_video_filter.c
@@ -389,13 +389,11 @@ static switch_bool_t chromakey_bug_callback(switch_media_bug_t *bug, void *user_
 	switch (type) {
 	case SWITCH_ABC_TYPE_INIT:
 		{
-			switch_channel_set_flag_recursive(channel, CF_VIDEO_DECODED_READ);
 		}
 		break;
 	case SWITCH_ABC_TYPE_CLOSE:
 		{
 			switch_thread_rwlock_unlock(MODULE_INTERFACE->rwlock);
-			switch_channel_clear_flag_recursive(channel, CF_VIDEO_DECODED_READ);
 			uninit_context(context);
 		}
 		break;
diff --git a/src/mod/formats/mod_vlc/mod_vlc.c b/src/mod/formats/mod_vlc/mod_vlc.c
index 21abee61ed..783d398c74 100644
--- a/src/mod/formats/mod_vlc/mod_vlc.c
+++ b/src/mod/formats/mod_vlc/mod_vlc.c
@@ -1513,7 +1513,7 @@ SWITCH_STANDARD_APP(play_video_function)
 	libvlc_video_set_format_callbacks(context->mp, video_format_setup_callback, video_format_clean_callback);
 	libvlc_video_set_callbacks(context->mp, vlc_video_lock_callback, vlc_video_unlock_callback, vlc_video_display_callback, context);
 
-	switch_channel_set_flag(channel, CF_VIDEO_DECODED_READ);
+	switch_channel_set_flag_recursive(channel, CF_VIDEO_DECODED_READ);
 
  top:
 
@@ -1612,6 +1612,7 @@ end:
 	}
 
 	switch_core_session_video_reset(session);
+	switch_channel_clear_flag_recursive(channel, CF_VIDEO_DECODED_READ);
 
 	if (vlc_handle) libvlc_release(vlc_handle);
 }
diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c
index 2c6ed39446..7d9c9095a2 100644
--- a/src/switch_ivr_async.c
+++ b/src/switch_ivr_async.c
@@ -654,12 +654,12 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_session_echo(switch_core_session_t *s
 	}
 
 	arg_recursion_check_start(args);
-
-	if (switch_true(switch_channel_get_variable(channel, "echo_decode_video"))) {
-		switch_channel_set_flag(channel, CF_VIDEO_DECODED_READ);
+	
+	if (switch_channel_var_true(channel, "echo_decode_video")) {
+		switch_channel_set_flag_recursive(channel, CF_VIDEO_DECODED_READ);
 	}
 
-	if (switch_true(switch_channel_get_variable(channel, "echo_decode_audio"))) {
+	if (switch_channel_var_true(channel, "echo_decode_audio")) {
 		switch_core_session_raw_read(session);
 	}
 
@@ -717,6 +717,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_session_echo(switch_core_session_t *s
 		}
 	}
 
+	if (switch_channel_var_true(channel, "echo_decode_video")) {
+		switch_channel_clear_flag_recursive(channel, CF_VIDEO_DECODED_READ);
+	}
+
 	switch_core_session_video_reset(session);
 	switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
 	switch_channel_clear_flag(channel, CF_TEXT_ECHO);