Code snippet how to perform 2 image transformations consequently

How to perform 2 transformations consequentially (rotate 90 degrees->resize), encode raw buffer to jpeg file in memory/decode jpeg file from memory. Privilege http://tizen.org/privilege/mediastorage should be added in manifest.
typedef struct appdata {
//…
    int width;
    int height;
    image_util_rotation_e angle;
    media_packet_h mediaPcktPtr;
} appdata_s;

int finalize_callback(media_packet_h packet, int err, void* userdata)
{
    return MEDIA_PACKET_FINALIZE;
}

Evas_Event_Flags on_click_rotation_start(void *data, void *event_info)
{
    appdata_s *ad = (appdata_s *)data;
    void* src_ptr;
    media_format_h fmt;
    media_packet_h src;
    transformation_h handle;

    image_util_transform_create(&handle);

    unsigned char *img_source = NULL;
    int width = 0, height = 0;
    unsigned int size_decode = 0;

    image_util_decode_jpeg( ad->files[ad->curIndex], (image_util_colorspace_e)IMAGE_UTIL_COLORSPACE_RGB888, &img_source, &width, &height, &size_decode);

    ad->width =width;
    ad->height =height;
    ad->angle = IMAGE_UTIL_ROTATION_90;

    media_format_create(&fmt);
    media_format_set_video_mime(fmt, MEDIA_FORMAT_RGB888);
    media_format_set_video_width(fmt, width);
    media_format_set_video_height(fmt, height);
    media_packet_create_alloc(fmt, finalize_callback, NULL, &src);

    image_util_transform_set_rotation(handle, ad->angle);

    media_packet_get_buffer_data_ptr(src, &src_ptr);
    memcpy(src_ptr, img_source, size_decode);
    free(img_source);
    image_util_transform_run(handle, src , (image_util_transform_completed_cb) completed_rotation_callback_start_resize, ad);
    ad->mediaPcktPtr = src;
    image_util_transform_destroy(handle);
    return EVAS_EVENT_FLAG_NONE;
}
static void completed_rotation_callback_start_resize(media_packet_h *dst, int error_code, void *user_data)
{
    appdata_s *ad = (appdata_s *)user_data;
    void * ptr;
    media_packet_get_buffer_data_ptr(*dst, &ptr);

    int w = ad->width;
    int h = ad->height;
    if (ad->angle == IMAGE_UTIL_ROTATION_90  || ad->angle == IMAGE_UTIL_ROTATION_270 )
    {
        w = ad->height;
        h = ad->width;
    }

    unsigned char* jpeg_memory_buffer;
    unsigned int jpeg_size;

    image_util_encode_jpeg_to_memory((unsigned char*)ptr, w, h, IMAGE_UTIL_COLORSPACE_RGB888, 100, &jpeg_memory_buffer ,&jpeg_size);

    unsigned char *img_buffer = NULL;
    int width = 0, height = 0;
    unsigned int size_decode = 0;

    image_util_decode_jpeg_from_memory(jpeg_memory_buffer, (int)jpeg_size, IMAGE_UTIL_COLORSPACE_RGB888, &img_buffer, &width, &height, &size_decode);
    free(jpeg_memory_buffer);

    media_packet_destroy(*dst);
    media_packet_destroy(ad->mediaPcktPtr);

    ad->width =width/4;
    ad->height =height/4;

    // create next transformation and perform it
    media_format_h fmt;
    media_packet_h src;
    transformation_h handle;

    image_util_transform_create(&handle);

    media_format_create(&fmt);
    media_format_set_video_mime(fmt, MEDIA_FORMAT_RGB888);
    media_format_set_video_width(fmt, width);
    media_format_set_video_height(fmt, height);
    media_packet_create_alloc(fmt, _finalize_callback, NULL, &src);

    image_util_transform_set_resolution(handle, ad->width, ad->height);

    void* src_ptr;
    media_packet_get_buffer_data_ptr(src, &src_ptr);
    memcpy(src_ptr, img_buffer, size_decode);
    free(img_buffer);

    image_util_transform_run(handle, src , (image_util_transform_completed_cb)completed_resize_callback, ad);

    ad->mediaPcktPtr = src;

    image_util_transform_destroy(handle);
}

static void completed_resize_callback(media_packet_h *dst, int error_code, void *user_data)
{
    appdata_s *ad = (appdata_s *)user_data;
    void * ptr;
    media_packet_get_buffer_data_ptr(*dst, &ptr);

    image_util_encode_jpeg((unsigned char*)ptr, ad->width, ad->height
                                                  , IMAGE_UTIL_COLORSPACE_RGB888, 100, "/opt/usr/media/rotated_resized.jpg");
    media_packet_destroy(*dst);
    media_packet_destroy(ad->mediaPcktPtr);
}

Responses

0 Replies