mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:56:14 +00:00
docs/manual/advanced-position.xml: Update seek example and explanations to current 0.9 API.
Original commit message from CVS: * docs/manual/advanced-position.xml: Update seek example and explanations to current 0.9 API. * gst/elements/gsttypefindelement.c: (gst_type_find_element_activate): Remove FIXME comment now that the found caps are unreffed.
This commit is contained in:
parent
102c29b3b8
commit
215a6a26e0
4 changed files with 78 additions and 28 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2005-11-03 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
|
* docs/manual/advanced-position.xml:
|
||||||
|
Update seek example and explanations to current 0.9 API.
|
||||||
|
|
||||||
|
* gst/elements/gsttypefindelement.c:
|
||||||
|
(gst_type_find_element_activate):
|
||||||
|
Remove FIXME comment now that the found caps
|
||||||
|
are unreffed.
|
||||||
|
|
||||||
2005-11-03 Thomas Vander Stichele <thomas at apestaart dot org>
|
2005-11-03 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
* gst/gstregistryxml.c: (load_feature):
|
* gst/gstregistryxml.c: (load_feature):
|
||||||
|
|
|
@ -25,8 +25,9 @@
|
||||||
frames or bytes. The function most commonly used for this is
|
frames or bytes. The function most commonly used for this is
|
||||||
<function>gst_element_query ()</function>, although some convenience
|
<function>gst_element_query ()</function>, although some convenience
|
||||||
wrappers are provided as well (such as
|
wrappers are provided as well (such as
|
||||||
<function>gst_element_query_position ()</function>). You can generally
|
<function>gst_element_query_position ()</function> and
|
||||||
query the pipeline directly, it'll figure out the internal details
|
<function>gst_element_query_duration ()</function>). You can generally
|
||||||
|
query the pipeline directly, and it'll figure out the internal details
|
||||||
for you, like which element to query.
|
for you, like which element to query.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
@ -42,12 +43,12 @@
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
<!-- example-end query.c a -->
|
<!-- example-end query.c a -->
|
||||||
<!-- example-begin query.c b --><!--
|
<!-- example-begin query.c b --><!--
|
||||||
static gboolean
|
static void
|
||||||
my_bus_callback (GstBus *bus,
|
my_bus_message_cb (GstBus *bus,
|
||||||
GstMessage *message,
|
GstMessage *message,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
GMainLoop *loop = data;
|
GMainLoop *loop = (GMainLoop *) data;
|
||||||
|
|
||||||
switch (GST_MESSAGE_TYPE (message)) {
|
switch (GST_MESSAGE_TYPE (message)) {
|
||||||
case GST_MESSAGE_ERROR: {
|
case GST_MESSAGE_ERROR: {
|
||||||
|
@ -69,9 +70,6 @@ my_bus_callback (GstBus *bus,
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remove from queue */
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
--><!-- example-end query.c b -->
|
--><!-- example-end query.c b -->
|
||||||
<!-- example-begin query.c c -->
|
<!-- example-begin query.c c -->
|
||||||
|
@ -81,7 +79,8 @@ cb_print_position (GstElement *pipeline)
|
||||||
GstFormat fmt = GST_FORMAT_TIME;
|
GstFormat fmt = GST_FORMAT_TIME;
|
||||||
gint64 pos, len;
|
gint64 pos, len;
|
||||||
|
|
||||||
if (gst_element_query_position (pipeline, &fmt, &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",
|
g_print ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r",
|
||||||
GST_TIME_ARGS (pos), GST_TIME_ARGS (len));
|
GST_TIME_ARGS (pos), GST_TIME_ARGS (len));
|
||||||
}
|
}
|
||||||
|
@ -97,7 +96,10 @@ main (gint argc,
|
||||||
GstElement *pipeline;
|
GstElement *pipeline;
|
||||||
<!-- example-end query.c c -->
|
<!-- example-end query.c c -->
|
||||||
[..]<!-- example-begin query.c d --><!--
|
[..]<!-- example-begin query.c d --><!--
|
||||||
|
GstStateChangeReturn ret;
|
||||||
GMainLoop *loop;
|
GMainLoop *loop;
|
||||||
|
GError *err = NULL;
|
||||||
|
GstBus *bus;
|
||||||
gchar *l;
|
gchar *l;
|
||||||
|
|
||||||
/* init */
|
/* init */
|
||||||
|
@ -109,18 +111,32 @@ main (gint argc,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
|
||||||
/* build pipeline, the easy way */
|
/* build pipeline, the easy way */
|
||||||
l = g_strdup_printf ("filesrc location=\"%s\" ! oggdemux ! vorbisdec ! "
|
l = g_strdup_printf ("filesrc location=\"%s\" ! oggdemux ! vorbisdec ! "
|
||||||
"audioconvert ! audioscale ! alsasink",
|
"audioconvert ! audioresample ! alsasink",
|
||||||
argv[1]);
|
argv[1]);
|
||||||
pipeline = gst_parse_launch (l, NULL);
|
pipeline = gst_parse_launch (l, &err);
|
||||||
|
if (pipeline == NULL || err != NULL) {
|
||||||
|
g_printerr ("Cannot build pipeline: %s\n", err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
g_free (l);
|
||||||
|
if (pipeline)
|
||||||
|
gst_object_unref (pipeline);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
g_free (l);
|
g_free (l);
|
||||||
gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (pipeline)),
|
|
||||||
my_bus_callback, NULL);
|
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
|
||||||
|
gst_bus_add_signal_watch (bus);
|
||||||
|
g_signal_connect (bus, "message", G_CALLBACK (my_bus_message_cb), loop);
|
||||||
|
gst_object_unref (bus);
|
||||||
|
|
||||||
/* play */
|
/* play */
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||||
loop = g_main_loop_new (NULL, FALSE);
|
if (ret == GST_STATE_CHANGE_FAILURE)
|
||||||
|
g_error ("Failed to set pipeline to PLAYING.\n");
|
||||||
--><!-- example-end query.c d -->
|
--><!-- example-end query.c d -->
|
||||||
<!-- example-begin query.c e -->
|
<!-- example-begin query.c e -->
|
||||||
/* run pipeline */
|
/* run pipeline */
|
||||||
|
@ -149,12 +165,16 @@ main (gint argc,
|
||||||
and it will figure out everything for you. Although there are more
|
and it will figure out everything for you. Although there are more
|
||||||
ways in which applications and elements can interact using events,
|
ways in which applications and elements can interact using events,
|
||||||
we will only focus on seeking here. This is done using the seek-event.
|
we will only focus on seeking here. This is done using the seek-event.
|
||||||
A seek-event contains a seeking offset, a seek method (which indicates
|
A seek-event contains a playback rate, a seek offset format (which is
|
||||||
relative to what the offset was given), a seek format (which is the
|
the unit of the offsets to follow, e.g. time, audio samples, video
|
||||||
unit of the offset, e.g. time, audio samples, video frames or bytes)
|
frames or bytes), optionally a set of seeking-related flags (e.g.
|
||||||
and optionally a set of seeking-related flags (e.g. whether internal
|
whether internal buffers should be flushed), a seek method (which
|
||||||
buffers should be flushed). The behaviour of a seek is also wrapped
|
indicates relative to what the offset was given), and seek offsets.
|
||||||
in the function <function>gst_element_seek ()</function>.
|
The first offset (cur) is the new position to seek to, while
|
||||||
|
the second offset (stop) is optional and specifies a position where
|
||||||
|
streaming is supposed to stop. Usually it is fine to just specify
|
||||||
|
GST_SEEK_TYPE_NONE and -1 as end_method and end offset. The behaviour
|
||||||
|
of a seek is also wrapped in the <function>gst_element_seek ()</function>.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<programlisting>
|
<programlisting>
|
||||||
|
@ -162,11 +182,33 @@ static void
|
||||||
seek_to_time (GstElement *pipeline,
|
seek_to_time (GstElement *pipeline,
|
||||||
gint64 time_nanoseconds)
|
gint64 time_nanoseconds)
|
||||||
{
|
{
|
||||||
gst_element_seek (pipeline,
|
GstFormat format = GST_FORMAT_TIME;
|
||||||
GST_SEEK_METHOD_SET | GST_FORMAT_TIME |
|
|
||||||
GST_SEEK_FLAG_FLUSH, time_nanoseconds);
|
if (!gst_element_seek (pipeline, 1.0, &format, GST_SEEK_FLAG_FLUSH,
|
||||||
|
GST_SEEK_TYPE_SET, time_nanoseconds,
|
||||||
|
GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
|
||||||
|
g_print ("Seek failed!\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</programlisting>
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Seeks should usually be done when the pipeline is in PAUSED or PLAYING
|
||||||
|
state (when it is in PLAYING state the pipeline will pause itself, issue
|
||||||
|
the seek, and then set itself back to PLAYING again itself).
|
||||||
|
returns.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
It is important to realise that seeks will not happen instantly in the
|
||||||
|
sense that they are finished when the function
|
||||||
|
<function>gst_element_seek ()</function> returns. Depending on the
|
||||||
|
specific elements involved, the actual seeking might be done later in
|
||||||
|
another thread (the streaming thread), and it might take a short time
|
||||||
|
until buffers from the new seek position will reach downstream elements
|
||||||
|
such as sinks (if the seek was non-flushing then it might take a bit
|
||||||
|
longer).
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
It is possible to do multiple seeks in short time-intervals, such as
|
It is possible to do multiple seeks in short time-intervals, such as
|
||||||
a direct response to slider movement. After a seek, internally, the
|
a direct response to slider movement. After a seek, internally, the
|
||||||
|
|
|
@ -826,7 +826,6 @@ gst_type_find_element_activate (GstPad * pad)
|
||||||
0, 100, found_caps);
|
0, 100, found_caps);
|
||||||
gst_caps_unref (found_caps);
|
gst_caps_unref (found_caps);
|
||||||
typefind->mode = MODE_NORMAL;
|
typefind->mode = MODE_NORMAL;
|
||||||
/* FIXME see if I can unref the caps here */
|
|
||||||
|
|
||||||
/* 7 */
|
/* 7 */
|
||||||
if (gst_pad_is_active (pad))
|
if (gst_pad_is_active (pad))
|
||||||
|
|
|
@ -826,7 +826,6 @@ gst_type_find_element_activate (GstPad * pad)
|
||||||
0, 100, found_caps);
|
0, 100, found_caps);
|
||||||
gst_caps_unref (found_caps);
|
gst_caps_unref (found_caps);
|
||||||
typefind->mode = MODE_NORMAL;
|
typefind->mode = MODE_NORMAL;
|
||||||
/* FIXME see if I can unref the caps here */
|
|
||||||
|
|
||||||
/* 7 */
|
/* 7 */
|
||||||
if (gst_pad_is_active (pad))
|
if (gst_pad_is_active (pad))
|
||||||
|
|
Loading…
Reference in a new issue