decodebin and single frame images

Sergei Vorobyov sergei.vorobyov at facilitylabs.com
Thu Mar 29 11:56:43 PDT 2012


RE: still images as movies howto

Try

gst-launch filesrc location=file.png ! decodebin2 ! imagefreeze !
ffmpegcolorspace ! autovideosink

You may replace the last sink with ximagesink, xvimagesink, or similar.

If you need the corresponding C code, it roughly looks as this:

...

  gst_init (&argc, &argv);
  loop = g_main_loop_new (NULL, FALSE);
  pipeline = gst_pipeline_new ("Still video player");
  src =  gst_element_factory_make ("filesrc", "source_image");
  dec =  gst_element_factory_make ("pngdec", "decode_bin");
  img_freeze = gst_element_factory_make ("imagefreeze", "image_freeze");
  conv = gst_element_factory_make ("ffmpegcolorspace", "ffmpeg-colorspace");
  sink = gst_element_factory_make ("ximagesink", "directdrawsink-output");

  if (!loop || !pipeline || !src || !img_freeze || !conv || !sink) {
    g_print ("Some element could not be created\n");
    return -1;
  }

  g_object_set (src, "location", argv[1], NULL); // plug in your file
name instead of argv[1] if needed

  gst_bin_add_many (GST_BIN (pipeline),
		    src,
		    dec,
		    img_freeze,
		    conv,
		    sink,  NULL);

  gst_element_link_many (src, dec, img_freeze, conv, sink, NULL);

  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  gst_bus_add_watch (bus, bus_call, loop); // callback bus call -> see below
  gst_object_unref (bus);

  // Variant 1:
  // Will stop still image playing after 5 sec
  // g_timeout_add_seconds (5, (GSourceFunc) cb_end_stream, pipeline);
// callback cb_end_stream -> see below

  // Variant 2: also stops after 5 sec
  GstEvent *event = gst_event_new_seek (1.0,
			      GST_FORMAT_TIME,
			      GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT,
			      GST_SEEK_TYPE_SET, 0 * GST_SECOND,
			      GST_SEEK_TYPE_SET, 5 * GST_SECOND);

  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  if (!gst_element_send_event(pipeline, event)) { // this will cause
...MESSAGE_SEGMENT_DONE in the callback
    g_print("failure to seek\n");
    return -1;
  }

  /* now run */
  g_main_loop_run (loop);

  /* finally clean up */
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (GST_OBJECT (pipeline));

  return 0;
}

gboolean cb_end_stream (GstElement *pipeline) {
  g_main_loop_quit(loop);
  return FALSE;
}

gboolean bus_call (GstBus  *bus, GstMessage *msg, gpointer  data) {
    GMainLoop *loop = (GMainLoop *) data;

    guint msg_type = GST_MESSAGE_TYPE (msg);

    if (msg_type & GST_MESSAGE_EOS) {
      g_print ("EOS message\n");
      g_main_loop_quit (loop);
    }

...

    if (msg_type & GST_MESSAGE_STATE_CHANGED) { // quite useful, for debugging
      g_print ("STATE CHANGED message, to state %d\n",
		GST_STATE(GST_MESSAGE_SRC(msg)));

      GstState old_state, new_state;

      gst_message_parse_state_changed (msg, &old_state, &new_state, NULL);
      g_print ("Element %s changed state from %s to %s.\n",
        GST_OBJECT_NAME (msg->src),
        gst_element_state_get_name (old_state),
        gst_element_state_get_name (new_state)); // I think you should
be more careful here to free ..._gets_
    }

...

    if (msg_type & GST_MESSAGE_SEGMENT_DONE) {
      g_print ("SEGMENT DONE message\n");
      g_main_loop_quit (loop);
    }

...

    return TRUE;
}

I am not a specialist, but hope it helps. The docs are scarce on
examples, explanations, and use cases. It also took me some to me to
figure.

On Thu, Mar 29, 2012 at 4:31 PM,  <Steffen.Roeber at hella.com> wrote:
> Hui,
> I'm using a filesrc, a decodebin2 and a appsink. If I use .avi file sall is
> fine. If I use image files like .bmp or .png the app sink gives me the image
> only one time. Following calls always return 0.
> What I want to have is to retrieve the image in a loop. Seeking the pipeline
> to 0 seems not to work.
> Is there any way to get this behaviour?
>
> Regards
>
>
> Hella Aglaia Mobile Vision GmbH
> Steffen Roeber
> Firmware & Tools
> Treskowstr. 14, D-13089 Berlin
> Amtsgericht Berlin-Charlottenburg HRB 66976 B
> Geschäftsführer: Kay Talmi
>
> Fon:  +49 30 200 04 29– 412
> Fax:  +49 30 200 04 29– 109
> Mail: Steffen.Roeber at hella.com
> URL: www.aglaia-gmbh.de
>
> URL: www.mobilevision.de
>
> Dieses Dokument ist vertraulich zu behandeln. Die Weitergabe sowie
> Vervielfältigung, Verwertung und Mitteilung seines Inhalts ist nur mit
> unserer ausdrücklichen Genehmigung gestattet. Alle Rechte vorbehalten,
> insbesondere für den Fall der Schutzrechtsanmeldung.
> This document has to be treated confidentially. Its contents are not to be
> pass ed on, duplicated, exploited or disclosed without our express
> permission. All rights reserved, especially the right to apply for
> protective rights.
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>


More information about the gstreamer-devel mailing list