From: Seunghun Lee Date: Fri, 13 Sep 2024 01:48:23 +0000 (+0900) Subject: video_shell: Refactor out X-Git-Tag: accepted/tizen/unified/20240919.163739^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=56b9768ccd4e48e6b1258b9ebc5233b771ea0f16;p=platform%2Fupstream%2Fenlightenment.git video_shell: Refactor out To improve readability, this patch renames functions and divides quite big functions into smaller ones. Change-Id: I9de746821c5bc410a0af9964a38b955b06e2e8a7 --- diff --git a/src/bin/server/e_video_shell.c b/src/bin/server/e_video_shell.c index 8747672bf1..751996e6e6 100644 --- a/src/bin/server/e_video_shell.c +++ b/src/bin/server/e_video_shell.c @@ -950,7 +950,7 @@ _letter_box_geometry_calc(Eina_Rectangle *in_out, double ratio_width, double rat } static void -_source_viewport_destination_update(E_Video_Viewport_Source *source) +_source_destination_update(E_Video_Viewport_Source *source) { E_Video_Viewport *viewport = source->viewport; Eina_Rectangle dest_rect = {0, 0, -1, -1}; @@ -991,7 +991,58 @@ end: } static void -_source_viewport_transform_update(E_Video_Viewport_Source *source) +_source_viewport_update(E_Video_Viewport_Source *source) +{ + E_Client *ec = e_surface_ec_get(source->surface->surface); + E_Comp_Wl_Buffer_Viewport *vp; + E_Comp_Wl_Client_Data *cdata; + int x1, y1, x2, y2, x, y; + + e_view_client_map_update(e_client_view_get(ec)); + + e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y); + e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), x, y); + + cdata = ec->comp_data; + if (!cdata->viewport_transform) + { + cdata->viewport_transform = e_util_transform_new(); + e_util_transform_role_set(cdata->viewport_transform, "viewport_transform"); + e_client_transform_core_add(ec, cdata->viewport_transform); + } + + e_util_transform_viewport_set(cdata->viewport_transform, x, y, + ec->comp_data->width_from_viewport, + ec->comp_data->height_from_viewport); + + vp = &cdata->scaler.buffer_viewport; + if (vp->buffer.src_width == wl_fixed_from_int(-1)) + { + x1 = 0; + y1 = 0; + x2 = cdata->width_from_buffer; + y2 = cdata->height_from_buffer; + } + else + { + x1 = wl_fixed_to_int(vp->buffer.src_x); + y1 = wl_fixed_to_int(vp->buffer.src_y); + x2 = wl_fixed_to_int(vp->buffer.src_x + vp->buffer.src_width); + y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height); + } + + e_util_transform_texcoord_set(cdata->viewport_transform, 0, x1, y1); + e_util_transform_texcoord_set(cdata->viewport_transform, 1, x2, y1); + e_util_transform_texcoord_set(cdata->viewport_transform, 2, x2, y2); + e_util_transform_texcoord_set(cdata->viewport_transform, 3, x1, y2); + + VS_INF("SOURCE %p| Update viewport: source(%d,%d %dx%d) destination(%d,%d %dx%d)", + source, x1, y1, (x2 - x1), (y2 - y1), + ec->x, ec->y, ec->comp_data->width_from_viewport, ec->comp_data->height_from_viewport); +} + +static void +_source_rotation_update(E_Video_Viewport_Source *source) { E_Video_Viewport *viewport = source->viewport; E_Client *ec = e_surface_ec_get(source->surface->surface); @@ -1009,7 +1060,6 @@ _source_viewport_transform_update(E_Video_Viewport_Source *source) e_client_transform_core_remove(ec, source->transform); e_util_transform_del(source->transform); source->transform = NULL; - goto end; } return; } @@ -1070,69 +1120,25 @@ _source_viewport_transform_update(E_Video_Viewport_Source *source) assert(0); } -end: - e_client_transform_core_update(ec); + VS_INF("SOURCE %p| Update rotation: %s", source, _viewport_transform_to_str(viewport->current.transform)); } static void -_source_viewport_apply(E_Video_Viewport_Source *source) +_source_transform_update(E_Video_Viewport_Source *source) { E_Client *ec = e_surface_ec_get(source->surface->surface); - E_Comp_Wl_Buffer_Viewport *vp; - E_Comp_Wl_Client_Data *cdata; - int x1, y1, x2, y2, x, y; + E_Desk *desk; Eina_Bool zoom_animating = EINA_FALSE; e_comp_wl_map_size_cal_from_viewport(ec); - // FIXME: This code is copied from e_comp_wl_map_apply() - e_view_client_map_update(e_client_view_get(ec)); - - e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y); - e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), x, y); - - cdata = ec->comp_data; - if (!cdata->viewport_transform) - { - cdata->viewport_transform = e_util_transform_new(); - e_util_transform_role_set(cdata->viewport_transform, "viewport_transform"); - e_client_transform_core_add(ec, cdata->viewport_transform); - } - - e_util_transform_viewport_set(cdata->viewport_transform, x, y, - ec->comp_data->width_from_viewport, - ec->comp_data->height_from_viewport); + _source_viewport_update(source); + _source_rotation_update(source); - vp = &cdata->scaler.buffer_viewport; - if (vp->buffer.src_width == wl_fixed_from_int(-1)) - { - x1 = 0; - y1 = 0; - x2 = cdata->width_from_buffer; - y2 = cdata->height_from_buffer; - } - else - { - x1 = wl_fixed_to_int(vp->buffer.src_x); - y1 = wl_fixed_to_int(vp->buffer.src_y); - x2 = wl_fixed_to_int(vp->buffer.src_x + vp->buffer.src_width); - y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height); - } - - e_util_transform_texcoord_set(cdata->viewport_transform, 0, x1, y1); - e_util_transform_texcoord_set(cdata->viewport_transform, 1, x2, y1); - e_util_transform_texcoord_set(cdata->viewport_transform, 2, x2, y2); - e_util_transform_texcoord_set(cdata->viewport_transform, 3, x1, y2); - - E_Desk *desk; desk = e_comp_desk_find_by_ec(ec); if (desk) zoom_animating = e_desk_zoom_is_animating(desk); - ELOGF("TRANSFORM", "viewport map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d), zoom_animating: %d", - ec, ec->x, ec->y, ec->comp_data->width_from_viewport, - ec->comp_data->height_from_viewport, x1, y1, x2, y1, x2, y2, x1, y2, zoom_animating); - /* workaround:: when the desk zoom is doing their animation, the transform core update can override animation's zoom boundary. so, don't doing transform core update while desk zoom animation */ @@ -1164,7 +1170,6 @@ static void _source_cb_surface_commit(struct wl_listener *listener, void *data) { E_Video_Viewport_Source *source = wl_container_of(listener, source, surface_commit); - Eina_Bool need_apply = EINA_FALSE; source->current = source->pending; source->pending.committed = E_VIDEO_VIEWPORT_SOURCE_STATE_CLEAN; @@ -1176,22 +1181,14 @@ _source_cb_surface_commit(struct wl_listener *listener, void *data) _source_map_state_update(source); if (source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_SOURCE_REGION) - { - _source_viewport_source_box_update(source); - need_apply = EINA_TRUE; - } + _source_viewport_source_box_update(source); if (source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO) - { - _source_viewport_destination_update(source); - need_apply = EINA_TRUE; - } + _source_destination_update(source); - if (need_apply) - { - _source_viewport_apply(source); - _source_viewport_transform_update(source); - } + if ((source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_SOURCE_REGION) || + (source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO)) + _source_transform_update(source); } static const char * @@ -1334,9 +1331,8 @@ _source_viewport_link(E_Video_Viewport_Source *source, E_Video_Viewport *viewpor if (source->surface->stand_alone) source->base.stand_alone = EINA_TRUE; - _source_viewport_destination_update(source); - _source_viewport_apply(source); - _source_viewport_transform_update(source); + _source_destination_update(source); + _source_transform_update(source); return EINA_TRUE; } @@ -1355,21 +1351,14 @@ static void _source_viewport_committed(E_Video_Viewport_Source *source) { E_Video_Viewport_State *state = &source->viewport->current; - Eina_Bool need_transform = EINA_FALSE; VS_DBG("SOURCE %p| viewport committed", source); if (state->committed & E_VIDEO_VIEWPORT_STATE_DESTINATION || state->committed & E_VIDEO_VIEWPORT_STATE_TRANSFORM) { - _source_viewport_destination_update(source); - _source_viewport_apply(source); - need_transform = EINA_TRUE; - } - - if (need_transform || (state->committed & E_VIDEO_VIEWPORT_STATE_TRANSFORM)) - { - _source_viewport_transform_update(source); + _source_destination_update(source); + _source_transform_update(source); } } @@ -1992,12 +1981,67 @@ _e_video_shell_transform_to_wtz(E_Video_Shell_Transform e_transform) return wtz_transform; } +static void +_viewport_state_transform_set(E_Video_Viewport *viewport, enum wtz_video_exported_viewport_transform transform) +{ + if (viewport->current.transform == transform) + return; + + viewport->current.transform = transform; + viewport->current.committed |= E_VIDEO_VIEWPORT_STATE_TRANSFORM; + + if (!(viewport->pending.committed & E_VIDEO_VIEWPORT_STATE_TRANSFORM)) + viewport->pending.transform = transform; +} + +static void +_viewport_state_geometry_set(E_Video_Viewport *viewport, int x, int y, int width, int height) +{ + int sx, sy; + + e_subsurface_position_get(viewport->subsurface, &sx, &sy); + if (sx == x && sy == y && viewport->current.width == width && viewport->current.height == height) + return; + + e_subsurface_position_set(viewport->subsurface, x, y); + + viewport->current.width = width; + viewport->current.height = height; + viewport->current.committed |= E_VIDEO_VIEWPORT_STATE_DESTINATION; + + if (!(viewport->pending.committed & E_VIDEO_VIEWPORT_STATE_DESTINATION)) + { + viewport->pending.width = width; + viewport->pending.height = height; + } +} + +static void +_source_state_aspect_ratio_set(E_Video_Viewport_Source *source, int width, int height) +{ + if (width == -1 && height == -1) + source->current.has_aspect_ratio = EINA_FALSE; + else if (width > 0 && height > 0) + source->current.has_aspect_ratio = EINA_TRUE; + else + return; + + source->current.aspect_ratio.width = width; + source->current.aspect_ratio.height = height; + source->current.committed = E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO; + + if (!(source->pending.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO)) + { + source->pending.aspect_ratio.width = width; + source->pending.aspect_ratio.height = height; + } +} + EINTERN void e_video_shell_viewport_transform(const char *handle, E_Video_Shell_Transform transform, int x, int y, int width, int height, int ratio_width, int ratio_height) { E_Video_Shell *shell; E_Video_Viewport *viewport; - enum wtz_video_exported_viewport_transform wtz_transform; wl_list_for_each(shell, &shells, link) { @@ -2005,50 +2049,30 @@ e_video_shell_viewport_transform(const char *handle, E_Video_Shell_Transform tra if (!viewport) continue; - if (viewport->source && ratio_width != -2 && ratio_height != -2) - { - if ((ratio_width == -1 && ratio_height == -1) || - (ratio_width > 0 && ratio_height > 0)) - { - if (ratio_width == -1 && ratio_height == -1) - { - viewport->source->pending.has_aspect_ratio = EINA_FALSE; - } - else - { - viewport->source->pending.has_aspect_ratio = EINA_TRUE; - viewport->source->pending.aspect_ratio.width = ratio_width; - viewport->source->pending.aspect_ratio.height = ratio_height; - } - viewport->source->pending.committed |= E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO; - - viewport->source->current = viewport->source->pending; - viewport->source->pending.committed = E_VIDEO_VIEWPORT_SOURCE_STATE_CLEAN; - - _source_viewport_destination_update(viewport->source); - _source_viewport_apply(viewport->source); - _source_viewport_transform_update(viewport->source); - } - } + viewport->current.committed = E_VIDEO_VIEWPORT_STATE_CLEAN; - wtz_transform = _e_video_shell_transform_to_wtz(transform); - if (viewport->pending.transform != wtz_transform) - { - viewport->pending.committed |= E_VIDEO_VIEWPORT_STATE_TRANSFORM; - viewport->pending.transform = _e_video_shell_transform_to_wtz(transform); - } + _viewport_state_transform_set(viewport, _e_video_shell_transform_to_wtz(transform)); if (width != -1 && height != -1) + _viewport_state_geometry_set(viewport, x, y, width, height); + + if (viewport->source && ratio_width != -2 && ratio_height != -2) + _source_state_aspect_ratio_set(viewport->source, ratio_width, ratio_height); + + if (viewport->current.committed != E_VIDEO_VIEWPORT_STATE_CLEAN) { - e_subsurface_position_set(viewport->subsurface, x, y); + if (viewport->current.committed & E_VIDEO_VIEWPORT_STATE_DESTINATION) + _viewport_border_geometry_update(viewport); - viewport->pending.committed |= E_VIDEO_VIEWPORT_STATE_DESTINATION; - viewport->pending.width = width; - viewport->pending.height = height; + if (viewport->source) + _source_viewport_committed(viewport->source); + } + else if (viewport->source && viewport->source->current.committed != E_VIDEO_VIEWPORT_SOURCE_STATE_CLEAN) + { + if (viewport->source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO) + _source_destination_update(viewport->source); + _source_transform_update(viewport->source); } - - if (viewport->pending.committed != E_VIDEO_VIEWPORT_STATE_CLEAN) - _viewport_state_commit(viewport, &viewport->pending); break; }