Add callbacks related to UIBC 33/322933/4 accepted/tizen_unified accepted/tizen_unified_x tizen accepted/tizen/unified/20250516.055917 accepted/tizen/unified/x/20250516.065700
authorYoungwoo Cho <young222.cho@samsung.com>
Fri, 18 Apr 2025 06:01:47 +0000 (15:01 +0900)
committerYoungwoo Cho <young222.cho@samsung.com>
Tue, 22 Apr 2025 01:39:56 +0000 (10:39 +0900)
- both callbacks are related to UIBC
- mm_wfd_sink_set_src_display_orientation_notify_callback()
- mm_wfd_sink_set_uibc_info_received_callback()

[Version] 0.4.9

Change-Id: I52590f7c51314f474861f5d34d1360b6bce3de83
Signed-off-by: Youngwoo Cho <young222.cho@samsung.com>
packaging/libmm-wfd.spec
src/include/mm_wfd_sink.h
src/include/mm_wfd_sink_priv.h
src/include/mm_wfd_sink_util.h
src/mm_wfd_sink.c
src/mm_wfd_sink_priv.c

index c82745ddf8a43e45646a6cb93331e4629ac077ee..729b8b5b11090f57c2bdbefebf53747d7c83ee07 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-wfd
 Summary:    Multimedia Framework Wifi-Display Library
-Version:    0.4.8
+Version:    0.4.9
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 00047c1d30b1efa7264c2583ced009dc73ef4025..4b504806182a878ca051b9e5309c4a502ffd31a3 100644 (file)
@@ -94,7 +94,53 @@ typedef struct {
        MMWFDUIBCMouse *uibc_object;
 } MMWFDUIBCMouseEvent;
 
+typedef enum {
+       MM_WFD_DISPLAY_ORIENTATION_NONE = 0,
+       MM_WFD_DISPLAY_ORIENTATION_PORTRAIT_DISPLAY,
+       MM_WFD_DISPLAY_ORIENTATION_PORTRAIT,
+       MM_WFD_DISPLAY_ORIENTATION_LANDSCAPE
+} MMWFDDisplayOrientation;
+
+typedef enum {
+       MM_WFD_UIBC_INPUT_TYPE_UNKNOWN       = 0,
+       MM_WFD_UIBC_INPUT_TYPE_KEYBOARD      = (1 << 0),
+       MM_WFD_UIBC_INPUT_TYPE_MOUSE         = (1 << 1),
+       MM_WFD_UIBC_INPUT_TYPE_SINGLETOUCH   = (1 << 2),
+       MM_WFD_UIBC_INPUT_TYPE_MULTITOUCH    = (1 << 3),
+       MM_WFD_UIBC_INPUT_TYPE_JOYSTICK      = (1 << 4),
+       MM_WFD_UIBC_INPUT_TYPE_CAMERA        = (1 << 5),
+       MM_WFD_UIBC_INPUT_TYPE_GESTURE       = (1 << 6),
+       MM_WFD_UIBC_INPUT_TYPE_REMOTECONTROL = (1 << 7)
+} MMWFDUibcInputType;
+
+typedef enum {
+       MM_WFD_UIBC_INPUT_PATH_UNKNOWN  = 0,
+       MM_WFD_UIBC_INPUT_PATH_INFRARED = (1 << 0),
+       MM_WFD_UIBC_INPUT_PATH_USB      = (1 << 1),
+       MM_WFD_UIBC_INPUT_PATH_BT       = (1 << 2),
+       MM_WFD_UIBC_INPUT_PATH_ZIGBEE   = (1 << 3),
+       MM_WFD_UIBC_INPUT_PATH_WIFI     = (1 << 4),
+       MM_WFD_UIBC_INPUT_PATH_NOSP     = (1 << 5)
+} MMWFDUibcInputPath;
+
+typedef struct {
+       MMWFDUibcInputType input_type;
+       MMWFDUibcInputPath input_path;
+} MMWFDUibcInput;
+
+typedef struct {
+       char *ip;
+       guint32 port;
+       guint32 gen_capability;
+       gint32 width;
+       gint32 height;
+       MMWFDUibcInput *hidc_caps_list;
+       guint32 hidc_caps_count;
+} MMWFDUibcInfo;
+
 typedef void(*MMWFDMessageCallback)(int error_type, MMWFDSinkStateType state_type, void *user_data);
+typedef void(*MMWFDSrcDisplayOrientationNotifyCallback)(MMWFDDisplayOrientation orientation, void *user_data);
+typedef void(*MMWFDUibcInfoReceivedCallback)(int error_type, MMWFDUibcInfo *uibc_info, void *user_data);
 
 /**
  * This function creates a wi-fi display sink object. \n
@@ -366,6 +412,32 @@ mm_wfd_sink_set_message_callback(g_wfd_sink_handle, msg_callback, (void*)g_wfd_s
  */
 int mm_wfd_sink_set_message_callback(MMHandleType wfd_sink_handle, MMWFDMessageCallback callback, void *user_param);
 
+/**
+ * This function sets callback function for receiving display orientation of source from wi-fi display sink. \n
+ * So, wi-fi display sink can notify display orientation of source to application. \n
+ *
+ * @param      wfd_sink_handle         [in]    Handle of wi-fi display sink
+ * @param      callback                                        [in]    Source display orientation callback function.
+ * @param      user_param                              [in]    User parameter which is passed to callback function.
+ *
+ * @return     This function returns zero on success, or negative value with error code.
+ * @see                MMWFDSrcDisplayOrientationNotifyCallback
+ */
+int mm_wfd_sink_set_src_display_orientation_notify_callback(MMHandleType wfd_sink_handle, MMWFDSrcDisplayOrientationNotifyCallback callback, void *user_data);
+
+/**
+ * This function sets callback function for receiving UIBC information from wi-fi display sink. \n
+ * So, wi-fi display sink can notify UIBC information to application. \n
+ *
+ * @param      wfd_sink_handle         [in]    Handle of wi-fi display sink
+ * @param      callback                                        [in]    UIBC info callback function.
+ * @param      user_param                              [in]    User parameter which is passed to callback function.
+ *
+ * @return     This function returns zero on success, or negative value with error code.
+ * @see                MMWFDUibcInfoReceivedCallback
+ */
+int mm_wfd_sink_set_uibc_info_received_callback(MMHandleType wfd_sink_handle, MMWFDUibcInfoReceivedCallback callback, void *user_data);
+
 /**
  * This function is to set attributes into screen mirroring sink handle. Multiple attributes can be set simultaneously. \n
  * If one of attribute fails, this function will stop at the point and let you know the name which is failed. \n
index c4cdbe874aaa8b254f037e909890178e223deb5e..3e43ca8809d7e9bb05c0637dcebde9dde37a5c61 100644 (file)
@@ -266,6 +266,14 @@ typedef struct {
        MMWFDMessageCallback msg_cb;
        void *msg_user_data;
 
+       /* Source display orientation handling */
+       MMWFDSrcDisplayOrientationNotifyCallback src_display_orientation_notify_cb;
+       void *src_display_orientation_notify_user_data;
+
+       /* UIBC information handling */
+       MMWFDUibcInfoReceivedCallback uibc_info_received_cb;
+       void *uibc_info_received_user_data;
+
        /* video resolution for negotiation */
        MMWFDSinkResolution supportive_resolution;
 
@@ -300,6 +308,8 @@ int _mm_wfd_sink_start(mm_wfd_sink_t *wfd_sink);
 int _mm_wfd_sink_pause(mm_wfd_sink_t *wfd_sink);
 int _mm_wfd_sink_resume(mm_wfd_sink_t *wfd_sink);
 int _mm_wfd_set_message_callback(mm_wfd_sink_t *wfd_sink, MMWFDMessageCallback callback, void *user_data);
+int _mm_wfd_set_src_display_orientation_notify_callback(mm_wfd_sink_t *wfd_sink, MMWFDSrcDisplayOrientationNotifyCallback callback, void *user_data);
+int _mm_wfd_set_uibc_info_received_callback(mm_wfd_sink_t *wfd_sink, MMWFDUibcInfoReceivedCallback callback, void *user_data);
 int _mm_wfd_sink_set_resolution(mm_wfd_sink_t *wfd_sink, MMWFDSinkResolution resolution);
 int _mm_wfd_sink_update_video_param(mm_wfd_sink_t *wfd_sink, const char *param_name);
 int _mm_wfd_sink_set_src_device_type(mm_wfd_sink_t *wfd_sink, MMWFDSinkDeviceType device_type);
index 3e9138130a2748d883e760750b51c7936add28ce..2fe9d3c0868b992a3258e05b54bdf251181bb79f 100644 (file)
                x_wfd_sink->msg_cb(x_error_type, x_state_type, x_wfd_sink->msg_user_data); \
        }
 
+/* posting display orientation */
+#define MMWFDSINK_POST_DISPLAY_ORIENTATION(x_wfd_sink, x_display_orientation_type) \
+       if (x_wfd_sink->src_display_orientation_notify_cb) { \
+               wfd_sink_debug("display_orientation[%d] will be posted using user callback\n", x_display_orientation_type); \
+               x_wfd_sink->src_display_orientation_notify_cb(x_display_orientation_type, x_wfd_sink->src_display_orientation_notify_user_data); \
+       }
+
 
 /* state */
 #define MMWFDSINK_CURRENT_STATE(x_wfd_sink) ((mm_wfd_sink_t *)x_wfd_sink)->state.state
index b1747f9c5d30328a9828378b702df6222ed98fc4..49f926390ec760b820bd74342377710964784d6e 100644 (file)
@@ -233,6 +233,34 @@ int mm_wfd_sink_set_message_callback(MMHandleType wfd_sink_handle, MMWFDMessageC
        return result;
 }
 
+int mm_wfd_sink_set_src_display_orientation_notify_callback(MMHandleType wfd_sink_handle, MMWFDSrcDisplayOrientationNotifyCallback callback, void *user_data)
+{
+       mm_wfd_sink_t *wfd_sink = (mm_wfd_sink_t *)wfd_sink_handle;
+       int result = MM_ERROR_NONE;
+
+       wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
+
+       MMWFDSINK_CMD_LOCK(wfd_sink);
+       result = _mm_wfd_set_src_display_orientation_notify_callback(wfd_sink, callback, user_data);
+       MMWFDSINK_CMD_UNLOCK(wfd_sink);
+
+       return result;
+}
+
+int mm_wfd_sink_set_uibc_info_received_callback(MMHandleType wfd_sink_handle, MMWFDUibcInfoReceivedCallback callback, void *user_data)
+{
+       mm_wfd_sink_t *wfd_sink = (mm_wfd_sink_t *)wfd_sink_handle;
+       int result = MM_ERROR_NONE;
+
+       wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
+
+       MMWFDSINK_CMD_LOCK(wfd_sink);
+       result = _mm_wfd_set_uibc_info_received_callback(wfd_sink, callback, user_data);
+       MMWFDSINK_CMD_UNLOCK(wfd_sink);
+
+       return result;
+}
+
 int mm_wfd_sink_set_attribute(MMHandleType wfd_sink_handle,  char **err_attr_name, const char *first_attribute_name, ...)
 {
        mm_wfd_sink_t *wfd_sink = (mm_wfd_sink_t *)wfd_sink_handle;
index e395d6e0a2648f5fe4b2c38dfbea57049760b520..4b33523fe870d93ccf251ffbe7710ba017c12373 100644 (file)
@@ -430,6 +430,34 @@ int _mm_wfd_set_message_callback(mm_wfd_sink_t *wfd_sink, MMWFDMessageCallback c
        return result;
 }
 
+int _mm_wfd_set_src_display_orientation_notify_callback(mm_wfd_sink_t *wfd_sink, MMWFDSrcDisplayOrientationNotifyCallback callback, void *user_data)
+{
+       wfd_sink_debug_fenter();
+
+       wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
+
+       wfd_sink->src_display_orientation_notify_cb = callback;
+       wfd_sink->src_display_orientation_notify_user_data = user_data;
+
+       wfd_sink_debug_fleave();
+
+       return MM_ERROR_NONE;
+}
+
+int _mm_wfd_set_uibc_info_received_callback(mm_wfd_sink_t *wfd_sink, MMWFDUibcInfoReceivedCallback callback, void *user_data)
+{
+       wfd_sink_debug_fenter();
+
+       wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
+
+       wfd_sink->uibc_info_received_cb = callback;
+       wfd_sink->uibc_info_received_user_data = user_data;
+
+       wfd_sink_debug_fleave();
+
+       return MM_ERROR_NONE;
+}
+
 static int __mm_wfd_sink_init_gstreamer(mm_wfd_sink_t *wfd_sink)
 {
        int result = MM_ERROR_NONE;
@@ -891,6 +919,18 @@ _mm_wfd_sink_msg_callback(GstBus *bus, GstMessage *msg, gpointer data)
                                break;
 
                        wfd_sink_debug("message name : %s", GST_STR_NULL(message_structure_name));
+                       if(g_strrstr(message_structure_name, "WFD_PORTRAIT_DISPLAY")) {
+                               MMWFDSINK_POST_DISPLAY_ORIENTATION(wfd_sink,
+                                                       MM_WFD_DISPLAY_ORIENTATION_PORTRAIT_DISPLAY);
+                       }
+                       else if(g_strrstr(message_structure_name, "WFD_PORTRAIT")) {
+                               MMWFDSINK_POST_DISPLAY_ORIENTATION(wfd_sink,
+                                       MM_WFD_DISPLAY_ORIENTATION_PORTRAIT);
+                       }
+                       else if(g_strrstr(message_structure_name, "WFD_LANDSCAPE")) {
+                               MMWFDSINK_POST_DISPLAY_ORIENTATION(wfd_sink,
+                                       MM_WFD_DISPLAY_ORIENTATION_LANDSCAPE);
+                       }
                }
                break;