e_output: Change stream capture vblank method 04/263304/2 accepted/tizen/unified/20210903.083034 submit/tizen/20210902.045853
authorJunkyeong, Kim <jk0430.kim@samsung.com>
Tue, 31 Aug 2021 07:40:18 +0000 (16:40 +0900)
committerJunkyeong, Kim <jk0430.kim@samsung.com>
Thu, 2 Sep 2021 02:26:35 +0000 (11:26 +0900)
If tdm backend not support stream capture,
enlightenment use vblank and pixman to support stream capture.
But if tdm support one shot capture, use tdm capture instead pixman for stream capture.

Change-Id: Ifb908c36256a07d598f3281f32bc9401c5cd6327
Signed-off-by: Junkyeong, Kim <jk0430.kim@samsung.com>
src/bin/e_output.c

index a0f0e1e..39512d8 100644 (file)
@@ -1581,6 +1581,28 @@ _e_output_watch_vblank(E_Output *output)
 }
 
 static void
+_e_output_capture_oneshot_cb(E_Output *output, tbm_surface_h tsurface, void *user_data)
+{
+   E_Output_Capture *cdata = (E_Output_Capture *)user_data;
+
+   EINA_SAFETY_ON_NULL_RETURN(cdata);
+
+   tbm_surface_internal_unref(cdata->surface);
+
+   cdata->func(output, cdata->surface, cdata->data);
+
+   E_FREE(cdata);
+
+   /* timer is a substitution for vblank during dpms off. so if timer is running,
+   * we don't watch vblank events recursively.
+   */
+   if (!output->stream_capture.timer)
+     _e_output_watch_vblank(output);
+
+//   DBG("_e_output_capture_oneshot_cb done");
+}
+
+static void
 _e_output_vblank_handler(tdm_output *toutput, unsigned int sequence,
                          unsigned int tv_sec, unsigned int tv_usec, void *data)
 {
@@ -1588,6 +1610,7 @@ _e_output_vblank_handler(tdm_output *toutput, unsigned int sequence,
    E_Output_Capture *cdata = NULL;
    Eina_List *l;
    Eina_Bool ret = EINA_FALSE;
+   tdm_capture *tcapture = NULL;
 
    EINA_SAFETY_ON_NULL_RETURN(output);
 
@@ -1623,21 +1646,42 @@ _e_output_vblank_handler(tdm_output *toutput, unsigned int sequence,
 
    output->stream_capture.data = eina_list_remove(output->stream_capture.data, cdata);
 
-   ret = _e_output_capture(output, cdata->surface, output->stream_capture.auto_rotate);
-   if (ret == EINA_FALSE)
-     EOERR("capture fail", output);
+   tcapture = _e_output_tdm_capture_create(output, TDM_CAPTURE_CAPABILITY_ONESHOT);
+   if (tcapture)
+     {
+        ret = _e_output_tdm_capture_info_set(output, tcapture, cdata->surface, TDM_CAPTURE_TYPE_ONESHOT, output->stream_capture.auto_rotate);
+        if (ret == EINA_FALSE)
+          {
+             EOERR("capture set info fail", output);
+             tdm_capture_destroy(tcapture);
+             return;
+          }
 
-   tbm_surface_internal_unref(cdata->surface);
+        ret = _e_output_tdm_capture(output, tcapture, cdata->surface, _e_output_capture_oneshot_cb, cdata);
+        if (ret == EINA_FALSE)
+          {
+             EOERR("capture fail", output);
+             tdm_capture_destroy(tcapture);
+          }
+     }
+   else
+     {
+        ret = _e_output_capture(output, cdata->surface, output->stream_capture.auto_rotate);
+        if (ret == EINA_FALSE)
+          EOERR("capture fail", output);
 
-   cdata->func(output, cdata->surface, cdata->data);
+        tbm_surface_internal_unref(cdata->surface);
 
-   E_FREE(cdata);
+        cdata->func(output, cdata->surface, cdata->data);
 
-   /* timer is a substitution for vblank during dpms off. so if timer is running,
-    * we don't watch vblank events recursively.
-    */
-   if (!output->stream_capture.timer)
-     _e_output_watch_vblank(output);
+        E_FREE(cdata);
+
+        /* timer is a substitution for vblank during dpms off. so if timer is running,
+         * we don't watch vblank events recursively.
+         */
+        if (!output->stream_capture.timer)
+          _e_output_watch_vblank(output);
+     }
 }
 
 static Eina_Bool