Howto determine size?

Stef Bon stefbon at
Tue Jul 5 01:31:58 PDT 2011


I've written a gstreamer program (my first!) . See at bottom of email.

It just plays an mp3 file. What I'm interested in is the progress of
bytes decoded and the final size.
Now the program gives the "size " in seconds, not in bytes. That's not
aproblem, but first the total duration is false:
It should be 2:57 in stead of 3:12.

sbon [ ~/Programmeren/testgst ]$ ./test /home/sbon/Music/The\ Doors\
The\ Ultimate\ Best\ Of\ 2011\ Remastered\ 320\ Kbps/02\ Strange\
Time: 0:00:05.074126984 / 0:03:12.604200000
(break using Ctrl-C)

When rewriting it to use the bytes, it also does not report the right
size. Instead of the format GST_FORMAT_TIME, I've used
GST_FORMAT_BYTES, and of course another format of the g_print
function. But then a far to small size is reported when printing len.

Futher is works as expected, great.


  2010, 2011 Stef Bon <stefbon at>

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.


#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <err.h>
#include <sys/stat.h>
#include <inttypes.h>
#include <sys/types.h>

#include <gst/gst.h>
#include <glib.h>

static gboolean cb_reportprogress (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)) {

        g_print ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "
\r", GST_TIME_ARGS(pos), GST_TIME_ARGS(len));


    /* call me again */
    return TRUE;


int main(int argc, char *argv[])
    GMainLoop *loop;
    GstElement *pipeline, *source, *decoder, *conv, *sampler, *sink;

    gst_init(&argc, &argv);

    loop = g_main_loop_new(NULL, FALSE);

    if ( argc != 2 ) {

        g_printerr("Usage: %s <audio file>\n", argv[0]);
        return -1;


    pipeline    = gst_pipeline_new("test-encoder");
    source      = gst_element_factory_make ("filesrc", "file-source");
    decoder     = gst_element_factory_make ("mad", "decoder");
    conv        = gst_element_factory_make ("audioconvert", "converter");
    sampler     = gst_element_factory_make ("audioresample", "sampler");
    sink        = gst_element_factory_make ("alsasink", "audio-output");

    if ( ! pipeline || ! source || ! decoder || ! conv || ! sampler ||
! sink ) {

        g_printerr ("error creating element....\n");
        return -1;


    g_object_set(G_OBJECT(source), "location", argv[1], NULL);

    gst_bin_add_many(GST_BIN(pipeline), source, decoder, conv,
sampler, sink, NULL);

    gst_element_link (source, decoder);
    gst_element_link (decoder, conv);
    gst_element_link (conv, sampler);
    gst_element_link (sampler, sink);

    /*if ( ! gst_element_link_many(decoder, conv, sink, NULL ) ) {

        g_printerr("error linking elements...\n");
        return -1;

    } */

    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    g_timeout_add (500, (GSourceFunc) cb_reportprogress, pipeline);
    g_main_loop_run (loop);


    gst_element_set_state(pipeline, GST_STATE_NULL);

    gst_object_unref( GST_OBJECT(pipeline));

    return 0;

More information about the gstreamer-devel mailing list