video: 'E_Video_Hwc' handles event of evas show for HWC mode. 98/204498/1
authorSeunghun Lee <shiin.lee@samsung.com>
Mon, 15 Apr 2019 09:42:13 +0000 (18:42 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Wed, 24 Apr 2019 06:33:45 +0000 (15:33 +0900)
Change-Id: I0377b626a43c1a28ec9d1f7eb9272865c74ebe0e

src/bin/video/iface/e_video_hwc.c
src/bin/video/iface/e_video_hwc.h
src/bin/video/iface/e_video_hwc_planes.c
src/bin/video/iface/e_video_hwc_windows.c

index f301e5df9a440afe74f763efda67dbe765912b7b..2c898989ccb53b3009eb4e79ef1aa85cbd8fcbf1 100644 (file)
@@ -1465,9 +1465,69 @@ _e_video_hwc_create(E_Client *ec)
    return evh;
 }
 
+static void
+_e_video_hwc_show(E_Video_Hwc *evh)
+{
+   E_Client *ec;
+
+   ec = evh->ec;
+   if (e_object_is_del(E_OBJECT(ec)))
+     return;
+
+   if (evh->need_force_render)
+     {
+        VIN("video forcely rendering..", evh->ec);
+        _e_video_hwc_render(evh, __FUNCTION__);
+     }
+
+   /* if stand_alone is true, not show */
+   if ((ec->comp_data->sub.data && ec->comp_data->sub.data->stand_alone) ||
+       (ec->comp_data->sub.data && evh->follow_topmost_visibility))
+     {
+#if 0 //mute off is managed by client. mute off in server made many issues.
+        if (!evhp->layer) return;
+
+        if (evhp->tdm_mute_id != -1)
+          {
+             Tdm_Prop_Value prop = {.id = evhp->tdm_mute_id, .value.u32 = 0};
+             VIN("video surface show. mute off (ec:%p)", evhp->ec);
+             _e_video_layer_set_property(evhp->layer, &prop);
+          }
+#endif
+        return;
+     }
+
+   /* FIXME It seems unnecessary. */
+   if (evh->hwc_policy == E_HWC_POLICY_PLANES)
+     {
+        if (!e_video_hwc_planes_properties_commit(evh))
+          return;
+     }
+
+   VIN("evas show", evh->ec);
+   if (evh->current_fb)
+     {
+        if (evh->hwc_policy == E_HWC_POLICY_PLANES)
+          e_video_hwc_planes_buffer_show(evh, evh->current_fb, evh->current_fb->content_t);
+        else
+          e_video_hwc_windows_buffer_show(evh, evh->current_fb, evh->current_fb->content_t);
+     }
+}
+
+static void
+_e_video_hwc_cb_evas_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   E_Video_Hwc *evh;
+
+   evh = data;
+   _e_video_hwc_show(evh);
+}
+
 static void
 _e_video_hwc_client_event_init(E_Video_Hwc *evh)
 {
+   evas_object_event_callback_add(evh->ec->frame, EVAS_CALLBACK_SHOW,
+                                  _e_video_hwc_cb_evas_show, evh);
    E_LIST_HANDLER_APPEND(evh->ec_event_handler, E_EVENT_CLIENT_SHOW,
                          _e_video_hwc_cb_client_show, evh);
    E_LIST_HANDLER_APPEND(evh->ec_event_handler, E_EVENT_CLIENT_BUFFER_CHANGE,
@@ -1572,3 +1632,9 @@ e_video_hwc_commit_done(E_Video_Hwc *evh)
 {
    return _e_video_hwc_current_fb_update(evh);
 }
+
+EINTERN void
+e_video_hwc_show(E_Video_Hwc *evh)
+{
+   _e_video_hwc_show(evh);
+}
index 18f1958240a330d5f57876055d2b87112185388e..4afb6761628507c604123b7be3ebb7f7c3b34460 100644 (file)
@@ -84,6 +84,7 @@ EINTERN Eina_Bool    e_video_hwc_planes_init(E_Video_Hwc *evh);
 EINTERN void         e_video_hwc_planes_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf, unsigned int transform);
 EINTERN Eina_Bool    e_video_hwc_planes_frame_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf);
 EINTERN Eina_Bool    e_video_hwc_planes_check_if_pp_needed(E_Video_Hwc *evh);
+EINTERN Eina_Bool    e_video_hwc_planes_properties_commit(E_Video_Hwc *evh);
 EINTERN tbm_surface_h   e_video_hwc_planes_displaying_buffer_get(E_Video_Hwc *evh);
 
 EINTERN E_Video_Hwc *e_video_hwc_windows_create(void);
@@ -93,6 +94,7 @@ EINTERN Eina_Bool    e_video_hwc_windows_frame_buffer_show(E_Video_Hwc *evh, E_C
 EINTERN Eina_Bool    e_video_hwc_windows_check_if_pp_needed(E_Video_Hwc *evh);
 EINTERN tbm_surface_h   e_video_hwc_windows_displaying_buffer_get(E_Video_Hwc *evh);
 
+EINTERN void         e_video_hwc_show(E_Video_Hwc *evh);
 EINTERN void         e_video_hwc_render(E_Video_Hwc *evh, const char *func);
 EINTERN Eina_Bool    e_video_hwc_can_commit(E_Video_Hwc *evh);
 EINTERN Eina_Bool    e_video_hwc_commit_done(E_Video_Hwc *evh);
index 83bd9ef2473dec6d0e8612075d5ae1c35fd9e7a6..736cc13c83d60eadbf621412f31d88b19f8e5484 100644 (file)
@@ -554,60 +554,6 @@ e_video_hwc_planes_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf, unsi
    _e_video_buffer_show(evhp, vbuf, transform);
 }
 
-static void
-_e_video_cb_evas_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
-{
-   E_Video_Hwc_Planes *evhp = data;
-
-   if (e_object_is_del(E_OBJECT(evhp->base.ec))) return;
-
-   if (evhp->base.need_force_render)
-     {
-        VIN("video forcely rendering..", evhp->base.ec);
-        e_video_hwc_render((E_Video_Hwc *)evhp, __FUNCTION__);
-     }
-
-   /* if stand_alone is true, not show */
-   if ((evhp->base.ec->comp_data->sub.data && evhp->base.ec->comp_data->sub.data->stand_alone) ||
-       (evhp->base.ec->comp_data->sub.data && evhp->base.follow_topmost_visibility))
-     {
-#if 0 //mute off is managed by client. mute off in server made many issues.
-        if (!evhp->layer) return;
-
-        if (evhp->tdm_mute_id != -1)
-          {
-             Tdm_Prop_Value prop = {.id = evhp->tdm_mute_id, .value.u32 = 0};
-             VIN("video surface show. mute off (ec:%p)", evhp->ec);
-             _e_video_layer_set_property(evhp->layer, &prop);
-          }
-#endif
-        return;
-     }
-
-   if (!evhp->layer)
-     {
-        VIN("set layer: show", evhp->base.ec);
-        if (!_e_video_set_layer(evhp))
-          {
-             VER("set layer failed", evhp->base.ec);
-             return;
-          }
-        // need call tdm property in list
-        Tdm_Prop_Value *prop;
-        EINA_LIST_FREE(evhp->tdm_prop_list, prop)
-          {
-             VIN("call property(%s), value(%d)", evhp->base.ec,
-                 prop->name, (unsigned int)prop->value.u32);
-             _e_video_layer_set_property(evhp->layer, prop);
-             free(prop);
-          }
-     }
-
-   VIN("evas show", evhp->base.ec);
-   if (evhp->base.current_fb)
-     _e_video_buffer_show(evhp, evhp->base.current_fb, evhp->base.current_fb->content_t);
-}
-
 static void
 _e_video_cb_evas_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
@@ -838,7 +784,7 @@ _e_video_cb_ec_visibility_change(void *data, int type, void *event)
          _e_video_cb_evas_hide(evhp, NULL, NULL, NULL);
          break;
       case E_VISIBILITY_UNOBSCURED:
-         _e_video_cb_evas_show(evhp, NULL, NULL, NULL);
+         e_video_hwc_show((E_Video_Hwc *)evhp);
          break;
       default:
          VER("Not implemented", evhp->base.ec);
@@ -879,7 +825,7 @@ _e_video_cb_topmost_ec_visibility_change(void *data, int type, void *event)
               break;
            case E_VISIBILITY_UNOBSCURED:
               VIN("follow_topmost_visibility: UNOBSCURED", ec);
-              _e_video_cb_evas_show(evhp, NULL, NULL, NULL);
+              e_video_hwc_show((E_Video_Hwc *)evhp);
               break;
            default:
               return ECORE_CALLBACK_PASS_ON;
@@ -1037,8 +983,6 @@ _e_video_hwc_planes_ec_event_deinit(E_Video_Hwc_Planes *evhp)
 
    ec = evhp->base.ec;
 
-   evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_SHOW,
-                                       _e_video_cb_evas_show, evhp);
    evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_HIDE,
                                        _e_video_cb_evas_hide, evhp);
 
@@ -1156,8 +1100,6 @@ _e_video_hwc_planes_ec_event_init(E_Video_Hwc_Planes *evhp)
 
    ec = evhp->base.ec;
 
-   evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW,
-                                  _e_video_cb_evas_show, evhp);
    evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_HIDE,
                                   _e_video_cb_evas_hide, evhp);
 
@@ -1304,3 +1246,31 @@ e_video_hwc_planes_init(E_Video_Hwc *evh)
 
    return EINA_TRUE;
 }
+
+EINTERN Eina_Bool
+e_video_hwc_planes_properties_commit(E_Video_Hwc *evh)
+{
+   E_Video_Hwc_Planes *evhp;
+
+   evhp = (E_Video_Hwc_Planes *)evh;
+   if (!evhp->layer)
+     {
+        VIN("set layer: show", evhp->base.ec);
+        if (!_e_video_set_layer(evhp))
+          {
+             VER("set layer failed", evhp->base.ec);
+             return EINA_FALSE;
+          }
+        // need call tdm property in list
+        Tdm_Prop_Value *prop;
+        EINA_LIST_FREE(evhp->tdm_prop_list, prop)
+          {
+             VIN("call property(%s), value(%d)", evhp->base.ec,
+                 prop->name, (unsigned int)prop->value.u32);
+             _e_video_layer_set_property(evhp->layer, prop);
+             free(prop);
+          }
+     }
+
+   return EINA_TRUE;
+}
index f8f1c3b2caa0d5388766b633962aa66dfc21bd6f..925207529ecddfecef53f8791c4f11978ff1a6de 100644 (file)
@@ -207,34 +207,6 @@ e_video_hwc_windows_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf, uns
    _e_video_buffer_show(evhw, vbuf, transform);
 }
 
-static void
-_e_video_cb_evas_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
-{
-   E_Video_Hwc_Windows *evhw = data;
-
-   if (e_object_is_del(E_OBJECT(evhw->base.ec))) return;
-
-   if (!evhw->base.ec->comp_data->video_client)
-     return;
-
-   if (evhw->base.need_force_render)
-     {
-        VIN("video forcely rendering..", evhw->base.ec);
-        e_video_hwc_render((E_Video_Hwc *)evhw, __FUNCTION__);
-     }
-
-   /* if stand_alone is true, not show */
-   if ((evhw->base.ec->comp_data->sub.data && evhw->base.ec->comp_data->sub.data->stand_alone) ||
-       (evhw->base.ec->comp_data->sub.data && evhw->base.follow_topmost_visibility))
-     {
-        return;
-     }
-
-   VIN("evas show", evhw->base.ec);
-   if (evhw->base.current_fb)
-     _e_video_buffer_show(evhw, evhw->base.current_fb, evhw->base.current_fb->content_t);
-}
-
 static Eina_Bool
 _e_video_hwc_windows_init(E_Video_Hwc_Windows *evhw)
 {
@@ -423,13 +395,6 @@ end:
 static void
 _e_video_hwc_windows_ec_event_deinit(E_Video_Hwc_Windows *evhw)
 {
-   E_Client *ec;
-
-   ec = evhw->base.ec;
-
-   evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_SHOW,
-                                       _e_video_cb_evas_show, evhw);
-
    E_FREE_FUNC(evhw->hook_subsurf_create, e_comp_wl_hook_del);
    E_FREE_LIST(evhw->base.ec_event_handler, ecore_event_handler_del);
 }
@@ -482,13 +447,6 @@ _e_video_hwc_windows_cb_hook_subsurface_create(void *data, E_Client *ec)
 static void
 _e_video_hwc_windows_ec_event_init(E_Video_Hwc_Windows *evhw)
 {
-   E_Client *ec;
-
-   ec = evhw->base.ec;
-
-   evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW,
-                                  _e_video_cb_evas_show, evhw);
-
    evhw->hook_subsurf_create =
       e_comp_wl_hook_add(E_COMP_WL_HOOK_SUBSURFACE_CREATE,
                          _e_video_hwc_windows_cb_hook_subsurface_create, evhw);