Events GStreamer 1.0中的自定义事件处理

Events GStreamer 1.0中的自定义事件处理,events,event-handling,gstreamer,Events,Event Handling,Gstreamer,我对GStreamer事件的发送和处理感到很为难。我理解这个过程,但不能达到我想要的结果。我正在开发一系列GStreamer插件,与GStreamer主应用程序一起使用。我有3个插件my_src继承自GstPushSrc,my_transform继承自GstBaseTransform和my_sink继承自GstBaseSink,还有一个主应用程序my_app 我正试图从my_app向管道中的所有元素发送一个自定义事件,告诉它们重新配置处理参数。这与重新配置GST事件不同,因为它不涉及任何CAP的

我对GStreamer事件的发送和处理感到很为难。我理解这个过程,但不能达到我想要的结果。我正在开发一系列GStreamer插件,与GStreamer主应用程序一起使用。我有3个插件
my_src
继承自
GstPushSrc
my_transform
继承自
GstBaseTransform
my_sink
继承自
GstBaseSink
,还有一个主应用程序
my_app

我正试图从
my_app
向管道中的所有元素发送一个自定义事件,告诉它们重新配置处理参数。这与重新配置GST事件不同,因为它不涉及任何CAP的重新协商。我正在从
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);
}
// 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);
}
// 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);
}
类似地,我重写了
GstBaseSink
事件处理程序,如下所示:

// 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);
}
// 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);
}
// 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);
}
最后,我重写了
GstBaseTransform
sink\u 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);
}
// 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);
}
// 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

你知道我做错了什么吗?

uu这是个大问题:)我没有太多经验。。但是:我只是注意到,有时您会分配给
->sink\u event
,有时只分配给
->event
。。有时您分配给基类的->事件,有时分配给类的事件-为什么?在使用msc->event which works.分配给类的有效接收器中。。嗯,不知道为什么要抓。这些都是有问题的错误,但不是在我的实际来源。这些应该始终分配给基类(即,重写基类虚拟函数)。
event()
vs
sink\u event()
与GStreamer元素的类型有关,来自、和文档。@RyanL您让它工作了吗?