Update wayland API multithread usage and setting 96/92996/2
authorSeokHoon Lee <andy.shlee@samsung.com>
Thu, 20 Oct 2016 02:38:52 +0000 (11:38 +0900)
committerSeokHoon Lee <andy.shlee@samsung.com>
Thu, 20 Oct 2016 03:16:30 +0000 (12:16 +0900)
Change enum value for WFD2VideoH265Level

Change-Id: Iddb2036dfacd15d23cdd43de341df3d3d509fdb1
Signed-off-by: SeokHoon Lee <andy.shlee@samsung.com>
packaging/libmm-wfd.spec
src/include/mm_wfd_sink_enum.h
src/mm_wfd_sink_priv.c
src/mm_wfd_sink_wayland.c

index 5079dc45d5b6dab58662b0993d17e3adced485c3..0b10aedaeefc77f7960b242fb231d372dc299add 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-wfd
 Summary:    Multimedia Framework Wifi-Display Library
-Version:    0.2.207
+Version:    0.2.208
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 51f6d1cbfd47d11f237daee34840255bcc4cfc80..e45847911b655afeaaf512c9fd67a2b4267a12be 100644 (file)
@@ -282,11 +282,11 @@ typedef enum {
 
 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 {
index 5bf7f0fed5d2982a29811c9095b417c5c0849caa..1a59aa27771136109376516357625f34ea1f800d 100644 (file)
@@ -3534,11 +3534,12 @@ static int __mm_wfd_sink_prepare_videosink(mm_wfd_sink_t *wfd_sink, GstElement *
                        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;
@@ -3568,22 +3569,27 @@ static int __mm_wfd_sink_prepare_videosink(mm_wfd_sink_t *wfd_sink, GstElement *
                                        /* 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);
index d3376acc0801569dc207a61ed6b90b0d31ee5e19..54298b27ec69138cdf9bc94e32be3a349c404ec3 100644 (file)
@@ -90,56 +90,86 @@ ERROR:
 
 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, &registry_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;
 }