Optimized surface sharing between gstreamer(-vaapi) and a openGL-application on INTEL ATOM GPUs?

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Optimized surface sharing between gstreamer(-vaapi) and a openGL-application on INTEL ATOM GPUs?

Sebastian Stelmasik

Hi there!

We are developing a Digital Signage application on basis of gstreamer(-vaapi) and info-beamer (https://info-beamer.com/opensource). Until now we were using (cheap) AMD devices where we use glx-pixmaps for surface sharing between gstreamer and info-beamer which works quite perfect (no mem copy at all).

Now we have to switch to INTEL devices as there are no cheap (and compatible with the former open souce driver) AMD devices and now we are expiriencing framedrop issues in surface sharing between gstreamer(-vaapi) and info-beamer on INTEL ATOM Z8300 devices (which should be a lot faster than the AMD E-350 we have been using before). As I said before we use glx-pixmaps for surface sharing which works perfect on AMD-GPUs. But now there seems to be a lot of in mem copy which couses a lot of framedrops.

Is there a optimized way/pipeline for INTEL ATOM GPUs?

Or any other issue we didn't think about while switching from AMD to INTEL GPUs?

Best regards and thanks in advance!

Sebastian Stelmasik

-- 

IT- & Websolutions Stelmasik
Dipl. Informatiker
Sebastian Stelmasik

Naatlandstr. 2
45143 Essen

Phone:  +49-201-6177151
Fax:    +49-201-6177152
Mobile: +49-172-2415963

---

Die Information in dieser e-mail ist vertraulich und exklusiv fuer den Adressatenkreis bestimmt. Weiterleitung oder Kopieren, auch auszugsweise, darf nur mit ausdruecklicher Einwilligung von IT- & Websolutions Stelmasik erfolgen. In jedem Fall ist sicherzustellen, dass keinerlei inhaltliche Veraenderungen erfolgen. IT- & Websolutions Stelmasik uebernimmt keine Haftung fuer die Richtigkeit der Information in dieser e-mail noch fuer Handlungen, die auf ihrer Grundlage erfolgen.

The information provided in this e-mail is confidential and is for the sole use of the recipient. It may not be disclosed, copied or distributed in any form without the obtained permission of IT- & Websolutions Stelmasik and to the extent that it is passed on care must be taken to ensure that this is in a form which accurately reflects the information presented here. No responsibility can be accepted by  IT- & Websolutions Stelmasik for the correctness of the information provided in this e-mail nor for any action on its basis. 

_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: Optimized surface sharing between gstreamer(-vaapi) and a openGL-application on INTEL ATOM GPUs?

Victor Jaquez
Hi,

On Mon, 05 Feb 2018 at 13:39, Sebastian Stelmasik wrote:

> Hi there!
>
> We are developing a Digital Signage application on basis of
> gstreamer(-vaapi) and info-beamer (https://info-beamer.com/opensource).
> Until now we were using (cheap) AMD devices where we use glx-pixmaps for
> surface sharing between gstreamer and info-beamer which works quite perfect
> (no mem copy at all).
>
> Now we have to switch to INTEL devices as there are no cheap (and compatible
> with the former open souce driver) AMD devices and now we are expiriencing
> framedrop issues in surface sharing between gstreamer(-vaapi) and
> info-beamer on INTEL ATOM Z8300 devices (which should be a lot faster than
> the AMD E-350 we have been using before). As I said before we use
> glx-pixmaps for surface sharing which works perfect on AMD-GPUs. But now
> there seems to be a lot of in mem copy which couses a lot of framedrops.
>
> Is there a optimized way/pipeline for INTEL ATOM GPUs?

Which video sink are you using in the application?

Which version of gstreamer?

I guess, in your AMD box, you are in a GLX environment and the sink negotiates
GLUploadTextureMeta, which isn't absolutely mem copy free, and it is going to be
deprecated soon.

A possibility could be to switch to EGL and the sink could import dmabuf, using,
perhaps, glupload, and no mem copy is involved.

The other option, would be, of course, embedded vaapisink, negotiating the
memory:VASurface feature.

vmjl


>
> Or any other issue we didn't think about while switching from AMD to INTEL
> GPUs?
>
> Best regards and thanks in advance!
>
> Sebastian Stelmasik

> _______________________________________________
> gstreamer-devel mailing list
> [hidden email]
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: Optimized surface sharing between gstreamer(-vaapi) and a openGL-application on INTEL ATOM GPUs?

Sebastian Stelmasik
Hi Victor,
thanks for Your fast answer! Regarding Your questions:

- we are using vaapisink
- gstreamer version 1.6.3, but we have the same issues with current gstreamer 1.12.4

Here are our basic functions:

----- video_load ---
int video_load(lua_State *L, const char *path, const char *name) {

    Window rootwin;
    XWindowAttributes wattr;
    GLint *attr;
    int n_fbconfig_attrs;
    const gchar *platform;
    memset(&video, 0, sizeof(video_t));

    video.x11_display = glXGetCurrentDisplay();
    screen = DefaultScreen (video.x11_display);
    //video.x11_window = (Window) RootWindow (video.x11_display, screen);
    video.x11_window = (Window) glXGetCurrentDrawable();
    XSynchronize (video.x11_display, True);
    platform = "glx";

    char dir[256], uri[256] = "file:///";
    getcwd(dir, sizeof(uri));
    strcat(uri, dir);
    strcat(uri, "/");
    strcat(uri, path);

    if (!gst_video_init) {

    src = gst_element_factory_make ("playbin", NULL);

    sink = gst_element_factory_make ("vaapisink", NULL);
    g_object_set (sink, "signal-handoffs", TRUE, NULL);
    handoff_id = g_signal_connect (G_OBJECT (sink), "handoff",
            G_CALLBACK (on_client_draw), &video);
    //g_object_set (video.sink, "display", 1, NULL); //1 is x11
    g_object_set (G_OBJECT(src), "video-sink", sink, NULL);

    //bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
    //gst_bus_add_signal_watch (video.bus);
    //gst_bus_enable_sync_message_emission (bus);
    //g_signal_connect (video.bus, "message", G_CALLBACK (sync_bus_call), &video);
    //g_signal_connect (bus, "sync-message", G_CALLBACK (sync_bus_call), &video);
    //gst_object_unref (bus);


    GstPad *sinkpad =  gst_element_get_static_pad (sink, "sink");
    gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
      (GstPadProbeCallback) playout_item_pad_probe_event, &video, NULL);
    gst_object_unref (sinkpad);
    }
    g_object_set (src, "uri", uri, NULL);

    video.eos = FALSE;

    if (!video_open(&video, path))
        return luaL_error(L, "cannot open video %s", path);

    glGenTextures(1, &video.tex);
    glBindTexture(GL_TEXTURE_2D, video.tex);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexImage2D(
            GL_TEXTURE_2D,  
            0,
            GL_BGRA, 
            video.width,
            video.height,
            0,
            GL_BGRA,
            GL_UNSIGNED_BYTE,
            NULL 
            );

    /* Initialize FBConfig attributes */
    static GLint fbconfig_attrs[] = {
    //values from MPV
        GLX_BIND_TO_TEXTURE_RGBA_EXT, True,
        GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
        GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT,
        GLX_Y_INVERTED_EXT, True,
        GLX_DOUBLEBUFFER, False,
        GLX_RED_SIZE, 8,
        GLX_GREEN_SIZE, 8,
        GLX_BLUE_SIZE, 8,
        GLX_ALPHA_SIZE, 0,
        None
    };

    video.fb_config = glXChooseFBConfig (video.x11_display, screen,
          fbconfig_attrs,
          &n_fbconfig_attrs);

    if (!video.fb_config) {
      fprintf (stderr, "FBCONFIG failed\n");
      exit(0);
    }

    video.pixmap = XCreatePixmap (video.x11_display,
                        video.x11_window,
                        video.width, video.height, 32);//wattr.depth);

    int pixmap_attrs[10] = {
    //Values from MPV
        GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
        GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT,
        GLX_MIPMAP_TEXTURE_EXT, False,
        None,
    };
    
    video.glx_pixmap = glXCreatePixmap (video.x11_display, video.fb_config[0],
      video.pixmap, pixmap_attrs );
    video.surface_present = 0;

    glx_bind_tex_image = (PFNGLXBINDTEXIMAGEEXTPROC)
      glXGetProcAddress ("glXBindTexImageEXT");
    glx_release_tex_image = (PFNGLXRELEASETEXIMAGEEXTPROC)
      glXGetProcAddress ("glXReleaseTexImageEXT");

    g_return_val_if_fail (GST_IS_VIDEO_OVERLAY (sink), NULL);
    video_overlay = GST_VIDEO_OVERLAY (sink);
    gst_video_overlay_set_window_handle (video_overlay, (guintptr) video.x11_window);

    if (gst_video_init) {
      //gint64 position;  
      //gst_element_query_position (src, GST_FORMAT_TIME, &position);
      handoff_id = g_signal_connect (G_OBJECT (sink), "handoff",
            G_CALLBACK (on_client_draw), &video);
      gst_element_set_state (src, GST_STATE_PLAYING);

      /*if (!gst_element_seek_simple (src, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
              position)) {
	 fprintf (stderr,"Seek failed set pos 0 manually\n");
	 gst_element_seek_simple (src, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,0);
	}*/

    }
    else {
    //g_return_val_if_fail (GST_IS_VIDEO_OVERLAY (sink), NULL);
    //video_overlay = GST_VIDEO_OVERLAY (sink);
    //gst_video_overlay_set_window_handle (video_overlay, (guintptr) video.x11_window);
      gst_element_set_state (GST_ELEMENT (src), GST_STATE_PLAYING);
      gst_video_init = 1;
    }

    /*g_return_val_if_fail (GST_IS_VIDEO_OVERLAY (video.sink), NULL);
    video.video_overlay = GST_VIDEO_OVERLAY (video.sink);
    gst_video_overlay_set_window_handle (video.video_overlay,
      (guintptr) video.x11_window);

    gst_element_set_state (GST_ELEMENT (video.pipeline), GST_STATE_PLAYING);*/

    /* we save the current video in a global variable */
    check_video = push_video(L);
    *check_video = video;
    return 1;
}
----- on client draw ---

static gboolean
on_client_draw (GstElement * glsink, GstBuffer *buf,
    gpointer data)
{
    video_t *video = (video_t*) data;
    GstVideoInfo v_info;
    GstCaps *caps;
    GstVaapiSurface *surface;
    GstVaapiSurfaceProxy *proxy;
    GstVaapiDisplay *vaapi_display;
    VAStatus status;

    GstVaapiVideoMeta *meta = NULL;

    if (video->eos)
      return FALSE;

    meta = gst_buffer_get_vaapi_video_meta (buf);
    if (!meta)
      fprintf(stderr, "could not find vaapi meta in buffer!\n");

    if (video->buf) {
        video->old_buf = video->buf;
    }
    video->buf = buf;
    gst_buffer_ref (video->buf);

    proxy = gst_vaapi_video_meta_get_surface_proxy (meta);
    surface = gst_vaapi_surface_proxy_get_surface (proxy);
    vaapi_display = gst_vaapi_video_meta_get_display(meta);

    /* fprintf(stderr, "%s video %p buffer %p video tex: %u width %d height %d screen %d %d, display: %p %p \n",
        __func__, video, video->buf, video->tex,
        video->width, video->height,
        screen,
        gst_vaapi_display_x11_get_screen (vaapi_display),
        video->x11_display,
        gst_vaapi_display_x11_get_display (vaapi_display)
        ); */

    status = vaPutSurface (
      GST_VAAPI_DISPLAY_VADISPLAY (vaapi_display),
      GST_VAAPI_OBJECT_ID (surface), video->pixmap,
      0, 0, video->width, video->height,
      0, 0, video->width, video->height,
      NULL, 0, VA_FRAME_PICTURE | VA_SRC_BT709);
    //VA_SRC_BT709
    if (!video_vaapi_check_status (status, "vaPutSurface()")) {
      fprintf(stderr, "could not put VAAPI surface!\n");
     return FALSE;
    }

    if (!gst_vaapi_surface_sync (surface)) {
      fprintf(stderr, "could not sync VAAPI surface!\n");
    }
    video->surface_present = 1;

    if (check_video) {
        check_video->buf = video->buf;
        check_video->surface_present = video->surface_present;
    }

    if (video->old_buf) {
        gst_buffer_unref (video->old_buf);
    }


    return TRUE;
}

Any optimization welcome!
Thanks in advance!

Sebastian

Am 05.02.2018 um 16:09 schrieb Víctor Jáquez:
Hi,

On Mon, 05 Feb 2018 at 13:39, Sebastian Stelmasik wrote:
Hi there!

We are developing a Digital Signage application on basis of
gstreamer(-vaapi) and info-beamer (https://info-beamer.com/opensource).
Until now we were using (cheap) AMD devices where we use glx-pixmaps for
surface sharing between gstreamer and info-beamer which works quite perfect
(no mem copy at all).

Now we have to switch to INTEL devices as there are no cheap (and compatible
with the former open souce driver) AMD devices and now we are expiriencing
framedrop issues in surface sharing between gstreamer(-vaapi) and
info-beamer on INTEL ATOM Z8300 devices (which should be a lot faster than
the AMD E-350 we have been using before). As I said before we use
glx-pixmaps for surface sharing which works perfect on AMD-GPUs. But now
there seems to be a lot of in mem copy which couses a lot of framedrops.

Is there a optimized way/pipeline for INTEL ATOM GPUs?
Which video sink are you using in the application?

Which version of gstreamer?

I guess, in your AMD box, you are in a GLX environment and the sink negotiates
GLUploadTextureMeta, which isn't absolutely mem copy free, and it is going to be
deprecated soon.

A possibility could be to switch to EGL and the sink could import dmabuf, using,
perhaps, glupload, and no mem copy is involved.

The other option, would be, of course, embedded vaapisink, negotiating the
memory:VASurface feature.

vmjl


Or any other issue we didn't think about while switching from AMD to INTEL
GPUs?

Best regards and thanks in advance!

Sebastian Stelmasik

      
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


-- 

IT- & Websolutions Stelmasik
Dipl. Informatiker
Sebastian Stelmasik

Naatlandstr. 2
45143 Essen

Phone:  +49-201-6177151
Fax:    +49-201-6177152
Mobile: +49-172-2415963

---

Die Information in dieser e-mail ist vertraulich und exklusiv fuer den Adressatenkreis bestimmt. Weiterleitung oder Kopieren, auch auszugsweise, darf nur mit ausdruecklicher Einwilligung von IT- & Websolutions Stelmasik erfolgen. In jedem Fall ist sicherzustellen, dass keinerlei inhaltliche Veraenderungen erfolgen. IT- & Websolutions Stelmasik uebernimmt keine Haftung fuer die Richtigkeit der Information in dieser e-mail noch fuer Handlungen, die auf ihrer Grundlage erfolgen.

The information provided in this e-mail is confidential and is for the sole use of the recipient. It may not be disclosed, copied or distributed in any form without the obtained permission of IT- & Websolutions Stelmasik and to the extent that it is passed on care must be taken to ensure that this is in a form which accurately reflects the information presented here. No responsibility can be accepted by  IT- & Websolutions Stelmasik for the correctness of the information provided in this e-mail nor for any action on its basis. 

_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

s_stelmasik.vcf (368 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Optimized surface sharing between gstreamer(-vaapi) and a openGL-application on INTEL ATOM GPUs?

Victor Jaquez
On Mon, 05 Feb 2018 at 18:23, Sebastian Stelmasik wrote:
> Hi Victor,
> thanks for Your fast answer! Regarding Your questions:
>
> - we are using vaapisink
> - gstreamer version 1.6.3, but we have the same issues with current
> gstreamer 1.12.4
>
> Here are our basic functions:

As far as I understand these functions you are basically using the
GLUploadTextureMeta, through the handoff signal in vaapisink. And furthermore
you are using the GstVaapi API, which was dropped when gstreamer-vaapi were
merged as part of the GStreamer project, at 1.8

It is a surprise to me that in AMD, the GLUploadTextureMeta is actually zero
copy, since for Intel it has always implied some memcopy.

So you are basically facing several potential problems:

1\ you are using a old version of gstreamer and gstreamer-vaapi
2\ you are using a deprecated API for handling VA-API
3\ you are using a soon-to-be deprecated buffer meta
4\ you are relying on GLX, which has no future, as far as I understand

What I propose to you is:

1\ upgrade to the latest gstreamer, gstreamer-vaapi release
2\ remove the old GstVaapi code
3\ use EGL

For that you should change your code to use a pipeline like this

playbin video-sink="glupload ! appsink"

and you code will use the appsink API to fetch the decoded video frames with
GLMemory, which it will contain a texture that you can render.

By using EGL vaapi will export dmabuf-based buffers, those buffers will be
imported as EGLImages, wrapped the texture, and thus no memcopy are required.

vmjl

>
> ----- video_load ---
>
> /int video_load(lua_State *L, const char *path, const char *name) { Window
> rootwin; XWindowAttributes wattr; GLint *attr; int n_fbconfig_attrs; const
> gchar *platform; memset(&video, 0, sizeof(video_t)); video.x11_display =
> glXGetCurrentDisplay(); screen = DefaultScreen (video.x11_display);
> //video.x11_window = (Window) RootWindow (video.x11_display, screen);
> video.x11_window = (Window) glXGetCurrentDrawable(); XSynchronize
> (video.x11_display, True); platform = "glx"; char dir[256], uri[256] =
> "file:///"; getcwd(dir, sizeof(uri)); strcat(uri, dir); strcat(uri, "/");
> strcat(uri, path); if (!gst_video_init) { src = gst_element_factory_make
> ("playbin", NULL); sink = gst_element_factory_make ("vaapisink", NULL);
> g_object_set (sink, "signal-handoffs", TRUE, NULL); handoff_id =
> g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (on_client_draw),
> &video); //g_object_set (video.sink, "display", 1, NULL); //1 is x11
> g_object_set (G_OBJECT(src), "video-sink", sink, NULL); //bus =
> gst_pipeline_get_bus (GST_PIPELINE (pipeline)); //gst_bus_add_signal_watch
> (video.bus); //gst_bus_enable_sync_message_emission (bus);
> //g_signal_connect (video.bus, "message", G_CALLBACK (sync_bus_call),
> &video); //g_signal_connect (bus, "sync-message", G_CALLBACK
> (sync_bus_call), &video); //gst_object_unref (bus); GstPad *sinkpad =
> gst_element_get_static_pad (sink, "sink"); gst_pad_add_probe (sinkpad,
> GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, (GstPadProbeCallback)
> playout_item_pad_probe_event, &video, NULL); gst_object_unref (sinkpad); }
> g_object_set (src, "uri", uri, NULL); video.eos = FALSE; if
> (!video_open(&video, path)) return luaL_error(L, "cannot open video %s",
> path); glGenTextures(1, &video.tex); glBindTexture(GL_TEXTURE_2D,
> video.tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
> GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D,
> GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D(
> GL_TEXTURE_2D, 0, GL_BGRA, video.width, video.height, 0, GL_BGRA,
> GL_UNSIGNED_BYTE, NULL ); /* Initialize FBConfig attributes */ static GLint
> fbconfig_attrs[] = { //values from MPV GLX_BIND_TO_TEXTURE_RGBA_EXT, True,
> GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, GLX_BIND_TO_TEXTURE_TARGETS_EXT,
> GLX_TEXTURE_2D_BIT_EXT, GLX_Y_INVERTED_EXT, True, GLX_DOUBLEBUFFER, False,
> GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_ALPHA_SIZE, 0,
> None }; video.fb_config = glXChooseFBConfig (video.x11_display, screen,
> fbconfig_attrs, &n_fbconfig_attrs); if (!video.fb_config) { fprintf (stderr,
> "FBCONFIG failed\n"); exit(0); } video.pixmap = XCreatePixmap
> (video.x11_display, video.x11_window, video.width, video.height,
> 32);//wattr.depth); int pixmap_attrs[10] = { //Values from MPV
> GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, GLX_TEXTURE_FORMAT_EXT,
> GLX_TEXTURE_FORMAT_RGB_EXT, GLX_MIPMAP_TEXTURE_EXT, False, None, };
> video.glx_pixmap = glXCreatePixmap (video.x11_display, video.fb_config[0],
> video.pixmap, pixmap_attrs ); video.surface_present = 0; glx_bind_tex_image
> = (PFNGLXBINDTEXIMAGEEXTPROC) glXGetProcAddress ("glXBindTexImageEXT");
> glx_release_tex_image = (PFNGLXRELEASETEXIMAGEEXTPROC) glXGetProcAddress
> ("glXReleaseTexImageEXT"); g_return_val_if_fail (GST_IS_VIDEO_OVERLAY
> (sink), NULL); video_overlay = GST_VIDEO_OVERLAY (sink);
> gst_video_overlay_set_window_handle (video_overlay, (guintptr)
> video.x11_window); if (gst_video_init) { //gint64 position;
> //gst_element_query_position (src, GST_FORMAT_TIME, &position); handoff_id =
> g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (on_client_draw),
> &video); gst_element_set_state (src, GST_STATE_PLAYING); /*if
> (!gst_element_seek_simple (src, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
> position)) { fprintf (stderr,"Seek failed set pos 0 manually\n");
> gst_element_seek_simple (src, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,0); }*/ }
> else { //g_return_val_if_fail (GST_IS_VIDEO_OVERLAY (sink), NULL);
> //video_overlay = GST_VIDEO_OVERLAY (sink);
> //gst_video_overlay_set_window_handle (video_overlay, (guintptr)
> video.x11_window); gst_element_set_state (GST_ELEMENT (src),
> GST_STATE_PLAYING); gst_video_init = 1; } /*g_return_val_if_fail
> (GST_IS_VIDEO_OVERLAY (video.sink), NULL); video.video_overlay =
> GST_VIDEO_OVERLAY (video.sink); gst_video_overlay_set_window_handle
> (video.video_overlay, (guintptr) video.x11_window); gst_element_set_state
> (GST_ELEMENT (video.pipeline), GST_STATE_PLAYING);*/ /* we save the current
> video in a global variable */ check_video = push_video(L); *check_video =
> video; return 1; }/
>
> ----- on client draw ---
>
> /static gboolean on_client_draw (GstElement * glsink, GstBuffer *buf,
> gpointer data) { video_t *video = (video_t*) data; GstVideoInfo v_info;
> GstCaps *caps; GstVaapiSurface *surface; GstVaapiSurfaceProxy *proxy;
> GstVaapiDisplay *vaapi_display; VAStatus status; GstVaapiVideoMeta *meta =
> NULL; if (video->eos) return FALSE; meta = gst_buffer_get_vaapi_video_meta
> (buf); if (!meta) fprintf(stderr, "could not find vaapi meta in buffer!\n");
> if (video->buf) { video->old_buf = video->buf; } video->buf = buf;
> gst_buffer_ref (video->buf); proxy = gst_vaapi_video_meta_get_surface_proxy
> (meta); surface = gst_vaapi_surface_proxy_get_surface (proxy); vaapi_display
> = gst_vaapi_video_meta_get_display(meta); /* fprintf(stderr, "%s video %p
> buffer %p video tex: %u width %d height %d screen %d %d, display: %p %p \n",
> __func__, video, video->buf, video->tex, video->width, video->height,
> screen, gst_vaapi_display_x11_get_screen (vaapi_display),
> video->x11_display, gst_vaapi_display_x11_get_display (vaapi_display) ); */
> status = vaPutSurface ( GST_VAAPI_DISPLAY_VADISPLAY (vaapi_display),
> GST_VAAPI_OBJECT_ID (surface), video->pixmap, 0, 0, video->width,
> video->height, 0, 0, video->width, video->height, NULL, 0, VA_FRAME_PICTURE
> | VA_SRC_BT709); //VA_SRC_BT709 if (!video_vaapi_check_status (status,
> "vaPutSurface()")) { fprintf(stderr, "could not put VAAPI surface!\n");
> return FALSE; } if (!gst_vaapi_surface_sync (surface)) { fprintf(stderr,
> "could not sync VAAPI surface!\n"); } video->surface_present = 1; if
> (check_video) { check_video->buf = video->buf; check_video->surface_present
> = video->surface_present; } if (video->old_buf) { gst_buffer_unref
> (video->old_buf); } return TRUE; }/
>
> Any optimization welcome!
>
> Thanks in advance!
>
> Sebastian
>
> Am 05.02.2018 um 16:09 schrieb Víctor Jáquez:
> > Hi,
> >
> > On Mon, 05 Feb 2018 at 13:39, Sebastian Stelmasik wrote:
> > > Hi there!
> > >
> > > We are developing a Digital Signage application on basis of
> > > gstreamer(-vaapi) and info-beamer (https://info-beamer.com/opensource).
> > > Until now we were using (cheap) AMD devices where we use glx-pixmaps for
> > > surface sharing between gstreamer and info-beamer which works quite perfect
> > > (no mem copy at all).
> > >
> > > Now we have to switch to INTEL devices as there are no cheap (and compatible
> > > with the former open souce driver) AMD devices and now we are expiriencing
> > > framedrop issues in surface sharing between gstreamer(-vaapi) and
> > > info-beamer on INTEL ATOM Z8300 devices (which should be a lot faster than
> > > the AMD E-350 we have been using before). As I said before we use
> > > glx-pixmaps for surface sharing which works perfect on AMD-GPUs. But now
> > > there seems to be a lot of in mem copy which couses a lot of framedrops.
> > >
> > > Is there a optimized way/pipeline for INTEL ATOM GPUs?
> > Which video sink are you using in the application?
> >
> > Which version of gstreamer?
> >
> > I guess, in your AMD box, you are in a GLX environment and the sink negotiates
> > GLUploadTextureMeta, which isn't absolutely mem copy free, and it is going to be
> > deprecated soon.
> >
> > A possibility could be to switch to EGL and the sink could import dmabuf, using,
> > perhaps, glupload, and no mem copy is involved.
> >
> > The other option, would be, of course, embedded vaapisink, negotiating the
> > memory:VASurface feature.
> >
> > vmjl
> >
> >
> > > Or any other issue we didn't think about while switching from AMD to INTEL
> > > GPUs?
> > >
> > > Best regards and thanks in advance!
> > >
> > > Sebastian Stelmasik
> > > _______________________________________________
> > > gstreamer-devel mailing list
> > > [hidden email]
> > > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
> > _______________________________________________
> > gstreamer-devel mailing list
> > [hidden email]
> > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel