TizenRefApp-7911 Implement thread-safe image crop and resize callbacks 14/110914/4
authorIryna Ferenchak <i.ferenchak@samsung.com>
Thu, 19 Jan 2017 09:34:55 +0000 (11:34 +0200)
committerAleksandr Sapozhnik <a.sapozhnik@samsung.com>
Tue, 24 Jan 2017 15:22:59 +0000 (07:22 -0800)
Change-Id: I22fdc5452aef71d44528865adb0891de14a64f7b
Signed-off-by: Iryna Ferenchak <i.ferenchak@samsung.com>
lib-common/inc/Common/ImageData.h
lib-common/src/Common/ImageData.cpp

index 07ac3a79466b3899459455f52d8594de7742ae3b..ff57bd32dfe9211554cd18c51d0edc2f2a5b9b6b 100644 (file)
@@ -92,6 +92,8 @@ namespace Common
 
                ExifData *m_ExifData;
                media_packet_h m_Packet;
+               transformation_h m_Transform;
+               int m_Error;
                ResultCallback m_OnResult;
        };
 }
index 926e88c3d054c16c5b73ba6dd415e246f2765f7d..7fb8e18293516332cb3d0fe6b749d9fd1b06e292 100644 (file)
@@ -18,6 +18,7 @@
 #include "Utils/Callback.h"
 #include "Utils/Logger.h"
 
+#include <Ecore.h>
 #include <libexif/exif-content.h>
 #include <fstream>
 
@@ -32,7 +33,9 @@ ImageData::ImageData(std::string path)
          m_Width(0),
          m_Height(0),
          m_ExifData(nullptr),
-         m_Packet(nullptr)
+         m_Packet(nullptr),
+         m_Transform(nullptr),
+         m_Error(IMAGE_UTIL_ERROR_NONE)
 {
 }
 
@@ -112,11 +115,10 @@ bool ImageData::resize(unsigned long width, unsigned long height, ResultCallback
 
        double ratio = getResizeRatio(width, height);
 
-       transformation_h handle = nullptr;
-       image_util_transform_create(&handle);
-       image_util_transform_set_hardware_acceleration(handle, true);
-       image_util_transform_set_resolution(handle, m_Width * ratio, m_Height * ratio);
-       int err = image_util_transform_run(handle, m_Packet, makeCallbackWithLastParam(&ImageData::onFinished), this);
+       image_util_transform_create(&m_Transform);
+       image_util_transform_set_hardware_acceleration(m_Transform, true);
+       image_util_transform_set_resolution(m_Transform, m_Width * ratio, m_Height * ratio);
+       int err = image_util_transform_run(m_Transform, m_Packet, makeCallbackWithLastParam(&ImageData::onFinished), this);
        if (err != IMAGE_UTIL_ERROR_NONE) {
                m_OnResult = nullptr;
                ERR("image_util_transform_run() failed.");
@@ -148,13 +150,12 @@ bool ImageData::crop(unsigned long width, unsigned long height, ResultCallback c
        }
 
        m_OnResult = std::move(callback);
-       transformation_h handle = nullptr;
-       image_util_transform_create(&handle);
-       image_util_transform_set_hardware_acceleration(handle, true);
-       image_util_transform_set_crop_area(handle,
+       image_util_transform_create(&m_Transform);
+       image_util_transform_set_hardware_acceleration(m_Transform, true);
+       image_util_transform_set_crop_area(m_Transform,
                (m_Width - width) / 2, (m_Height - height) / 2,
                (m_Width + width) / 2, (m_Height + height) / 2);
-       int err = image_util_transform_run(handle, m_Packet, makeCallbackWithLastParam(&ImageData::onFinished), this);
+       int err = image_util_transform_run(m_Transform, m_Packet, makeCallbackWithLastParam(&ImageData::onFinished), this);
        if (err != IMAGE_UTIL_ERROR_NONE) {
                m_OnResult = nullptr;
                ERR("image_util_transform_run() failed.");
@@ -256,11 +257,16 @@ void ImageData::clear()
                media_packet_destroy(m_Packet);
                m_Packet = nullptr;
        }
+       if (m_Transform) {
+               image_util_transform_destroy(m_Transform);
+               m_Transform = nullptr;
+       }
 }
 
 void ImageData::onFinished(media_packet_h *dst, int error)
 {
-       if (error == IMAGE_UTIL_ERROR_NONE) {
+       m_Error = error;
+       if (m_Error == IMAGE_UTIL_ERROR_NONE) {
                media_packet_destroy(m_Packet);
                m_Packet = *dst;
 
@@ -269,7 +275,14 @@ void ImageData::onFinished(media_packet_h *dst, int error)
                media_format_get_video_info(fmt, nullptr, (int *)&m_Width, (int *)&m_Height, nullptr, nullptr);
        }
 
-       ResultCallback callback = m_OnResult;
-       m_OnResult = nullptr;
-       callback(error);
+       ecore_main_loop_thread_safe_call_async([](void *data) {
+               ImageData *imageData = (ImageData *)data;
+               image_util_transform_destroy(imageData->m_Transform);
+               imageData->m_Transform = nullptr;
+
+               ResultCallback callback = imageData->m_OnResult;
+               imageData->m_OnResult = nullptr;
+               callback(imageData->m_Error);
+               imageData->m_Error = 0;
+       }, this);
 }