Gstreamer改变状态函数

时间:2012-10-26 17:44:33

标签: gstreamer

我是Gstreamer的新手。我有一个关于插件的change_state函数的问题。 正如我在本指南中所读到的那样:http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/chapter-statemanage-states.html#section-statemanage-filters

static GstStateChangeReturn
gst_my_filter_change_state (GstElement *element, GstStateChange transition)
{
  GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
  GstMyFilter *filter = GST_MY_FILTER (element);

  switch (transition) {
    **//Downwards state change;**

  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
  if (ret == GST_STATE_CHANGE_FAILURE)
    return ret;

     **//upward state change**
  }

  return ret;
}

我真的不知道如何使用 parent_class 并调用 parent_class-> change_state 因为在这个元素的init函数中:

gst_my_filter_class_init (GstMyFilterClass *klass)
{
  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);

  element_class->change_state = gst_my_filter_change_state;**strong text**
}

element_class-> change_state 已分配给 gst_my_filter_change_state 。当element_class-> change_state被分配给另一个函数时,为什么我们仍然可以在 gst_my_filter_change_state 中调用 element_class-> change_state 。 谢谢!

2 个答案:

答案 0 :(得分:2)

gst_my_filter_class_init (GstMyFilterClass *klass)更改为以下内容:

gst_my_filter_class_init (GstMyFilterClass *klass)
{
  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
  parent_class = (GstXyzClass *) g_type_class_peek_parent (klass);
  element_class->change_state = gst_my_filter_change_state;**strong text**
}

在插件顶部附近的某处添加static个全局变量GstXyzClass *parent_class;。只有GstXyzClass将是您继承的元素的类型,例如GstElementClass。只需查看其他插件源代码即可。

答案 1 :(得分:0)

感谢您的回答。实际上,我从该指南中引用的代码可以正常运行。但我无法理解的是在头文件中我们声明:GstMyFilterClass {GstElementClass parent_class;}这意味着GstElementClass是GstMyFilterClass的父类 但是为什么我们可以在这个插件(.c文件)的源文件中使用 parent_class ?很抱歉我在Gobject中缺乏知识,但据我所知 GstMyFilterClass 是一个结构而且(不像C ++这样的类),属性 parent_class 不能用于插件的功能(在C ++中我们可以很容易地在类的方法中使用属性)。并在 gst_my_filter_class_init

gst_my_filter_class_init (GstMyFilterClass *klass)
{
  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);

  element_class->change_state = gst_my_filter_change_state;//assign to function pointer  state change
}

声明: GstElementClass * element_class = GST_ELEMENT_CLASS(klass); 是指我们投射GST_ELEMENT_CLASS(klass)来获取其父类( GstElementClass parent_class )? 如果为true,那么 parent_class change_state 函数指针不是Null。所以在

gst_my_filter_change_state (GstElement *element, GstStateChange transition)
{
  GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
  GstMyFilter *filter = GST_MY_FILTER (element);

  switch (transition) {
    **//Downwards state change;**

  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
  if (ret == GST_STATE_CHANGE_FAILURE)
    return ret;

     **//upward state change**
  }

  return ret;
}

什么是 GST_ELEMENT_CLASS(parent_class) - > change_state(元素,转换)? 据我所知,每个GstElementClass都有一个默认函数 change_state 但在这种情况下函数 change_state 已分配给另一个指针函数( gst_my_filter_class_init 执行此分配)是对的?希望尽快收到你的答复。非常感谢你