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