From: Hyunsoo, Park Date: Tue, 21 Feb 2017 11:08:59 +0000 (+0900) Subject: Change wfd message for video only mirroring X-Git-Tag: accepted/tizen/common/20170303.090929^0 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fmultimedia%2Flibmm-wfd.git;a=commitdiff_plain;h=e46075bfc98a39f4dec7ab4364aa72b320601612 Change wfd message for video only mirroring 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 --- diff --git a/packaging/libmm-wfd.spec b/packaging/libmm-wfd.spec index 2aebd65..0f17409 100644 --- a/packaging/libmm-wfd.spec +++ b/packaging/libmm-wfd.spec @@ -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 diff --git a/src/mm_wfd_sink_ini.c b/src/mm_wfd_sink_ini.c index 62034eb..566dd62 100644 --- a/src/mm_wfd_sink_ini.c +++ b/src/mm_wfd_sink_ini.c @@ -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); diff --git a/src/mm_wfd_sink_manager.c b/src/mm_wfd_sink_manager.c index 4fbf50e..10ab7ed 100644 --- a/src/mm_wfd_sink_manager.c +++ b/src/mm_wfd_sink_manager.c @@ -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; diff --git a/src/mm_wfd_sink_priv.c b/src/mm_wfd_sink_priv.c index df57f84..ffe770e 100644 --- a/src/mm_wfd_sink_priv.c +++ b/src/mm_wfd_sink_priv.c @@ -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; }