主页 > 手机  > 

pipeline状态的变化

pipeline状态的变化

  gst_element_set_state (pipeline, GST_STATE_PLAYING); 在插件创建,链接之后会调用该函数。

gst_element_set_state {

  if (oclass->set_state)

    result = (oclass->set_state) (element, state);

}

这个函数会调用element的gst_element_set_state_func函数,set_state会保存element的当前,下一个,最终状态。元素的四个状态,分别是NULL, READY,PASUED, PLAYING。set_state会调gst_element_change_state函数去改状态。

gst_element_change_state{

  if (oclass->change_state)

    ret = (oclass->change_state) (element, transition);

......

      ret = gst_element_continue_state (element, ret);

......

}

gst_pipeline_change_state{

  result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);

}

gst_element_change_state里,会调用gst_pipeline_change_state,gst_pipeline_change_state又会调用父类的change_state,父类是bin,所以调用的是gst_bin_change_state_func,如下:

gst_bin_change_state_func{

.......

GST_STATE_PAUSED:

gst_bin_src_pads_activate

......

  /* iterate in state change order */

  it = gst_bin_iterate_sorted (bin);

        /* set state and base_time now */

        ret = gst_bin_element_set_state (bin, child, base_time, start_time,

            current, next);

}

 * Gets an iterator for the elements in this bin in topologically

 * sorted order. This means that the elements are returned from

 * the most downstream elements (sinks) to the sources. gst_bin_iterate_sorted{

.......

  result = gst_bin_sort_iterator_new (bin);

.......

}

从备注上看,gst_bin_iterate_sorted 函数返回一个从后往前的迭代, 然后依次设置子插件的状态。为fakesink为例,就会调用

gst_fake_sink_change_state{

......

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

......

}

标签:

pipeline状态的变化由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“pipeline状态的变化