Support waylandsink 75/38575/2 submit/tizen/20150430.023919 submit/tizen_common/20150505.090000
authorJeongmo Yang <jm80.yang@samsung.com>
Wed, 22 Apr 2015 08:06:07 +0000 (17:06 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 24 Apr 2015 07:57:22 +0000 (16:57 +0900)
Change-Id: Iff3ede498e3ccfd081453c2f535e4582e5ab9e50
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
CMakeLists.txt
include/camera_private.h
packaging/capi-media-camera.spec
src/camera.c

index 4909f31..c6cb71d 100755 (executable)
@@ -50,6 +50,13 @@ IF("${ARCH}" STREQUAL "arm")
     ADD_DEFINITIONS("-DTARGET")
 ENDIF("${ARCH}" STREQUAL "arm")
 
+IF(WAYLAND_SUPPORT)
+    ADD_DEFINITIONS("-DHAVE_WAYLAND")
+ENDIF(WAYLAND_SUPPORT)
+IF(X11_SUPPORT)
+    ADD_DEFINITIONS("-DHAVE_X11")
+ENDIF(X11_SUPPORT)
+
 ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
 ADD_DEFINITIONS("-DTIZEN_DEBUG")
 
index 0e27f59..e5f43b2 100644 (file)
@@ -55,6 +55,9 @@ typedef struct _camera_s{
        void* user_cb[_CAMERA_EVENT_TYPE_NUM];
        void* user_data[_CAMERA_EVENT_TYPE_NUM];
        void* display_handle;
+#ifdef HAVE_WAYLAND
+       MMCamWaylandInfo *wl_info;
+#endif /* #ifdef HAVE_WAYLAND */
        camera_display_type_e display_type;
        unsigned int state;
 
index 58832b8..52d227a 100755 (executable)
@@ -1,6 +1,9 @@
+%bcond_with wayland
+%bcond_with x
+
 Name:       capi-media-camera
 Summary:    A Camera library in Tizen C API
-Version:    0.2.0
+Version:    0.2.1
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
@@ -46,7 +49,18 @@ Development related files.
 export CFLAGS+=" -DTIZEN_DEBUG_ENABLE"
 %endif
 MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
-%cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
+%cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} \
+%if %{with wayland}
+       -DWAYLAND_SUPPORT=On \
+%else
+       -DWAYLAND_SUPPORT=Off \
+%endif
+%if %{with x}
+       -DX11_SUPPORT=On
+%else
+       -DX11_SUPPORT=Off
+%endif
+
 make %{?jobs:-j%jobs}
 
 
index 6d6cdb9..7f2b647 100644 (file)
@@ -724,7 +724,8 @@ int camera_create(camera_device_e device, camera_h* camera){
        return __convert_camera_error_code(__func__, ret);
 }
 
- int camera_destroy(camera_h camera){
+ int camera_destroy(camera_h camera)
+{
        if( camera == NULL ){
                LOGE("INVALID_PARAMETER(0x%08x)",CAMERA_ERROR_INVALID_PARAMETER);
                return CAMERA_ERROR_INVALID_PARAMETER;
@@ -749,11 +750,16 @@ int camera_create(camera_device_e device, camera_h* camera){
        if( ret == MM_ERROR_NONE ){
                _camera_remove_cb_message(handle);
                g_mutex_clear(&handle->idle_cb_lock);
+#ifdef HAVE_WAYLAND
+               if (handle->wl_info) {
+                       free(handle->wl_info);
+                       handle->wl_info = NULL;
+               }
+#endif /* HAVE_WAYLAND */
                free(handle);
        }
 
        return __convert_camera_error_code(__func__, ret);
-
 }
 
 int camera_start_preview(camera_h camera){
@@ -1222,7 +1228,9 @@ int camera_cancel_focusing(camera_h camera){
        handle->on_continuous_focusing = false;
        return __convert_camera_error_code(__func__, mm_camcorder_stop_focusing(handle->mm_handle));
 }
-int camera_set_display(camera_h camera, camera_display_type_e type, camera_display_h display){
+
+int camera_set_display(camera_h camera, camera_display_type_e type, camera_display_h display)
+{
        int ret = MM_ERROR_NONE;
        int set_surface = MM_DISPLAY_SURFACE_X;
        void *set_handle = NULL;
@@ -1255,12 +1263,51 @@ int camera_set_display(camera_h camera, camera_display_type_e type, camera_displ
                object_type = evas_object_type_get(obj);
                if( object_type ){
                        if( type == CAMERA_DISPLAY_TYPE_OVERLAY && !strcmp(object_type, "elm_win") ){
+#ifdef HAVE_WAYLAND
+                               MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)malloc(sizeof(MMCamWaylandInfo));
+
+                               if (wl_info == NULL) {
+                                       LOGE("wl_info alloc failed : %d", sizeof(MMCamWaylandInfo));
+                                       return __convert_camera_error_code(__func__, MM_ERROR_CAMCORDER_LOW_MEMORY);
+                               }
+
+                               memset(wl_info, 0x0, sizeof(MMCamWaylandInfo));
+
+                               wl_info->evas_obj = (void *)obj;
+                               wl_info->window = (void *)elm_win_wl_window_get(obj);
+                               wl_info->surface = (void *)ecore_wl_window_surface_get(wl_info->window);
+                               wl_info->display = (void *)ecore_wl_display_get();
+
+                               if (wl_info->window == NULL || wl_info->surface == NULL || wl_info->display == NULL) {
+                                       LOGE("something is NULL %p, %p, %p", wl_info->window, wl_info->surface, wl_info->display);
+                                       free(wl_info);
+                                       return __convert_camera_error_code(__func__, MM_ERROR_CAMCORDER_INTERNAL);
+                               }
+
+                               evas_object_geometry_get(obj, &wl_info->window_x, &wl_info->window_y,
+                                                             &wl_info->window_width, &wl_info->window_height);
+
+                               if (handle->wl_info) {
+                                       free(handle->wl_info);
+                                       handle->wl_info = NULL;
+                               }
+
+                               /* set wayland info */
+                               handle->wl_info = (void *)wl_info;
+                               set_surface = MM_DISPLAY_SURFACE_X;
+                               set_handle = (void *)wl_info;
+
+                               LOGD("wayland obj %p, window %p, surface %p, display %p, size %d,%d,%dx%d",
+                                    wl_info->evas_obj, wl_info->window, wl_info->surface, wl_info->display,
+                                    wl_info->window_x, wl_info->window_y, wl_info->window_width, wl_info->window_height);
+#else /* HAVE_WAYLAND */
                                /* x window overlay surface */
                                handle->display_handle = (void *)elm_win_xwindow_get(obj);
                                set_surface = MM_DISPLAY_SURFACE_X;
                                set_handle = &(handle->display_handle);
 
                                LOGD("display type OVERLAY : handle %p, %d", set_handle, (int)handle->display_handle);
+#endif /* HAVE_WAYLAND */
                        } else if( type == CAMERA_DISPLAY_TYPE_EVAS && !strcmp(object_type, "image") ) {
                                /* evas object surface */
                                handle->display_handle = display;