1 #include "e_client_video_intern.h"
2 #include "e_video_debug_intern.h"
3 #include "e_info_server_intern.h"
4 #include "e_comp_wl_video_buffer_intern.h"
5 #include "e_zone_video_intern.h"
6 #include "e_comp_wl_viewport_intern.h"
7 #include "e_utils_intern.h"
8 #include "e_client_intern.h"
10 #include <tizen-extension-server-protocol.h>
12 typedef struct _E_Video_Object E_Video_Object;
14 struct _E_Video_Object
16 struct wl_resource *resource;
20 Ecore_Event_Handler *visibility_change;
21 Ecore_Event_Handler *remove;
22 } client_event_handler;
25 static void _e_comp_wl_video_object_setup(E_Video_Object *vo, E_Client *ec);
28 _e_comp_wl_video_object_prop_id_get(E_Video_Object *vo, const char *name)
30 const tdm_prop *props;
33 e_client_video_available_properties_get(vo->ec, &props, &count);
34 for (i = 0; i < count; i++)
36 if (!strncmp(name, props[i].name, TDM_NAME_LEN))
38 VDB("check property(%s)", vo->ec, name);
47 _e_comp_wl_video_object_ec_cb_remove(void *data, int type, void *event)
57 if (vo->ec != ec) return ECORE_CALLBACK_PASS_ON;
59 E_FREE_FUNC(vo->client_event_handler.visibility_change, ecore_event_handler_del);
60 E_FREE_FUNC(vo->client_event_handler.remove, ecore_event_handler_del);
62 e_client_video_unset(vo->ec);
66 return ECORE_CALLBACK_PASS_ON;
69 static E_Video_Object *
70 _e_comp_wl_video_object_create(struct wl_resource *resource, struct wl_resource *surface)
75 ec = e_client_from_surface_resource(surface);
76 EINA_SAFETY_ON_TRUE_RETURN_VAL(e_object_is_del(E_OBJECT(ec)), NULL);
78 vo = calloc(1, sizeof *vo);
79 EINA_SAFETY_ON_NULL_RETURN_VAL(vo, NULL);
81 vo->resource = resource;
85 _e_comp_wl_video_object_setup(vo, ec);
87 vo->client_event_handler.remove =
88 ecore_event_handler_add(E_EVENT_CLIENT_REMOVE,
89 _e_comp_wl_video_object_ec_cb_remove, vo);
95 _e_comp_wl_video_object_available_size_send(E_Video_Object *vo)
97 int minw, minh, maxw, maxh;
102 zone = e_comp_zone_find_by_ec(vo->ec);
103 EINA_SAFETY_ON_NULL_RETURN(zone);
105 res = e_zone_video_available_size_get(zone,
106 &minw, &minh, &maxw, &maxh, &align);
109 VER("Failed to get video available size", vo->ec);
113 tizen_video_object_send_size(vo->resource, minw, minh, maxw, maxh, align);
117 _e_comp_wl_video_object_available_properties_send(E_Video_Object *vo)
120 const tdm_prop *props;
124 e_client_video_available_properties_get(vo->ec, &props, &count);
125 for (i = 0; i < count; i++)
127 res = e_client_video_property_get(vo->ec, props[i].id, &value);
130 VER("Failed to get property name %s value %d",
131 vo->ec, props[i].name, value.u32);
135 tizen_video_object_send_attribute(vo->resource,
136 props[i].name, value.u32);
141 _e_comp_wl_video_object_setup(E_Video_Object *vo, E_Client *ec)
145 e_client_video_set(ec);
147 _e_comp_wl_video_object_available_size_send(vo);
148 _e_comp_wl_video_object_available_properties_send(vo);
152 _e_comp_wl_video_object_resource_destroy(struct wl_resource *resource)
156 vo = wl_resource_get_user_data(resource);
160 E_FREE_FUNC(vo->client_event_handler.visibility_change, ecore_event_handler_del);
161 E_FREE_FUNC(vo->client_event_handler.remove, ecore_event_handler_del);
163 e_client_video_unset(vo->ec);
170 _e_comp_wl_video_object_handle_destroy(struct wl_client *client, struct wl_resource *resource)
172 wl_resource_destroy(resource);
176 _e_comp_wl_video_object_handle_attribute_set(struct wl_client *client,
177 struct wl_resource *resource,
185 vo = wl_resource_get_user_data(resource);
190 VIN("Client(%s):PID(%d) Attribute:%s, Value:%d",
191 vo->ec, e_client_util_name_get(vo->ec) ?: "No Name",
192 vo->ec->netwm.pid, name, value);
194 // check available property & count
195 id = _e_comp_wl_video_object_prop_id_get(vo, name);
198 VIN("no available property", vo->ec);
203 e_client_video_property_set(vo->ec, id, v, EINA_FALSE);
207 _e_comp_wl_video_object_ec_cb_visibility_change(void *data, int type, void *event)
215 if (vo->ec != ev->ec)
216 return ECORE_CALLBACK_PASS_ON;
219 switch (e_client_visibility_get(ec))
221 case E_VISIBILITY_FULLY_OBSCURED:
222 evas_object_hide(ec->frame);
225 case E_VISIBILITY_UNOBSCURED:
226 evas_object_show(ec->frame);
230 return ECORE_CALLBACK_PASS_ON;
234 _e_comp_wl_video_object_handle_topmost_visibility_follow(struct wl_client *client,
235 struct wl_resource *resource)
239 vo = wl_resource_get_user_data(resource);
244 VIN("set follow_topmost_visibility", vo->ec);
246 e_client_video_topmost_visibility_follow(vo->ec);
248 if (!vo->client_event_handler.visibility_change)
250 vo->client_event_handler.visibility_change =
251 ecore_event_handler_add(E_EVENT_CLIENT_VISIBILITY_CHANGE,
252 (Ecore_Event_Handler_Cb)_e_comp_wl_video_object_ec_cb_visibility_change,
258 _e_comp_wl_video_object_handle_topmost_visibility_unfollow(struct wl_client *client,
259 struct wl_resource *resource)
263 vo = wl_resource_get_user_data(resource);
268 VIN("set unfollow_topmost_visibility", vo->ec);
270 e_client_video_topmost_visibility_unfollow(vo->ec);
271 E_FREE_FUNC(vo->client_event_handler.visibility_change, ecore_event_handler_del);
275 _e_comp_wl_video_object_handle_attribute_allowed(struct wl_client *client,
276 struct wl_resource *resource)
280 vo = wl_resource_get_user_data(resource);
285 VIN("set allowed_attribute", vo->ec);
286 e_client_video_property_allow(vo->ec);
290 _e_comp_wl_video_object_handle_attribute_disallowed(struct wl_client *client,
291 struct wl_resource *resource)
295 vo = wl_resource_get_user_data(resource);
300 VIN("set disallowed_attribute", vo->ec);
301 e_client_video_property_disallow(vo->ec);
304 static const struct tizen_video_object_interface _e_comp_wl_video_object_implementation =
306 _e_comp_wl_video_object_handle_destroy,
307 _e_comp_wl_video_object_handle_attribute_set,
308 _e_comp_wl_video_object_handle_topmost_visibility_follow,
309 _e_comp_wl_video_object_handle_topmost_visibility_unfollow,
310 _e_comp_wl_video_object_handle_attribute_allowed,
311 _e_comp_wl_video_object_handle_attribute_disallowed,
315 _e_comp_wl_video_handle_object_get(struct wl_client *client,
316 struct wl_resource *resource,
318 struct wl_resource *surface)
322 struct wl_resource *res;
324 version = wl_resource_get_version(resource);
325 res = wl_resource_create(client, &tizen_video_object_interface, version, id);
328 wl_client_post_no_memory(client);
332 if (!(vo = _e_comp_wl_video_object_create(res, surface)))
334 wl_resource_destroy(res);
335 wl_client_post_no_memory(client);
339 wl_resource_set_implementation(res, &_e_comp_wl_video_object_implementation,
340 vo, _e_comp_wl_video_object_resource_destroy);
344 _e_comp_wl_video_handle_viewport_get(struct wl_client *client,
345 struct wl_resource *resource,
347 struct wl_resource *surface)
351 ec = e_client_from_surface_resource(surface);
353 if (!ec->comp_data) return;
355 if (ec->comp_data && ec->comp_data->scaler.viewport)
357 wl_resource_post_error(resource,
358 TIZEN_VIDEO_ERROR_VIEWPORT_EXISTS,
359 "a viewport for that subsurface already exists");
363 if (!e_comp_wl_viewport_create(resource, id, surface))
365 ERR("Failed to create viewport for wl_surface@%d",
366 wl_resource_get_id(surface));
367 wl_client_post_no_memory(client);
373 _e_comp_wl_video_handle_destroy(struct wl_client *client, struct wl_resource *resource)
375 wl_resource_destroy(resource);
378 static const struct tizen_video_interface _e_comp_wl_video_implementation =
380 _e_comp_wl_video_handle_object_get,
381 _e_comp_wl_video_handle_viewport_get,
382 _e_comp_wl_video_handle_destroy,
386 _e_comp_wl_tizen_video_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
388 struct wl_resource *res;
389 const uint32_t *formats = NULL;
392 if (!(res = wl_resource_create(client, &tizen_video_interface, version, id)))
394 ERR("Could not create tizen_video_interface resource: %m");
395 wl_client_post_no_memory(client);
399 wl_resource_set_implementation(res, &_e_comp_wl_video_implementation, NULL, NULL);
401 e_comp_screen_available_video_formats_get(&formats, &count);
402 for (i = 0; i < count; i++)
403 tizen_video_send_format(res, formats[i]);
407 _e_comp_wl_video_info_cb_vbuf_print(void *data, const char *log_path)
409 e_comp_wl_video_buffer_list_print(log_path);
413 _e_comp_wl_video_info_cb_video_to_primary(void *data, const char *log_path)
417 flag = e_video_debug_display_primary_plane_value_get();
418 e_video_debug_display_primary_plane_set(!flag);
422 _e_comp_wl_video_info_cb_video_punch(void *data, const char *log_path)
426 flag = e_video_debug_punch_value_get();
427 e_video_debug_punch_set(!flag);
431 e_comp_wl_video_init(void)
433 struct wl_global *global;
435 if (!e_comp_wl) return EINA_FALSE;
436 if (!e_comp_wl->wl.disp) return EINA_FALSE;
437 if (e_comp->wl_comp_data->video.global) return EINA_TRUE;
439 /* try to add tizen_video to wayland globals */
440 global = wl_global_create(e_comp_wl->wl.disp, &tizen_video_interface,
441 1, NULL, _e_comp_wl_tizen_video_bind);
444 ERR("Could not add tizen_video to wayland globals");
448 e_comp->wl_comp_data->video.global = global;
450 e_comp->wl_comp_data->available_hw_accel.underlay = EINA_TRUE;
451 DBG("enable HW underlay");
453 e_comp->wl_comp_data->available_hw_accel.scaler = EINA_TRUE;
454 DBG("enable HW scaler");
456 e_info_server_hook_set("vbuf", _e_comp_wl_video_info_cb_vbuf_print, NULL);
457 e_info_server_hook_set("video-to-primary", _e_comp_wl_video_info_cb_video_to_primary, NULL);
458 e_info_server_hook_set("video-punch", _e_comp_wl_video_info_cb_video_punch, NULL);
464 e_comp_wl_video_shutdown(void)
466 e_comp->wl_comp_data->available_hw_accel.underlay = EINA_FALSE;
467 e_comp->wl_comp_data->available_hw_accel.scaler = EINA_FALSE;
469 E_FREE_FUNC(e_comp->wl_comp_data->video.global, wl_global_destroy);
471 e_info_server_hook_set("vbuf", NULL, NULL);
472 e_info_server_hook_set("video-to-primary", NULL, NULL);
473 e_info_server_hook_set("video-punch", NULL, NULL);