video: Update comp object after cleanup HWC resources 91/252791/1 accepted/tizen/6.0/unified/hotfix/20210203.025640 submit/tizen_6.0_hotfix/20210202.094453
authorSeunghun Lee <shiin.lee@samsung.com>
Thu, 28 Jan 2021 07:18:29 +0000 (16:18 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Tue, 2 Feb 2021 08:38:21 +0000 (17:38 +0900)
It was discovered that abnormal frame was exposed when video render
backend got switch to SW compositing from HW due to the transformation
of 180 degree under no HW rotation support. This problem only occurred
on one frame at the very first try.

This change updates comp object (by calling e_comp_wl_surface_commit)
after cleanup HWC data. I couldn't figure out the root cause, but it
looked like HWC implementation affected updating efl object in some way.
Nonetheless, This change all makes sense on its own after all.

Change-Id: Ia99e5d626506d68128733b39b6f82cd763ee70c4

src/bin/video/e_client_video.c
src/bin/video/iface/e_video_hwc.c

index db789f2b9c0a6ceb2a269a1cd40c1e09cf7f7b66..2171f8793fc6ec6d94b1748be2823b69f70d980d 100644 (file)
@@ -58,6 +58,9 @@ _e_client_video_cb_hwc_render_fail(E_Client_Video *ecv)
         return;
      }
 
+   ecv->iface->destroy(ecv->iface);
+   ecv->iface = new_iface;
+
    /* workaround:
     * For redrawing compositor's canvas for video buffer. */
    buffer = e_pixmap_resource_get(ecv->ec->pixmap);
@@ -66,9 +69,6 @@ _e_client_video_cb_hwc_render_fail(E_Client_Video *ecv)
         buffer->type = E_COMP_WL_BUFFER_TYPE_TBM;
         e_comp_wl_surface_commit(ecv->ec);
      }
-
-   ecv->iface->destroy(ecv->iface);
-   ecv->iface = new_iface;
 }
 
 static Eina_Bool
index dfc3f8184b8619a8b864659d7d9c491d1ae0adbb..d554049db6874e882e73127c23d0e220aa19a5cf 100644 (file)
@@ -23,7 +23,6 @@
 static Eina_Bool _e_video_hwc_render(E_Video_Hwc *evh, const char *func);
 static void _e_video_hwc_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf, unsigned int transform);
 static void _e_video_hwc_buffer_commit(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf);
-static void _e_video_hwc_del(E_Video_Hwc *evh);
 
 static void
 _coord_move_to_axis(int x_axis, int y_axis, int *ox, int *oy)
@@ -1195,7 +1194,7 @@ _e_video_hwc_render_job(void *data)
         if (evh->deleted)
           {
              VIN("Delete HWC interface", evh->ec);
-             _e_video_hwc_del(evh);
+             evh->backend.destroy(evh);
           }
      }
 }
@@ -1778,11 +1777,13 @@ _e_video_hwc_client_event_deinit(E_Video_Hwc *evh)
 }
 
 static void
-_e_video_hwc_del(E_Video_Hwc *evh)
+_e_video_hwc_iface_destroy(E_Video_Comp_Iface *iface)
 {
    E_Comp_Wl_Video_Buf *vbuf;
    Eina_List *l = NULL, *ll = NULL;
 
+   IFACE_ENTRY;
+
    _e_video_hwc_hide(evh);
 
    EINA_LIST_FOREACH_SAFE(evh->input_buffer_list, l, ll, vbuf)
@@ -1812,21 +1813,13 @@ _e_video_hwc_del(E_Video_Hwc *evh)
 
    E_FREE_FUNC(evh->render.job, ecore_job_del);
 
-   evh->backend.destroy(evh);
-}
-
-static void
-_e_video_hwc_iface_destroy(E_Video_Comp_Iface *iface)
-{
-   IFACE_ENTRY;
-
    if (evh->render_fail.walking)
      {
         evh->deleted = EINA_TRUE;
         return;
      }
 
-   _e_video_hwc_del(evh);
+   evh->backend.destroy(evh);
 }
 
 static Eina_Bool