Change wfd message for video only mirroring 33/115833/6 accepted/tizen/common/20170303.090929 accepted/tizen/ivi/20170303.070307 accepted/tizen/mobile/20170303.070213 accepted/tizen/tv/20170303.070238 accepted/tizen/unified/20170309.033437 submit/tizen/20170303.040910 submit/tizen_unified/20170308.100408
authorHyunsoo, Park <hance.park@samsung.com>
Tue, 21 Feb 2017 11:08:59 +0000 (20:08 +0900)
committerSeokHoon Lee <andy.shlee@samsung.com>
Thu, 2 Mar 2017 05:00:56 +0000 (14:00 +0900)
Using this patch, 'wfd-audio-formats' parameter have none parameter for video only sink.

Basically, screen mirroring provides video & audio simultaneously.
This patch will make screen mirroring to provide Video only.

-When Video only mirroring mode, it doesn't make audio plugins.

If 'sink session mode' in 'mmfw_wfd_sink.ini' is set '2',
screen mirroring runs without audio(that is, video only mirroring)

Change-Id: I8d5fa9c6d6d9ac02868f3f87334b757104615e9e
Signed-off-by: Hyunsoo, Park <hance.park@samsung.com>
packaging/libmm-wfd.spec
src/mm_wfd_sink_ini.c
src/mm_wfd_sink_manager.c
src/mm_wfd_sink_priv.c

index 2aebd65..0f17409 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-wfd
 Summary:    Multimedia Framework Wifi-Display Library
-Version:    0.2.217
+Version:    0.2.218
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 62034eb..566dd62 100644 (file)
@@ -250,7 +250,7 @@ mm_wfd_sink_ini_load(mm_wfd_sink_ini_t *ini, const char *path)
                ini->audio_sink_async = iniparser_getboolean(dict, "general:audio sink async", DEFAULT_AUDIO_SINK_ASYNC);
                ini->video_sink_async = iniparser_getboolean(dict, "general:video sink async", DEFAULT_VIDEO_SINK_ASYNC);
                MM_WFD_SINK_INI_GET_STRING(dict, ini->user_agent, "general:user agent", DEFAULT_USER_AGENT);
-               ini->sink_session_mode = iniparser_getint(dict, "general:sink session mode", DEFAULT_SINK_SESSION_MODE);
+               ini->sink_session_mode = (1 << (iniparser_getint(dict, "general:sink session mode", DEFAULT_SINK_SESSION_MODE)-1));
 
                /* debug */
                ini->generate_dot = iniparser_getboolean(dict, "debug:generate dot", DEFAULT_GENERATE_DOT);
index 4fbf50e..10ab7ed 100644 (file)
@@ -112,7 +112,11 @@ __mm_wfd_sink_manager_thread(gpointer data)
 
                        switch (cmd) {
                        case WFD_SINK_MANAGER_CMD_LINK_A_DECODEBIN:
-                               wfd_sink_debug("try to link audio decodebin.");
+                               wfd_sink_debug("try to link audio decodebin. session mode = %d", wfd_sink->ini.sink_session_mode);
+                               if (wfd_sink->ini.sink_session_mode & WFD_SESSION_MODE_VIDEO_ONLY) {
+                                       wfd_sink_debug("Video only mode skip link audio decodebin.");
+                                       break;
+                               }
                                if (MM_ERROR_NONE != __mm_wfd_sink_link_audio_decodebin(wfd_sink)) {
                                        wfd_sink_error("failed to link audio decodebin.....");
                                        goto EXIT;
@@ -130,7 +134,11 @@ __mm_wfd_sink_manager_thread(gpointer data)
                                }
                                break;
                        case WFD_SINK_MANAGER_CMD_PREPARE_A_PIPELINE:
-                               wfd_sink_debug("try to prepare audio pipeline.");
+                               wfd_sink_debug("try to prepare audio pipeline. session mode = %d", wfd_sink->ini.sink_session_mode);
+                               if (wfd_sink->ini.sink_session_mode & WFD_SESSION_MODE_VIDEO_ONLY) {
+                                       wfd_sink_debug("Video only mode skip prepare video pipeline.");
+                                       break;
+                               }
                                if (MM_ERROR_NONE != __mm_wfd_sink_prepare_audio_pipeline(wfd_sink, NULL)) {
                                        wfd_sink_error("failed to prepare audio pipeline.....");
                                        goto EXIT;
@@ -148,7 +156,11 @@ __mm_wfd_sink_manager_thread(gpointer data)
                                }
                                break;
                        case WFD_SINK_MANAGER_CMD_UNPREPARE_A_PIPELINE:
-                               wfd_sink_debug("try to unprepare audio pipeline.");
+                               wfd_sink_debug("try to unprepare audio pipeline. session mode = %d", wfd_sink->ini.sink_session_mode);
+                               if (wfd_sink->ini.sink_session_mode & WFD_SESSION_MODE_VIDEO_ONLY) {
+                                       wfd_sink_debug("Video only mode skip unprepare audio pipeline.");
+                                       break;
+                               }
                                if (MM_ERROR_NONE != __mm_wfd_sink_unprepare_audio_pipeline(wfd_sink)) {
                                        wfd_sink_error("failed to unprepare audio pipeline.....");
                                        goto EXIT;
index df57f84..ffe770e 100644 (file)
@@ -194,7 +194,7 @@ int _mm_wfd_sink_prepare(mm_wfd_sink_t *wfd_sink)
        }
 
        wfd_sink_info("Current session mode : %d", wfd_sink->ini.sink_session_mode);
-       if(wfd_sink->ini.sink_session_mode & (WFD_SESSION_MODE_MIXED | WFD_SESSION_MODE_VIDEO_ONLY)) {
+       if (wfd_sink->ini.sink_session_mode & (WFD_SESSION_MODE_MIXED | WFD_SESSION_MODE_VIDEO_ONLY)) {
                /* create video decodebin */
                result = __mm_wfd_sink_create_video_decodebin(wfd_sink);
                if (result < MM_ERROR_NONE) {
@@ -209,21 +209,22 @@ int _mm_wfd_sink_prepare(mm_wfd_sink_t *wfd_sink)
                        goto fail_to_create;
                }
        }
+       wfd_sink_info("Current session mode : %d", wfd_sink->ini.sink_session_mode);
+       if (wfd_sink->ini.sink_session_mode & (WFD_SESSION_MODE_MIXED | WFD_SESSION_MODE_AUDIO_ONLY)) {
+               /* create audio decodebin */
+               result = __mm_wfd_sink_create_audio_decodebin(wfd_sink);
+               if (result < MM_ERROR_NONE) {
+                       wfd_sink_error("fail to create audio decodebin : %d", result);
+                       goto fail_to_create;
+               }
 
-       /* create audio decodebin */
-       result = __mm_wfd_sink_create_audio_decodebin(wfd_sink);
-       if (result < MM_ERROR_NONE) {
-               wfd_sink_error("fail to create audio decodebin : %d", result);
-               goto fail_to_create;
-       }
-
-       /* create audio sinkbin */
-       result = __mm_wfd_sink_create_audio_sinkbin(wfd_sink);
-       if (result < MM_ERROR_NONE) {
-               wfd_sink_error("fail to create audio sinkbin : %d", result);
-               goto fail_to_create;
+               /* create audio sinkbin */
+               result = __mm_wfd_sink_create_audio_sinkbin(wfd_sink);
+               if (result < MM_ERROR_NONE) {
+                       wfd_sink_error("fail to create audio sinkbin : %d", result);
+                       goto fail_to_create;
+               }
        }
-
        /* set pipeline READY state */
        result = __mm_wfd_sink_set_pipeline_state(wfd_sink, GST_STATE_READY, TRUE);
        if (result < MM_ERROR_NONE) {
@@ -2399,18 +2400,27 @@ __mm_wfd_sink_demux_pad_added(GstElement *demux, GstPad *pad, gpointer data)
                                                        wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst);
 
        name = gst_pad_get_name(pad);
-       if(name == NULL) {
+       if (name == NULL) {
                wfd_sink_error("fail to get pad");
                goto ERROR;
        }
 
        wfd_sink_debug("Mux pad added, session mode = %d, name[0] = %c", wfd_sink->ini.sink_session_mode, name[0]);
-       if((wfd_sink->ini.sink_session_mode & WFD_SESSION_MODE_AUDIO_ONLY) && name[0] == 'v') {
+
+       //In case of 'audio-only-mirroring', we don't add video pad
+       if ((wfd_sink->ini.sink_session_mode & WFD_SESSION_MODE_AUDIO_ONLY) && name[0] == 'v') {
                wfd_sink_error("Skip video pad add in audio only mode");
                // Do nothing
                goto done;
        }
 
+       //In case of 'video-only-mirroring', we don't add audio pad
+       if ((wfd_sink->ini.sink_session_mode & WFD_SESSION_MODE_VIDEO_ONLY) && name[0] == 'a') {
+               wfd_sink_error("Skip audio pad add in video only mode");
+               // Do nothing
+               goto done;
+       }
+
        pipeline = wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst;
 
        /* take srcpad from demuxer added pad */
@@ -2582,7 +2592,6 @@ __mm_wfd_sink_update_stream_info(GstElement *wfdsrc, GstStructure *str, gpointer
        gchar *video_format;
 
        wfd_sink_debug_fenter();
-
        wfd_sink_return_if_fail(str && GST_IS_STRUCTURE(str));
        wfd_sink_return_if_fail(wfd_sink);
 
@@ -2601,7 +2610,6 @@ __mm_wfd_sink_update_stream_info(GstElement *wfdsrc, GstStructure *str, gpointer
                        wfd_sink_error("invalid audio format(%s)...", audio_format);
                        is_valid_audio_format = FALSE;
                }
-
                if (is_valid_audio_format == TRUE) {
                        if (gst_structure_has_field(str, "audio_rate"))
                                gst_structure_get_int(str, "audio_rate", &stream_info->audio_stream_info.sample_rate);
@@ -2619,7 +2627,6 @@ __mm_wfd_sink_update_stream_info(GstElement *wfdsrc, GstStructure *str, gpointer
                                                        stream_info->audio_stream_info.bitwidth);
                }
        }
-
        if (gst_structure_has_field(str, "video_format")) {
                is_valid_video_format = TRUE;
                video_format = g_strdup(gst_structure_get_string(str, "video_format"));
@@ -3001,13 +3008,14 @@ static int __mm_wfd_sink_create_pipeline(mm_wfd_sink_t *wfd_sink)
                }
        }
 
-       /* create valve for audio */
-       MMWFDSINK_CREATE_ELEMENT(mainbin, WFD_SINK_M_A_VALVE, "valve", "audio_valve", FALSE);
-       MMWFDSINK_PAD_PROBE(wfd_sink, NULL, mainbin[WFD_SINK_M_A_VALVE].gst, "src");
-       MMWFDSINK_PAD_PROBE(wfd_sink, NULL, mainbin[WFD_SINK_M_A_VALVE].gst, "sink");
+       if (wfd_sink->ini.sink_session_mode & (WFD_SESSION_MODE_MIXED | WFD_SESSION_MODE_AUDIO_ONLY)) {
+               /* create valve for audio */
+               MMWFDSINK_CREATE_ELEMENT(mainbin, WFD_SINK_M_A_VALVE, "valve", "audio_valve", FALSE);
+               MMWFDSINK_PAD_PROBE(wfd_sink, NULL, mainbin[WFD_SINK_M_A_VALVE].gst, "src");
+               MMWFDSINK_PAD_PROBE(wfd_sink, NULL, mainbin[WFD_SINK_M_A_VALVE].gst, "sink");
+       }
 
-       wfd_sink_error("Current session mode : %d", wfd_sink->ini.sink_session_mode);
-       if(wfd_sink->ini.sink_session_mode & (WFD_SESSION_MODE_MIXED | WFD_SESSION_MODE_VIDEO_ONLY)) {
+       if (wfd_sink->ini.sink_session_mode & (WFD_SESSION_MODE_MIXED | WFD_SESSION_MODE_VIDEO_ONLY)) {
                /* create valve for video */
                MMWFDSINK_CREATE_ELEMENT(mainbin, WFD_SINK_M_V_VALVE, "valve", "video_valve", FALSE);
                MMWFDSINK_PAD_PROBE(wfd_sink, NULL, mainbin[WFD_SINK_M_V_VALVE].gst, "src");
@@ -3971,7 +3979,7 @@ static int __mm_wfd_sink_prepare_videosink(mm_wfd_sink_t *wfd_sink, GstElement *
        wfd_sink_info("check display visible attribute: %d", visible);
 
        if (FALSE == visible) {
-               wfd_sink_info ("skipped to prepare video sink. display_visible is FALSE.");
+               wfd_sink_info("skipped to prepare video sink. display_visible is FALSE.");
                g_object_set(G_OBJECT(video_sink), "visible", visible, NULL);
                return MM_ERROR_NONE;
        }