seek.c 37.5 KB
Newer Older
1
#include <stdlib.h>
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
2 3 4 5 6
#include <glib.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <string.h>

7
static GList *seekable_pads = NULL;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
8
static GList *rate_pads = NULL;
9
static GList *seekable_elements = NULL;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
10 11

static GstElement *pipeline;
Wim Taymans's avatar
Wim Taymans committed
12 13
static gint64 position;
static gint64 duration;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
14
static GtkAdjustment *adjustment;
15
static GtkWidget *hscale;
16
static gboolean stats = FALSE;
17 18
static gboolean elem_seek = FALSE;
static gboolean verbose = FALSE;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
19 20

static guint update_id;
21 22
static guint seek_timeout_id = 0;
static gulong changed_id;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
23

Wim Taymans's avatar
Wim Taymans committed
24
//#define SOURCE "filesrc"
25
#define SOURCE "gnomevfssrc"
26 27
#define ASINK "alsasink"
//#define ASINK "osssink"
Wim Taymans's avatar
Wim Taymans committed
28 29 30
#define VSINK "xvimagesink"
//#define VSINK "ximagesink"
//#define VSINK "aasink"
31
//#define VSINK "cacasink"
32

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
33 34
#define UPDATE_INTERVAL 500

35
/* number of milliseconds to play for after a seek */
Wim Taymans's avatar
Wim Taymans committed
36 37
//#define SCRUB_TIME 250
//#define SCRUB
38

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
39
#define THREAD
40
#define PAD_SEEK
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
41 42 43

typedef struct
{
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
44 45 46
  const gchar *padname;
  GstPad *target;
  GstElement *bin;
47 48
}
dyn_link;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
49

50
static GstElement *
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
51
gst_element_factory_make_or_warn (gchar * type, gchar * name)
52 53 54 55
{
  GstElement *element = gst_element_factory_make (type, name);

  if (!element) {
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
56
    g_warning ("Failed to create element %s of type %s", name, type);
57 58 59 60 61
  }

  return element;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
62
static void
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
63
dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data)
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
64
{
65
  dyn_link *connect = (dyn_link *) data;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
66

67 68 69 70
  if (connect->padname == NULL ||
      !strcmp (gst_pad_get_name (newpad), connect->padname)) {
    if (connect->bin)
      gst_bin_add (GST_BIN (pipeline), connect->bin);
71
    gst_pad_link (newpad, connect->target);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
72

73
    //seekable_pads = g_list_prepend (seekable_pads, newpad);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
74 75 76 77 78
    rate_pads = g_list_prepend (rate_pads, newpad);
  }
}

static void
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
79 80
setup_dynamic_link (GstElement * element, const gchar * padname,
    GstPad * target, GstElement * bin)
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
81
{
82
  dyn_link *connect;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
83

84
  connect = g_new0 (dyn_link, 1);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
85 86 87
  connect->padname = g_strdup (padname);
  connect->target = target;
  connect->bin = bin;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
88

89
  g_signal_connect (G_OBJECT (element), "pad-added", G_CALLBACK (dynamic_link),
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
90
      connect);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
91 92
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
93 94
static GstElement *
make_mod_pipeline (const gchar * location)
95 96 97 98
{
  GstElement *pipeline;
  GstElement *src, *decoder, *audiosink;
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
99

100 101
  pipeline = gst_pipeline_new ("app");

102 103
  src = gst_element_factory_make_or_warn (SOURCE, "src");
  decoder = gst_element_factory_make_or_warn ("modplug", "decoder");
104
  audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
105 106 107 108 109 110 111 112
  //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);

  g_object_set (G_OBJECT (src), "location", location, NULL);

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), decoder);
  gst_bin_add (GST_BIN (pipeline), audiosink);

113 114
  gst_element_link (src, decoder);
  gst_element_link (decoder, audiosink);
115 116 117 118 119 120 121 122 123

  seekable = gst_element_get_pad (decoder, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
124 125
static GstElement *
make_dv_pipeline (const gchar * location)
Wim Taymans's avatar
Wim Taymans committed
126 127 128
{
  GstElement *pipeline;
  GstElement *src, *decoder, *audiosink, *videosink;
129
  GstElement *a_queue, *v_queue;
Wim Taymans's avatar
Wim Taymans committed
130
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
131

Wim Taymans's avatar
Wim Taymans committed
132 133 134 135
  pipeline = gst_pipeline_new ("app");

  src = gst_element_factory_make_or_warn (SOURCE, "src");
  decoder = gst_element_factory_make_or_warn ("dvdec", "decoder");
136 137 138
  v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
  videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
  a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
139
  audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
Wim Taymans's avatar
Wim Taymans committed
140 141 142 143 144

  g_object_set (G_OBJECT (src), "location", location, NULL);

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), decoder);
145
  gst_bin_add (GST_BIN (pipeline), a_queue);
Wim Taymans's avatar
Wim Taymans committed
146
  gst_bin_add (GST_BIN (pipeline), audiosink);
147
  gst_bin_add (GST_BIN (pipeline), v_queue);
Wim Taymans's avatar
Wim Taymans committed
148 149
  gst_bin_add (GST_BIN (pipeline), videosink);

150
  gst_element_link (src, decoder);
151 152 153 154
  gst_element_link (decoder, a_queue);
  gst_element_link (a_queue, audiosink);
  gst_element_link (decoder, v_queue);
  gst_element_link (v_queue, videosink);
Wim Taymans's avatar
Wim Taymans committed
155 156 157 158

  seekable = gst_element_get_pad (decoder, "video");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
159

Wim Taymans's avatar
Wim Taymans committed
160 161 162 163 164 165 166
  seekable = gst_element_get_pad (decoder, "audio");
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
167 168
static GstElement *
make_wav_pipeline (const gchar * location)
Wim Taymans's avatar
Wim Taymans committed
169 170 171 172
{
  GstElement *pipeline;
  GstElement *src, *decoder, *audiosink;
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
173

Wim Taymans's avatar
Wim Taymans committed
174 175
  pipeline = gst_pipeline_new ("app");

176 177
  src = gst_element_factory_make_or_warn (SOURCE, "src");
  decoder = gst_element_factory_make_or_warn ("wavparse", "decoder");
178
  audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
Wim Taymans's avatar
Wim Taymans committed
179 180 181 182 183 184 185 186
  //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);

  g_object_set (G_OBJECT (src), "location", location, NULL);

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), decoder);
  gst_bin_add (GST_BIN (pipeline), audiosink);

187 188
  gst_element_link (src, decoder);
  gst_element_link (decoder, audiosink);
Wim Taymans's avatar
Wim Taymans committed
189 190 191 192 193 194 195 196 197

  seekable = gst_element_get_pad (decoder, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
198 199
static GstElement *
make_flac_pipeline (const gchar * location)
200 201 202 203
{
  GstElement *pipeline;
  GstElement *src, *decoder, *audiosink;
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
204

205 206
  pipeline = gst_pipeline_new ("app");

207 208
  src = gst_element_factory_make_or_warn (SOURCE, "src");
  decoder = gst_element_factory_make_or_warn ("flacdec", "decoder");
209
  audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
Wim Taymans's avatar
Wim Taymans committed
210
  g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
211 212 213 214 215 216 217

  g_object_set (G_OBJECT (src), "location", location, NULL);

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), decoder);
  gst_bin_add (GST_BIN (pipeline), audiosink);

218 219
  gst_element_link (src, decoder);
  gst_element_link (decoder, audiosink);
220 221 222 223 224 225 226 227 228

  seekable = gst_element_get_pad (decoder, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
229 230
static GstElement *
make_sid_pipeline (const gchar * location)
231 232 233 234
{
  GstElement *pipeline;
  GstElement *src, *decoder, *audiosink;
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
235

236 237
  pipeline = gst_pipeline_new ("app");

238 239
  src = gst_element_factory_make_or_warn (SOURCE, "src");
  decoder = gst_element_factory_make_or_warn ("siddec", "decoder");
240
  audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
241 242 243 244 245 246 247 248
  //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);

  g_object_set (G_OBJECT (src), "location", location, NULL);

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), decoder);
  gst_bin_add (GST_BIN (pipeline), audiosink);

249 250
  gst_element_link (src, decoder);
  gst_element_link (decoder, audiosink);
251 252 253 254 255 256 257 258 259

  seekable = gst_element_get_pad (decoder, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
260 261
static GstElement *
make_parse_pipeline (const gchar * location)
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
262 263 264 265
{
  GstElement *pipeline;
  GstElement *src, *parser, *fakesink;
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
266

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
267 268
  pipeline = gst_pipeline_new ("app");

269 270 271
  src = gst_element_factory_make_or_warn (SOURCE, "src");
  parser = gst_element_factory_make_or_warn ("mpegparse", "parse");
  fakesink = gst_element_factory_make_or_warn ("fakesink", "sink");
Wim Taymans's avatar
Wim Taymans committed
272 273
  g_object_set (G_OBJECT (fakesink), "silent", TRUE, NULL);
  g_object_set (G_OBJECT (fakesink), "sync", TRUE, NULL);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
274 275 276 277 278 279 280

  g_object_set (G_OBJECT (src), "location", location, NULL);

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), parser);
  gst_bin_add (GST_BIN (pipeline), fakesink);

281 282
  gst_element_link (src, parser);
  gst_element_link (parser, fakesink);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
283 284

  seekable = gst_element_get_pad (parser, "src");
285
  seekable_pads = g_list_prepend (seekable_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
286 287 288 289 290 291
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (parser, "sink"));

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
292 293
static GstElement *
make_vorbis_pipeline (const gchar * location)
294
{
295 296
  GstElement *pipeline, *audio_bin;
  GstElement *src, *demux, *decoder, *convert, *audiosink;
297
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
298

299 300
  pipeline = gst_pipeline_new ("app");

301
  src = gst_element_factory_make_or_warn (SOURCE, "src");
302 303 304
  demux = gst_element_factory_make_or_warn ("oggdemux", "demux");
  decoder = gst_element_factory_make_or_warn ("vorbisdec", "decoder");
  convert = gst_element_factory_make_or_warn ("audioconvert", "convert");
305
  audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
Wim Taymans's avatar
Wim Taymans committed
306
  g_object_set (G_OBJECT (audiosink), "sync", TRUE, NULL);
307 308 309

  g_object_set (G_OBJECT (src), "location", location, NULL);

310 311
  audio_bin = gst_bin_new ("a_decoder_bin");

312
  gst_bin_add (GST_BIN (pipeline), src);
313 314 315 316 317
  gst_bin_add (GST_BIN (pipeline), demux);
  gst_bin_add (GST_BIN (audio_bin), decoder);
  gst_bin_add (GST_BIN (audio_bin), convert);
  gst_bin_add (GST_BIN (audio_bin), audiosink);
  gst_bin_add (GST_BIN (pipeline), audio_bin);
318

319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
  gst_element_link (src, demux);
  gst_element_link (decoder, convert);
  gst_element_link (convert, audiosink);

  setup_dynamic_link (demux, NULL, gst_element_get_pad (decoder, "sink"), NULL);

  seekable = gst_element_get_pad (decoder, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));

  return pipeline;
}

static GstElement *
make_theora_pipeline (const gchar * location)
{
  GstElement *pipeline, *video_bin;
  GstElement *src, *demux, *decoder, *convert, *videosink;
  GstElement *queue;
  GstPad *seekable;

  pipeline = gst_pipeline_new ("app");

  src = gst_element_factory_make_or_warn (SOURCE, "src");
  demux = gst_element_factory_make_or_warn ("oggdemux", "demux");
  queue = gst_element_factory_make_or_warn ("queue", "queue");
  decoder = gst_element_factory_make_or_warn ("theoradec", "decoder");
  convert = gst_element_factory_make_or_warn ("ffmpegcolorspace", "convert");
Wim Taymans's avatar
Wim Taymans committed
348
  videosink = gst_element_factory_make_or_warn (VSINK, "sink");
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367

  g_object_set (G_OBJECT (src), "location", location, NULL);

  video_bin = gst_bin_new ("v_decoder_bin");

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), demux);
  gst_bin_add (GST_BIN (pipeline), queue);
  gst_bin_add (GST_BIN (video_bin), decoder);
  gst_bin_add (GST_BIN (video_bin), convert);
  gst_bin_add (GST_BIN (video_bin), videosink);
  gst_bin_add (GST_BIN (pipeline), video_bin);

  gst_element_link (src, demux);
  gst_element_link (queue, decoder);
  gst_element_link (decoder, convert);
  gst_element_link (convert, videosink);

  setup_dynamic_link (demux, NULL, gst_element_get_pad (queue, "sink"), NULL);
368 369 370 371 372 373 374 375 376

  seekable = gst_element_get_pad (decoder, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));

  return pipeline;
}

377 378 379 380 381 382 383 384
static GstElement *
make_vorbis_theora_pipeline (const gchar * location)
{
  GstElement *pipeline, *audio_bin, *video_bin;
  GstElement *src, *demux, *a_decoder, *a_convert, *v_decoder, *v_convert;
  GstElement *audiosink, *videosink;
  GstElement *a_queue, *v_queue;
  GstPad *seekable;
Wim Taymans's avatar
Wim Taymans committed
385
  GstPad *pad;
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401

  pipeline = gst_pipeline_new ("app");

  src = gst_element_factory_make_or_warn (SOURCE, "src");
  g_object_set (G_OBJECT (src), "location", location, NULL);

  demux = gst_element_factory_make_or_warn ("oggdemux", "demux");

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), demux);
  gst_element_link (src, demux);

  audio_bin = gst_bin_new ("a_decoder_bin");
  a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
  a_decoder = gst_element_factory_make_or_warn ("vorbisdec", "a_dec");
  a_convert = gst_element_factory_make_or_warn ("audioconvert", "a_convert");
402
  audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
403

404
  gst_bin_add (GST_BIN (pipeline), audio_bin);
405 406 407 408 409 410

  gst_bin_add (GST_BIN (audio_bin), a_queue);
  gst_bin_add (GST_BIN (audio_bin), a_decoder);
  gst_bin_add (GST_BIN (audio_bin), a_convert);
  gst_bin_add (GST_BIN (audio_bin), audiosink);

411 412 413
  gst_element_link (a_queue, a_decoder);
  gst_element_link (a_decoder, a_convert);
  gst_element_link (a_convert, audiosink);
414

Wim Taymans's avatar
Wim Taymans committed
415 416 417
  pad = gst_element_get_pad (a_queue, "sink");
  gst_element_add_pad (audio_bin, gst_ghost_pad_new ("sink", pad));
  gst_object_unref (GST_OBJECT_CAST (pad));
418 419 420

  setup_dynamic_link (demux, NULL, gst_element_get_pad (audio_bin, "sink"),
      NULL);
421 422 423 424 425 426

  video_bin = gst_bin_new ("v_decoder_bin");
  v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
  v_decoder = gst_element_factory_make_or_warn ("theoradec", "v_dec");
  v_convert =
      gst_element_factory_make_or_warn ("ffmpegcolorspace", "v_convert");
Wim Taymans's avatar
Wim Taymans committed
427
  videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
428 429

  gst_bin_add (GST_BIN (pipeline), video_bin);
430 431 432 433 434 435

  gst_bin_add (GST_BIN (video_bin), v_queue);
  gst_bin_add (GST_BIN (video_bin), v_decoder);
  gst_bin_add (GST_BIN (video_bin), v_convert);
  gst_bin_add (GST_BIN (video_bin), videosink);

436
  gst_element_link_many (v_queue, v_decoder, v_convert, videosink, NULL);
437

Wim Taymans's avatar
Wim Taymans committed
438 439 440
  pad = gst_element_get_pad (v_queue, "sink");
  gst_element_add_pad (video_bin, gst_ghost_pad_new ("sink", pad));
  gst_object_unref (GST_OBJECT_CAST (pad));
441 442 443

  setup_dynamic_link (demux, NULL, gst_element_get_pad (video_bin, "sink"),
      NULL);
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477

  seekable = gst_element_get_pad (a_decoder, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads =
      g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink"));

  return pipeline;
}

static GstElement *
make_avi_msmpeg4v3_mp3_pipeline (const gchar * location)
{
  GstElement *pipeline, *audio_bin, *video_bin;
  GstElement *src, *demux, *a_decoder, *a_convert, *v_decoder, *v_convert;
  GstElement *audiosink, *videosink;
  GstElement *a_queue, *v_queue;
  GstPad *seekable;

  pipeline = gst_pipeline_new ("app");

  src = gst_element_factory_make_or_warn (SOURCE, "src");
  g_object_set (G_OBJECT (src), "location", location, NULL);

  demux = gst_element_factory_make_or_warn ("avidemux", "demux");

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), demux);
  gst_element_link (src, demux);

  audio_bin = gst_bin_new ("a_decoder_bin");
  a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
  a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
  a_convert = gst_element_factory_make_or_warn ("audioconvert", "a_convert");
478
  audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497

  gst_element_link (a_queue, a_decoder);
  gst_element_link (a_decoder, a_convert);
  gst_element_link (a_convert, audiosink);

  gst_bin_add (GST_BIN (audio_bin), a_queue);
  gst_bin_add (GST_BIN (audio_bin), a_decoder);
  gst_bin_add (GST_BIN (audio_bin), a_convert);
  gst_bin_add (GST_BIN (audio_bin), audiosink);

  gst_bin_add (GST_BIN (pipeline), audio_bin);

  setup_dynamic_link (demux, NULL, gst_element_get_pad (a_queue, "sink"), NULL);

  video_bin = gst_bin_new ("v_decoder_bin");
  v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
  v_decoder = gst_element_factory_make_or_warn ("ffdec_msmpeg4", "v_dec");
  v_convert =
      gst_element_factory_make_or_warn ("ffmpegcolorspace", "v_convert");
Wim Taymans's avatar
Wim Taymans committed
498
  videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
  gst_element_link_many (v_queue, v_decoder, v_convert, videosink, NULL);

  gst_bin_add (GST_BIN (video_bin), v_queue);
  gst_bin_add (GST_BIN (video_bin), v_decoder);
  gst_bin_add (GST_BIN (video_bin), v_convert);
  gst_bin_add (GST_BIN (video_bin), videosink);

  gst_bin_add (GST_BIN (pipeline), video_bin);

  setup_dynamic_link (demux, NULL, gst_element_get_pad (v_queue, "sink"), NULL);

  seekable = gst_element_get_pad (a_decoder, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads =
      g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink"));

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
519 520
static GstElement *
make_mp3_pipeline (const gchar * location)
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
521 522
{
  GstElement *pipeline;
523
  GstElement *src, *decoder, *osssink, *queue;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
524
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
525

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
526 527
  pipeline = gst_pipeline_new ("app");

528 529 530
  src = gst_element_factory_make_or_warn (SOURCE, "src");
  decoder = gst_element_factory_make_or_warn ("mad", "dec");
  queue = gst_element_factory_make_or_warn ("queue", "queue");
531
  osssink = gst_element_factory_make_or_warn (ASINK, "sink");
532

533
  seekable_elements = g_list_prepend (seekable_elements, osssink);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
534 535

  g_object_set (G_OBJECT (src), "location", location, NULL);
536
  g_object_set (G_OBJECT (osssink), "fragment", 0x00180008, NULL);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
537

538 539
  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), decoder);
540 541
  gst_bin_add (GST_BIN (pipeline), queue);
  gst_bin_add (GST_BIN (pipeline), osssink);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
542

543 544
  gst_element_link (src, decoder);
  gst_element_link (decoder, queue);
545
  gst_element_link (queue, osssink);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
546

547 548
  seekable = gst_element_get_pad (queue, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
549 550 551 552 553 554
  rate_pads = g_list_prepend (rate_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
555 556
static GstElement *
make_avi_pipeline (const gchar * location)
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
557 558 559
{
  GstElement *pipeline, *audio_bin, *video_bin;
  GstElement *src, *demux, *a_decoder, *v_decoder, *audiosink, *videosink;
560
  GstElement *a_queue = NULL, *v_queue = NULL;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
561
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
562

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
563 564
  pipeline = gst_pipeline_new ("app");

565
  src = gst_element_factory_make_or_warn (SOURCE, "src");
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
566 567
  g_object_set (G_OBJECT (src), "location", location, NULL);

568
  demux = gst_element_factory_make_or_warn ("avidemux", "demux");
569
  seekable_elements = g_list_prepend (seekable_elements, demux);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
570 571 572

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), demux);
573
  gst_element_link (src, demux);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
574 575

  audio_bin = gst_bin_new ("a_decoder_bin");
576
  a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
577
  audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
578
  //g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
579
  a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
580 581
  gst_element_link (a_decoder, a_queue);
  gst_element_link (a_queue, audiosink);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
582
  gst_bin_add (GST_BIN (audio_bin), a_decoder);
583 584
  gst_bin_add (GST_BIN (audio_bin), a_queue);
  gst_bin_add (GST_BIN (audio_bin), audiosink);
Wim Taymans's avatar
Wim Taymans committed
585
  gst_element_set_state (audio_bin, GST_STATE_PAUSED);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
586

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
587
  setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder,
588
          "sink"), audio_bin);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
589 590

  seekable = gst_element_get_pad (a_queue, "src");
591
  seekable_pads = g_list_prepend (seekable_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
592
  rate_pads = g_list_prepend (rate_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
593 594
  rate_pads =
      g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink"));
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
595 596

  video_bin = gst_bin_new ("v_decoder_bin");
597
  //v_decoder = gst_element_factory_make_or_warn ("identity", "v_dec");
Wim Taymans's avatar
Wim Taymans committed
598
  //v_decoder = gst_element_factory_make_or_warn ("windec", "v_dec");
Wim Taymans's avatar
Wim Taymans committed
599
  v_decoder = gst_element_factory_make_or_warn ("ffmpegdecall", "v_dec");
600
  videosink = gst_element_factory_make_or_warn ("ximagesink", "v_sink");
601
  //videosink = gst_element_factory_make_or_warn ("fakesink", "v_sink");
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
602
  //g_object_set (G_OBJECT (videosink), "sync", TRUE, NULL);
603
  v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
Wim Taymans's avatar
Wim Taymans committed
604
  //g_object_set (G_OBJECT (v_queue), "max_level", 10, NULL);
605 606
  gst_element_link (v_decoder, v_queue);
  gst_element_link (v_queue, videosink);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
607
  gst_bin_add (GST_BIN (video_bin), v_decoder);
608 609
  gst_bin_add (GST_BIN (video_bin), v_queue);
  gst_bin_add (GST_BIN (video_bin), videosink);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
610

Wim Taymans's avatar
Wim Taymans committed
611
  gst_element_set_state (video_bin, GST_STATE_PAUSED);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
612

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
613
  setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder,
614
          "sink"), video_bin);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
615 616

  seekable = gst_element_get_pad (v_queue, "src");
617
  seekable_pads = g_list_prepend (seekable_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
618
  rate_pads = g_list_prepend (rate_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
619 620
  rate_pads =
      g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink"));
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
621 622 623 624

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
625 626
static GstElement *
make_mpeg_pipeline (const gchar * location)
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
627 628
{
  GstElement *pipeline, *audio_bin, *video_bin;
629 630
  GstElement *src, *demux, *a_decoder, *v_decoder, *v_filter;
  GstElement *audiosink, *videosink;
631
  GstElement *a_queue, *v_queue;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
632
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
633

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
634 635
  pipeline = gst_pipeline_new ("app");

636
  src = gst_element_factory_make_or_warn (SOURCE, "src");
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
637 638
  g_object_set (G_OBJECT (src), "location", location, NULL);

639
  demux = gst_element_factory_make_or_warn ("mpegdemux", "demux");
Wim Taymans's avatar
Wim Taymans committed
640
  g_object_set (G_OBJECT (demux), "sync", FALSE, NULL);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
641

642 643
  seekable_elements = g_list_prepend (seekable_elements, demux);

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
644 645
  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), demux);
646
  gst_element_link (src, demux);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
647 648

  audio_bin = gst_bin_new ("a_decoder_bin");
649 650
  a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
  a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
651
  audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
652
  g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
653 654
  gst_element_link (a_decoder, a_queue);
  gst_element_link (a_queue, audiosink);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
655
  gst_bin_add (GST_BIN (audio_bin), a_decoder);
656 657
  gst_bin_add (GST_BIN (audio_bin), a_queue);
  gst_bin_add (GST_BIN (audio_bin), audiosink);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
658

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
659
  setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder,
660
          "sink"), audio_bin);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
661 662

  seekable = gst_element_get_pad (a_queue, "src");
663
  seekable_pads = g_list_prepend (seekable_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
664
  rate_pads = g_list_prepend (rate_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
665 666
  rate_pads =
      g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink"));
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
667 668

  video_bin = gst_bin_new ("v_decoder_bin");
669
  v_decoder = gst_element_factory_make_or_warn ("mpeg2dec", "v_dec");
Wim Taymans's avatar
Wim Taymans committed
670
  //g_object_set (G_OBJECT (video_thread), "priority", 2, NULL);
671
  v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
672
  v_filter = gst_element_factory_make_or_warn ("ffmpegcolorspace", "v_filter");
673
  videosink = gst_element_factory_make_or_warn ("ximagesink", "v_sink");
674
  gst_element_link_many (v_decoder, v_queue, v_filter, NULL);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
675

676
  gst_element_link (v_filter, videosink);
677 678
  gst_bin_add_many (GST_BIN (video_bin), v_decoder, NULL);
  gst_bin_add_many (GST_BIN (video_bin), v_queue, v_filter, videosink, NULL);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
679

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
680
  setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder,
681
          "sink"), video_bin);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
682 683

  seekable = gst_element_get_pad (v_queue, "src");
684
  seekable_pads = g_list_prepend (seekable_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
685
  rate_pads = g_list_prepend (rate_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
686 687
  rate_pads =
      g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink"));
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
688 689 690 691

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
692 693
static GstElement *
make_mpegnt_pipeline (const gchar * location)
Wim Taymans's avatar
Wim Taymans committed
694 695 696 697
{
  GstElement *pipeline, *audio_bin, *video_bin;
  GstElement *src, *demux, *a_decoder, *v_decoder, *v_filter;
  GstElement *audiosink, *videosink;
698
  GstElement *a_queue;
Wim Taymans's avatar
Wim Taymans committed
699
  GstPad *seekable;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
700

Wim Taymans's avatar
Wim Taymans committed
701 702 703 704 705 706 707 708 709 710 711 712
  pipeline = gst_pipeline_new ("app");

  src = gst_element_factory_make_or_warn (SOURCE, "src");
  g_object_set (G_OBJECT (src), "location", location, NULL);

  demux = gst_element_factory_make_or_warn ("mpegdemux", "demux");
  //g_object_set (G_OBJECT (demux), "sync", TRUE, NULL);

  seekable_elements = g_list_prepend (seekable_elements, demux);

  gst_bin_add (GST_BIN (pipeline), src);
  gst_bin_add (GST_BIN (pipeline), demux);
713
  gst_element_link (src, demux);
Wim Taymans's avatar
Wim Taymans committed
714 715 716 717

  audio_bin = gst_bin_new ("a_decoder_bin");
  a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
  a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
718
  audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
Wim Taymans's avatar
Wim Taymans committed
719 720
  //g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
  g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
721 722
  gst_element_link (a_decoder, a_queue);
  gst_element_link (a_queue, audiosink);
Wim Taymans's avatar
Wim Taymans committed
723
  gst_bin_add (GST_BIN (audio_bin), a_decoder);
724 725
  gst_bin_add (GST_BIN (audio_bin), a_queue);
  gst_bin_add (GST_BIN (audio_bin), audiosink);
Wim Taymans's avatar
Wim Taymans committed
726

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
727
  setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder,
728
          "sink"), audio_bin);
Wim Taymans's avatar
Wim Taymans committed
729 730 731 732

  seekable = gst_element_get_pad (a_queue, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
733 734
  rate_pads =
      g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink"));
Wim Taymans's avatar
Wim Taymans committed
735 736 737

  video_bin = gst_bin_new ("v_decoder_bin");
  v_decoder = gst_element_factory_make_or_warn ("mpeg2dec", "v_dec");
738
  v_filter = gst_element_factory_make_or_warn ("ffmpegcolorspace", "v_filter");
739
  videosink = gst_element_factory_make_or_warn ("ximagesink", "v_sink");
740
  gst_element_link_many (v_decoder, v_filter, videosink, NULL);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
741

Wim Taymans's avatar
Wim Taymans committed
742 743
  gst_bin_add_many (GST_BIN (video_bin), v_decoder, v_filter, videosink, NULL);

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
744
  setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder,
745
          "sink"), video_bin);
Wim Taymans's avatar
Wim Taymans committed
746 747 748 749

  seekable = gst_element_get_pad (v_decoder, "src");
  seekable_pads = g_list_prepend (seekable_pads, seekable);
  rate_pads = g_list_prepend (rate_pads, seekable);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
750 751
  rate_pads =
      g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink"));
Wim Taymans's avatar
Wim Taymans committed
752 753 754 755

  return pipeline;
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
756 757
static GstElement *
make_playerbin_pipeline (const gchar * location)
Wim Taymans's avatar
Wim Taymans committed
758
{
759
  GstElement *player;
760 761 762 763

  player = gst_element_factory_make ("playbin", "player");
  g_assert (player);

764
  g_object_set (G_OBJECT (player), "uri", location, NULL);
765 766 767 768 769 770 771

  seekable_elements = g_list_prepend (seekable_elements, player);

  /* force element seeking on this pipeline */
  elem_seek = TRUE;

  return player;
Wim Taymans's avatar
Wim Taymans committed
772 773
}

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
774 775
static gchar *
format_value (GtkScale * scale, gdouble value)
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
776
{
777 778 779 780 781 782 783
  gint64 real;
  gint64 seconds;
  gint64 subseconds;

  real = value * duration / 100;
  seconds = (gint64) real / GST_SECOND;
  subseconds = (gint64) real / (GST_SECOND / 100);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
784

785 786
  return g_strdup_printf ("%02" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT ":%02"
      G_GINT64_FORMAT, seconds / 60, seconds % 60, subseconds % 100);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
787 788 789 790 791 792
}

typedef struct
{
  const gchar *name;
  const GstFormat format;
793 794
}
seek_format;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
795

Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
796 797 798 799 800 801
static seek_format seek_formats[] = {
  {"tim", GST_FORMAT_TIME},
  {"byt", GST_FORMAT_BYTES},
  {"buf", GST_FORMAT_BUFFERS},
  {"def", GST_FORMAT_DEFAULT},
  {NULL, 0},
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819
};

G_GNUC_UNUSED static void
query_rates (void)
{
  GList *walk = rate_pads;

  while (walk) {
    GstPad *pad = GST_PAD (walk->data);
    gint i = 0;

    g_print ("rate/sec  %8.8s: ", GST_PAD_NAME (pad));
    while (seek_formats[i].name) {
      gint64 value;
      GstFormat format;

      format = seek_formats[i].format;

Wim Taymans's avatar
Wim Taymans committed
820 821
      if (gst_pad_query_convert (pad, GST_FORMAT_TIME, GST_SECOND, &format,
              &value)) {
822
        g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
823
      } else {
824
        g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
825 826 827 828 829 830 831 832 833 834 835
      }

      i++;
    }
    g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));

    walk = g_list_next (walk);
  }
}

G_GNUC_UNUSED static void
836 837 838 839 840 841 842 843 844 845
query_positions_elems ()
{
  GList *walk = seekable_elements;

  while (walk) {
    GstElement *element = GST_ELEMENT (walk->data);
    gint i = 0;

    g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
    while (seek_formats[i].name) {
Wim Taymans's avatar
Wim Taymans committed
846
      gint64 position, total;
847 848 849
      GstFormat format;

      format = seek_formats[i].format;
Wim Taymans's avatar
Wim Taymans committed
850 851 852 853

      if (gst_element_query_position (element, &format, &position, &total)) {
        g_print ("%s %13" G_GINT64_FORMAT " / %13" G_GINT64_FORMAT " | ",
            seek_formats[i].name, position, total);
854
      } else {
Wim Taymans's avatar
Wim Taymans committed
855 856
        g_print ("%s %13.13s / %13.13s | ", seek_formats[i].name, "*NA*",
            "*NA*");
857 858 859 860 861 862 863 864 865 866 867
      }
      i++;
    }
    g_print (" %s\n", GST_ELEMENT_NAME (element));

    walk = g_list_next (walk);
  }
}

G_GNUC_UNUSED static void
query_positions_pads ()
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
868
{
869 870 871 872 873 874 875 876 877
  GList *walk = seekable_pads;

  while (walk) {
    GstPad *pad = GST_PAD (walk->data);
    gint i = 0;

    g_print ("positions %8.8s: ", GST_PAD_NAME (pad));
    while (seek_formats[i].name) {
      GstFormat format;
Wim Taymans's avatar
Wim Taymans committed
878
      gint64 position, total;
879 880

      format = seek_formats[i].format;
Wim Taymans's avatar
Wim Taymans committed
881 882 883 884

      if (gst_pad_query_position (pad, &format, &position, &total)) {
        g_print ("%s %13" G_GINT64_FORMAT " / %13" G_GINT64_FORMAT " | ",
            seek_formats[i].name, position, total);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
885
      } else {
Wim Taymans's avatar
Wim Taymans committed
886 887
        g_print ("%s %13.13s / %13.13s | ", seek_formats[i].name, "*NA*",
            "*NA*");
888
      }
Wim Taymans's avatar
Wim Taymans committed
889

890
      i++;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
891
    }
892 893 894
    g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));

    walk = g_list_next (walk);
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
895 896 897 898
  }
}

static gboolean
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
899
update_scale (gpointer data)
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
900 901
{
  GstClock *clock;
Wim Taymans's avatar
Wim Taymans committed
902
  GstFormat format;