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);
......
}