Clocks
-----------
GstClock用_get_time()返回单调递增的时间,它的精度和base time取决于时钟实现,但总是以纳秒为单位。既然时钟的基线没有被定义,时钟返回的值本身毫无意义,只有两个时钟之间的差值才有意义。
GstClock返回的时间值被称为absolute_time。
Clock Selection
~~~~~~~~~~~~~~~
为了同步不同的元素,GstPipeline负责为所有的元素选择并指定一个全局的时钟。无论什么时候pipeline变成PLAYING状态时,该选择将会发生;无论什么时候,一个元素添加到或者删除从pipeline,该选择将会再下次变成PLAYING状态时发生。添加一个能够提供时钟的元素时将触发GST_MESSAGE_CLOCK_PROVIDE消息,该消息将导致时钟重新被选择。
当一个时钟被选择,NEW_CLOCK消息被post到bus上,告知应用程序。
当提供时钟的元素从pipeline上删除了,CLOCK_LOST消息被post到bus上。应用程序必须设置pipeline为PAUSED,然后再设置成PLAYING状态,目的是让pipeline重新选定时钟。
Clock features
~~~~~~~~~~~~~~
gstreamer支持周期时钟和计数器时钟,首先用_clock_new_single_shot_id()和_clock_new_periodic_id()分别创建计数器时钟和周期时钟的实例(GstClockID)。
为了执行一段阻塞时间的等待,调用gst_clock_id_wait();为了执行一个异步的时间等待,时间到后能够执行指定的回调函数,需要调用gst_clock_id_wait_async()。这个两个调用都可以用gst_clock_id_unschedule()中断。如果没有阻塞的等待被调度,GST_CLOCK_UNSCHEDULED被返回。可以从任何线程执行异步的调用。
可以从多个线程在同一个GstClockID的ID执行阻塞等待,但是异步调用确实不行的,回调函数将只被调用一次。
没有任何等待操作将unref GstClockID,GstClockID的拥有者应该自行unref。原因是GstClockID的拥有者必须保留GstClockID来取消在FLUSHING event上的阻塞等。如果自动unref,GstClockID的jID可能是无效的。
这些时钟操作不能应用到stream time。当不是PLAYING状态时,回调函数可能被触发如果时钟还是在继续运行。但是有一些时钟的提供者,在不是PLAYING状态是,时钟是不运行的,这个时候回调函数将不会被触发。
Clock implementations
~~~~~~~~~~~~~~~~~~~~~
GStreamer核心提供了一个基于系统时钟的GstSystemClock,异步回调函数能够在内部线程被调用。时钟实现被鼓励继承自这个系统时钟,因为他已经实现了异步通知机制。
子类也可以覆盖所有的重要方法来实现他们自己的异步回调功能和同步阻塞功能。
-----------
GstClock用_get_time()返回单调递增的时间,它的精度和base time取决于时钟实现,但总是以纳秒为单位。既然时钟的基线没有被定义,时钟返回的值本身毫无意义,只有两个时钟之间的差值才有意义。
GstClock返回的时间值被称为absolute_time。
Clock Selection
~~~~~~~~~~~~~~~
为了同步不同的元素,GstPipeline负责为所有的元素选择并指定一个全局的时钟。无论什么时候pipeline变成PLAYING状态时,该选择将会发生;无论什么时候,一个元素添加到或者删除从pipeline,该选择将会再下次变成PLAYING状态时发生。添加一个能够提供时钟的元素时将触发GST_MESSAGE_CLOCK_PROVIDE消息,该消息将导致时钟重新被选择。
当一个时钟被选择,NEW_CLOCK消息被post到bus上,告知应用程序。
当提供时钟的元素从pipeline上删除了,CLOCK_LOST消息被post到bus上。应用程序必须设置pipeline为PAUSED,然后再设置成PLAYING状态,目的是让pipeline重新选定时钟。
Clock features
~~~~~~~~~~~~~~
gstreamer支持周期时钟和计数器时钟,首先用_clock_new_single_shot_id()和_clock_new_periodic_id()分别创建计数器时钟和周期时钟的实例(GstClockID)。
为了执行一段阻塞时间的等待,调用gst_clock_id_wait();为了执行一个异步的时间等待,时间到后能够执行指定的回调函数,需要调用gst_clock_id_wait_async()。这个两个调用都可以用gst_clock_id_unschedule()中断。如果没有阻塞的等待被调度,GST_CLOCK_UNSCHEDULED被返回。可以从任何线程执行异步的调用。
可以从多个线程在同一个GstClockID的ID执行阻塞等待,但是异步调用确实不行的,回调函数将只被调用一次。
没有任何等待操作将unref GstClockID,GstClockID的拥有者应该自行unref。原因是GstClockID的拥有者必须保留GstClockID来取消在FLUSHING event上的阻塞等。如果自动unref,GstClockID的jID可能是无效的。
这些时钟操作不能应用到stream time。当不是PLAYING状态时,回调函数可能被触发如果时钟还是在继续运行。但是有一些时钟的提供者,在不是PLAYING状态是,时钟是不运行的,这个时候回调函数将不会被触发。
Clock implementations
~~~~~~~~~~~~~~~~~~~~~
GStreamer核心提供了一个基于系统时钟的GstSystemClock,异步回调函数能够在内部线程被调用。时钟实现被鼓励继承自这个系统时钟,因为他已经实现了异步通知机制。
子类也可以覆盖所有的重要方法来实现他们自己的异步回调功能和同步阻塞功能。