From 2c2801cc18e105e47f8860aa1cb648d081da92d7 Mon Sep 17 00:00:00 2001 From: SeokHoon Lee Date: Thu, 16 Mar 2017 10:46:43 +0900 Subject: [PATCH] Change pipeline creation for Video only session - make pipeline as a result of audio codec negotiation. Signed-off-by: SeokHoon Lee Change-Id: I83ca1b20430602662080f97066bfac6ec9566f5b --- packaging/libmm-wfd.spec | 2 +- src/mm_wfd_sink_manager.c | 18 ++---------- src/mm_wfd_sink_priv.c | 73 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 54 insertions(+), 39 deletions(-) diff --git a/packaging/libmm-wfd.spec b/packaging/libmm-wfd.spec index 1b14906..e11447a 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.219 +Version: 0.2.220 Release: 0 Group: System/Libraries License: Apache-2.0 diff --git a/src/mm_wfd_sink_manager.c b/src/mm_wfd_sink_manager.c index 10ab7ed..4fbf50e 100644 --- a/src/mm_wfd_sink_manager.c +++ b/src/mm_wfd_sink_manager.c @@ -112,11 +112,7 @@ __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. 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; - } + wfd_sink_debug("try to link audio decodebin."); if (MM_ERROR_NONE != __mm_wfd_sink_link_audio_decodebin(wfd_sink)) { wfd_sink_error("failed to link audio decodebin....."); goto EXIT; @@ -134,11 +130,7 @@ __mm_wfd_sink_manager_thread(gpointer data) } break; case WFD_SINK_MANAGER_CMD_PREPARE_A_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; - } + wfd_sink_debug("try to prepare audio pipeline."); if (MM_ERROR_NONE != __mm_wfd_sink_prepare_audio_pipeline(wfd_sink, NULL)) { wfd_sink_error("failed to prepare audio pipeline....."); goto EXIT; @@ -156,11 +148,7 @@ __mm_wfd_sink_manager_thread(gpointer data) } break; case WFD_SINK_MANAGER_CMD_UNPREPARE_A_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; - } + wfd_sink_debug("try to unprepare audio pipeline."); 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 ffe770e..40ff1e2 100644 --- a/src/mm_wfd_sink_priv.c +++ b/src/mm_wfd_sink_priv.c @@ -209,22 +209,21 @@ 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 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 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; } + /* set pipeline READY state */ result = __mm_wfd_sink_set_pipeline_state(wfd_sink, GST_STATE_READY, TRUE); if (result < MM_ERROR_NONE) { @@ -1780,6 +1779,12 @@ __mm_wfd_sink_unprepare_audio_pipeline(mm_wfd_sink_t *wfd_sink) wfd_sink->pipeline, MM_ERROR_WFD_NOT_INITIALIZED); + if (wfd_sink->stream_info.audio_stream_info.codec == MM_WFD_SINK_AUDIO_CODEC_NONE) { + wfd_sink_debug("Skip unprepare audio pipeline for none audio codec."); + wfd_sink_debug_fleave(); + return MM_ERROR_NONE; + } + wfd_sink_error("No-error:unprepare audio sink bin"); PRINT_WFD_REF_COUNT(wfd_sink); @@ -1970,6 +1975,12 @@ __mm_wfd_sink_prepare_audio_pipeline(mm_wfd_sink_t *wfd_sink, GstPad **pad) wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst, MM_ERROR_WFD_NOT_INITIALIZED); + if (wfd_sink->stream_info.audio_stream_info.codec == MM_WFD_SINK_AUDIO_CODEC_NONE) { + wfd_sink_debug("Skip prepare audio pipeline for none audio codec"); + wfd_sink_debug_fleave(); + return MM_ERROR_NONE; + } + /* check audio decodebin is linked */ if (!wfd_sink->audio_decodebin_is_linked) { /* check audio decodebin is created */ @@ -2414,9 +2425,9 @@ __mm_wfd_sink_demux_pad_added(GstElement *demux, GstPad *pad, gpointer data) 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"); + //In case of none audio codec, we don't add audio pad + if (wfd_sink->stream_info.audio_stream_info.codec == MM_WFD_SINK_AUDIO_CODEC_NONE && name[0] == 'a') { + wfd_sink_error("Skip audio pad add for none audio codec"); // Do nothing goto done; } @@ -3008,12 +3019,10 @@ static int __mm_wfd_sink_create_pipeline(mm_wfd_sink_t *wfd_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"); - } + /* 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_VIDEO_ONLY)) { /* create valve for video */ @@ -3121,6 +3130,12 @@ int __mm_wfd_sink_link_audio_decodebin(mm_wfd_sink_t *wfd_sink) return MM_ERROR_NONE; } + if (wfd_sink->stream_info.audio_stream_info.codec == MM_WFD_SINK_AUDIO_CODEC_NONE) { + wfd_sink_debug("Skip link audio decodebin for none audio codec."); + wfd_sink_debug_fleave(); + return MM_ERROR_NONE; + } + /* take audio decodebin */ a_decodebin = wfd_sink->pipeline->a_decodebin; @@ -3399,6 +3414,12 @@ int __mm_wfd_sink_create_audio_decodebin(mm_wfd_sink_t *wfd_sink) return MM_ERROR_NONE; } + if (wfd_sink->stream_info.audio_stream_info.codec == MM_WFD_SINK_AUDIO_CODEC_NONE) { + wfd_sink_debug("Skip create audio decodebin for none audio codec."); + wfd_sink_debug_fleave(); + return MM_ERROR_NONE; + } + /* check audio decodebin could be linked now */ switch (wfd_sink->stream_info.audio_stream_info.codec) { case MM_WFD_SINK_AUDIO_CODEC_AAC: @@ -3632,6 +3653,12 @@ int __mm_wfd_sink_create_audio_sinkbin(mm_wfd_sink_t *wfd_sink) return MM_ERROR_NONE; } + if (wfd_sink->stream_info.audio_stream_info.codec == MM_WFD_SINK_AUDIO_CODEC_NONE) { + wfd_sink_error("Skip create audio sink bin for non audio codec. %d", wfd_sink->stream_info.audio_stream_info.codec); + wfd_sink_debug_fleave(); + return MM_ERROR_NONE; + } + /* alloc handles */ a_sinkbin = (MMWFDSinkGstElement *)g_malloc0(sizeof(MMWFDSinkGstElement) * WFD_SINK_A_S_NUM); if (!a_sinkbin) { -- 2.7.4