学无先后,达者为师

网站首页 编程语言 正文

gstreamer的消息传递机制

作者:茄子船长 更新时间: 2022-07-11 编程语言

//创建bin的同时会创建一个bus,用于接收子插件的消息。      
gst_bin_init (GstBin * bin)
{
  bus = g_object_new (GST_TYPE_BUS, "enable-async", FALSE, NULL);
  bin->child_bus = bus;  //childbus是用来接受子元素的消息。
}
        
//添加子元素,将child_bus设给子元素
gst_bin_add
--bclass->add_element
-----gst_bin_add_func
-------gst_element_set_bus (element, bin->child_bus);

//具体给子元素设置bus的函数。
gst_element_set_bus
--gst_element_set_bus_func
----gst_object_replace ((GstObject **) bus_p, GST_OBJECT_CAST (bus));

子元素发送消息,以为basesink的eos消息为例。
static gboolean
gst_base_sink_default_event (GstBaseSink * basesink, GstEvent * event)
{
    case GST_EVENT_EOS:
    {
      //向bus发送eos消息,所在bin会收到。
      seqnum = basesink->priv->seqnum = gst_event_get_seqnum (event);
      GST_DEBUG_OBJECT (basesink, "Got seqnum #%" G_GUINT32_FORMAT, seqnum);

      message = gst_message_new_eos (GST_OBJECT_CAST (basesink));
      gst_message_set_seqnum (message, seqnum);
      gst_element_post_message (GST_ELEMENT_CAST (basesink), message);
    }
}

//bin收到消息后,往上级bin转发消息。
bin_bus_handler{
  bclass->handle_message
  --gst_bin_handle_message_func
  ----bin_do_message_forward
}  

原文链接:https://blog.csdn.net/evsqiezi/article/details/125707929

栏目分类
最近更新