На нашей встроенной платформе 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;