From: Youngwoo Cho Date: Fri, 18 Apr 2025 06:01:47 +0000 (+0900) Subject: Add callbacks related to UIBC X-Git-Tag: accepted/tizen/unified/20250516.055917^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Faccepted%2Ftizen_unified;p=platform%2Fcore%2Fmultimedia%2Flibmm-wfd.git Add callbacks related to UIBC - 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 --- diff --git a/packaging/libmm-wfd.spec b/packaging/libmm-wfd.spec index c82745d..729b8b5 100644 --- a/packaging/libmm-wfd.spec +++ b/packaging/libmm-wfd.spec @@ -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 diff --git a/src/include/mm_wfd_sink.h b/src/include/mm_wfd_sink.h index 00047c1..4b50480 100644 --- a/src/include/mm_wfd_sink.h +++ b/src/include/mm_wfd_sink.h @@ -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 diff --git a/src/include/mm_wfd_sink_priv.h b/src/include/mm_wfd_sink_priv.h index c4cdbe8..3e43ca8 100644 --- a/src/include/mm_wfd_sink_priv.h +++ b/src/include/mm_wfd_sink_priv.h @@ -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); diff --git a/src/include/mm_wfd_sink_util.h b/src/include/mm_wfd_sink_util.h index 3e91381..2fe9d3c 100644 --- a/src/include/mm_wfd_sink_util.h +++ b/src/include/mm_wfd_sink_util.h @@ -96,6 +96,13 @@ 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 diff --git a/src/mm_wfd_sink.c b/src/mm_wfd_sink.c index b1747f9..49f9263 100644 --- a/src/mm_wfd_sink.c +++ b/src/mm_wfd_sink.c @@ -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; diff --git a/src/mm_wfd_sink_priv.c b/src/mm_wfd_sink_priv.c index e395d6e..4b33523 100644 --- a/src/mm_wfd_sink_priv.c +++ b/src/mm_wfd_sink_priv.c @@ -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;