Blame tests/icles/position-formats.c

Packit 971217
/*
Packit 971217
 * position-formats.c
Packit 971217
 *
Packit 971217
 * we mostly use GST_FORMAT_TIME in queries and seeks. Test the other ones to
Packit 971217
 * know what works and what not.
Packit 971217
 */
Packit 971217
Packit 971217
#include <gst/gst.h>
Packit 971217
Packit 971217
#include <stdio.h>
Packit 971217
Packit 971217
static gboolean
Packit 971217
bus_message (GstBus * bus, GstMessage * message, gpointer user_data)
Packit 971217
{
Packit 971217
  GMainLoop *loop = (GMainLoop *) user_data;
Packit 971217
Packit 971217
  switch (GST_MESSAGE_TYPE (message)) {
Packit 971217
    case GST_MESSAGE_ERROR:
Packit 971217
    {
Packit 971217
      GError *gerror;
Packit 971217
      gchar *debug;
Packit 971217
Packit 971217
      gst_message_parse_error (message, &gerror, &debug);
Packit 971217
      gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
Packit 971217
      g_error_free (gerror);
Packit 971217
      g_free (debug);
Packit 971217
Packit 971217
      g_main_loop_quit (loop);
Packit 971217
      break;
Packit 971217
    }
Packit 971217
    case GST_MESSAGE_WARNING:
Packit 971217
    {
Packit 971217
      GError *gerror;
Packit 971217
      gchar *debug;
Packit 971217
Packit 971217
      gst_message_parse_warning (message, &gerror, &debug);
Packit 971217
      gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
Packit 971217
      g_error_free (gerror);
Packit 971217
      g_free (debug);
Packit 971217
Packit 971217
      g_main_loop_quit (loop);
Packit 971217
      break;
Packit 971217
    }
Packit 971217
    case GST_MESSAGE_EOS:
Packit 971217
      g_main_loop_quit (loop);
Packit 971217
      break;
Packit 971217
    default:
Packit 971217
      break;
Packit 971217
  }
Packit 971217
  return TRUE;
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
print_value (gboolean res, GstFormat fmt, gint64 val)
Packit 971217
{
Packit 971217
  if (res) {
Packit 971217
    switch (fmt) {
Packit 971217
      case GST_FORMAT_TIME:
Packit 971217
        printf ("%" GST_TIME_FORMAT, GST_TIME_ARGS (val));
Packit 971217
        break;
Packit 971217
      case GST_FORMAT_PERCENT:
Packit 971217
        printf ("%8.4lf%%", (gdouble) val / GST_FORMAT_PERCENT_SCALE);
Packit 971217
        break;
Packit 971217
      case GST_FORMAT_DEFAULT:
Packit 971217
      case GST_FORMAT_BYTES:
Packit 971217
      case GST_FORMAT_BUFFERS:
Packit 971217
      default:
Packit 971217
        printf ("%" G_GINT64_FORMAT, val);
Packit 971217
        break;
Packit 971217
    }
Packit 971217
  } else {
Packit 971217
    printf ("-");
Packit 971217
  }
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
run_queries (gpointer user_data)
Packit 971217
{
Packit 971217
  GstElement *bin = (GstElement *) user_data;
Packit 971217
  GstFormat i, fmt;
Packit 971217
  gint64 pos, dur;
Packit 971217
  gboolean pres, dres;
Packit 971217
Packit 971217
  for (i = GST_FORMAT_DEFAULT; i <= GST_FORMAT_PERCENT; i++) {
Packit 971217
    fmt = i;
Packit 971217
    pres = gst_element_query_position (bin, fmt, &pos;;
Packit 971217
    fmt = i;
Packit 971217
    dres = gst_element_query_duration (bin, fmt, &dur;;
Packit 971217
    printf ("%-8s : ", gst_format_get_name (i));
Packit 971217
    print_value (pres, fmt, pos);
Packit 971217
    printf (" / ");
Packit 971217
    print_value (dres, fmt, dur);
Packit 971217
    printf ("\n");
Packit 971217
  }
Packit 971217
  printf ("\n");
Packit 971217
Packit 971217
  return TRUE;
Packit 971217
}
Packit 971217
Packit 971217
gint
Packit 971217
main (gint argc, gchar ** argv)
Packit 971217
{
Packit 971217
  gint res = 1;
Packit 971217
  GstElement *bin;
Packit 971217
  GstBus *bus;
Packit 971217
  GMainLoop *loop;
Packit 971217
  const gchar *uri;
Packit 971217
Packit 971217
  gst_init (&argc, &argv);
Packit 971217
Packit 971217
  if (argc < 2) {
Packit 971217
    printf ("Usage: %s <uri>\n", argv[0]);
Packit 971217
    goto Error;
Packit 971217
  }
Packit 971217
  uri = argv[1];
Packit 971217
Packit 971217
  /* build pipeline */
Packit 971217
  bin = gst_element_factory_make ("playbin", NULL);
Packit 971217
  if (!bin) {
Packit 971217
    GST_WARNING ("need playbin from gst-plugins-base");
Packit 971217
    goto Error;
Packit 971217
  }
Packit 971217
Packit 971217
  g_object_set (bin, "uri", uri, NULL);
Packit 971217
Packit 971217
  loop = g_main_loop_new (NULL, TRUE);
Packit 971217
Packit 971217
  /* add watch for messages */
Packit 971217
  bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
Packit 971217
  gst_bus_add_watch (bus, (GstBusFunc) bus_message, (gpointer) loop);
Packit 971217
  gst_object_unref (bus);
Packit 971217
Packit 971217
  /* add timeout for queries */
Packit 971217
  g_timeout_add_seconds (1, (GSourceFunc) run_queries, (gpointer) bin);
Packit 971217
Packit 971217
  /* run the show */
Packit 971217
  if (gst_element_set_state (bin,
Packit 971217
          GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE) {
Packit 971217
    g_main_loop_run (loop);
Packit 971217
    gst_element_set_state (bin, GST_STATE_NULL);
Packit 971217
  }
Packit 971217
Packit 971217
  /* cleanup */
Packit 971217
  g_main_loop_unref (loop);
Packit 971217
  gst_object_unref (G_OBJECT (bin));
Packit 971217
  res = 0;
Packit 971217
Error:
Packit 971217
  return (res);
Packit 971217
}