]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7513: add some mutexes on video_read_callback code
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 15 Apr 2015 19:49:01 +0000 (14:49 -0500)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:47:21 +0000 (12:47 -0500)
src/mod/applications/mod_conference/mod_conference.c
src/switch_core_media.c
src/switch_core_session.c

index 3a6ad5184e0a8a942986293aef104f59399834cf..70b34be6866bdab23d0769423ee7011fe546d6e9 100644 (file)
@@ -4661,10 +4661,8 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi
 
        switch_assert(member);
 
-       lock_member(member);
        
        if (switch_thread_rwlock_tryrdlock(member->conference->rwlock) != SWITCH_STATUS_SUCCESS) {
-               unlock_member(member);
                return SWITCH_STATUS_FALSE;
        }
 
@@ -4676,7 +4674,6 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi
                        switch_queue_push(member->video_queue, img_copy);
                }
                switch_thread_rwlock_unlock(member->conference->rwlock);
-               unlock_member(member);
                return SWITCH_STATUS_SUCCESS;
        }
 
@@ -4720,7 +4717,6 @@ static switch_status_t video_thread_callback(switch_core_session_t *session, swi
                }
        }
 
-       unlock_member(member);
        switch_thread_rwlock_unlock(member->conference->rwlock);
 
        return SWITCH_STATUS_SUCCESS;
index c72c2a5183e9d85aa5dadf169378f3d97a48fb43..8b9ee13d54b2f23c7f11e833bd1afdf640117ab1 100644 (file)
@@ -10563,6 +10563,50 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_video_frame(switch_core
        return status;
 }
 
+SWITCH_DECLARE(switch_status_t) switch_core_session_set_video_read_callback(switch_core_session_t *session, 
+                                                                                                                                                       switch_core_video_thread_callback_func_t func, void *user_data)
+{
+       switch_status_t status = SWITCH_STATUS_SUCCESS;
+       switch_media_handle_t *smh;
+
+       if (!(smh = session->media_handle)) {
+               return SWITCH_STATUS_FALSE;
+       }
+
+       switch_mutex_lock(smh->control_mutex);
+       if (!func) {
+               session->video_read_callback = NULL;
+               session->video_read_user_data = NULL;
+       } else if (session->video_read_callback) {
+               status = SWITCH_STATUS_FALSE;
+       } else {
+               session->video_read_callback = func;
+               session->video_read_user_data = user_data;
+       }
+       switch_mutex_unlock(smh->control_mutex);
+
+       return status;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_core_session_video_read_callback(switch_core_session_t *session, switch_frame_t *frame)
+{
+       switch_media_handle_t *smh;
+       switch_status_t status = SWITCH_STATUS_CONTINUE;
+
+       if (!(smh = session->media_handle)) {
+               return SWITCH_STATUS_FALSE;
+       }
+
+       switch_mutex_lock(smh->control_mutex);
+
+       if (session->video_read_callback) {
+               status = session->video_read_callback(session, frame, session->video_read_user_data);
+       }
+
+       switch_mutex_unlock(smh->control_mutex);
+
+       return status;
+}
 
 
 /* For Emacs:
index c37af893d4542b142ef51cac9a41647a05c67983..40c1a0ed3530d421a2337c9593781e42079a900b 100644 (file)
@@ -3073,32 +3073,6 @@ SWITCH_DECLARE(void) switch_core_session_raw_read(switch_core_session_t *session
        switch_core_session_set_codec_slin(session, session->sdata);
 }
 
-
-SWITCH_DECLARE(switch_status_t) switch_core_session_set_video_read_callback(switch_core_session_t *session, 
-                                                                                                                                                       switch_core_video_thread_callback_func_t func, void *user_data)
-{
-       if (!func) {
-               session->video_read_callback = NULL;
-               session->video_read_user_data = NULL;
-               return SWITCH_STATUS_SUCCESS;
-       } else if (session->video_read_callback) {
-               return SWITCH_STATUS_FALSE;
-       } else {
-               session->video_read_callback = func;
-               session->video_read_user_data = user_data;
-               return SWITCH_STATUS_SUCCESS;
-       }
-}
-
-SWITCH_DECLARE(switch_status_t) switch_core_session_video_read_callback(switch_core_session_t *session, switch_frame_t *frame)
-{
-       if (session->video_read_callback) {
-               return session->video_read_callback(session, frame, session->video_read_user_data);
-       }
-
-       return SWITCH_STATUS_CONTINUE;
-}
-
 /* For Emacs:
  * Local Variables:
  * mode:c