1 #include <stdio.h>
2 #include <Eina.h>
3 #include <Ecore.h>
4 #include <Ecore_Evas.h>
5 #include <Ecore_Buffer.h>
6 #include <Ecore_Buffer_Queue.h>
7 #include <Evas.h>
8 
9 #ifdef DEBUG
10 #define LOG(f, x...) printf("[CONSUMER|%30.30s|%04d] " f "\n", __func__, __LINE__, ##x)
11 #else
12 #define LOG(f, x...)
13 #endif
14 
15 #define WIDTH 720
16 #define HEIGHT 960
17 
18 typedef struct _Consumer_Data
19 {
20    Ecore_Buffer_Consumer *consumer;
21    Ecore_Buffer *buffer;
22    Ecore_Job *render_job;
23    struct
24    {
25       Evas *e;
26       Ecore_Evas *ee;
27       Evas_Object *bg, *img;
28    } win;
29 } Consumer_Data;
30 
31 const char *name = "ecore_buffer_queue_test";
32 
33 static void
shutdown_all(void)34 shutdown_all(void)
35 {
36    ecore_buffer_queue_shutdown();
37    ecore_buffer_shutdown();
38    ecore_evas_shutdown();
39    ecore_shutdown();
40    eina_shutdown();
41 }
42 
43 static Eina_Bool
init_all(void)44 init_all(void)
45 {
46    if (!eina_init()) goto err;
47    if (!ecore_init()) goto err;
48    if (!ecore_evas_init()) goto err;
49    if (!ecore_buffer_init()) goto err;
50    if (!ecore_buffer_queue_init()) goto err;
51 
52    return EINA_TRUE;
53 err:
54    shutdown_all();
55    return EINA_FALSE;
56 }
57 
58 static void
_cb_render_post(void * data,Evas * e EINA_UNUSED,void * event_info EINA_UNUSED)59 _cb_render_post(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
60 {
61    Consumer_Data *cd = (Consumer_Data *)data;
62 
63    if (cd->buffer)
64      {
65         ecore_buffer_consumer_buffer_release(cd->consumer, cd->buffer);
66         cd->buffer = NULL;
67      }
68 }
69 
70 static void
_consumer_cb_render_job(void * data)71 _consumer_cb_render_job(void *data)
72 {
73    Consumer_Data *cd = (Consumer_Data *)data;
74    void *pixel_data;
75    unsigned int w, h;
76 
77    LOG("Startup - Render");
78 
79    if (!(cd->buffer = ecore_buffer_consumer_buffer_dequeue(cd->consumer)))
80      {
81         LOG("Failed to dequeue buffer");
82         goto end;
83      }
84 
85    LOG("Success to get Compositable Buffer, "
86         "Drawing it to Consumer's Canvas now... - buffer:%p", cd->buffer);
87    // Get pixel data and set it to object.
88    pixel_data = ecore_buffer_data_get(cd->buffer);
89    ecore_buffer_size_get(cd->buffer, &w, &h);
90    evas_object_image_data_set(cd->win.img, pixel_data);
91    evas_object_image_data_update_add(cd->win.img, 0, 0, w, h);
92 
93    ecore_job_del(cd->render_job);
94    cd->render_job = NULL;
95 
96 end:
97    LOG("Done - Render");
98 }
99 
100 static void
_consumer_render_queue(Consumer_Data * cd)101 _consumer_render_queue(Consumer_Data *cd)
102 {
103    if (!cd) return;
104 
105    LOG("Render Queue");
106 
107    if (!cd->render_job)
108      cd->render_job = ecore_job_add(_consumer_cb_render_job, cd);
109 }
110 
111 static void
_cb_provider_add(Ecore_Buffer_Consumer * consumer EINA_UNUSED,void * data EINA_UNUSED)112 _cb_provider_add(Ecore_Buffer_Consumer *consumer EINA_UNUSED, void *data EINA_UNUSED)
113 {
114    LOG("Connected with Provider");
115 }
116 
117 static void
_cb_provider_del(Ecore_Buffer_Consumer * consumer EINA_UNUSED,void * data EINA_UNUSED)118 _cb_provider_del(Ecore_Buffer_Consumer *consumer EINA_UNUSED, void *data EINA_UNUSED)
119 {
120    LOG("Disconnected with Provider, Shutdown Consumer now.");
121    ecore_main_loop_quit();
122 }
123 
124 static void
_cb_buffer_enqueued(Ecore_Buffer_Consumer * consumer EINA_UNUSED,void * data)125 _cb_buffer_enqueued(Ecore_Buffer_Consumer *consumer EINA_UNUSED, void *data)
126 {
127    Consumer_Data *cd = (Consumer_Data *)data;
128 
129    LOG("Buffer Enqueued");
130 
131    _consumer_render_queue(cd);
132 }
133 
134 int
main(void)135 main(void)
136 {
137    Consumer_Data *cd;
138    Evas_Object *o;
139    const int queue_size = 3;
140 
141    if (!init_all())
142      {
143         LOG("Initializing failed");
144         return -1;
145      }
146 
147    cd = (Consumer_Data *)calloc(1, sizeof(Consumer_Data));
148 
149    if (!cd || !(cd->consumer = ecore_buffer_consumer_new(name, queue_size, WIDTH, HEIGHT)))
150      {
151         LOG("Failed to create consumer");
152         goto shutdown;
153      }
154 
155    ecore_buffer_consumer_provider_add_cb_set(cd->consumer, _cb_provider_add, cd);
156    ecore_buffer_consumer_provider_del_cb_set(cd->consumer, _cb_provider_del, cd);
157    ecore_buffer_consumer_buffer_enqueued_cb_set(cd->consumer, _cb_buffer_enqueued, cd);
158 
159    cd->win.ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
160    cd->win.e = ecore_evas_get(cd->win.ee);
161 
162    o = evas_object_rectangle_add(cd->win.e);
163    evas_object_move(o, 0, 0);
164    evas_object_resize(o, WIDTH, HEIGHT);
165    evas_object_color_set(o, 255, 0, 0, 255);
166    evas_object_show(o);
167    cd->win.bg = o;
168 
169    o = evas_object_image_add(cd->win.e);
170    evas_object_image_fill_set(o, 0, 0, WIDTH, HEIGHT);
171    evas_object_image_size_set(o, WIDTH, HEIGHT);
172 
173    evas_object_move(o, 0, 0);
174    evas_object_resize(o, WIDTH, HEIGHT);
175    evas_object_show(o);
176    cd->win.img = o;
177 
178    ecore_evas_show(cd->win.ee);
179 
180    evas_event_callback_add(cd->win.e, EVAS_CALLBACK_RENDER_POST, _cb_render_post, cd);
181 
182    ecore_main_loop_begin();
183 
184 shutdown:
185    if (cd->win.ee) ecore_evas_free(cd->win.ee);
186    if (cd->buffer) ecore_buffer_consumer_buffer_release(cd->consumer, cd->buffer);
187    if (cd->consumer) ecore_buffer_consumer_free(cd->consumer);
188    free(cd);
189 
190    shutdown_all();
191    return 0;
192 }
193