这里介绍一下GstSegment结构
GstSegment: (https://gstreamer.freedesktop.org/documentation/gstreamer/gstsegment.html?gi-language=c)
这个structure保存一些追踪感兴趣的区域的相关value, 主要用于两个目的,一个seek(handle seek events), 一个是tracking playback regions(handle newsegment events).
segment一般由app来生成,然后以event的方式传递给upstream,由具体实施seek的element来handle这个event. 然后作为一个newsegment的event传递给downstream, 用来定义这个segment的边界。
这个structure用gst_segment_init来初始化,用GstFormat来定义format. 内部成员start默认值为0, stop/duration默认为-1. rate and applied_rate默认为1.0
当element要做seek时, 需要使用gst_segment_do_seek函数来将要seek的value填到本element的GstSegment结构体中。在调用上述函数之前,需要检测format是否一样,不一样的话,需要转换format.
当element使用GstSegment去track playback region, 可以使用gst_segment_clip来实现。
下面我们看一下成员变量:
struct _GstSegment {
/*< public >*/
GstSegmentFlags flags;
gdouble rate;
gdouble applied_rate;
GstFormat format;
guint64 base;
guint64 offset;
guint64 start;
guint64 stop;
guint64 time;
guint64 position;
guint64 duration;
/* < private > */
gpointer _gst_reserved[GST_PADDING];
};
成员函数:
GType gst_segment_get_type (void);
/*创建并init一个segment.*/
GstSegment * gst_segment_new (void) ;
/*copy传入的segment, 返回一个新建的segment, 使用完毕后需要用gst_segment_free()来释放*/
GstSegment * gst_segment_copy (const GstSegment *segment) ;
/*这个就是直接调用memcpy将src复制到dest中*/
void gst_segment_copy_into (const GstSegment *src, GstSegment *dest);
void gst_segment_free (GstSegment *segment);
/*利用format来初始化segment, 其他值采用默认值, 利用传入的format来初始化format*/
void gst_segment_init (GstSegment *segment, GstFormat format);
/*就是将segment里面的信息和position计算出srteam_time, 主要就是stream_time = position - start, 返回值返回成功or失败*/
gint gst_segment_to_stream_time_full (const GstSegment *segment, GstFormat format, guint64 position, guint64 * stream_time);
/*功能和上面函数一样,只不过将stream_time作为返回值返回*/
guint64 gst_segment_to_stream_time (const GstSegment *segment, GstFormat format, guint64 position);
/*通过stream_time来计算position*/
gint gst_segment_position_from_stream_time_full (const GstSegment * segment, GstFormat format, guint64 stream_time, guint64 * position);
/*同上*/
guint64 gst_segment_position_from_stream_time (const GstSegment * segment, GstFormat format, guint64 stream_time);
/*将position转换为running time*/
guint64 gst_segment_to_running_time (const GstSegment *segment, GstFormat format, guint64 position);
/*同上*/
gint gst_segment_to_running_time_full (const GstSegment *segment, GstFormat format, guint64 position,
guint64 * running_time);
GST_DEPRECATED_FOR(gst_segment_position_from_running_time)
guint64 gst_segment_to_position (const GstSegment *segment, GstFormat format, guint64 running_time);
gint gst_segment_position_from_running_time_full (const GstSegment *segment, GstFormat format, guint64 running_time, guint64 * position);
guint64 gst_segment_position_from_running_time (const GstSegment *segment, GstFormat format, guint64 running_time);
gboolean gst_segment_set_running_time (GstSegment *segment, GstFormat format, guint64 running_time);
gboolean gst_segment_offset_running_time (GstSegment *segment, GstFormat format, gint64 offset);
gboolean gst_segment_clip (const GstSegment *segment, GstFormat format, guint64 start,
guint64 stop, guint64 *clip_start, guint64 *clip_stop);
/*用传入的各个参数来初始化传入的segment, 初始化的时候会根据flag和format等参数来做一些调整,主要就是
给segment内部的成员变量赋值*/
gboolean gst_segment_do_seek (GstSegment * segment, gdouble rate,
GstFormat format, GstSeekFlags flags,
GstSeekType start_type, guint64 start,
GstSeekType stop_type, guint64 stop, gboolean * update);
gboolean gst_segment_is_equal (const GstSegment * s0, const GstSegment * s1);