]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
play video files for hold_music
authorAnthony Minessale <anthm@freeswitch.org>
Sat, 13 Jun 2015 07:57:50 +0000 (02:57 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Sat, 13 Jun 2015 21:18:45 +0000 (16:18 -0500)
squashme

src/include/switch_core_media.h
src/include/switch_types.h
src/switch_core_media.c
src/switch_ivr_bridge.c

index 09958e7e458868ccfe072b136d3e6e7ace1fcdb6..2d42f057204dc1509a65a10a072a66856cb4cca9 100644 (file)
@@ -331,6 +331,7 @@ SWITCH_DECLARE(void) switch_core_session_stop_media(switch_core_session_t *sessi
 SWITCH_DECLARE(switch_media_flow_t) switch_core_session_media_flow(switch_core_session_t *session, switch_media_type_t type);
 SWITCH_DECLARE(switch_status_t) switch_core_media_get_vid_params(switch_core_session_t *session, switch_vid_params_t *vid_params);
 SWITCH_DECLARE(switch_status_t) switch_core_media_set_video_file(switch_core_session_t *session, switch_file_handle_t *fh, switch_rw_t rw);
+SWITCH_DECLARE(switch_file_handle_t *) switch_core_media_get_video_file(switch_core_session_t *session, switch_rw_t rw);
 SWITCH_DECLARE(switch_bool_t) switch_core_session_in_video_thread(switch_core_session_t *session);
 SWITCH_DECLARE(switch_bool_t) switch_core_media_check_dtls(switch_core_session_t *session, switch_media_type_t type);
 
index b170414344f01fadaadb5dd62bbd39a4f557d8bc..c435106c38a3c0a00daf0ca243ad93cada982570 100644 (file)
@@ -1486,6 +1486,8 @@ typedef enum {
        CF_VIDEO_ONLY,
        CF_VIDEO_READY,
        CF_VIDEO_MIRROR_INPUT,
+       CF_VIDEO_READ_FILE_ATTACHED,
+       CF_VIDEO_WRITE_FILE_ATTACHED,
        /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
        /* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */
        CF_FLAG_MAX
index 1432d30c8eda7a61d58296b5dc2264b2a3f50c6c..deba97131180e160a5800690c4545b6c057f2a14 100644 (file)
@@ -4763,6 +4763,39 @@ SWITCH_DECLARE(int) switch_core_media_toggle_hold(switch_core_session_t *session
        return changed;
 }
 
+
+SWITCH_DECLARE(switch_file_handle_t *) switch_core_media_get_video_file(switch_core_session_t *session, switch_rw_t rw)
+{
+       switch_media_handle_t *smh;
+       switch_rtp_engine_t *v_engine;
+       switch_file_handle_t *fh;
+
+       switch_assert(session);
+
+       if (!switch_channel_test_flag(session->channel, CF_VIDEO)) {
+               return NULL;
+       }
+
+       if (!(smh = session->media_handle)) {
+               return NULL;
+       }
+
+       v_engine = &smh->engines[SWITCH_MEDIA_TYPE_VIDEO];      
+
+       switch_mutex_lock(v_engine->mh.file_mutex);
+
+       if (rw == SWITCH_RW_READ) {
+               fh = smh->video_read_fh;
+       } else {
+               fh = smh->video_write_fh;
+       }
+
+       switch_mutex_unlock(v_engine->mh.file_mutex);
+
+       return fh;
+}
+
+
 SWITCH_DECLARE(switch_status_t) switch_core_media_set_video_file(switch_core_session_t *session, switch_file_handle_t *fh, switch_rw_t rw)
 {
        switch_media_handle_t *smh;
@@ -4789,14 +4822,28 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_set_video_file(switch_core_ses
        switch_mutex_lock(v_engine->mh.file_mutex);
 
        if (rw == SWITCH_RW_READ) {
-               smh->video_read_fh = fh;
+               
                if (fh) {
                        switch_channel_set_flag_recursive(session->channel, CF_VIDEO_DECODED_READ);
-               } else {
+                       switch_channel_set_flag(session->channel, CF_VIDEO_READ_FILE_ATTACHED);
+               } else if (smh->video_read_fh) {
                        switch_channel_clear_flag_recursive(session->channel, CF_VIDEO_DECODED_READ);
                        switch_core_session_video_reset(session);
                }
+               
+               if (!fh) {
+                       switch_channel_clear_flag(session->channel, CF_VIDEO_READ_FILE_ATTACHED);
+               }
+
+               smh->video_read_fh = fh;
+
        } else {
+               if (fh) {
+                       switch_channel_set_flag(session->channel, CF_VIDEO_WRITE_FILE_ATTACHED);
+               } else {
+                       switch_channel_clear_flag(session->channel, CF_VIDEO_WRITE_FILE_ATTACHED);
+               }
+
                switch_core_media_gen_key_frame(session);
                smh->video_write_fh = fh;
        }
@@ -4941,7 +4988,7 @@ static void *SWITCH_THREAD_FUNC video_helper_thread(switch_thread_t *thread, voi
                vloops++;
 
                if (!buf) {
-                       int buflen = SWITCH_RECOMMENDED_BUFFER_SIZE * 4;
+                       int buflen = SWITCH_RTP_MAX_BUF_LEN;
                        buf = switch_core_session_alloc(session, buflen);
                        fr.packet = buf;
                        fr.packetlen = buflen;
index 129ae72e12eb7875a3cd4f7d75142a831f434a8a..a6d086ec68d4d674e60fbe37c0d08fbdbfe9c234 100644 (file)
@@ -53,7 +53,9 @@ static void video_bridge_thread(switch_core_session_t *session, void *obj)
        switch_channel_t *b_channel = switch_core_session_get_channel(vh->session_b);
        switch_status_t status;
        switch_frame_t *read_frame = 0;
-       int set_decoded_read = 0;
+       int set_decoded_read = 0, refresh_timer = 0, playing_file = 0;
+       switch_frame_t fr = { 0 };
+       unsigned char *buf = NULL;
 
        vh->up = 1;
 
@@ -63,10 +65,13 @@ static void video_bridge_thread(switch_core_session_t *session, void *obj)
        switch_core_session_request_video_refresh(vh->session_a);
        switch_core_session_request_video_refresh(vh->session_b);
 
+       refresh_timer = 5;
+
        while (switch_channel_up_nosig(channel) && switch_channel_up_nosig(b_channel) && vh->up == 1) {
                if (switch_channel_media_up(channel)) {
                        switch_codec_t *a_codec = switch_core_session_get_video_read_codec(vh->session_a);
                        switch_codec_t *b_codec = switch_core_session_get_video_write_codec(vh->session_b);
+                       switch_file_handle_t *fh;
 
                        switch_assert(a_codec);
                        switch_assert(b_codec);
@@ -76,6 +81,7 @@ static void video_bridge_thread(switch_core_session_t *session, void *obj)
                                        if (set_decoded_read) {
                                                switch_channel_clear_flag_recursive(channel, CF_VIDEO_DECODED_READ);
                                                set_decoded_read = 0;
+                                               refresh_timer = 5;
                                        }
                                }
                        } else {
@@ -83,18 +89,72 @@ static void video_bridge_thread(switch_core_session_t *session, void *obj)
                                        switch_channel_test_flag(b_channel, CF_VIDEO_DECODED_READ)) {
                                        switch_channel_set_flag_recursive(channel, CF_VIDEO_DECODED_READ);
                                        set_decoded_read = 1;
+                                       refresh_timer = 5;
                                }
                        }
                        
-                       status = switch_core_session_read_video_frame(vh->session_a, &read_frame, SWITCH_IO_FLAG_NONE, 0);
+
+                       if ((fh = switch_core_media_get_video_file(session, SWITCH_RW_WRITE)) && switch_test_flag(fh, SWITCH_FILE_OPEN)) {
+                               switch_status_t wstatus;
+                               
+                               if (!playing_file) {
+                                       playing_file = 1;
+                               }
+
+                               if (!buf) {
+                                       int buflen = SWITCH_RTP_MAX_BUF_LEN;
+
+                                       buf = switch_core_session_alloc(session, buflen);
+                                       fr.packet = buf;
+                                       fr.packetlen = buflen;
+                                       fr.data = buf + 12;
+                                       fr.buflen = buflen - 12;
+                                       switch_core_media_gen_key_frame(session);
+                               }
+
+                               wstatus = switch_core_file_read_video(fh, &fr, SVR_BLOCK);
+                               
+                               if (wstatus == SWITCH_STATUS_SUCCESS) {
+                                       switch_core_session_write_video_frame(session, &fr, SWITCH_IO_FLAG_NONE, 0);
+                                       switch_img_free(&fr.img);
+                               } else if (wstatus != SWITCH_STATUS_BREAK) {
+                                       switch_core_media_set_video_file(session, NULL, SWITCH_RW_WRITE);
+                               }
+
+                               continue;
+                       }
                        
+
+                       if (playing_file) {
+                               playing_file = 0;
+                               switch_core_session_request_video_refresh(vh->session_a);
+                               switch_core_session_request_video_refresh(vh->session_b);
+                               switch_channel_video_sync(channel);
+                               refresh_timer = 5;
+                       }
+
+                       if (refresh_timer) {
+                               if (--refresh_timer == 0) {
+                                       switch_core_session_request_video_refresh(vh->session_a);
+                                       switch_core_session_request_video_refresh(vh->session_b);
+                               }
+                       }
+               
+
+                       status = switch_core_session_read_video_frame(vh->session_a, &read_frame, SWITCH_IO_FLAG_NONE, 0);
+
                        if (!SWITCH_READ_ACCEPTABLE(status)) {
                                switch_cond_next();
                                continue;
                        }
+
+
+                       if (switch_test_flag(read_frame, SFF_CNG)) {
+                               continue;
+                       }
                }
 
-               if (switch_test_flag(read_frame, SFF_CNG)) {
+               if (switch_channel_test_flag(channel, CF_LEG_HOLDING) || switch_channel_test_flag(b_channel, CF_VIDEO_READ_FILE_ATTACHED)) {
                        continue;
                }