summaryrefslogtreecommitdiffstats
path: root/examples/seeking
diff options
context:
space:
mode:
Diffstat (limited to 'examples/seeking')
-rw-r--r--examples/seeking/cdparanoia.c83
1 files changed, 68 insertions, 15 deletions
diff --git a/examples/seeking/cdparanoia.c b/examples/seeking/cdparanoia.c
index b735b4ab..ec047f95 100644
--- a/examples/seeking/cdparanoia.c
+++ b/examples/seeking/cdparanoia.c
@@ -3,10 +3,51 @@
#include <string.h>
static void
+get_position_info (GstElement *cdparanoia)
+{
+ GstFormat track_format;
+ const GstFormat *formats;
+ GstPad *pad;
+
+ track_format = gst_format_get_by_nick ("track");
+ g_assert (track_format != 0);
+
+ pad = gst_element_get_pad (cdparanoia, "src");
+ formats = gst_pad_get_formats (pad);
+
+ while (*formats) {
+ const GstFormatDefinition *definition;
+ GstFormat format;
+ gint64 position;
+ gboolean res;
+
+ definition = gst_format_get_details (*formats);
+
+ format = *formats;
+ res = gst_pad_query (pad, GST_PAD_QUERY_POSITION,
+ &format, &position);
+
+ if (format == GST_FORMAT_TIME) {
+ position /= GST_SECOND;
+ g_print ("%s: %lld:%02lld", definition->nick, position/60, position%60);
+ }
+ else {
+ g_print ("%s: %lld", definition->nick, position);
+ }
+
+ formats++;
+ if (*formats) {
+ g_print (", ");
+ }
+ }
+ g_print ("\r");
+}
+
+static void
get_track_info (GstElement *cdparanoia)
{
GstFormat track_format;
- gint64 total_tracks, total_time;
+ gint64 total_tracks = 0, total_time = 0;
GstPad *pad;
const GstFormat *formats;
gint i;
@@ -23,21 +64,25 @@ get_track_info (GstElement *cdparanoia)
while (*formats) {
const GstFormatDefinition *definition;
gint64 total;
+ GstFormat format;
gboolean res;
definition = gst_format_get_details (*formats);
+ format = *formats;
res = gst_pad_query (pad, GST_PAD_QUERY_TOTAL,
- (GstFormat *)formats, &total);
+ &format, &total);
if (res) {
- if (*formats == GST_FORMAT_TIME)
- g_print ("%s total: %lld:%lld\n", definition->nick, total/60, total%60);
+ if (format == GST_FORMAT_TIME) {
+ total /= GST_SECOND;
+ g_print ("%s total: %lld:%02lld\n", definition->nick, total/60, total%60);
+ }
else
g_print ("%s total: %lld\n", definition->nick, total);
- if (*formats == track_format)
+ if (format == track_format)
total_tracks = total;
- else if (*formats == GST_FORMAT_TIME)
+ else if (format == GST_FORMAT_TIME)
total_time = total;
}
else
@@ -59,6 +104,7 @@ get_track_info (GstElement *cdparanoia)
format = GST_FORMAT_TIME;
res = gst_pad_convert (pad, track_format, i,
&format, &time);
+ time /= GST_SECOND;
}
else {
time = total_time;
@@ -95,6 +141,7 @@ main (int argc, char **argv)
GstFormat track_format;
GstEvent *event;
gint count;
+ gboolean res;
gst_init (&argc, &argv);
@@ -133,30 +180,36 @@ main (int argc, char **argv)
GST_SEEK_FLAG_FLUSH,
3);
- gst_pad_send_event (pad, event);
+ res = gst_pad_send_event (pad, event);
+ if (!res)
+ g_warning ("seek failed");
+
gst_element_set_state (pipeline, GST_STATE_PLAYING);
count = 0;
while (gst_bin_iterate (GST_BIN (pipeline))) {
+ get_position_info (cdparanoia);
if (count++ > 500)
break;
}
gst_element_set_state (pipeline, GST_STATE_PAUSED);
- g_print ("playing track 3 only\n");
- /* seek to track3 */
- event = gst_event_new_segment_seek (track_format |
+ g_print ("\nplaying from second 25 to second 29\n");
+ /* seek to some seconds */
+ event = gst_event_new_segment_seek (GST_FORMAT_TIME |
GST_SEEK_METHOD_SET |
GST_SEEK_FLAG_FLUSH,
- 3, 4);
- gst_pad_send_event (pad, event);
+ 25 * GST_SECOND, 29 * GST_SECOND);
+ res = gst_pad_send_event (pad, event);
+ if (!res)
+ g_warning ("seek failed");
+
gst_element_set_state (pipeline, GST_STATE_PLAYING);
- count = 0;
while (gst_bin_iterate (GST_BIN (pipeline))) {
- if (count++ > 500)
- break;
+ get_position_info (cdparanoia);
}
+ g_print ("\n");
/* shutdown everything again */
gst_element_set_state (pipeline, GST_STATE_NULL);