【问题标题】:Gstreamer Change State FunctionGstreamer 改变状态函数
【发布时间】:2015-06-22 03:31:22
【问题描述】:

我是 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。 谢谢!

【问题讨论】:

    标签: gstreamer


    【解决方案1】:

    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。只需查看其他插件源以获取示例。

    【讨论】:

      【解决方案2】:

      感谢您的回答。实际上,我从该指南中引用的这段代码可以正常运行。但我无法理解的是在我们声明的头文件中: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)? 如果为真,则parent_classchange_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 (element, transition)? 据我所知,每个 GstElementClass 都有一个默认函数 change_state 但在这种情况下,函数 change_state 已分配给另一个指针函数(gst_my_filter_class_init 执行此分配)是对的?希望尽快收到您的答复。非常感谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        相关资源
        最近更新 更多