0e27a3ff4a438bf35e8cd2c4372a01bca20b2c07
[platform/upstream/gstreamer.git] / tests / seeking / seeking1.c
1 #include <gst/gst.h>
2
3 static gint looping;
4 static GstEvent *event;
5 static GstPad *pad;
6
7 static void
8 event_received (GObject * object, GstEvent * event, GstElement * pipeline)
9 {
10   if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT_DONE) {
11     g_print ("segment done\n");
12     if (--looping == 1) {
13       event = gst_event_new_segment_seek (GST_FORMAT_DEFAULT |
14           GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, 20, 25);
15     } else {
16       event = gst_event_new_segment_seek (GST_FORMAT_DEFAULT |
17           GST_SEEK_METHOD_SET |
18           GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT_LOOP, 50, 55);
19     }
20     gst_pad_send_event (pad, event);
21   }
22 }
23
24 gint
25 main (gint argc, gchar * argv[])
26 {
27   GstElement *pipeline;
28   GstElement *fakesrc;
29   GstElement *fakesink;
30   guint64 value;
31   GstFormat format;
32
33   gst_init (&argc, &argv);
34
35   pipeline = gst_pipeline_new ("pipeline");
36
37   fakesrc = gst_element_factory_make ("fakesrc", "src");
38
39   fakesink = gst_element_factory_make ("fakesink", "sink");
40
41   gst_bin_add (GST_BIN (pipeline), fakesrc);
42   gst_bin_add (GST_BIN (pipeline), fakesink);
43
44   gst_element_link_pads (fakesrc, "src", fakesink, "sink");
45
46   gst_element_set_state (pipeline, GST_STATE_READY);
47
48   pad = gst_element_get_pad (fakesrc, "src");
49
50   g_print ("doing segment seek from 5 to 10\n");
51
52   gst_pad_send_event (pad,
53       gst_event_new_segment_seek (GST_FORMAT_DEFAULT |
54           GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, 5, 10));
55
56   format = GST_FORMAT_DEFAULT;
57
58   gst_pad_query (pad, GST_QUERY_START, &format, &value);
59   g_print ("configured for start   %" G_GINT64_FORMAT "\n", value);
60   gst_pad_query (pad, GST_QUERY_SEGMENT_END, &format, &value);
61   g_print ("configured segment end %" G_GINT64_FORMAT "\n", value);
62
63
64   gst_element_set_state (pipeline, GST_STATE_PLAYING);
65
66   g_signal_connect (G_OBJECT (pipeline), "deep_notify",
67       G_CALLBACK (gst_element_default_deep_notify), NULL);
68
69   while (gst_bin_iterate (GST_BIN (pipeline)));
70
71   g_print
72       ("doing segment seek from 50 to 55 with looping (2 times), then 20 to 25 without looping\n");
73   looping = 3;
74
75   event = gst_event_new_segment_seek (GST_FORMAT_DEFAULT |
76       GST_SEEK_METHOD_SET |
77       GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT_LOOP, 50, 55);
78   gst_pad_send_event (pad, event);
79
80   g_signal_connect (G_OBJECT (gst_element_get_pad (fakesink, "sink")),
81       "event_received", G_CALLBACK (event_received), event);
82
83   gst_pad_query (pad, GST_QUERY_START, &format, &value);
84   g_print ("configured for start   %" G_GINT64_FORMAT "\n", value);
85   gst_pad_query (pad, GST_QUERY_SEGMENT_END, &format, &value);
86   g_print ("configured segment end %" G_GINT64_FORMAT "\n", value);
87
88   gst_element_set_state (pipeline, GST_STATE_PLAYING);
89
90   while (gst_bin_iterate (GST_BIN (pipeline)));
91
92   gst_element_set_state (pipeline, GST_STATE_NULL);
93
94   return 0;
95 }