gst_bus_sync_handler не отправляет сообщение prepare-window-handle - PullRequest
1 голос
/ 17 мая 2019

Я построил конвейер Gstreamer, который использует xvoverlay, udpsrc и xvimagesink.

Я использую 4 параллельных конвейера с разными источниками, я пытаюсь показать их в окне GTK.Я создаю 4 GtkWidgets и инициализирую их с помощью gtk_drawing_area_new ();

Я следовал этому руководству и реализовал реализуемый_cb и обработчик синхронизации шины.

Проблема в том, что оноработает, большую часть времени.Время от времени обработчик синхронизации шины никогда не отправляет сообщение prepare-window-handle для 1 или 2 приемников.Код, который устанавливает обработчик синхронизации, явно присутствует, окна инициализированы и все такое, но я никогда не получаю сообщение.

static GstBusSyncReply bus_sync_handler (GstBus * bus, GstMessage * message, gpointer ptr)
{
    uint8_t index = *((uint8_t *) ptr);

    if (!gst_is_video_overlay_prepare_window_handle_message (message))
        return GST_BUS_PASS;

    if (window_handles[index] != 0) {
        GstVideoOverlay *overlay;

        overlay = GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message));
        gst_video_overlay_set_window_handle (overlay, window_handles[index]);
    }
    gst_message_unref (message);
    (void)bus;

    return GST_BUS_DROP;
}
stream->queue_display = gst_element_factory_make("queue", NULL);
stream->videoscale = gst_element_factory_make ("videoscale", NULL);
stream->videosink = gst_element_factory_make("xvimagesink", NULL);


GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE (stream->pipeline));
gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler, (gpointer) stream->window_index, NULL);
gst_bin_add_many(GST_BIN(stream->pipeline), gst_object_ref(stream->queue_display), stream->videoscale, stream->videosink, NULL);

if (!gst_element_link_many(stream->queue_display, stream->videoscale, stream->videosink, NULL)) {
//Error handling
}

Конвейер настроен на воспроизведение на более поздней стадии после этого.

Есть идеи?

...