Change for audio only session 66/113766/3
authorSeokHoon Lee <andy.shlee@samsung.com>
Thu, 9 Feb 2017 00:57:56 +0000 (09:57 +0900)
committerHyunsoo, Park <hance.park@samsung.com>
Tue, 14 Feb 2017 04:55:39 +0000 (13:55 +0900)
Do not need to take care video prepare/unprepare.

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

packaging/libmm-wfd.spec
src/include/mm_wfd_sink_enum.h
src/include/mm_wfd_sink_ini.h
src/mm_wfd_sink_ini.c
src/mm_wfd_sink_manager.c
src/mm_wfd_sink_priv.c

index ce8fe011733b45ac34c1cac7bddd4d81478ea36a..dc77a717c02ab445b40809df0977eb0ee320fbee 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-wfd
 Summary:    Multimedia Framework Wifi-Display Library
-Version:    0.2.215
+Version:    0.2.216
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index e45847911b655afeaaf512c9fd67a2b4267a12be..60f5cbf3f94bdf4a0cd1fcc0bd849c0d1de7fd1c 100644 (file)
 #ifndef _MM_WFD_SINK_WFD_ENUM_H_
 #define _MM_WFD_SINK_WFD_ENUM_H_
 
+typedef enum {
+       WFD_SESSION_MODE_MIXED          = 0,
+       WFD_SESSION_MODE_VIDEO_ONLY,
+       WFD_SESSION_MODE_AUDIO_ONLY
+} WFDSinkSessionMOde;
+
 typedef enum {
        WFD_AUDIO_UNKNOWN       = 0,
        WFD_AUDIO_LPCM          = (1 << 0),
index 6a19e04e3781f0f4ea366e03c4484e53bcad28b5..37796e85c1f5c4ed8d67c98b3f125b7468458475 100644 (file)
@@ -113,6 +113,7 @@ typedef struct __mm_wfd_sink_ini {
        gboolean enable_retransmission;
        gboolean enable_reset_basetime;
        gchar user_agent[WFD_SINK_INI_MAX_STRLEN];
+       gint sink_session_mode;
 
        /* debug */
        gboolean generate_dot;
index fbd7c10ec1e705db6a9f55e2b1a28523784ffb54..62034eb6c9a8c7578928e7888b5503967714d40d 100644 (file)
@@ -45,6 +45,7 @@
 #define DEFAULT_AUDIO_SINK_ASYNC FALSE
 #define DEFAULT_VIDEO_SINK_ASYNC FALSE
 #define DEFAULT_USER_AGENT "TIZEN3_0/WFD-SINK"
+#define DEFAULT_SINK_SESSION_MODE WFD_SESSION_MODE_MIXED
 
 /* Debug */
 #define DEFAULT_GENERATE_DOT   FALSE
@@ -249,6 +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);
 
                /* debug */
                ini->generate_dot = iniparser_getboolean(dict, "debug:generate dot", DEFAULT_GENERATE_DOT);
@@ -380,6 +382,7 @@ mm_wfd_sink_ini_load(mm_wfd_sink_ini_t *ini, const char *path)
                ini->video_sink_max_lateness = DEFAULT_VIDEO_SINK_MAX_LATENESS;
                ini->sink_ts_offset = DEFAULT_SINK_TS_OFFSET;
                strncpy(ini->user_agent, DEFAULT_USER_AGENT, WFD_SINK_INI_MAX_STRLEN - 1);
+               ini->sink_session_mode = DEFAULT_SINK_SESSION_MODE;
 
                /* debug */
                ini->generate_dot =  DEFAULT_GENERATE_DOT;
@@ -501,6 +504,7 @@ mm_wfd_sink_ini_load(mm_wfd_sink_ini_t *ini, const char *path)
        wfd_sink_debug("audio_sink_async : %d", ini->audio_sink_async);
        wfd_sink_debug("video_sink_async : %d", ini->video_sink_async);
        wfd_sink_debug("user_agent : %s\n", ini->user_agent);
+       wfd_sink_debug("sink_session_mode : %d", ini->sink_session_mode);
 
        /* debug */
        wfd_sink_debug("generate_dot : %d", ini->generate_dot);
index a38943a09f195e93d885cad5af81c75549be08f2..697cddd40119c6a76d847ba63a8552927b27a372 100644 (file)
@@ -22,7 +22,7 @@
 
 
 #include "mm_wfd_sink_manager.h"
-
+#include "mm_wfd_sink_enum.h"
 
 static gpointer __mm_wfd_sink_manager_thread(gpointer data);
 
@@ -119,7 +119,11 @@ __mm_wfd_sink_manager_thread(gpointer data)
                                }
                                break;
                        case WFD_SINK_MANAGER_CMD_LINK_V_DECODEBIN:
-                               wfd_sink_debug("try to link video 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;
+                               }
                                if (MM_ERROR_NONE != __mm_wfd_sink_link_video_decodebin(wfd_sink)) {
                                        wfd_sink_error("failed to link video decodebin.....");
                                        goto EXIT;
@@ -133,7 +137,11 @@ __mm_wfd_sink_manager_thread(gpointer data)
                                }
                                break;
                        case WFD_SINK_MANAGER_CMD_PREPARE_V_PIPELINE:
-                               wfd_sink_debug("try to prepare video 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;
+                               }
                                if (MM_ERROR_NONE != __mm_wfd_sink_prepare_video_pipeline(wfd_sink, NULL)) {
                                        wfd_sink_error("failed to prepare video pipeline.....");
                                        goto EXIT;
@@ -147,7 +155,11 @@ __mm_wfd_sink_manager_thread(gpointer data)
                                }
                                break;
                        case WFD_SINK_MANAGER_CMD_UNPREPARE_V_PIPELINE:
-                               wfd_sink_debug("try to unprepare video 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;
+                               }
                                if (MM_ERROR_NONE != __mm_wfd_sink_unprepare_video_pipeline(wfd_sink)) {
                                        wfd_sink_error("failed to unprepare video pipeline.....");
                                        goto EXIT;
index 960ae24410479804cc515d537fbdf36b49cb25ec..fcb63ce899f91f44aa1905980fc4b72a6a0e68b5 100644 (file)
@@ -193,18 +193,22 @@ int _mm_wfd_sink_prepare(mm_wfd_sink_t *wfd_sink)
                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;
-       }
+       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_sink->ini.sink_session_mode == 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 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 */
@@ -2390,6 +2394,13 @@ __mm_wfd_sink_demux_pad_added(GstElement *demux, GstPad *pad, gpointer data)
                                                        wfd_sink->pipeline->mainbin &&
                                                        wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst);
 
+       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') {
+               wfd_sink_error("Skip video pad add in audio only mode");
+               // Do nothing
+               goto done;
+       }
+
        pipeline = wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst;
 
        /* take srcpad from demuxer added pad */
@@ -2985,10 +2996,13 @@ 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");
 
-       /* 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");
+       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_sink->ini.sink_session_mode == 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");
+       }
 
        /* 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)) {