1

私は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を呼び出すことができるのはなぜですか 。ありがとうございました!

4

2 に答える 2

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;JustGstXyzClassは、継承元の Element のタイプになりますGstElementClass。例については、他のプラグイン ソースを参照してください。

于 2012-10-27T09:47:40.717 に答える
0

ご回答有難うございます。実際、そのガイドから引用したこのコードは正常に実行できますが、理解できないのは、宣言するヘッダー ファイルにあります。GstMyFilterClass {GstElementClass parent_class;} これは、GstElementClass が GstMyFilterClass の親クラスであることを意味しますが、なぜこのプラグインのソース ファイルでparent_classを使用できるのでしょうか (. c ファイル)? 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はこの割り当てを行います) 正しいですか? ご回答をお待ちしております。どうもありがとうございました

于 2012-10-27T12:59:57.203 に答える