Как встроить gstreamer waylandsink в qwidget? - PullRequest
0 голосов
/ 19 июня 2019

На нашей встроенной платформе imx6 (linux 5.0, etnaviv, wayland) у меня есть проблемы с встраиванием waylandsink поверх qtwidget.(glimagesink также возможен, если он работает достаточно хорошо, но, начиная с gst-launch, похоже, что waylandsink менее интенсивно использует процессор).В качестве демонстрации я создал небольшое приложение:

https://github.com/woutervanh/qt-waylandsink-demo

Он застревает при создании дескриптора окна:

Подготовка дескриптора окна 0:00: 00.113075333 494 0x213f3b0 WARN
waylandsink wlvideoformat.c: 137: gst_video_format_to_wl_dmabuf_format: формат видео waymaf dmabuf не найден

Я должен что-то делать неправильно при обработке поверхности и отображении, я думаю1013 *

Однако «тот же» конвейер работает, если я запускаю его напрямую через: gst-launch1.0 videotestsrc!waylandsink

Было бы замечательно, если бы кто-то указал мне правильное направление?

Кстати, файл .pro выглядит неопрятно, но это потому, что у меня также есть некоторые проблемы, возникающие с правильными зависимостями вYocto.

Widget* widget = static_cast<Widget*>(user_data);

if (gst_is_wayland_display_handle_need_context_message (message)) {
  GstContext *context;
  qDebug() << "Need Context";

  QPlatformNativeInterface *native =
          QGuiApplication::platformNativeInterface();
  struct wl_display *display_handle = (struct wl_display *)
          native->nativeResourceForWindow("display", NULL);

  context = gst_wayland_display_handle_context_new (display_handle);
  gst_element_set_context (GST_ELEMENT (GST_MESSAGE_SRC (message)), context);

  goto drop;
} else if (gst_is_video_overlay_prepare_window_handle_message (message)) {
    qDebug() << "Prepare window handle";

  QPlatformNativeInterface *native =
          QGuiApplication::platformNativeInterface();
  struct wl_surface *surface = static_cast<struct wl_surface *>(
              native->nativeResourceForWindow("surface", widget->windowHandle()));

  gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)), (guintptr) surface);
  gst_video_overlay_set_render_rectangle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)), widget->x(), widget->y(), widget->width(), widget->height());

  goto drop;
}

return GST_BUS_PASS;
...