<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >Position tracking and seeking</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79;charset=UTF-8"><LINK REL="HOME" TITLE="GStreamer Application Development Manual (0.10.36)" HREF="index.html"><LINK REL="UP" TITLE="Advanced GStreamer concepts" HREF="part-advanced.html"><LINK REL="PREVIOUS" TITLE="Advanced GStreamer concepts" HREF="part-advanced.html"><LINK REL="NEXT" TITLE="Events: seeking (and more)" HREF="section-eventsseek.html"></HEAD ><BODY CLASS="chapter" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" ><SPAN CLASS="application" >GStreamer</SPAN > Application Development Manual (0.10.36)</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="part-advanced.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="section-eventsseek.html" ACCESSKEY="N" >Next</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="chapter" ><H1 ><A NAME="chapter-queryevents" ></A >Chapter 11. Position tracking and seeking</H1 ><P > So far, we've looked at how to create a pipeline to do media processing and how to make it run. Most application developers will be interested in providing feedback to the user on media progress. Media players, for example, will want to show a slider showing the progress in the song, and usually also a label indicating stream length. Transcoding applications will want to show a progress bar on how much percent of the task is done. <SPAN CLASS="application" >GStreamer</SPAN > has built-in support for doing all this using a concept known as <SPAN CLASS="emphasis" ><I CLASS="emphasis" >querying</I ></SPAN >. Since seeking is very similar, it will be discussed here as well. Seeking is done using the concept of <SPAN CLASS="emphasis" ><I CLASS="emphasis" >events</I ></SPAN >. </P ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="section-querying" >11.1. Querying: getting the position or length of a stream</A ></H1 ><P > Querying is defined as requesting a specific stream property related to progress tracking. This includes getting the length of a stream (if available) or getting the current position. Those stream properties can be retrieved in various formats such as time, audio samples, video frames or bytes. The function most commonly used for this is <CODE CLASS="function" >gst_element_query ()</CODE >, although some convenience wrappers are provided as well (such as <CODE CLASS="function" >gst_element_query_position ()</CODE > and <CODE CLASS="function" >gst_element_query_duration ()</CODE >). You can generally query the pipeline directly, and it'll figure out the internal details for you, like which element to query. </P ><P > Internally, queries will be sent to the sinks, and <SPAN CLASS="QUOTE" >"dispatched"</SPAN > backwards until one element can handle it; that result will be sent back to the function caller. Usually, that is the demuxer, although with live sources (from a webcam), it is the source itself. </P ><PRE CLASS="programlisting" > #include <gst/gst.h> static gboolean cb_print_position (GstElement *pipeline) { GstFormat fmt = GST_FORMAT_TIME; gint64 pos, len; if (gst_element_query_position (pipeline, &fmt, &pos) && gst_element_query_duration (pipeline, &fmt, &len)) { g_print ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r", GST_TIME_ARGS (pos), GST_TIME_ARGS (len)); } /* call me again */ return TRUE; } gint main (gint argc, gchar *argv[]) { GstElement *pipeline; [..] /* run pipeline */ g_timeout_add (200, (GSourceFunc) cb_print_position, pipeline); g_main_loop_run (loop); [..] } </PRE ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="part-advanced.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="section-eventsseek.html" ACCESSKEY="N" >Next</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Advanced <SPAN CLASS="application" >GStreamer</SPAN > concepts</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="part-advanced.html" ACCESSKEY="U" >Up</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Events: seeking (and more)</TD ></TR ></TABLE ></DIV ></BODY ></HTML >