Add audio only session negotiation 02/123502/1
authorSeokHoon Lee <andy.shlee@samsung.com>
Thu, 6 Apr 2017 02:18:04 +0000 (11:18 +0900)
committerSeokHoon Lee <andy.shlee@samsung.com>
Thu, 6 Apr 2017 02:18:29 +0000 (11:18 +0900)
- add video codec for source
- change pipeline creation as negotiation result

Signed-off-by: SeokHoon Lee <andy.shlee@samsung.com>
Change-Id: I027a4f5185d9d9bacfac9cfc05e5be01c7dd1d37

packaging/libmm-wfd.spec
src/mm_wfd_sink_manager.c
src/mm_wfd_sink_priv.c

index ec200b7935d5c0b3b28d41ba12497a11d7a3d886..be2d9f7909e615197906722ff9f6f52c47d4b618 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-wfd
 Summary:    Multimedia Framework Wifi-Display Library
-Version:    0.2.221
+Version:    0.2.222
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 4fbf50ea42ae35a8ed0a8dc8efcdb31151594d64..cb8c9e3d1441d8b18888cad2ef7538c1668316c9 100644 (file)
@@ -119,11 +119,7 @@ __mm_wfd_sink_manager_thread(gpointer data)
                                }
                                break;
                        case WFD_SINK_MANAGER_CMD_LINK_V_DECODEBIN:
-                               wfd_sink_debug("try to link video decodebin. session mode = %d", wfd_sink->ini.sink_session_mode);
-                               if (wfd_sink->ini.sink_session_mode & WFD_SESSION_MODE_AUDIO_ONLY) {
-                                       wfd_sink_debug("Audio only mode skip link video decodebin.");
-                                       break;
-                               }
+                               wfd_sink_debug("try to link video decodebin.");
                                if (MM_ERROR_NONE != __mm_wfd_sink_link_video_decodebin(wfd_sink)) {
                                        wfd_sink_error("failed to link video decodebin.....");
                                        goto EXIT;
@@ -137,11 +133,7 @@ __mm_wfd_sink_manager_thread(gpointer data)
                                }
                                break;
                        case WFD_SINK_MANAGER_CMD_PREPARE_V_PIPELINE:
-                               wfd_sink_debug("try to prepare video pipeline. session mode = %d", wfd_sink->ini.sink_session_mode);
-                               if (wfd_sink->ini.sink_session_mode & WFD_SESSION_MODE_AUDIO_ONLY) {
-                                       wfd_sink_debug("Audio only mode skip prepare video pipeline.");
-                                       break;
-                               }
+                               wfd_sink_debug("try to prepare video pipeline.");
                                if (MM_ERROR_NONE != __mm_wfd_sink_prepare_video_pipeline(wfd_sink, NULL)) {
                                        wfd_sink_error("failed to prepare video pipeline.....");
                                        goto EXIT;
@@ -155,11 +147,7 @@ __mm_wfd_sink_manager_thread(gpointer data)
                                }
                                break;
                        case WFD_SINK_MANAGER_CMD_UNPREPARE_V_PIPELINE:
-                               wfd_sink_debug("try to unprepare video pipeline. session mode = %d", wfd_sink->ini.sink_session_mode);
-                               if (wfd_sink->ini.sink_session_mode & WFD_SESSION_MODE_AUDIO_ONLY) {
-                                       wfd_sink_debug("Audio only mode skip unprepare video pipeline.");
-                                       break;
-                               }
+                               wfd_sink_debug("try to unprepare video pipeline.");
                                if (MM_ERROR_NONE != __mm_wfd_sink_unprepare_video_pipeline(wfd_sink)) {
                                        wfd_sink_error("failed to unprepare video pipeline.....");
                                        goto EXIT;
index 40ff1e2b4636cf9b61eef9a39969541aba1ab49c..18e7cbe13c30f3d8c06997f5c786647f2710c344 100644 (file)
@@ -193,21 +193,18 @@ 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_VIDEO_ONLY)) {
-               /* create video decodebin */
-               result = __mm_wfd_sink_create_video_decodebin(wfd_sink);
-               if (result < MM_ERROR_NONE) {
-                       wfd_sink_error("failed to create video decodebin %d", result);
-                       goto fail_to_create;
-               }
+       /* create video decodebin */
+       result = __mm_wfd_sink_create_video_decodebin(wfd_sink);
+       if (result < MM_ERROR_NONE) {
+               wfd_sink_error("failed to create video decodebin %d", result);
+               goto fail_to_create;
+       }
 
-               /* create video sinkbin */
-               result = __mm_wfd_sink_create_video_sinkbin(wfd_sink);
-               if (result < MM_ERROR_NONE) {
-                       wfd_sink_error("failed to create video sinkbin %d", result);
-                       goto fail_to_create;
-               }
+       /* create video sinkbin */
+       result = __mm_wfd_sink_create_video_sinkbin(wfd_sink);
+       if (result < MM_ERROR_NONE) {
+               wfd_sink_error("failed to create video sinkbin %d", result);
+               goto fail_to_create;
        }
 
        /* create audio decodebin */
@@ -1400,6 +1397,12 @@ __mm_wfd_sink_unprepare_video_pipeline(mm_wfd_sink_t *wfd_sink)
                                                                wfd_sink->pipeline,
                                                                MM_ERROR_WFD_NOT_INITIALIZED);
 
+       if (wfd_sink->stream_info.video_stream_info.codec == MM_WFD_SINK_VIDEO_CODEC_NONE) {
+               wfd_sink_debug("Skip unprepare video pipeline for none audio codec.");
+               wfd_sink_debug_fleave();
+               return MM_ERROR_NONE;
+       }
+
        PRINT_WFD_REF_COUNT(wfd_sink);
        wfd_sink_error("No-error:unprepare video sink bin");
        if (wfd_sink->pipeline->v_sinkbin && wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_BIN].gst) {
@@ -1590,6 +1593,12 @@ __mm_wfd_sink_prepare_video_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.video_stream_info.codec == MM_WFD_SINK_VIDEO_CODEC_NONE) {
+               wfd_sink_debug("Skip prepare video pipeline for none audio codec");
+               wfd_sink_debug_fleave();
+               return MM_ERROR_NONE;
+       }
+
        /* check video decodebin is linked */
        if (!wfd_sink->video_decodebin_is_linked) {
                /* check video decodebin is created */
@@ -2416,11 +2425,14 @@ __mm_wfd_sink_demux_pad_added(GstElement *demux, GstPad *pad, gpointer data)
                goto ERROR;
        }
 
-       wfd_sink_debug("Mux pad added, session mode = %d, name[0] = %c", wfd_sink->ini.sink_session_mode, name[0]);
+       wfd_sink_debug("Mux pad added, video_codec=%d, audio_codec=%d, name[0] = %c",
+                               wfd_sink->stream_info.video_stream_info.codec,
+                               wfd_sink->stream_info.audio_stream_info.codec,
+                               name[0]);
 
-       //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");
+       //In case of none vieo codec, we don't add video pad
+       if (wfd_sink->stream_info.video_stream_info.codec == MM_WFD_SINK_VIDEO_CODEC_NONE && name[0] == 'v') {
+               wfd_sink_error("Skip video pad add for none video codec");
                // Do nothing
                goto done;
        }
@@ -3024,12 +3036,10 @@ static int __mm_wfd_sink_create_pipeline(mm_wfd_sink_t *wfd_sink)
        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 */
-               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");
-               MMWFDSINK_PAD_PROBE(wfd_sink, NULL, mainbin[WFD_SINK_M_V_VALVE].gst, "sink");
-       }
+       /* 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");
+       MMWFDSINK_PAD_PROBE(wfd_sink, NULL, mainbin[WFD_SINK_M_V_VALVE].gst, "sink");
 
        /* adding created elements to pipeline */
        if (!__mm_wfd_sink_gst_element_add_bucket_to_bin(GST_BIN_CAST(mainbin[WFD_SINK_M_PIPE].gst), element_bucket, FALSE)) {
@@ -3654,7 +3664,7 @@ int __mm_wfd_sink_create_audio_sinkbin(mm_wfd_sink_t *wfd_sink)
        }
 
        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_error("Skip create audio sink bin for non audio codec.");
                wfd_sink_debug_fleave();
                return MM_ERROR_NONE;
        }
@@ -3826,6 +3836,12 @@ int __mm_wfd_sink_link_video_decodebin(mm_wfd_sink_t *wfd_sink)
                return MM_ERROR_NONE;
        }
 
+       if (wfd_sink->stream_info.video_stream_info.codec == MM_WFD_SINK_VIDEO_CODEC_NONE) {
+               wfd_sink_debug("Skip link video decodebin for none video codec.");
+               wfd_sink_debug_fleave();
+               return MM_ERROR_NONE;
+       }
+
        /* take video decodebin */
        v_decodebin = wfd_sink->pipeline->v_decodebin;
 
@@ -4228,6 +4244,12 @@ int __mm_wfd_sink_create_video_decodebin(mm_wfd_sink_t *wfd_sink)
                return MM_ERROR_NONE;
        }
 
+       if (wfd_sink->stream_info.video_stream_info.codec == MM_WFD_SINK_VIDEO_CODEC_NONE) {
+               wfd_sink_debug("Skip create video decodebin for none video codec.");
+               wfd_sink_debug_fleave();
+               return MM_ERROR_NONE;
+       }
+
        /* check video decodebin could be linked now */
        switch (wfd_sink->stream_info.video_stream_info.codec) {
        case MM_WFD_SINK_VIDEO_CODEC_H264:
@@ -4455,6 +4477,12 @@ int __mm_wfd_sink_create_video_sinkbin(mm_wfd_sink_t *wfd_sink)
                return MM_ERROR_NONE;
        }
 
+       if (wfd_sink->stream_info.video_stream_info.codec == MM_WFD_SINK_VIDEO_CODEC_NONE) {
+               wfd_sink_error("Skip create video sink bin for non video codec.");
+               wfd_sink_debug_fleave();
+               return MM_ERROR_NONE;
+       }
+
        /* alloc handles */
        v_sinkbin = (MMWFDSinkGstElement *)g_malloc0(sizeof(MMWFDSinkGstElement) * WFD_SINK_V_S_NUM);
        if (!v_sinkbin) {