]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-9000 #resolve [Set conference flags or conference member flags with individual...
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 30 Mar 2016 19:10:58 +0000 (14:10 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 30 Mar 2016 19:11:07 +0000 (14:11 -0500)
src/mod/applications/mod_conference/conference_api.c
src/mod/applications/mod_conference/conference_utils.c
src/mod/applications/mod_conference/conference_video.c
src/mod/applications/mod_conference/mod_conference.h

index c25dc038d7c87210d2635aa62a4a2fc2d2735699..4ec801a093ba416bce49f6b60a8e634f79a40346 100644 (file)
@@ -62,6 +62,7 @@ api_command_t conference_api_sub_commands[] = {
        {"stop", (void_fn_t) & conference_api_sub_stop, CONF_API_SUB_ARGS_SPLIT, "stop", "<[current|all|async|last]> [<member_id>]"},
        {"dtmf", (void_fn_t) & conference_api_sub_dtmf, CONF_API_SUB_MEMBER_TARGET, "dtmf", "<[member_id|all|last|non_moderator]> <digits>"},
        {"kick", (void_fn_t) & conference_api_sub_kick, CONF_API_SUB_MEMBER_TARGET, "kick", "<[member_id|all|last|non_moderator]> [<optional sound file>]"},
+       {"vid-flip", (void_fn_t) & conference_api_sub_vid_flip, CONF_API_SUB_MEMBER_TARGET, "vid-flip", "<[member_id|all|last|non_moderator]>"},
        {"hup", (void_fn_t) & conference_api_sub_hup, CONF_API_SUB_MEMBER_TARGET, "hup", "<[member_id|all|last|non_moderator]>"},
        {"mute", (void_fn_t) & conference_api_sub_mute, CONF_API_SUB_MEMBER_TARGET, "mute", "<[member_id|all]|last|non_moderator> [<quiet>]"},
        {"tmute", (void_fn_t) & conference_api_sub_tmute, CONF_API_SUB_MEMBER_TARGET, "tmute", "<[member_id|all]|last|non_moderator> [<quiet>]"},
@@ -655,6 +656,36 @@ switch_status_t conference_api_sub_kick(conference_member_t *member, switch_stre
 }
 
 
+switch_status_t conference_api_sub_vid_flip(conference_member_t *member, switch_stream_handle_t *stream, void *data)
+{
+       switch_event_t *event;
+
+       if (member == NULL) {
+               return SWITCH_STATUS_GENERR;
+       }
+
+       if (conference_utils_member_test_flag(member, MFLAG_FLIP_VIDEO)) {
+               conference_utils_member_clear_flag_locked(member, MFLAG_FLIP_VIDEO);
+       } else {
+               conference_utils_member_set_flag_locked(member, MFLAG_FLIP_VIDEO);
+       }
+
+       if (stream != NULL) {
+               stream->write_function(stream, "OK flipped %u\n", member->id);
+       }
+
+       if (member->conference && test_eflag(member->conference, EFLAG_KICK_MEMBER)) {
+               if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
+                       conference_member_add_event_data(member, event);
+                       switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "vid-flip-member");
+                       switch_event_fire(&event);
+               }
+       }
+
+       return SWITCH_STATUS_SUCCESS;
+}
+
+
 switch_status_t conference_api_sub_dtmf(conference_member_t *member, switch_stream_handle_t *stream, void *data)
 {
        switch_event_t *event;
index 269e55887988c33c1650234b641f3b0f53f0db28..be02472460e3b93c031116911ea01f2b8f657cb0 100644 (file)
@@ -74,6 +74,13 @@ const char *conference_utils_combine_flag_var(switch_core_session_t *session, co
                                        ret = switch_core_session_sprintf(session, "%s|%s", ret, val);
                                }
                        }
+               } else if (!strncasecmp(var, var_name, strlen(var_name)) && switch_true(val)) {
+                       char *p = var + strlen(var_name);
+
+                       if (*p == '_' && *(p+1)) {
+                               p++;
+                               ret = switch_core_session_sprintf(session, "%s|%s", ret, p);
+                       }
                }
        }
 
@@ -129,6 +136,8 @@ void conference_utils_set_mflags(const char *flags, member_flag_t *f)
                                f[MFLAG_GHOST] = 1;
                        } else if (!strcasecmp(argv[i], "join-only")) {
                                f[MFLAG_JOIN_ONLY] = 1;
+                       } else if (!strcasecmp(argv[i], "flip-video")) {
+                               f[MFLAG_FLIP_VIDEO] = 1;
                        } else if (!strcasecmp(argv[i], "positional")) {
                                f[MFLAG_POSITIONAL] = 1;
                        } else if (!strcasecmp(argv[i], "no-positional")) {
index 5c638c5b895a8bc720cd4709b03e50ad0f2a89b5..bf6c22a196d4408a9b1213dc63229765045f5207 100644 (file)
@@ -3729,6 +3729,11 @@ switch_status_t conference_video_thread_callback(switch_core_session_t *session,
                        switch_queue_size(member->video_queue) < member->conference->video_fps.fps * 2 &&
                        !member->conference->playing_video_file) {
                        switch_img_copy(frame->img, &img_copy);
+                       
+                       if (conference_utils_member_test_flag(member, MFLAG_FLIP_VIDEO)) {
+                               switch_img_flip(img_copy);
+                       }
+
                        if (switch_queue_trypush(member->video_queue, img_copy) != SWITCH_STATUS_SUCCESS) {
                                switch_img_free(&img_copy);
                        }
index 102f1e334da69b8bee43ee16e63e70d332606068..863bf39ff8fba849d961110d8e11d53176b18777 100644 (file)
@@ -208,6 +208,7 @@ typedef enum {
        MFLAG_CAN_BE_SEEN,
        MFLAG_SECOND_SCREEN,
        MFLAG_SILENT,
+       MFLAG_FLIP_VIDEO,
        ///////////////////////////
        MFLAG_MAX
 } member_flag_t;
@@ -1105,6 +1106,7 @@ switch_status_t conference_api_sub_watching_canvas(conference_member_t *member,
 switch_status_t conference_api_sub_canvas(conference_member_t *member, switch_stream_handle_t *stream, void *data);
 switch_status_t conference_api_sub_layer(conference_member_t *member, switch_stream_handle_t *stream, void *data);
 switch_status_t conference_api_sub_kick(conference_member_t *member, switch_stream_handle_t *stream, void *data);
+switch_status_t conference_api_sub_vid_flip(conference_member_t *member, switch_stream_handle_t *stream, void *data);
 switch_status_t conference_api_sub_transfer(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
 switch_status_t conference_api_sub_record(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);
 switch_status_t conference_api_sub_norecord(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv);