]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7513: [mod_conference] video recording in conference
authorSeven Du <dujinfang@gmail.com>
Fri, 10 Aug 2012 07:35:29 +0000 (15:35 +0800)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:46:41 +0000 (12:46 -0500)
conference 3000 record /tmp/testrecord.fsv
call 9194 try to playback
mp4 should also work with the mp4 file format, will be available soon

src/mod/applications/mod_conference/mod_conference.c

index cf08f0da43def0351ed7f6736a44036afa2e3947..a8d31b56c8f5f66a72efb56d101bbac856047b13 100644 (file)
@@ -448,6 +448,8 @@ typedef struct conference_obj {
        struct vid_helper mh;
        conference_record_t *rec_node_head;
        int last_speech_channels;
+       switch_file_handle_t *record_fh;
+       int video_recording;
 } conference_obj_t;
 
 /* Relationship with another member */
@@ -2412,7 +2414,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe
                //switch_live_array_add_alias(conference->la, switch_core_session_get_uuid(member->session), "conference");
                adv_la(conference, member, SWITCH_TRUE);
                switch_live_array_add(conference->la, switch_core_session_get_uuid(member->session), -1, &member->json, SWITCH_FALSE);
-               
+
        }
 
 
@@ -2427,7 +2429,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe
        switch_mutex_unlock(conference->mutex);
        status = SWITCH_STATUS_SUCCESS;
 
-       
+
 
 
        return status;
@@ -2452,7 +2454,7 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf
                        return;
                } else {                        
                        old_member = conference->video_floor_holder;
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Dropping video floor %s\n", 
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Dropping video floor %s\n",
                                                          switch_channel_get_name(old_member->channel));
                }
        }
@@ -2469,7 +2471,7 @@ static void conference_set_video_floor_holder(conference_obj_t *conference, conf
        }
 
        if (member) {
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Adding video floor %s\n", 
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Adding video floor %s\n",
                                                  switch_channel_get_name(member->channel));
                //switch_channel_set_flag(member->channel, CF_VIDEO_PASSIVE);
                switch_core_session_refresh_video(member->session);
@@ -2994,6 +2996,23 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr
                        switch_core_session_rwunlock(isession);
                }
                
+               /* seems we are recording a video file */
+               switch_mutex_lock(conference->mutex);
+               if (conference->record_fh) {
+                       switch_size_t len = vid_frame->packetlen;
+                       if (!conference->video_recording) {
+                               want_refresh++;
+                               conference->video_recording++;
+                       } else {
+                               if (len > 14) { // 14 = 12(rtp) + 2(cng?)
+                                       switch_core_file_write_video(conference->record_fh, vid_frame->packet, &len);
+                               }
+                       }
+               } else {
+                       conference->video_recording = 0;
+               }
+               switch_mutex_unlock(conference->mutex);
+
                if (want_refresh && session) {
                        switch_core_session_refresh_video(session);
                        want_refresh = 0;
@@ -5079,6 +5098,11 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th
        switch_size_t data_buf_len;
        switch_event_t *event;
        switch_size_t len = 0;
+       char *ext;
+
+       data_buf_len = samples * sizeof(int16_t);
+
+       switch_zmalloc(data_buf, data_buf_len);
 
        if (switch_thread_rwlock_tryrdlock(conference->rwlock) != SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Read Lock Fail\n");
@@ -5137,6 +5161,15 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th
 
        fh.pre_buffer_datalen = SWITCH_DEFAULT_FILE_BUFFER_LEN;
 
+       /* video recording, only for testing at this time*/
+       if ((ext = strrchr(rec->path, '.')) != NULL) {
+               ext++;
+               if (!strncasecmp(ext, "fsv", 3) || !strncasecmp(ext, "mp4", 3)) {
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Disable buffer for video recording\n");
+                       fh.pre_buffer_datalen = 0;
+               }
+       }
+
        if (switch_core_file_open(&fh,
                                                          rec->path, (uint8_t) conference->channels, conference->rate, SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT,
                                                          rec->pool) != SWITCH_STATUS_SUCCESS) {
@@ -5155,6 +5188,12 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th
                goto end;
        }
 
+       switch_mutex_lock(conference->mutex);
+       if (!conference->record_fh) conference->record_fh = &fh;
+       if (conference->video_floor_holder) {
+               switch_core_session_refresh_video(conference->video_floor_holder->session);
+       }
+       switch_mutex_unlock(conference->mutex);
 
        if (switch_core_timer_init(&timer, conference->timer_name, conference->interval, samples, rec->pool) == SWITCH_STATUS_SUCCESS) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Setup timer success interval: %u  samples: %u\n", conference->interval, samples);
@@ -5258,6 +5297,9 @@ static void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *th
        switch_buffer_destroy(&member->mux_buffer);
        switch_clear_flag_locked(member, MFLAG_RUNNING);
        if (switch_test_flag((&fh), SWITCH_FILE_OPEN)) {
+               switch_mutex_lock(conference->mutex);
+               conference->record_fh = NULL;
+               switch_mutex_unlock(conference->mutex);
                switch_core_file_close(&fh);
        }
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Recording of %s Stopped\n", rec->path);