Add 'TCP/UDP Switching' feature 79/99479/4
authorHyunsoo, Park <hance.park@samsung.com>
Wed, 23 Nov 2016 04:22:48 +0000 (13:22 +0900)
committerSeokHoon Lee <andy.shlee@samsung.com>
Fri, 25 Nov 2016 06:29:50 +0000 (15:29 +0900)
Using this feature, User can choose transport layer protocol between TCP and UDP.

For testing, use 'scmirroring_test' or 'scmirroring_wifi_direct_test'
And through 'GST_LOG', user can show logs.

[Version] 0.1.58
[Profile] Common
[Issue Type] Add feature
[Dependency module] N/A
[Test] [M(T) - Boot=(OK), sdb=(OK), Home=(OK), Touch=(OK), Version=tizen-mobile_20161111.1]

Change-Id: I6b2bd6d68224e96995d05de693ee72c5162791a1
Signed-off-by: Hyunsoo, Park <hance.park@samsung.com>
include/scmirroring_private.h
include/scmirroring_src.h [changed mode: 0755->0644]
include/scmirroring_type.h [changed mode: 0755->0644]
miracast_server/miracast_server_impl.c
packaging/capi-media-screen-mirroring.spec
src/scmirroring_sink.c [changed mode: 0755->0644]
src/scmirroring_src.c
test/scmirroring_test.c [changed mode: 0644->0755]
test/scmirroring_wifi_direct_test.c [changed mode: 0644->0755]

index c7b971a0aa7cee96157d4aa9a3896c52ed74ad28..387bf4a3834f8c603c50f00b88455b42b2003cf1 100755 (executable)
@@ -126,6 +126,7 @@ typedef struct {
        int current_state;
        scmirroring_state_cb_s *scmirroring_state_cb;
        scmirroring_multisink_e multisink;
+       scmirroring_av_transport_e av_transport;
 } scmirroring_src_s;
 
 typedef struct {
old mode 100755 (executable)
new mode 100644 (file)
index 21d5bbb..ca17eca
@@ -291,6 +291,31 @@ int scmirroring_src_pause(scmirroring_src_h scmirroring_src);
  */
 int scmirroring_src_resume(scmirroring_src_h scmirroring_src);
 
+/**
+ * @brief Change transport for AV streaming.
+ * @details This function changes transport for AV streaming. Default transport is UDP.
+ *
+ * @param[in] scmirroring_src The handle to screen mirroring source
+ * @param[in] transport Transport for audio/video streaming data
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #SCMIRRORING_ERROR_NONE Successful
+ * @retval #SCMIRRORING_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #SCMIRRORING_ERROR_OUT_OF_MEMORY Not enough memory to allocate new object
+ * @retval #SCMIRRORING_ERROR_INVALID_OPERATION External function not implemented
+ *
+ * @pre The screen mirroring state should be SCMIRRORING_STATE_PLAYING
+ *
+ * @see scmirroring_src_create()
+ * @see scmirroring_src_set_state_changed_cb()
+ * @see scmirroring_src_prepare()
+ * @see scmirroring_src_connect()
+ * @see scmirroring_src_start()
+ */
+int scmirroring_src_AV_transport_switch(scmirroring_src_h scmirroring_src, scmirroring_av_transport_e transport);
+
 /**
  * @brief Stops screen mirroring, asynchronously.
  * @details This function stops screen mirroring, which means it sends RTSP TEARDOWN trigger message to sink.
old mode 100755 (executable)
new mode 100644 (file)
index 56b4340..162ef72
@@ -125,6 +125,15 @@ typedef enum {
 } scmirroring_video_codec_e;
 
 /**
+ * @brief Enumeration for screen mirroring AV streaming transport.
+ * @since_tizen 3.0
+ */
+typedef enum {
+       SCMIRRORING_AV_TRANSPORT_UDP = 0,    /**< UDP transoprt for AV streaming data */
+       SCMIRRORING_AV_TRANSPORT_TCP         /**< TCP transport for AV streaming data */
+} scmirroring_av_transport_e;
+
+ /**
  * @brief Called when each status is changed.
  * @since_tizen 2.4
  *
index bbc26690f57c306ebc4901be7d9838cb077f751c..4dce052040c883383aec016a6c5f66aac62260bd 100644 (file)
@@ -48,6 +48,9 @@
 #define TEST_MOUNT_POINT  "/wfd1.0/streamid=0"
 #define WFD_REQUIREMENT "org.wfa.wfd1.0"
 
+#define SWITCH_TO_UDP 0
+#define SWITCH_TO_TCP 1
+
 
 static const GDBusMethodInfo scmirroring_server_method_info_method = {
        -1,
@@ -728,6 +731,39 @@ failed:
        return SCMIRRORING_ERROR_INVALID_OPERATION;
 }
 
+static int __miracast_server_switch_transport(MiracastServer *server_obj, gint transport)
+{
+       GstRTSPWFDServer *server = NULL;
+       server = (GstRTSPWFDServer *)server_obj->server;
+       if (server == NULL) {
+               scmirroring_error("No server object");
+               goto failed;
+       }
+
+       switch (transport) {
+       case SWITCH_TO_UDP:
+               if (gst_rtsp_wfd_server_switch_to_udp(server) != ERROR_NONE) {
+                       scmirroring_error("Failed switch transport to UDP in server object");
+                       goto failed;
+               }
+               break;
+       case SWITCH_TO_TCP:
+               if (gst_rtsp_wfd_server_switch_to_tcp(server) != ERROR_NONE) {
+                       scmirroring_error("Failed switch transport to TCP in server object");
+                       goto failed;
+               }
+               break;
+       default:
+               return SCMIRRORING_ERROR_INVALID_PARAMETER;
+       }
+
+       return SCMIRRORING_ERROR_NONE;
+
+failed:
+       scmirroring_error("Failed to start direct streaming");
+       return SCMIRRORING_ERROR_INVALID_OPERATION;
+}
+
 void __miracast_server_interpret(MiracastServer *server, gchar *buf)
 {
        int ret = SCMIRRORING_ERROR_NONE;
@@ -805,6 +841,22 @@ void __miracast_server_interpret(MiracastServer *server, gchar *buf)
                g_strfreev(multisink_info);
 
                klass->send_response(server, "OK:SET");
+       } else if (g_strrstr(buf, "SWITCH UDP")) {
+               scmirroring_debug("Swithc AV streaming transport to UDP");
+
+               ret = __miracast_server_switch_transport(server, SWITCH_TO_UDP);
+               if (ret == SCMIRRORING_ERROR_NONE)
+                       klass->send_response(server, "OK:SET");
+               else
+                       klass->send_response(server, "FAIL:SET");
+       } else if (g_strrstr(buf, "SWITCH TCP")) {
+               scmirroring_debug("Swithc AV streaming transport to TCP");
+
+               ret = __miracast_server_switch_transport(server, SWITCH_TO_TCP);
+               if (ret == SCMIRRORING_ERROR_NONE)
+                       klass->send_response(server, "OK:SET");
+               else
+                       klass->send_response(server, "FAIL:SET");
        } else if (g_strrstr(buf, SCMIRRORING_STATE_CMD_PAUSE)) {
                gst_rtsp_wfd_server_trigger_request(GST_RTSP_SERVER(server->server), WFD_TRIGGER_PAUSE);
                klass->send_response(server, "OK:PAUSE");
index 46ce410ffe85de56a17ad8bfc2c97719c9fbeac6..59b5dd5257b6faf312f155986aef9d384919e5bd 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-screen-mirroring
 Summary:    A screen mirroring library in Tizen C API
-Version:    0.1.57
+Version:    0.1.58
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
old mode 100755 (executable)
new mode 100644 (file)
index 4a86c22..5cb1ad3
@@ -105,7 +105,7 @@ int scmirroring_sink_create(scmirroring_sink_h *scmirroring_sink)
 
        int ret = SCMIRRORING_ERROR_NONE;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(scmirroring_sink == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -129,7 +129,7 @@ int scmirroring_sink_create(scmirroring_sink_h *scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -140,7 +140,7 @@ int scmirroring_sink_set_ip_and_port(scmirroring_sink_h scmirroring_sink, const
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
        scmirroring_retvm_if(ip == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "ip is NULL");
@@ -151,7 +151,7 @@ int scmirroring_sink_set_ip_and_port(scmirroring_sink_h scmirroring_sink, const
        handle->ip = strdup(ip);
        handle->port = strdup(port);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return SCMIRRORING_ERROR_NONE;
 }
@@ -164,7 +164,7 @@ int scmirroring_sink_prepare(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -172,7 +172,7 @@ int scmirroring_sink_prepare(scmirroring_sink_h scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -186,7 +186,7 @@ int scmirroring_sink_connect(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -210,7 +210,7 @@ int scmirroring_sink_connect(scmirroring_sink_h scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -223,7 +223,7 @@ int scmirroring_sink_unprepare(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -231,7 +231,7 @@ int scmirroring_sink_unprepare(scmirroring_sink_h scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -244,7 +244,7 @@ int scmirroring_sink_destroy(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -258,7 +258,7 @@ int scmirroring_sink_destroy(scmirroring_sink_h scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -271,7 +271,7 @@ int scmirroring_sink_start(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -279,7 +279,7 @@ int scmirroring_sink_start(scmirroring_sink_h scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -292,7 +292,7 @@ int scmirroring_sink_disconnect(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -300,7 +300,7 @@ int scmirroring_sink_disconnect(scmirroring_sink_h scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -313,7 +313,7 @@ int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, s
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
        scmirroring_retvm_if(callback == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "callback is NULL");
@@ -335,7 +335,7 @@ int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, s
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -348,7 +348,7 @@ int scmirroring_sink_unset_state_changed_cb(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -358,7 +358,7 @@ int scmirroring_sink_unset_state_changed_cb(scmirroring_sink_h scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -371,7 +371,7 @@ int scmirroring_sink_set_display(scmirroring_sink_h scmirroring_sink, scmirrorin
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
        scmirroring_retvm_if(display_surface == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "display_surface is NULL");
@@ -397,7 +397,7 @@ int scmirroring_sink_set_display(scmirroring_sink_h scmirroring_sink, scmirrorin
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -410,7 +410,7 @@ int scmirroring_sink_set_resolution(scmirroring_sink_h scmirroring_sink, int res
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
        if ((resolution < SCMIRRORING_RESOLUTION_1920x1080_P30) || (resolution >= SCMIRRORING_RESOLUTION_MAX)) {
@@ -427,7 +427,7 @@ int scmirroring_sink_set_resolution(scmirroring_sink_h scmirroring_sink, int res
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -440,7 +440,7 @@ int scmirroring_sink_pause(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -448,7 +448,7 @@ int scmirroring_sink_pause(scmirroring_sink_h scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -461,7 +461,7 @@ int scmirroring_sink_resume(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_sink_s *handle = (scmirroring_sink_s *)scmirroring_sink;
 
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
@@ -469,7 +469,7 @@ int scmirroring_sink_resume(scmirroring_sink_h scmirroring_sink)
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -482,7 +482,7 @@ int scmirroring_sink_get_negotiated_video_codec(scmirroring_sink_h *scmirroring_
        int mm_codec = MM_WFD_SINK_VIDEO_CODEC_NONE;
 
        scmirroring_sink_s *handle = NULL;
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(scmirroring_sink == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink* is NULL");
        scmirroring_retvm_if(codec == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "codec is NULL");
@@ -507,7 +507,7 @@ int scmirroring_sink_get_negotiated_video_codec(scmirroring_sink_h *scmirroring_
        }
 
        scmirroring_debug("codec: %d", *codec);
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -519,7 +519,7 @@ int scmirroring_sink_get_negotiated_video_resolution(scmirroring_sink_h *scmirro
        int ret = SCMIRRORING_ERROR_NONE;
 
        scmirroring_sink_s *handle = NULL;
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(scmirroring_sink == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink* is NULL");
        scmirroring_retvm_if(width == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "width is NULL");
@@ -537,7 +537,7 @@ int scmirroring_sink_get_negotiated_video_resolution(scmirroring_sink_h *scmirro
                return ret;
 
        scmirroring_debug("width: %d, height: %d", *width, *height);
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -549,7 +549,7 @@ int scmirroring_sink_get_negotiated_video_frame_rate(scmirroring_sink_h *scmirro
        int ret = SCMIRRORING_ERROR_NONE;
 
        scmirroring_sink_s *handle = NULL;
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(scmirroring_sink == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink* is NULL");
        scmirroring_retvm_if(frame_rate == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "frame_rate is NULL");
@@ -565,7 +565,7 @@ int scmirroring_sink_get_negotiated_video_frame_rate(scmirroring_sink_h *scmirro
                return ret;
 
        scmirroring_debug("frame rate: %d", *frame_rate);
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -578,7 +578,7 @@ int scmirroring_sink_get_negotiated_audio_codec(scmirroring_sink_h *scmirroring_
        int mm_codec = MM_WFD_SINK_AUDIO_CODEC_NONE;
 
        scmirroring_sink_s *handle = NULL;
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(scmirroring_sink == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink* is NULL");
        scmirroring_retvm_if(codec == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "codec is NULL");
@@ -609,7 +609,7 @@ int scmirroring_sink_get_negotiated_audio_codec(scmirroring_sink_h *scmirroring_
        }
 
        scmirroring_debug("codec: %d", *codec);
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -621,7 +621,7 @@ int scmirroring_sink_get_negotiated_audio_channel(scmirroring_sink_h *scmirrorin
        int ret = SCMIRRORING_ERROR_NONE;
 
        scmirroring_sink_s *handle = NULL;
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(scmirroring_sink == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink* is NULL");
        scmirroring_retvm_if(channel == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "channel is NULL");
@@ -637,7 +637,7 @@ int scmirroring_sink_get_negotiated_audio_channel(scmirroring_sink_h *scmirrorin
                return ret;
 
        scmirroring_debug("channel: %d", *channel);
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -649,7 +649,7 @@ int scmirroring_sink_get_negotiated_audio_sample_rate(scmirroring_sink_h *scmirr
        int ret = SCMIRRORING_ERROR_NONE;
 
        scmirroring_sink_s *handle = NULL;
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(scmirroring_sink == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink* is NULL");
        scmirroring_retvm_if(sample_rate == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "sample_rate is NULL");
@@ -665,7 +665,7 @@ int scmirroring_sink_get_negotiated_audio_sample_rate(scmirroring_sink_h *scmirr
                return ret;
 
        scmirroring_debug("sample rate: %d", *sample_rate);
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
@@ -677,7 +677,7 @@ int scmirroring_sink_get_negotiated_audio_bitwidth(scmirroring_sink_h *scmirrori
        int ret = SCMIRRORING_ERROR_NONE;
 
        scmirroring_sink_s *handle = NULL;
-       scmirroring_error_fenter();
+       scmirroring_debug_fenter();
 
        scmirroring_retvm_if(scmirroring_sink == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink* is NULL");
        scmirroring_retvm_if(bitwidth == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "bitwidth is NULL");
@@ -693,7 +693,7 @@ int scmirroring_sink_get_negotiated_audio_bitwidth(scmirroring_sink_h *scmirrori
                return ret;
 
        scmirroring_debug("bitwidth: %d", *bitwidth);
-       scmirroring_error_fleave();
+       scmirroring_debug_fleave();
 
        return ret;
 }
index 3aff34f85f62d5bcbbb90e49ef29b46bac2eecda..c28dad082a22584b85db97c1d7519a639250d0b1 100644 (file)
@@ -364,6 +364,27 @@ static int __scmirroring_src_send_set_multisink(scmirroring_src_h scmirroring)
        return ret;
 }
 
+static int __scmirroring_src_send_switch_transport(scmirroring_src_h scmirroring)
+{
+       /* Set tranport protocol to miracast server */
+       char *cmd = NULL;
+       int ret = SCMIRRORING_ERROR_NONE;
+       scmirroring_src_s *_scmirroring = (scmirroring_src_s *)scmirroring;
+       const char *tr = _scmirroring->av_transport == SCMIRRORING_AV_TRANSPORT_UDP ? "UDP": "TCP";
+
+       cmd = g_strdup_printf("SWITCH %s", tr);
+       ret = __scmirroring_src_send_cmd_to_server(_scmirroring, cmd);
+       if (ret != SCMIRRORING_ERROR_NONE) {
+               SCMIRRORING_SAFE_FREE(cmd);
+               scmirroring_error("Failed to be ready [%d]", ret);
+               return SCMIRRORING_ERROR_INVALID_OPERATION;
+       }
+
+       SCMIRRORING_SAFE_FREE(cmd);
+
+       return ret;
+}
+
 int scmirroring_src_create(scmirroring_src_h *scmirroring)
 {
        CHECK_FEATURE_SUPPORTED(WIFIDIRECT_DISPLAY_FEATURE);
@@ -391,6 +412,7 @@ int scmirroring_src_create(scmirroring_src_h *scmirroring)
        _scmirroring->current_state = SCMIRRORING_STATE_NONE;
        _scmirroring->server_name = g_strdup("scmirroring");
        _scmirroring->multisink = SCMIRRORING_MULTISINK_DISABLE;
+       _scmirroring->av_transport = SCMIRRORING_AV_TRANSPORT_UDP;
 
        *scmirroring = (scmirroring_src_h)_scmirroring;
 
@@ -780,6 +802,32 @@ int scmirroring_src_resume(scmirroring_src_h scmirroring)
        return ret;
 }
 
+int scmirroring_src_AV_transport_switch(scmirroring_src_h scmirroring,
+    scmirroring_av_transport_e transport)
+{
+       CHECK_FEATURE_SUPPORTED(WIFIDIRECT_DISPLAY_FEATURE);
+
+       int ret = SCMIRRORING_ERROR_NONE;
+       scmirroring_src_s *_scmirroring = (scmirroring_src_s *)scmirroring;
+
+       scmirroring_debug_fenter();
+
+       scmirroring_retvm_if(_scmirroring == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       if (transport < SCMIRRORING_AV_TRANSPORT_UDP || transport > SCMIRRORING_AV_TRANSPORT_TCP) {
+               scmirroring_error ("Invalid transport");
+               return SCMIRRORING_ERROR_INVALID_PARAMETER;
+       }
+
+       _scmirroring->av_transport = transport;
+
+       ret = __scmirroring_src_send_switch_transport(_scmirroring);
+
+       scmirroring_debug_fleave();
+
+       return ret;
+}
+
 int scmirroring_src_stop(scmirroring_src_h scmirroring)
 {
        CHECK_FEATURE_SUPPORTED(WIFIDIRECT_DISPLAY_FEATURE);
old mode 100644 (file)
new mode 100755 (executable)
index 770d331..39af904
@@ -53,6 +53,8 @@ static void __displaymenu(void)
        g_print("S : Start  \n");
        g_print("P : Pause \n");
        g_print("R : Resume \n");
+       g_print("u : Switch to UDP\n");
+       g_print("t : Switch ti TCP\n");
        g_print("T : sTop\n");
        g_print("D : Destroy\n");
        g_print("q : quit\n");
@@ -95,6 +97,12 @@ static void __interpret(char *cmd)
        } else if (strncmp(cmd, "R", 1) == 0) {
                g_print("Resume\n");
                ret = scmirroring_src_resume(g_scmirroring);
+       } else if (strncmp(cmd, "u", 1) == 0) {
+               g_print("Switch to UDP\n");
+               ret = scmirroring_src_AV_transport_switch(g_scmirroring, SCMIRRORING_AV_TRANSPORT_UDP);
+       } else if (strncmp(cmd, "t", 1) == 0) {
+               g_print("Switch to TCP\n");
+               ret = scmirroring_src_AV_transport_switch(g_scmirroring, SCMIRRORING_AV_TRANSPORT_TCP);
        } else if (strncmp(cmd, "T", 1) == 0) {
                g_print("Stop\n");
                ret = scmirroring_src_stop(g_scmirroring);
old mode 100644 (file)
new mode 100755 (executable)
index dbc6fbb..50cc1d3
@@ -72,6 +72,8 @@ static void __displaymenu(void)
        g_print("S : Start  \n");
        g_print("P : Pause \n");
        g_print("R : Resume \n");
+       g_print("u : Switch to UDP\n");
+       g_print("t : Switch ti TCP\n");
        g_print("T : sTop\n");
        g_print("D : Destroy\n");
 
@@ -139,6 +141,13 @@ static void __interpret(char *cmd)
        } else if (strncmp(cmd, "R", 1) == 0) {
                g_print("Resume\n");
                ret = scmirroring_src_resume(g_scmirroring);
+
+       } else if (strncmp(cmd, "u", 1) == 0) {
+               g_print("Switch to UDP\n");
+               ret = scmirroring_src_AV_transport_switch(g_scmirroring, SCMIRRORING_AV_TRANSPORT_UDP);
+       } else if (strncmp(cmd, "t", 1) == 0) {
+               g_print("Switch to TCP\n");
+               ret = scmirroring_src_AV_transport_switch(g_scmirroring, SCMIRRORING_AV_TRANSPORT_TCP);
        } else if (strncmp(cmd, "T", 1) == 0) {
                g_print("Stop\n");
                ret = scmirroring_src_stop(g_scmirroring);