typedef enum {
WFD2_H265_LEVEL_UNKNOWN = 0,
- WFD2_H265_LEVEL_3_1 = (1 << 1),
- WFD2_H265_LEVEL_4 = (1 << 2),
- WFD2_H265_LEVEL_4_1 = (1 << 3),
- WFD2_H265_LEVEL_5 = (1 << 4),
- WFD2_H265_LEVEL_5_1 = (1 << 5)
+ WFD2_H265_LEVEL_3_1 = (1 << 0),
+ WFD2_H265_LEVEL_4 = (1 << 1),
+ WFD2_H265_LEVEL_4_1 = (1 << 2),
+ WFD2_H265_LEVEL_5 = (1 << 3),
+ WFD2_H265_LEVEL_5_1 = (1 << 4)
} WFD2VideoH265LevelEnum;
typedef enum {
break;
case MM_DISPLAY_SURFACE_OVERLAY: {
+ static unsigned int wl_surface_id = 0;
+ static void *display_overlay = NULL;
int wl_window_x = 0;
int wl_window_y = 0;
int wl_window_width = 0;
int wl_window_height = 0;
- unsigned int wl_surface_id = 0;
struct wl_surface *wl_surface = NULL;
struct wl_display *wl_display = NULL;
Ecore_Wl_Window *wl_window = NULL;
/* get wl_display */
wl_display = (struct wl_display *) ecore_wl_display_get();
- ret = mm_wfd_sink_wlclient_create(&wlclient);
- if (ret != MM_ERROR_NONE) {
- wfd_sink_error("Wayland client create failure");
- return ret;
- }
-
- if (wl_surface && wl_display) {
+ wfd_sink_debug("previous display object : %p current object : %p", display_overlay, object);
+ if (wl_surface && wl_display && (wl_surface_id == 0 || display_overlay != object)) {
wfd_sink_debug("surface = %p, wl_display = %p", wl_surface, wl_display);
+ display_overlay = object;
+
+ ret = mm_wfd_sink_wlclient_create(&wlclient);
+ if (ret != MM_ERROR_NONE) {
+ wfd_sink_error("Wayland client create failure");
+ return ret;
+ }
+ wfd_sink_debug("Try to get surface id");
+
wl_surface_id = mm_wfd_sink_wlclient_get_wl_window_wl_surface_id(wlclient, wl_surface, wl_display);
+
wfd_sink_debug("wl_surface_id = %d", wl_surface_id);
- }
- if (wlclient) {
- g_free(wlclient);
- wlclient = NULL;
- }
+ if (wlclient) {
+ g_free(wlclient);
+ wlclient = NULL;
+ }
+ }
wfd_sink_debug("set video param : surface_id %d", wl_surface_id);
gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(video_sink),
wl_surface_id);
int mm_wfd_sink_wlclient_get_wl_window_wl_surface_id(wl_client *wlclient, struct wl_surface *surface, struct wl_display *display)
{
+ unsigned int wl_surface_id = 0;
+ struct wl_event_queue *queue1 = NULL;
+ struct wl_event_queue *queue2 = NULL;
+
goto_if_fail(wlclient != NULL, failed);
goto_if_fail(surface != NULL, failed);
goto_if_fail(display != NULL, failed);
- unsigned int wl_surface_id = 0;
-
wlclient->display = display;
goto_if_fail(wlclient->display != NULL, failed);
+ queue1 = wl_display_create_queue(wlclient->display);
+ goto_if_fail(queue1 != NULL, failed);
+
wlclient->registry = wl_display_get_registry(wlclient->display);
goto_if_fail(wlclient->registry != NULL, failed);
+ wl_proxy_set_queue((struct wl_proxy *)wlclient->registry, queue1);
wl_registry_add_listener(wlclient->registry, ®istry_listener, wlclient);
- wl_display_dispatch(wlclient->display);
- wl_display_roundtrip(wlclient->display);
+ wl_display_roundtrip_queue(wlclient->display, queue1);
- /* check global objects */
goto_if_fail(wlclient->tz_surface != NULL, failed);
/* Get wl_surface_id which is unique in a entire systemw. */
wlclient->tz_resource = tizen_surface_get_tizen_resource(wlclient->tz_surface, surface);
goto_if_fail(wlclient->tz_resource != NULL, failed);
+ queue2 = wl_display_create_queue(wlclient->display);
+ goto_if_fail(queue2 != NULL, failed);
+
+ wl_proxy_set_queue((struct wl_proxy *)wlclient->tz_resource, queue2);
tizen_resource_add_listener(wlclient->tz_resource, &tz_resource_listener, &wl_surface_id);
- wl_display_roundtrip(wlclient->display);
+ wl_display_roundtrip_queue(wlclient->display, queue2);
+
goto_if_fail(wl_surface_id > 0, failed);
mm_wfd_sink_wlclient_finalize(wlclient);
+ wl_event_queue_destroy(queue1);
+ queue1 = NULL;
+ wl_event_queue_destroy(queue2);
+ queue2 = NULL;
+
return wl_surface_id;
failed:
wfd_sink_error("Failed to get wl_surface_id");
+ if (queue1) {
+ wl_event_queue_destroy(queue1);
+ queue1 = NULL;
+ }
+ if (queue2) {
+ wl_event_queue_destroy(queue2);
+ queue2 = NULL;
+ }
+
+ mm_wfd_sink_wlclient_finalize(wlclient);
+
return 0;
}
+
void mm_wfd_sink_wlclient_finalize(wl_client *wlclient)
{
wfd_sink_debug("start finalize wlclient");
return_if_fail(wlclient != NULL)
- if (wlclient->tz_surface)
+ if (wlclient->tz_surface) {
tizen_surface_destroy(wlclient->tz_surface);
-
- if (wlclient->tz_resource)
+ wlclient->tz_surface = NULL;
+ }
+ if (wlclient->tz_resource) {
tizen_resource_destroy(wlclient->tz_resource);
-
+ wlclient->tz_resource = NULL;
+ }
/* destroy registry */
- if (wlclient->registry)
+ if (wlclient->registry) {
wl_registry_destroy(wlclient->registry);
+ wlclient->registry = NULL;
+ }
return;
}