default_backend: do not allocate frame whenever each frames
[platform/core/uifw/libpui.git] / backends / voice / default_ani_streaming.c
index be6657d..39da2a4 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_streaming_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,27 +39,15 @@ _ani_backend_streaming_get_led_rgb(default_frame_info_t *frame, int led_idx, uns
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_streaming_free_frame(default_frame_info_t *frame)
-{
-       if (!frame) return;
-
-       if (frame->leds) free(frame->leds);
-       free(frame);
-}
-
 static default_frame_info_t *
 _ani_backend_streaming_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,13 +58,7 @@ _ani_backend_streaming_get_frame(default_ani_info *ani_info)
 
        key_frame = &ani_info->frames[idx];
        key_frame2 = &ani_info->frames[idx2];
-       frame->num_led = key_frame->num_led;
-       frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
-       if (!frame->leds)
-       {
-               free(frame);
-               return NULL;
-       }
+
        div = (double)(ani_info->frame_idx) / (double)ani_info->frame_max;
        r = g = b = r2 = g2 = b2 = 0x0;
        for (int i = 0; i < key_frame->num_led; i++)
@@ -85,7 +69,7 @@ _ani_backend_streaming_get_frame(default_ani_info *ani_info)
                g3 = (int)(g2 - g) * div + g;
                b3 = (int)(b2 - b) * div + b;
 
-               frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+               ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
        }
        ani_info->frame_idx++;
        if (ani_info->frame_idx >= ani_info->frame_max)
@@ -96,7 +80,7 @@ _ani_backend_streaming_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -130,7 +114,7 @@ _ani_backend_streaming_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_streaming_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -180,6 +164,10 @@ _ani_streaming_start(pui_ani_t *ani, int repeat)
        info->frame_idx = 0;
        info->repeat_cur = 0;
 
+       if (!ani_frame)
+               ani_frame = backend_util_alloc_frame(info);
+       ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
        ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_streaming_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -211,6 +199,11 @@ _ani_streaming_stop(pui_ani_t *ani, pui_bool force)
        else
                pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
 
+       if (ani_frame)
+       {
+               backend_util_free_frame(ani_frame);
+               ani_frame = NULL;
+       }
 
        return e;
 }