Problem in seek for non-seekable file

satish pattar satish.pattar at gmail.com
Thu May 5 05:10:45 PDT 2011


Hello All,

I have a basic understanding of gstreamer, the problem i am facing may be
trivial , please bear with me.
What I am trying  to make use of playbin2 for playing a non-seekable file (I
am using pipe & doing "cat  *.mp3 > /home/my_pipe after running my app)

Here is my app
-------------------------------------------------------

include <gst/gst.h>

static int cnt = 0;
static gboolean
cb_print_position (GstElement *pipeline)
{
  GstFormat fmt = GST_FORMAT_TIME;
  gint64 pos, len;

  if (gst_element_query_position (pipeline, &fmt, &pos) &&
gst_element_query_duration (pipeline, &fmt, &len))
  {
      GTimeVal tv_pos, tv_len;
      GST_TIME_TO_TIMEVAL (pos, tv_pos);
      GST_TIME_TO_TIMEVAL (len, tv_len);
      glong pos_min = tv_pos.tv_sec / 60;
      glong len_min = tv_len.tv_sec / 60;
      g_print ("\rCount %d) : Time:   %01lu:%02lu:%02lu.%02lu", cnt++ ,
pos_min / 60, pos_min % 60, tv_pos.tv_sec % 60, tv_pos.tv_usec / 10000);
      if (len > 0)   /* streams have len == -1 */
        g_print (" of %01lu:%02lu:%02lu.%02lu", len_min / 60, len_min % 60,
tv_len.tv_sec % 60, tv_len.tv_usec / 10000);
  }

  if(cnt == 50)
  {
        printf("Going to Seek for 10 sec \n");
        GstFormat fmt = GST_FORMAT_TIME;
        gint64    cur_pos;

        if (!(gst_element_query_position (pipeline, &fmt, &cur_pos)))
          printf("[player] : gst_element_query_position failed \n");

        g_print("The cur_pos %" G_GINT64_FORMAT , cur_pos);

        double new_pos_sec = cur_pos * (1.0 / GST_SECOND) + 10; // 10 sec
        gint64 new_pos = new_pos_sec * GST_SECOND ;
        printf("new_pos = %" G_GINT64_FORMAT , new_pos);
        if(!(gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET,
                      new_pos , GST_SEEK_TYPE_NONE,  GST_CLOCK_TIME_NONE)))
                printf("\n[player] Seek failed!! \n");
        else
                printf("\n[Player] Seek successful \n");
  }
  return TRUE;
}

static gboolean
my_bus_callback (GstBus     *bus,
          GstMessage *msg,
          gpointer    data)
{
  GMainLoop *loop = (GMainLoop *) data;
  switch (GST_MESSAGE_TYPE (msg)) {
    case GST_MESSAGE_EOS:
     g_print ("End of stream\n");
      g_main_loop_quit (loop);
      break;
    case GST_MESSAGE_ERROR: {
      gchar *debug;
      GError *error;
      gst_message_parse_error (msg, &error, &debug);
      g_free (debug);
      g_printerr ("Error: %s\n", error->message);
      g_error_free (error);
      g_main_loop_quit (loop);
      break;
    }
    default:
      break;
  }
  return TRUE;
}

gint
main (gint   argc,
      gchar *argv[])
{
  GMainLoop *loop;
  GstElement *play;
  GstBus *bus;
  /* init GStreamer */
  gst_init (&argc, &argv);
  loop = g_main_loop_new (NULL, FALSE);
  /* make sure we have a URI */
  if (argc != 2) {
    g_print ("Usage: %s <URI>\n", argv[0]);
    return -1;
  }
  /* set up */
  play = gst_element_factory_make ("playbin2", "play");
  g_object_set (G_OBJECT (play), "uri", argv[1], NULL);
  bus = gst_pipeline_get_bus (GST_PIPELINE (play));
  gst_bus_add_watch (bus, my_bus_callback, loop);
  gst_object_unref (bus);
  gst_element_set_state (play, GST_STATE_PLAYING);
  g_timeout_add (200, (GSourceFunc) cb_print_position, play);
  /* now run */
  g_main_loop_run (loop);
  /* also clean up */
  gst_element_set_state (play, GST_STATE_NULL);
  gst_object_unref (GST_OBJECT (play));
  return 0;
}

--------------------------------- End --------------------------------
run:
<my_app>  my_pipe

o/p:
Count 49) : Time:   0:00:09.85
Going to Seek for 10 sec
The cur_pos 9852113000
new_pos = 19852112999
[player] Seek failed!!
Count 118) : Time:   0:00:23.63

--------------------------------
observation:


1) Playback successfuly between count 1- 49.
2) At count= 50 i.e., when seek called , the seek fails. & there was no
sound though player is in PLAYING state between count <50 to 100>
3) After count = 100 , resumed normal playback.

Why there is no sound after seek failed though player was in PLAYING state.

The same behavior I observed with my own pipeline [ filesrc  ! decodebon2 !
autoaudiosink ]

Appreciate your input.


-- 
Thanks & Regards,

Satish Pattar
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20110505/8cae054f/attachment.htm>


More information about the gstreamer-devel mailing list