GStreamer 1.0中的自定义事件处理

时间:2016-06-02 18:33:07

标签: events event-handling gstreamer

我很难围绕GStreamer事件发送和处理。我了解这个过程,但无法达到我想要的结果。我正在开发一系列与GStreamer主应用程序串联的GStreamer插件。我有3个插件my_src继承自GstPushSrcmy_transform继承自GstBaseTransformmy_sink,继承自GstBaseSink,以及主要应用my_app

我正在尝试将my_app中的自定义事件发送到管道中的所有元素,告诉他们重新配置处理参数。这与GST_EVENT_RECONFIGURE不同,因为它不涉及任何重新协商的上限。我将my_app的活动发送至以下内容:

// my_app.c

GstStructure *reconfigureStructure = gst_structure_new("reconfigure", NULL);
GstEvent *reconfigureEvent = gst_event_new_custom(GST_EVENT_CUSTOM_DOWNSTREAM, 
                                                  reconfigureStructure);
gst_element_send_event(pipeline, reconfigureEvent);

我已覆盖GstBaseSrc event()方法,如下所示:

// my_src.c

static gboolean my_src_event(GstBaseSrc *bs, GstEvent *event);

static void
my_src_class_init(MySrcClass *msc)
{
  GstBaseSrcClass *bsc = GST_BASE_SRC_CLASS(msc);
  bsc->event = my_src_event;
}

static gboolean
my_src_event(GstBaseSrc *bs, GstEvent *event)
{
  switch (GST_EVENT_TYPE(event)) {
    case GST_EVENT_CUSTOM_DOWNSTREAM: {
      const GstStructure *structure = gst_event_get_structure(event);

      if (gst_structure_has_name(structure, "reconfigure")) {
        g_print("MY SRC RECONFIGURE\n");
        // do reconfigure things
      }

      break;
    }
  }

  return GST_BASE_SRC_CLASS(parent_class)->event(bs, event);
}

同样,我已经覆盖了GstBaseSink事件处理程序,如下所示:

// my_sink.c

static gboolean my_sink_event(GstBaseSink *bs, GstEvent *event);

static void
my_sink_class_init(MySinkClass *msc)
{
  GstBaseSinkClass *bsc = GST_BASE_SINK_CLASS(msc);
  bsc->event = my_sink_event;
}

static gboolean
my_sink_event(GstBaseSink *bs, GstEvent *event)
{
  switch (GST_EVENT_TYPE(event)) {
    case GST_EVENT_CUSTOM_DOWNSTREAM: {
      const GstStructure *structure = gst_event_get_structure(event);

      if (gst_structure_has_name(structure, "reconfigure")) {
        g_print("MY SINK RECONFIGURE\n");
        // do reconfigure things
      }

      break;
    }
  }

  return GST_BASE_SINK_CLASS(parent_class)->event(bs, event);
}

最后,我已按照以下方式覆盖GstBaseTransform sink_event()方法:

// my_transform.c

static gboolean my_transform_sink_event(GstBaseTransform *bt, GstEvent *event);

static void
my_transform_class_init(MyTransformClass *mtc)
{
  GstBaseTransformClass *btc = GST_BASE_TRANDFORM_CLASS(mtc);
  btc->sink_event = my_transform_sink_event;
}

static gboolean
my_transform_sink_event(GstBaseTransfor *bt, GstEvent *event)
{
  switch (GST_EVENT_TYPE(event)) {
    case GST_EVENT_CUSTOM_DOWNSTREAM: {
      const GstStructure *structure = gst_event_get_structure(event);

      if (gst_structure_has_name(structure, "reconfigure")) {
        g_print("MY TRANSFORM RECONFIGURE\n");
        // do reconfigure things
      }

      break;
    }
  }

  return GST_BASE_TRANSFORM_CLASS(parent_class)->sink_event(bt, event);
}

当我运行my_app时,我希望输出为:

MY SRC RECONFIGURE
MY TRANSFORM RECONFIGURE
MY SINK RECONFIGURE

但是,我只是得到了:

MY SINK RECONFIGURE

我在这里做错了什么想法?

0 个答案:

没有答案