gst_bus_sync_handler不发送prepare-window-handle消息

时间:2019-05-17 10:03:32

标签: c udp gtk gstreamer

我建立了一个使用xvoverlay,udpsrc和xvimagesink的Gstreamer管道。

我正在使用不同的源运行4个并行管道,我试图将它们显示在GTK窗口中。我创建了4个GtkWidget,并使用gtk_drawing_area_new();

对其进行了初始化。

我遵循了this指南并实现了Achieve_cb和总线同步处理程序。

问题在于它在大多数情况下都有效。总线同步处理程序时不时地不发送针对1个或2个接收器的prepare-window-handle消息。设置同步处理程序的代码很清楚,窗口已初始化,并且一切正常,但我从没收到消息。

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
}

在此之后的稍后阶段,将管道设置为播放。

有什么想法吗?

0 个答案:

没有答案