# GST\_MESSAGE\_DURATION\_CHANGED failure

**URL:** <https://discourse.gstreamer.org/t/gst-message-duration-changed-failure/2270>\
**Category:** Newcomers\
**Created:** [August 28, 2024, 12:12pm UTC](https://discourse.gstreamer.org/t/gst-message-duration-changed-failure/2270 "2024-08-28T12:12:55Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![sechshelme](https://discourse.gstreamer.org/user_avatar/discourse.gstreamer.org/sechshelme/32/739_2.png) [@sechshelme](https://discourse.gstreamer.org/u/sechshelme)\
**Post date:** [August 28, 2024, 12:12pm UTC](https://discourse.gstreamer.org/t/gst-message-duration-changed-failure/2270/1 "2024-08-28T12:12:55Z")

</div>

Why doesn’t the message `GST_MESSAGE_DURATION_CHANGED` arrive with this code?  
Other messages like `GST_MESSAGE_STATE_CHANGED` arrive.

```auto
// gcc main.c -o main `pkg-config --cflags --libs gstreamer-1.0 gstreamer-audio-1.0`

#include <gst/gst.h>

int quit = 0;

static void test_cb(GstBus *bus, GstMessage *msg, gpointer data) {
    g_print("Message: %i\n", msg);
    switch (GST_MESSAGE_TYPE(msg)) {
        case GST_MESSAGE_DURATION_CHANGED:
            g_print("Duration changed\n");
            break;
        case GST_MESSAGE_STATE_CHANGED:
            g_print("State changed\n");
            break;
        case GST_MESSAGE_EOS:
            g_print("Finish\n");
            quit = 1;
            break;
    }
}

int main(int argc, char *argv[]) {
    gst_init(&argc, &argv);

    GstElement *pipeline = gst_parse_launch("filesrc location=/home/tux/Schreibtisch/sound/test.wav ! decodebin ! audioconvert ! autoaudiosink", NULL);

    GstBus *bus = gst_element_get_bus(pipeline);
    gst_bus_add_signal_watch(bus);
    g_signal_connect(bus, "message", G_CALLBACK(test_cb), NULL);
    gst_object_unref(bus);

    gst_element_set_state(pipeline, GST_STATE_PLAYING);
    while (!quit) {
      g_main_context_iteration(0, 0);
    }
}

```

---

<div class="post-metadata">

**Author:** ![Honey\_Patouceul](https://discourse.gstreamer.org/user_avatar/discourse.gstreamer.org/honey_patouceul/32/365_2.png) [@Honey\_Patouceul](https://discourse.gstreamer.org/u/Honey_Patouceul)\
**Post date:** [August 28, 2024, 7:37pm UTC](https://discourse.gstreamer.org/t/gst-message-duration-changed-failure/2270/2 "2024-08-28T19:37:05Z")

</div>

Not sure, but as you’re playing a single file with a fixed duration, I wouldn’t expect that message to be issued.

I might be wrong, someone better skilled may correct my assumption.

---

<div class="post-metadata">

**Author:** ![sechshelme](https://discourse.gstreamer.org/user_avatar/discourse.gstreamer.org/sechshelme/32/739_2.png) [@sechshelme](https://discourse.gstreamer.org/u/sechshelme)\
**Post date:** [August 29, 2024, 3:15pm UTC](https://discourse.gstreamer.org/t/gst-message-duration-changed-failure/2270/3 "2024-08-29T15:15:18Z")

</div>

> Not sure, but as you’re playing a single file with a fixed duration, I wouldn’t expect that message to be issued.[/quote]

It seems that Duration does not appear for every file type.  
It does not appear for WAV, but it does appear for FLAC and MP3.

wav:

```auto
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: stream-status
Message: state-changed
Message: state-changed
Message: stream-status
Message: state-changed
Message: stream-status
Message: state-changed
Message: stream-status
Message: state-changed
Message: stream-start
Message: latency
Message: tag
Message: state-changed
Message: state-changed
Message: state-changed
Message: async-done
Message: latency
Message: new-clock
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed

```

Flac:

```auto
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: stream-status
Message: state-changed
Message: state-changed
Message: stream-status
Message: state-changed
Message: stream-status
Message: state-changed
Message: stream-status
Message: duration-changed
Message: state-changed
Message: state-changed
Message: latency
Message: state-changed
Message: stream-start
Message: latency
Message: tag
Message: state-changed
Message: state-changed
Message: state-changed
Message: async-done
Message: latency
Message: new-clock
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag
Message: tag

```

MP3:

```auto
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: stream-status
Message: state-changed
Message: state-changed
Message: stream-status
Message: state-changed
Message: stream-status
Message: state-changed
Message: stream-status
Message: state-changed
Message: stream-status
Message: state-changed
Message: stream-status
Message: state-changed
Message: state-changed
Message: state-changed
Message: stream-start
Message: latency
Message: tag
Message: tag
Message: state-changed
Message: state-changed
Message: state-changed
Message: async-done
Message: latency
Message: new-clock
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: state-changed
Message: tag
Message: tag
Message: duration-changed

```

Addendum: OGG doesn’t work either.

Is there a way I can get the duration for WAV and OGG?

---

<div class="post-metadata">

**Author:** ![Honey\_Patouceul](https://discourse.gstreamer.org/user_avatar/discourse.gstreamer.org/honey_patouceul/32/365_2.png) [@Honey\_Patouceul](https://discourse.gstreamer.org/u/Honey_Patouceul)\
**Post date:** [August 29, 2024, 7:00pm UTC](https://discourse.gstreamer.org/t/gst-message-duration-changed-failure/2270/4 "2024-08-29T19:00:12Z")

</div>

Ok, got it. Someone more skilled may provide more accurate advice for this case… In the meantime, do you see differences from gst-discoverer-1.0 for the various cases ?

---

<div class="post-metadata">

**Author:** ![tpm](https://discourse.gstreamer.org/letter_avatar_proxy/v4/letter/t/c5a1d2/32.png) [@tpm](https://discourse.gstreamer.org/u/tpm)\
**Post date:** [August 31, 2024, 2:22pm UTC](https://discourse.gstreamer.org/t/gst-message-duration-changed-failure/2270/5 "2024-08-31T14:22:45Z")

</div>

If you’re just interested in the duration, you would usually just do a duration query it when you get an `ASYNC_DONE` message on the bus (which is when the pipeline is prerolled, at which point the demuxer/parsers will have produced some data and will have processed headers and metadata).

The `DURATION_CHANGED` message on the bus is something elements can post to indicate to the application that something has changed and it should re-query the duration.

With most container formats, the duration is determined and known initially once the headers have been processed.

The main case where you get a `DURATION_CHANGED` message is with audio files that are elementary streams without a container, such as e.g. MP3, where in case of VBR encoding the parser will update the duration estimate over time, as the estimated average bitrate changes the more frames it processes, which means the duration estimate in time will change too (but depends on what other metadata exists, e.g. there could be xing metadata or such to provide good info from the start).

Long story short: don’t expect a `DURATION_CHANGED` message from the start, just query the duration yourself and then query again when you get a message that says that it changed.
