Merge the latest code. 45/40045/1 accepted/tizen/common/20150605.071904 accepted/tizen/mobile/20150605.091819 accepted/tizen/tv/20150605.091754 accepted/tizen/wearable/20150605.091805 submit/tizen/20150601.053448 submit/tizen/20150604.020049
authorSangkyu Park <sk1122.park@samsung.com>
Thu, 28 May 2015 05:51:00 +0000 (14:51 +0900)
committerSangkyu Park <sk1122.park@samsung.com>
Thu, 28 May 2015 05:51:00 +0000 (14:51 +0900)
Change-Id: Iadc779094bbe618b9fa110be8637762eca973104
Signed-off-by: Sangkyu Park <sk1122.park@samsung.com>
include/scmirroring_private.h
include/scmirroring_sink.h
include/scmirroring_type.h
packaging/capi-media-screen-mirroring.spec
src/scmirroring_sink.c
test_sink/scmirroring_sink_test.c

index ed10a8179d95d6c3819e44a0b923a14b726a7c3d..90b2cc19248f17c0fe19aaebdbac3835acc19be6 100755 (executable)
@@ -94,6 +94,14 @@ typedef struct
        scmirroring_state_cb state_cb;
 }scmirroring_state_cb_s;
 
+typedef struct
+{
+       int error_code;
+       int sink_state;
+       void *user_data;
+       scmirroring_sink_state_cb state_cb;
+}scmirroring_sink_state_cb_s;
+
 typedef struct
 {
        char *ip;
@@ -116,7 +124,7 @@ typedef struct
        char *ip;
        char *port;
        bool use_hdcp;
-       scmirroring_state_cb_s *scmirroring_state_cb;
+       scmirroring_sink_state_cb_s *scmirroring_sink_state_cb;
 } scmirroring_sink_s;
 
 #ifdef __cplusplus
index 6689469cfe8bacdd949044d1b8ce06961fb72020..e3aa2a9da6b44a3f5582b6943645d0959836ab38 100755 (executable)
@@ -36,6 +36,9 @@ extern "C" {
 /**
  * @brief Creates a new screen mirroring sink handle
  * @since_tizen 2.4
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/internet
+ *
  * @remarks You must release @a scmirroring_sink using scmirroring_sink_destroy().
  *
  * @param[out] scmirroring_sink        A newly returned handle to the screen mirroring sink
@@ -46,6 +49,10 @@ extern "C" {
  * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
  * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
+ *
+ * @post The screen mirroring state will be SCMIRRORING_STATE_NULL
  *
  * @see        scmirroring_sink_destroy()
  */
@@ -66,12 +73,15 @@ int scmirroring_sink_create(scmirroring_sink_h *scmirroring_sink);
  * @retval      #SCMIRRORING_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
+ * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  *
  * @see scmirroring_sink_create()
  */
-int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, scmirroring_state_cb callback, void *user_data);
+int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, scmirroring_sink_state_cb callback, void *user_data);
 
 /**
  * @brief Sets server IP and port
@@ -87,6 +97,9 @@ int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, s
  * @retval      #SCMIRRORING_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
+ * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  *
@@ -110,6 +123,9 @@ int scmirroring_sink_set_ip_and_port(scmirroring_sink_h scmirroring_sink, const
  * @retval      #SCMIRRORING_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
+ * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  *
@@ -131,6 +147,9 @@ int scmirroring_sink_set_display(scmirroring_sink_h scmirroring_sink, scmirrorin
  * @retval      #SCMIRRORING_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
+ * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  *
@@ -141,18 +160,24 @@ int scmirroring_sink_set_resolution(scmirroring_sink_h scmirroring_sink, scmirro
 /**
  * @brief Prepares the screen mirroring sink handle and allocates specific resources.
  * @since_tizen 2.4
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/internet
  *
  * @param[in] scmirroring_sink The handle to the screen mirroring sink
- * @return      0 on success, otherwise a negative error value.
+ * @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 Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
  * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  * @pre Register user callback by calling scmirroring_sink_set_state_changed_cb().
- * @post The screen mirroring state will be SCMIRRORING_STATE_READY
+ * @pre The screen mirroring state should be SCMIRRORING_SINK_STATE_NULL
+ * @post The screen mirroring state will be SCMIRRORING_SINK_STATE_PREPARED
  *
  * @see scmirroring_sink_create()
  * @see scmirroring_sink_set_state_changed_cb()
@@ -163,6 +188,8 @@ int scmirroring_sink_prepare(scmirroring_sink_h scmirroring_sink);
  * @brief Creates connection and prepare for receiving data from SCMIRRORING source
  *
  * @since_tizen 2.4
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/internet
  *
  * @param[in]  scmirroring_sink The handle to the screen mirroring sink
  * @return @c 0 on success,
@@ -173,11 +200,13 @@ int scmirroring_sink_prepare(scmirroring_sink_h scmirroring_sink);
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
  * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
  * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  * @pre Register user callback by calling scmirroring_sink_set_state_changed_cb().
  * @pre Call scmirroring_sink_prepare()
- * @post The screen mirroring state will be SCMIRRORING_STATE_CONNECTED
+ * @pre The screen mirroring state should be SCMIRRORING_SINK_STATE_PREPARED
+ * @post The screen mirroring state will be SCMIRRORING_SINK_STATE_CONNECTED
  *
  * @see scmirroring_sink_create()
  * @see scmirroring_sink_set_state_changed_cb()
@@ -189,6 +218,8 @@ int scmirroring_sink_connect(scmirroring_sink_h scmirroring_sink);
  * @brief Start receiving data from the SCMIRRORING source and display it (mirror)
  *
  * @since_tizen 2.4
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/internet
  *
  * @param[in]  scmirroring_sink The handle to the screen mirroring sink
  * @return @c 0 on success,
@@ -199,11 +230,14 @@ int scmirroring_sink_connect(scmirroring_sink_h scmirroring_sink);
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
  * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
  * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  * @pre Register user callback by calling scmirroring_sink_set_state_changed_cb().
  * @pre Call scmirroring_sink_prepare()
- * @post The screen mirroring state will be SCMIRRORING_STATE_PLAYING
+ * @pre Call scmirroring_sink_connect()
+ * @pre The screen mirroring state should be SCMIRRORING_SINK_STATE_CONNECTED
+ * @post The screen mirroring state will be SCMIRRORING_SINK_STATE_PLAYING
  *
  * @see scmirroring_sink_create()
  * @see scmirroring_sink_set_state_changed_cb()
@@ -214,9 +248,12 @@ int scmirroring_sink_start(scmirroring_sink_h scmirroring_sink);
 
 /**
  * @brief Pauses receiving data from the SCMIRRORING source
- * @details This function pauses receiving data from the SCMIRRORING source, which means it sends RTSP PAUSE message to source.
+ * @details This function pauses receiving data from the SCMIRRORING source,
+ *     which means it sends RTSP PAUSE message to source.
  *
  * @since_tizen 2.4
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/internet
  *
  * @param[in]  scmirroring_sink The handle to the screen mirroring sink
  * @return @c 0 on success,
@@ -226,9 +263,11 @@ int scmirroring_sink_start(scmirroring_sink_h scmirroring_sink);
  * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
  * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
- * @pre The screen mirroring state should be SCMIRRORING_STATE_PLAYING
- * @post The screen mirroring state will be SCMIRRORING_STATE_PAUSED
+ * @pre The screen mirroring state should be SCMIRRORING_SINK_STATE_PLAYING
+ * @post The screen mirroring state will be SCMIRRORING_SINK_STATE_PAUSED
  *
  * @see scmirroring_sink_create()
  * @see scmirroring_sink_set_state_changed_cb()
@@ -243,6 +282,8 @@ int scmirroring_sink_pause(scmirroring_sink_h scmirroring_sink);
  * @details This function pauses receiving data from the SCMIRRORING source, which means it sends RTSP PLAY message to source.
  *
  * @since_tizen 2.4
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/internet
  *
  * @param[in]  scmirroring_sink The handle to the screen mirroring sink
  * @return @c 0 on success,
@@ -252,18 +293,22 @@ int scmirroring_sink_pause(scmirroring_sink_h scmirroring_sink);
  * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
  * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
- * @pre The screen mirroring state should be SCMIRRORING_STATE_PAUSED
- * @post The screen mirroring state will be SCMIRRORING_STATE_PLAYING
+ * @pre The screen mirroring state should be SCMIRRORING_SINK_STATE_PAUSED
+ * @post The screen mirroring state will be SCMIRRORING_SINK_STATE_PLAYING
  *
  * @see scmirroring_sink_pause()
  */
 int scmirroring_sink_resume(scmirroring_sink_h scmirroring_sink);
 
 /**
- * @brief Stops receiving data from the SCMIRRORING source
+ * @brief Disconnects and stops receiving data from the SCMIRRORING source
  *
  * @since_tizen 2.4
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/internet
  *
  * @param[in]  scmirroring_sink The handle to the screen mirroring sink
  * @return @c 0 on success,
@@ -273,9 +318,12 @@ int scmirroring_sink_resume(scmirroring_sink_h scmirroring_sink);
  * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
  * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
- * @pre The screen mirroring state should be SCMIRRORING_STATE_PAUSED or SCMIRRORING_STATE_PLAYING
- * @post The screen mirroring state will be SCMIRRORING_STATE_TEARDOWN
+ * @pre The screen mirroring state should be SCMIRRORING_SINK_STATE_CONNECTED
+ *     or SCMIRRORING_SINK_STATE_PLAYING or SCMIRRORING_SINK_STATE_PAUSED
+ * @post The screen mirroring state will be SCMIRRORING_SINK_STATE_DISCONNECTED
  *
  * @see scmirroring_sink_create()
  * @see scmirroring_sink_set_state_changed_cb()
@@ -283,13 +331,15 @@ int scmirroring_sink_resume(scmirroring_sink_h scmirroring_sink);
  * @see scmirroring_sink_connect()
  * @see scmirroring_sink_start()
  */
-int scmirroring_sink_stop(scmirroring_sink_h scmirroring_sink);
+int scmirroring_sink_disconnect(scmirroring_sink_h scmirroring_sink);
 
 /**
  * @brief Unprepares screen mirroring
  * @details This function unprepares screen mirroring, which closes specific resources.
  *
  * @since_tizen 2.4
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/internet
  *
  * @param[in]  scmirroring_sink The handle to the screen mirroring sink
  * @return @c 0 on success,
@@ -299,6 +349,8 @@ int scmirroring_sink_stop(scmirroring_sink_h scmirroring_sink);
  * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
  * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  * @pre Register user callback by calling scmirroring_sink_set_state_changed_cb().
@@ -321,8 +373,10 @@ int scmirroring_sink_unprepare(scmirroring_sink_h scmirroring_sink);
  *         otherwise a negative error value
  * @retval      #SCMIRRORING_ERROR_NONE Successful
  * @retval      #SCMIRRORING_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
+ * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  * @pre Register user callback by calling scmirroring_sink_set_state_changed_cb().
@@ -330,7 +384,7 @@ int scmirroring_sink_unprepare(scmirroring_sink_h scmirroring_sink);
  * @see scmirroring_sink_create()
  * @see scmirroring_sink_set_state_changed_cb()
  */
-int scmirroring_sink_unset_state_cb(scmirroring_sink_h scmirroring_sink);
+int scmirroring_sink_unset_state_changed_cb(scmirroring_sink_h scmirroring_sink);
 
 /**
  * @brief Destroys screen mirroring sink handle.
@@ -342,8 +396,10 @@ int scmirroring_sink_unset_state_cb(scmirroring_sink_h scmirroring_sink);
  *         otherwise a negative error value
  * @retval      #SCMIRRORING_ERROR_NONE Successful
  * @retval      #SCMIRRORING_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval      #SCMIRRORING_ERROR_OUT_OF_MEMORY Out of memory
  * @retval      #SCMIRRORING_ERROR_INVALID_OPERATION Invalid operation
+ * @retval      #SCMIRRORING_ERROR_PERMISSION_DENIED Permission Denied
+ * @retval      #SCMIRRORING_ERROR_NOT_SUPPORTED Not supported
+ * @retval      #SCMIRRORING_ERROR_UNKNOWN Unknown Error
  *
  * @pre Create a screen mirroring sink handle by calling scmirroring_sink_create().
  * @pre The screen mirroring state should be SCMIRRORING_STATE_NULL
index d493e4374d53a85653c1902770ac2a0fd9274b45..3123ae3eee07d267d98150c66f4afd424b663ba3 100755 (executable)
@@ -54,29 +54,46 @@ typedef enum
        SCMIRRORING_ERROR_NONE                                  = TIZEN_ERROR_NONE,                                     /**< Successful */
        SCMIRRORING_ERROR_INVALID_PARAMETER     = TIZEN_ERROR_INVALID_PARAMETER,                /**< Invalid parameter */
        SCMIRRORING_ERROR_OUT_OF_MEMORY         = TIZEN_ERROR_OUT_OF_MEMORY,                    /**< Out of memory */
-       SCMIRRORING_ERROR_INVALID_OPERATION             = TIZEN_ERROR_INVALID_OPERATION,                /**< Invalid Operation */
+       SCMIRRORING_ERROR_INVALID_OPERATION     = TIZEN_ERROR_INVALID_OPERATION,                /**< Invalid Operation */
        SCMIRRORING_ERROR_CONNECTION_TIME_OUT   = TIZEN_ERROR_CONNECTION_TIME_OUT,  /**< Connection timeout */
-       SCMIRRORING_ERROR_PERMISSION_DENIED             = TIZEN_ERROR_PERMISSION_DENIED,    /**< Permission denied */
-       SCMIRRORING_ERROR_NOT_SUPPORTED                 = TIZEN_ERROR_NOT_SUPPORTED,        /**< Not supported */
+       SCMIRRORING_ERROR_PERMISSION_DENIED     = TIZEN_ERROR_PERMISSION_DENIED,    /**< Permission denied */
+       SCMIRRORING_ERROR_NOT_SUPPORTED         = TIZEN_ERROR_NOT_SUPPORTED,        /**< Not supported */
+       SCMIRRORING_ERROR_UNKNOWN                               = TIZEN_ERROR_UNKNOWN,        /**< Unknown error */
 } scmirroring_error_e;
 
 /**
- * @brief Enumeration for screen mirroring state.
+ * @brief Enumeration for screen mirroring source state.
  * @since_tizen 2.4
  */
 typedef enum
 {
        SCMIRRORING_STATE_NULL = 0,                     /**< Screen mirroring is created, but not realized yet */
-       SCMIRRORING_STATE_READY,                        /**< Screen mirroring is ready to play media */
+       SCMIRRORING_STATE_READY,                                /**< Screen mirroring is ready to play media */
        SCMIRRORING_STATE_CONNECTION_WAIT,      /**< Screen mirroring is waiting for connection */
        SCMIRRORING_STATE_CONNECTED,            /**< Screen mirroring is connected */
        SCMIRRORING_STATE_PLAYING,                      /**< Screen mirroring is now playing media */
-       SCMIRRORING_STATE_PAUSED,           /**< Screen mirroring is paused while playing media */
+       SCMIRRORING_STATE_PAUSED,                        /**< Screen mirroring is paused while playing media */
        SCMIRRORING_STATE_TEARDOWN,                     /**< Teardown Screen mirroring */
        SCMIRRORING_STATE_NONE,                         /**< Screen mirroring is not created yet */
        SCMIRRORING_STATE_MAX                           /* Number of screen mirroring states */
 } scmirroring_state_e;
 
+/**
+ * @brief Enumeration for screen mirroring sink state.
+ * @since_tizen 2.4
+ */
+typedef enum
+{
+       SCMIRRORING_SINK_STATE_NONE = 0,                /**< Screen mirroring is not created yet */
+       SCMIRRORING_SINK_STATE_NULL,                    /**< Screen mirroring is created, but not prepared yet */
+       SCMIRRORING_SINK_STATE_PREPARED,        /**< Screen mirroring is prepared to play media */
+       SCMIRRORING_SINK_STATE_CONNECTED,       /**< Screen mirroring is connected */
+       SCMIRRORING_SINK_STATE_PLAYING,         /**< Screen mirroring is now playing media */
+       SCMIRRORING_SINK_STATE_PAUSED,           /**< Screen mirroring is paused while playing media */
+       SCMIRRORING_SINK_STATE_DISCONNECTED,                    /**< Screen mirroring is dieconnected */
+       SCMIRRORING_SINK_STATE_MAX                      /* Number of screen mirroring states */
+} scmirroring_sink_state_e;
+
 /**
  * @brief Enumeration for screen mirroring resolution.
  * @since_tizen 2.4
@@ -130,6 +147,22 @@ typedef enum
  */
 typedef void (*scmirroring_state_cb)(scmirroring_error_e error, scmirroring_state_e state, void *user_data);
 
+/**
+ * @brief Called when each status is changed
+ * @since_tizen 2.4
+ *
+ * @details This callback is called for state and error of screen mirroring sink
+ *
+ * @param[in] error     The error code
+ * @param[in] state     The screen mirroring sink state
+ * @param[in] user_data The user data passed from the scmirroring_sink_set_state_cb() function
+ *
+ * @pre scmirroring_sink_create()
+ *
+ * @see scmirroring_sink_create()
+ */
+typedef void (*scmirroring_sink_state_cb)(scmirroring_error_e error, scmirroring_sink_state_e state, void *user_data);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index af954f70f1cbff1c06ccafdde4804f4bef149b81..b4c3e8e938e5e23b68ed529817a0ea3ad445d596 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-media-screen-mirroring
 Summary:    A screen mirroring library in Tizen C API
-Version:    0.1.22
+Version:    0.1.23
 Release:    0
 Group:      Multimedia/API
 License:    Apache License, Version 2.0
index ea30552918b5de2311d867437fffa8d17ef74f14..a98a83b3e96a601c67666c0ed69d646f1e2cdbfd 100755 (executable)
@@ -53,47 +53,50 @@ static scmirroring_error_e __scmirroring_sink_error_convert(const char* func, in
        return ret;
 }
 
-static scmirroring_state_e __scmirroring_sink_state_convert(MMWfdSinkStateType mm_state)
+static scmirroring_sink_state_e __scmirroring_sink_state_convert(MMWFDSinkStateType mm_state)
 {
-       scmirroring_state_e state = SCMIRRORING_STATE_NULL;
+       scmirroring_sink_state_e state = SCMIRRORING_SINK_STATE_NONE;
 
        switch( mm_state )
        {
+               case MM_WFD_SINK_STATE_NONE:
+                       state = SCMIRRORING_SINK_STATE_NONE;
+                       break;
                case MM_WFD_SINK_STATE_NULL:
-                       state = SCMIRRORING_STATE_NULL;
+                       state = SCMIRRORING_SINK_STATE_NULL;
+                       break;
+               case MM_WFD_SINK_STATE_PREPARED:
+                       state = SCMIRRORING_SINK_STATE_PREPARED;
                        break;
-               case MM_WFD_SINK_STATE_READY:
-                       state = SCMIRRORING_STATE_READY;
+               case MM_WFD_SINK_STATE_CONNECTED:
+                       state = SCMIRRORING_SINK_STATE_CONNECTED;
                        break;
                case MM_WFD_SINK_STATE_PLAYING:
-                       state = SCMIRRORING_STATE_PLAYING;
+                       state = SCMIRRORING_SINK_STATE_PLAYING;
                        break;
                case MM_WFD_SINK_STATE_PAUSED:
-                       state = SCMIRRORING_STATE_PAUSED;
+                       state = SCMIRRORING_SINK_STATE_PAUSED;
                        break;
-               case MM_WFD_SINK_STATE_TEARDOWN:
-                       state = SCMIRRORING_STATE_TEARDOWN;
-                       break;
-               case MM_WFD_SINK_STATE_NONE:
-                       state = SCMIRRORING_STATE_NULL;
+               case MM_WFD_SINK_STATE_DISCONNECTED:
+                       state = SCMIRRORING_SINK_STATE_DISCONNECTED;
                        break;
                default:
-                       state = SCMIRRORING_STATE_NULL;
+                       state = SCMIRRORING_SINK_STATE_NONE;
                        break;
        }
 
        return state;
 }
 
-void __mm_scmirroring_sink_set_message_cb(MMWfdSinkStateType type, void *uData)
+void __mm_scmirroring_sink_set_message_cb(int error_type, MMWFDSinkStateType state_type, void *uData)
 {
-       int error_value = SCMIRRORING_ERROR_NONE;
-       scmirroring_state_e state = __scmirroring_sink_state_convert(type);
+       scmirroring_error_e error = __scmirroring_sink_error_convert(__func__, error_type);
+       scmirroring_sink_state_e state = __scmirroring_sink_state_convert(state_type);
        scmirroring_sink_s *handle = (scmirroring_sink_s*)uData;
 
        /* call application callback */
-       if (handle->scmirroring_state_cb->state_cb)
-               handle->scmirroring_state_cb->state_cb((scmirroring_error_e)error_value, state, handle->scmirroring_state_cb->user_data);
+       if (handle->scmirroring_sink_state_cb->state_cb)
+               handle->scmirroring_sink_state_cb->state_cb(error, state, handle->scmirroring_sink_state_cb->user_data);
 
        return;
 }
@@ -113,6 +116,7 @@ int scmirroring_sink_create(scmirroring_sink_h *scmirroring_sink)
        handle->ip= NULL;
        handle->port = NULL;
        handle->use_hdcp = TRUE;
+       handle->scmirroring_sink_state_cb = NULL;
 
        ret = mm_wfd_sink_create(&handle->mm_handle);
        if(ret != MM_ERROR_NONE)
@@ -161,7 +165,7 @@ int scmirroring_sink_prepare(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       ret = mm_wfd_sink_realize(handle->mm_handle);
+       ret = mm_wfd_sink_prepare(handle->mm_handle);
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
@@ -183,13 +187,13 @@ int scmirroring_sink_connect(scmirroring_sink_h scmirroring_sink)
 
        if(handle->ip == NULL)
        {
-               scmirroring_error("INVALID_IP (0x%08x)",SCMIRRORING_ERROR_INVALID_PARAMETER);
+               scmirroring_error("INVALID_IP(NULL) (0x%08x)",SCMIRRORING_ERROR_INVALID_PARAMETER);
                return SCMIRRORING_ERROR_INVALID_PARAMETER;
        }
 
        if(handle->port == NULL)
        {
-               scmirroring_error("INVALID_PORT (0x%08x)",SCMIRRORING_ERROR_INVALID_PARAMETER);
+               scmirroring_error("INVALID_PORT(NULL) (0x%08x)",SCMIRRORING_ERROR_INVALID_PARAMETER);
                return SCMIRRORING_ERROR_INVALID_PARAMETER;
        }
 
@@ -218,7 +222,7 @@ int scmirroring_sink_unprepare(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       ret = mm_wfd_sink_unrealize(handle->mm_handle);
+       ret = mm_wfd_sink_unprepare(handle->mm_handle);
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
@@ -239,9 +243,10 @@ int scmirroring_sink_destroy(scmirroring_sink_h scmirroring_sink)
 
        ret = mm_wfd_sink_destroy(handle->mm_handle);
 
+       handle->mm_handle = 0;
        SCMIRRORING_SAFE_FREE(handle->ip);
        SCMIRRORING_SAFE_FREE(handle->port);
-       SCMIRRORING_SAFE_FREE(handle->scmirroring_state_cb);
+       SCMIRRORING_SAFE_FREE(handle->scmirroring_sink_state_cb);
        SCMIRRORING_SAFE_FREE(handle);
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
@@ -270,7 +275,7 @@ int scmirroring_sink_start(scmirroring_sink_h scmirroring_sink)
        return ret;
 }
 
-int scmirroring_sink_stop(scmirroring_sink_h scmirroring_sink)
+int scmirroring_sink_disconnect(scmirroring_sink_h scmirroring_sink)
 {
        int ret = SCMIRRORING_ERROR_NONE;
 
@@ -280,7 +285,7 @@ int scmirroring_sink_stop(scmirroring_sink_h scmirroring_sink)
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       ret = mm_wfd_sink_stop(handle->mm_handle);
+       ret = mm_wfd_sink_disconnect(handle->mm_handle);
 
        ret = __scmirroring_sink_error_convert(__func__, ret);
 
@@ -289,7 +294,7 @@ int scmirroring_sink_stop(scmirroring_sink_h scmirroring_sink)
        return ret;
 }
 
-int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, scmirroring_state_cb callback, void *user_data)
+int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, scmirroring_sink_state_cb callback, void *user_data)
 {
        int ret = SCMIRRORING_ERROR_NONE;
 
@@ -298,17 +303,24 @@ int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, s
        scmirroring_error_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       scmirroring_retvm_if(callback == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "callback is NULL");
 
-       handle->scmirroring_state_cb = (scmirroring_state_cb_s*)calloc(1, sizeof(scmirroring_state_cb_s));
-
-       if(handle->scmirroring_state_cb == NULL)
+       if(handle->scmirroring_sink_state_cb == NULL)
+       {
+               handle->scmirroring_sink_state_cb = (scmirroring_sink_state_cb_s*)calloc(1, sizeof(scmirroring_sink_state_cb_s));
+               if(handle->scmirroring_sink_state_cb == NULL)
+               {
+                       scmirroring_error("Error Set CB");
+                       return SCMIRRORING_ERROR_OUT_OF_MEMORY;
+               }
+       }
+       else
        {
-               scmirroring_error("Error Set CB");
-               return SCMIRRORING_ERROR_OUT_OF_MEMORY;
+               memset(handle->scmirroring_sink_state_cb, 0, sizeof(scmirroring_sink_state_cb_s));
        }
 
-       handle->scmirroring_state_cb->user_data = user_data;
-       handle->scmirroring_state_cb->state_cb  = callback;
+       handle->scmirroring_sink_state_cb->user_data = user_data;
+       handle->scmirroring_sink_state_cb->state_cb  = callback;
 
        ret = mm_wfd_sink_set_message_callback(handle->mm_handle, __mm_scmirroring_sink_set_message_cb, handle);
 
@@ -319,6 +331,27 @@ int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, s
        return ret;
 }
 
+int scmirroring_sink_unset_state_changed_cb(scmirroring_sink_h scmirroring_sink)
+{
+       int ret = SCMIRRORING_ERROR_NONE;
+
+       scmirroring_sink_s *handle = (scmirroring_sink_s*)scmirroring_sink;
+
+       scmirroring_error_fenter();
+
+       scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       ret = mm_wfd_sink_set_message_callback(handle->mm_handle, NULL, NULL);
+
+       SCMIRRORING_SAFE_FREE(handle->scmirroring_sink_state_cb);
+
+       ret = __scmirroring_sink_error_convert(__func__, ret);
+
+       scmirroring_error_fleave();
+
+       return ret;
+}
+
 int scmirroring_sink_set_display(scmirroring_sink_h scmirroring_sink, scmirroring_display_type_e type, void * display_surface)
 {
        int ret = SCMIRRORING_ERROR_NONE;
@@ -345,7 +378,7 @@ int scmirroring_sink_set_display(scmirroring_sink_h scmirroring_sink, scmirrorin
                return __scmirroring_sink_error_convert(__func__,ret);
        }
 
-       ret = mm_wfd_sink_set_attribute(handle->mm_handle, NULL, "display_overlay", display_surface, NULL);
+       ret = mm_wfd_sink_set_attribute(handle->mm_handle, NULL, "display_overlay", display_surface, sizeof(display_surface), NULL);
        if(ret != MM_ERROR_NONE)
        {
                scmirroring_error("Fail to Set Display Overlay");
@@ -358,3 +391,53 @@ int scmirroring_sink_set_display(scmirroring_sink_h scmirroring_sink, scmirrorin
 
        return ret;
 }
+
+int scmirroring_sink_set_resolution(scmirroring_sink_h scmirroring_sink, scmirroring_resolution_e resolution)
+{
+       int ret = SCMIRRORING_ERROR_NONE;
+
+       scmirroring_sink_s *handle = (scmirroring_sink_s*)scmirroring_sink;
+
+       scmirroring_error_fenter();
+
+       scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       if((resolution < SCMIRRORING_RESOLUTION_1920x1080_P30) ||(resolution >= SCMIRRORING_RESOLUTION_MAX))
+       {
+               scmirroring_error("INVALID resolution : %d", resolution);
+               return SCMIRRORING_ERROR_INVALID_PARAMETER;
+       }
+
+       scmirroring_error_fleave();
+
+       return ret;
+}
+
+int scmirroring_sink_pause(scmirroring_sink_h scmirroring_sink)
+{
+       int ret = SCMIRRORING_ERROR_NONE;
+
+       scmirroring_sink_s *handle = (scmirroring_sink_s*)scmirroring_sink;
+
+       scmirroring_error_fenter();
+
+       scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       scmirroring_error_fleave();
+
+       return ret;
+}
+
+int scmirroring_sink_resume(scmirroring_sink_h scmirroring_sink)
+{
+       int ret = SCMIRRORING_ERROR_NONE;
+
+       scmirroring_sink_s *handle = (scmirroring_sink_s*)scmirroring_sink;
+
+       scmirroring_error_fenter();
+
+       scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       scmirroring_error_fleave();
+
+       return ret;
+}
index 009f27952cf283ad527dd01b3449aecfd3598adb..a579d3fa739eaeb79c84f1e0d25bae6a9663f6f6 100755 (executable)
@@ -31,6 +31,7 @@ GMainLoop *g_loop;
 static int g_peer_cnt = 0;
 static char g_peer_ip[32];
 static char g_peer_port[32];
+#define DEFAULT_SCREEN_MIRRORING_PORT 2022
 #endif
 
 gboolean __scmirroring_sink_start(gpointer data);
@@ -43,26 +44,26 @@ static gboolean __start_p2p_connection(gpointer data);
 static gboolean __disconnect_p2p_connection(void);
 #endif
 
-static void scmirroring_state_callback(scmirroring_error_e error_code, scmirroring_state_e state, void *user_data)
+static void scmirroring_sink_state_callback(scmirroring_error_e error_code, scmirroring_sink_state_e state, void *user_data)
 {
        g_print("Received Callback error code[%d]", error_code);
 
-       if(state == SCMIRRORING_STATE_NULL)
-               g_print(" st ate[%d] SCMIRRORING_STATE_NULL", state);
-       else if(state ==SCMIRRORING_STATE_READY)
-               g_print(" state[%d] SCMIRRORING_STATE_READY", state);
-       else if(state == SCMIRRORING_STATE_CONNECTION_WAIT)
-               g_print(" state[%d] SCMIRRORING_STATE_CONNECTION_WAIT", state);
-       else if(state == SCMIRRORING_STATE_CONNECTED)
-               g_print(" state[%d] SCMIRRORING_STATE_CONNECTED", state);
-       else if(state == SCMIRRORING_STATE_PLAYING)
-               g_print(" state[%d] SCMIRRORING_STATE_PLAYING", state);
-       else if(state == SCMIRRORING_STATE_PAUSED)
-               g_print(" state[%d] SCMIRRORING_STATE_PAUSED", state);
-       else if(state == SCMIRRORING_STATE_TEARDOWN)
-               g_print(" state[%d] SCMIRRORING_STATE_TEARDOWN", state);
-       else if(state == SCMIRRORING_STATE_NONE)
-               g_print(" state[%d] SCMIRRORING_STATE_NONE", state);
+       if(state == SCMIRRORING_SINK_STATE_NONE)
+               g_print(" state[%d] SCMIRRORING_SINK_STATE_NONE", state);
+       else if(state == SCMIRRORING_SINK_STATE_NULL)
+               g_print(" st ate[%d] (state == SCMIRRORING_SINK_STATE_NULL)", state);
+       else if(state ==SCMIRRORING_SINK_STATE_PREPARED)
+               g_print(" state[%d] SCMIRRORING_SINK_STATE_PREPARED", state);
+       else if(state == SCMIRRORING_SINK_STATE_CONNECTED)
+               g_print(" state[%d] SCMIRRORING_SINK_STATE_CONNECTED", state);
+               if(scmirroring_sink_start(g_scmirroring)!= SCMIRRORING_ERROR_NONE)
+                       g_print("scmirroring_sink_start fail");
+       else if(state == SCMIRRORING_SINK_STATE_PLAYING)
+               g_print(" state[%d] SCMIRRORING_SINK_STATE_PLAYING", state);
+       else if(state == SCMIRRORING_SINK_STATE_PAUSED)
+               g_print(" state[%d] SCMIRRORING_SINK_STATE_PAUSED", state);
+       else if(state == SCMIRRORING_SINK_STATE_DISCONNECTED)
+               g_print(" state[%d] SCMIRRORING_SINK_STATE_DISCONNECTED", state);
        else
                g_print(" state[%d] Invalid State", state);
 
@@ -90,8 +91,8 @@ static void __displaymenu(void)
        g_print("a : a ip port (ex. a 192.168.49.1 2022)\n");
        g_print("s : start  \n");
 #endif
-       g_print("T : sTop\n");
-       g_print("D : Destroy\n");
+       g_print("D : Disconnect\n");
+       g_print("T : desTroy\n");
        g_print("q : quit\n");
        g_print("-----------------------------------------------------------------------------------------\n");
 }
@@ -106,8 +107,20 @@ gboolean __timeout_menu_display(void* data)
 #ifdef TEST_WITH_WIFI_DIRECT
 bool _connected_peer_cb(wifi_direct_connected_peer_info_s *peer, void *user_data)
 {
+       int peer_port = 0;
+       if (wifi_direct_get_peer_display_port(peer->mac_address, &peer_port) != WIFI_DIRECT_ERROR_NONE)
+       {
+               g_print ("Can not get port info\n Use default (2022)\n");
+               peer_port = DEFAULT_SCREEN_MIRRORING_PORT;
+       }
+       if (peer_port == 0)
+       {
+               g_print ("Can not get port info\n Use default (2022)\n");
+               peer_port = DEFAULT_SCREEN_MIRRORING_PORT;
+       }
+
        g_print("[_connected_peer_cb] Connected to IP [%s]\n", peer->ip_address);
-       g_print("[_connected_peer_cb] Connected to Port [%d]\n", peer->scmirroring_ctrl_port);
+       g_print("[_connected_peer_cb] Connected to Port [%d]\n", peer_port);
        g_print("[_connected_peer_cb] Connected device_name [%s]\n", peer->device_name);
        g_print("[_connected_peer_cb] Connected to mac_address [%s]\n", peer->mac_address);
        g_print("[_connected_peer_cb] Connected to interface_address [%s]\n", peer->interface_address);
@@ -116,7 +129,7 @@ bool _connected_peer_cb(wifi_direct_connected_peer_info_s *peer, void *user_data
        memset(g_peer_port, 0x00, sizeof(g_peer_port));
 
        snprintf(g_peer_ip, sizeof(g_peer_port), "%s", peer->ip_address);
-       snprintf(g_peer_port, sizeof(g_peer_port), "%d", peer->scmirroring_ctrl_port);
+       snprintf(g_peer_port, sizeof(g_peer_port), "%d", peer_port);
 
        g_timeout_add(SINKTEST_EXECUTE_DELAY, __scmirroring_sink_start, NULL);
 
@@ -235,16 +248,12 @@ static void __interpret (char *cmd)
        int ret = SCMIRRORING_ERROR_NONE;
   gchar **value;
        value = g_strsplit(cmd," ",0);
-#if 0
-       gchar **value;
-       value = g_strsplit(cmd," ",0);
-#endif
-       if(strncmp(cmd, "T", 1) == 0)
+       if(strncmp(cmd, "D", 1) == 0)
        {
-               g_print ("Stop\n");
-               ret = scmirroring_sink_stop(g_scmirroring);
+               g_print ("Disconnect\n");
+               ret = scmirroring_sink_disconnect(g_scmirroring);
        }
-       else if(strncmp(cmd, "D", 1) == 0)
+       else if(strncmp(cmd, "T", 1) == 0)
        {
                g_print ("Destroy\n");
                ret = scmirroring_sink_unprepare(g_scmirroring);
@@ -381,7 +390,7 @@ static gboolean __start_p2p_connection(gpointer data)
        }
 
        /*Enable Screen Mirroring*/
-       ret = wifi_direct_display_init();
+       ret = wifi_direct_init_display();
        if(ret != WIFI_DIRECT_ERROR_NONE)
        {
                g_print("Error : wifi_direct_display_init failed : %d\n", ret);
@@ -389,14 +398,14 @@ static gboolean __start_p2p_connection(gpointer data)
        }
 
        /*Enable Wifi Direct - You can set this as true if you want to see it from wifi-direct list*/
-       ret = wifi_direct_display_set_wifi_direct(false);
+       ret = wifi_direct_set_display_availability(TRUE);
        if(ret != WIFI_DIRECT_ERROR_NONE)
        {
                g_print("Error : wifi_direct_display_init failed : %d\n", ret);
                goto error;
        }
 
-       ret = wifi_direct_display_set_device(WIFI_DISPLAY_TYPE_PRIMARY_SINK, 77, 0);
+       ret = wifi_direct_set_display(WIFI_DISPLAY_TYPE_SINK, 2022, 0);
        if(ret != WIFI_DIRECT_ERROR_NONE)
        {
                g_print("Error : wifi_direct_display_set_device failed : %d\n", ret);
@@ -545,7 +554,7 @@ gboolean __scmirroring_sink_start(gpointer data)
        }
 #endif
 
-       ret = scmirroring_sink_set_state_changed_cb(g_scmirroring, scmirroring_state_callback, NULL);
+       ret = scmirroring_sink_set_state_changed_cb(g_scmirroring, scmirroring_sink_state_callback, NULL);
        if(ret != SCMIRRORING_ERROR_NONE)
        {
                g_print("scmirroring_sink_set_state_changed_cb fail [%d]", ret);
@@ -570,14 +579,6 @@ gboolean __scmirroring_sink_start(gpointer data)
                return FALSE;
        }
 #endif
-
-       ret = scmirroring_sink_start(g_scmirroring);
-       if(ret != SCMIRRORING_ERROR_NONE)
-       {
-               g_print("scmirroring_sink_start fail [%d]", ret);
-               return FALSE;
-       }
-
        return FALSE;
 }