int current_state;
scmirroring_state_cb_s *scmirroring_state_cb;
scmirroring_multisink_e multisink;
+ scmirroring_direct_streaming_e direct_streaming;
+ char *filesrc;
scmirroring_av_transport_e av_transport;
} scmirroring_src_s;
*/
int scmirroring_src_resume(scmirroring_src_h scmirroring_src);
+/**
+ * @brief Enable streaming without reencoding for screen mirroring.
+ * @details This function enable streaming without reencoding for screen mirroring, which means files that encoded with supported formats will be streamed without decoding and reencoding.
+ *
+ * @param[in] scmirroring_src The handle to screen mirroring source
+ * @param[in] enable Ability to stream file directly
+ * @param[in] uri_srcname File name to stream directly
+ *
+ * @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_connect()
+ * @see scmirroring_src_start()
+ */
+int scmirroring_src_set_direct_streaming(scmirroring_src_h scmirroring_src, scmirroring_direct_streaming_e enable, const char *uri_srcname);
+
/**
* @brief Change transport for AV streaming.
* @details This function changes transport for AV streaming. Default transport is UDP.
SCMIRRORING_VIDEO_CODEC_H264 /**< H.264 codec for video */
} scmirroring_video_codec_e;
+/**
+ * @brief Enumeration for screen mirroring direct streaming mode.
+ * @since_tizen 3.0
+ */
+typedef enum {
+ SCMIRRORING_DIRECT_STREAMING_DISABLED = 0, /**< Disable screen mirroring direct streaming mode */
+ SCMIRRORING_DIRECT_STREAMING_ENABLED /**< Enable direct streaming for files */
+} scmirroring_direct_streaming_e;
+
/**
* @brief Enumeration for screen mirroring AV streaming transport.
* @since_tizen 3.0
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
*
return SCMIRRORING_ERROR_INVALID_OPERATION;
}
+static int __miracast_server_set_direct_streaming(MiracastServer *server_obj, gint direct_streaming,
+ gchar *filesrc)
+{
+ GstRTSPWFDServer *server = NULL;
+ server = (GstRTSPWFDServer *)server_obj->server;
+ if (server == NULL) {
+ scmirroring_error("No server object");
+ goto failed;
+ }
+
+ if (gst_rtsp_wfd_server_set_direct_streaming(server, direct_streaming, filesrc) != ERROR_NONE) {
+ scmirroring_error("Failed to set direct streaming to server object");
+ goto failed;
+ }
+
+ return SCMIRRORING_ERROR_NONE;
+failed:
+ scmirroring_error("Failed to start direct streaming");
+ return SCMIRRORING_ERROR_INVALID_OPERATION;
+}
+
static int __miracast_server_switch_transport(MiracastServer *server_obj, gint transport)
{
GstRTSPWFDServer *server = NULL;
g_strfreev(multisink_info);
klass->send_response(server, "OK:SET");
+ } else if (g_strrstr(buf, "SET STREAMING")) {
+ gchar **streaming_info = NULL;
+
+ streaming_info = g_strsplit(buf, " ", 0);
+ if (streaming_info == NULL || streaming_info[2] == NULL || streaming_info[3] == NULL) {
+ klass->send_response(server, "FAIL:SET");
+ g_strfreev(streaming_info);
+ return;
+ }
+
+ scmirroring_debug("Streming command: %d, Filesrc: %s", atoi(streaming_info[2]), streaming_info[3]);
+
+ ret = __miracast_server_set_direct_streaming(server, atoi(streaming_info[2]), streaming_info[3]);
+
+ if (ret == SCMIRRORING_ERROR_NONE)
+ klass->send_response(server, "OK:SET");
+ else
+ klass->send_response(server, "FAIL:SET");
+
+ g_strfreev(streaming_info);
+
} else if (g_strrstr(buf, "SWITCH UDP")) {
scmirroring_debug("Swithc AV streaming transport to UDP");
Name: capi-media-screen-mirroring
Summary: A screen mirroring library in Tizen C API
-Version: 0.1.82
+Version: 0.1.83
Release: 0
Group: Multimedia/API
License: Apache-2.0
return ret;
}
+static int __scmirroring_src_send_set_direct_streaming(scmirroring_src_h scmirroring)
+{
+ /* Set resolution to miracast server */
+ char *cmd = NULL;
+ int ret = SCMIRRORING_ERROR_NONE;
+ scmirroring_src_s *_scmirroring = (scmirroring_src_s *)scmirroring;
+
+ scmirroring_retvm_if(_scmirroring == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+ cmd = g_strdup_printf("SET STREAMING %d %s", _scmirroring->direct_streaming, _scmirroring->filesrc);
+ ret = __scmirroring_src_send_cmd_to_server(_scmirroring, cmd);
+ if (ret != SCMIRRORING_ERROR_NONE) {
+ SCMIRRORING_SAFE_FREE(cmd);
+ scmirroring_error("Failed to enable direct streaming [%d]", ret);
+ return SCMIRRORING_ERROR_INVALID_OPERATION;
+ }
+
+ SCMIRRORING_SAFE_FREE(cmd);
+
+ return ret;
+}
+
static int __scmirroring_src_send_switch_transport(scmirroring_src_h scmirroring)
{
/* Set tranport protocol to miracast server */
_scmirroring->magic_num = SCMIRRORING_MAGIC_NUMBER;
_scmirroring->ip = NULL;
_scmirroring->port = NULL;
+ _scmirroring->filesrc = NULL;
_scmirroring->connected = NOT_CONNECTED_TO_SERVER;
_scmirroring->use_hdcp = TRUE;
_scmirroring->resolution = 0;
return ret;
}
+int scmirroring_src_set_direct_streaming(scmirroring_src_h scmirroring_src,
+ scmirroring_direct_streaming_e enable, const char* uri_srcname)
+{
+ CHECK_FEATURE_SUPPORTED(WIFIDIRECT_DISPLAY_FEATURE);
+
+ int ret = SCMIRRORING_ERROR_NONE;
+ int len = 0;
+ scmirroring_src_s *_scmirroring = (scmirroring_src_s *)scmirroring_src;
+
+ scmirroring_debug_fenter();
+
+ scmirroring_retvm_if(_scmirroring == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
+ scmirroring_retvm_if(_scmirroring->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "Invalid handle");
+ scmirroring_retvm_if(!STRING_VALID(uri_srcname), SCMIRRORING_ERROR_INVALID_PARAMETER, "INVALID URI_SRCNAME");
+ _scmirroring->direct_streaming = enable;
+
+ len = strlen(uri_srcname);
+ if (_scmirroring->filesrc != NULL) {
+ g_free(_scmirroring->filesrc);
+ _scmirroring->filesrc = NULL;
+ }
+ _scmirroring->filesrc = g_strndup(uri_srcname, len);
+
+ if ((_scmirroring->filesrc == NULL)) {
+ scmirroring_error("OUT_OF_MEMORY");
+ return SCMIRRORING_ERROR_OUT_OF_MEMORY;
+ }
+
+ ret = __scmirroring_src_send_set_direct_streaming(_scmirroring);
+
+ scmirroring_debug_fleave();
+
+ return ret;
+}
+
int scmirroring_src_AV_transport_switch(scmirroring_src_h scmirroring,
scmirroring_av_transport_e transport)
{
g_print("S : Start \n");
g_print("P : Pause \n");
g_print("R : Resume \n");
+ g_print("s : Direct Streaming (ex. s 1 file:///tmp/file.mp4 (0:disable, 1:enable))\n");
g_print("u : Switch to UDP\n");
g_print("t : Switch ti TCP\n");
g_print("T : sTop\n");
} 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, "s", 1) == 0) {
+ ret = scmirroring_src_set_direct_streaming(g_scmirroring, atoi(value[1]), value[2]);
+ g_print("Direct streaming state - [%d] Source - [%s]\n", atoi(value[1]), value[2]);
} else if (strncmp(cmd, "T", 1) == 0) {
g_print("Stop\n");
ret = scmirroring_src_stop(g_scmirroring);