From: Hyunsoo, Park Date: Wed, 23 Nov 2016 04:22:48 +0000 (+0900) Subject: Add 'TCP/UDP Switching' feature X-Git-Tag: submit/tizen_3.0/20161129.051721^2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2f5121ffa05d28b4f8a59e7e733e9d62e7ecb10f;p=platform%2Fcore%2Fapi%2Fscreen-mirroring.git Add 'TCP/UDP Switching' feature 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 --- diff --git a/include/scmirroring_private.h b/include/scmirroring_private.h index c7b971a..387bf4a 100755 --- a/include/scmirroring_private.h +++ b/include/scmirroring_private.h @@ -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 { diff --git a/include/scmirroring_src.h b/include/scmirroring_src.h old mode 100755 new mode 100644 index 21d5bbb..ca17eca --- a/include/scmirroring_src.h +++ b/include/scmirroring_src.h @@ -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. diff --git a/include/scmirroring_type.h b/include/scmirroring_type.h old mode 100755 new mode 100644 index 56b4340..162ef72 --- a/include/scmirroring_type.h +++ b/include/scmirroring_type.h @@ -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 * diff --git a/miracast_server/miracast_server_impl.c b/miracast_server/miracast_server_impl.c index bbc2669..4dce052 100644 --- a/miracast_server/miracast_server_impl.c +++ b/miracast_server/miracast_server_impl.c @@ -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"); diff --git a/packaging/capi-media-screen-mirroring.spec b/packaging/capi-media-screen-mirroring.spec index 46ce410..59b5dd5 100644 --- a/packaging/capi-media-screen-mirroring.spec +++ b/packaging/capi-media-screen-mirroring.spec @@ -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 diff --git a/src/scmirroring_sink.c b/src/scmirroring_sink.c old mode 100755 new mode 100644 index 4a86c22..5cb1ad3 --- a/src/scmirroring_sink.c +++ b/src/scmirroring_sink.c @@ -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; } diff --git a/src/scmirroring_src.c b/src/scmirroring_src.c index 3aff34f..c28dad0 100644 --- a/src/scmirroring_src.c +++ b/src/scmirroring_src.c @@ -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); diff --git a/test/scmirroring_test.c b/test/scmirroring_test.c old mode 100644 new mode 100755 index 770d331..39af904 --- a/test/scmirroring_test.c +++ b/test/scmirroring_test.c @@ -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); diff --git a/test/scmirroring_wifi_direct_test.c b/test/scmirroring_wifi_direct_test.c old mode 100644 new mode 100755 index dbc6fbb..50cc1d3 --- a/test/scmirroring_wifi_direct_test.c +++ b/test/scmirroring_wifi_direct_test.c @@ -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);