v 1.12, Incorrect current position of GstPipeline is reported

David Ing ding at panopto.com
Tue Mar 27 00:20:43 UTC 2018


I have a gstreamer pipeline which basically incorporates a GESTimeline, two
encoders (audio and video), a muxer, and a filesink.

When I run the pipeline, I periodically query the stream position (as shown
in code below) and print into the terminal (stdout).

The problem is:  When I run the pipeline, the terminal says that I have
reached 100% relatively early (within 2 seconds), but the pipeline itself
continues to run for 10 more seconds.  When the terminal reports being 100%
done, I can see that the target mp4 file (the final output of the pipeline)
is less than 5% of it's final size.

My goal is to get an accurate indication of the job's progress as it runs

Other things I've tried.

   - Tried listening for GST_MESSAGE_PROGRESS messages, but I don't get any.
   - Tried executing `gst_element_query_position` on the filesink (the last
   element of the pipeline), instead of the entire pipeline itself, but my
   results did not change.

The code for my main loop is shown below.  The progress printing occurs
near the very bottom of the loop.

    /// Run the job.  Will throw exception if unsuccessful.
    void CompositionJob::run()
    {
        GstStateChangeReturn stateChangeReturn;

        //  Start playing the pipeline.
        stateChangeReturn =
gst_element_set_state(reinterpret_cast<GstElement*>(this->gstPipeline),
GST_STATE_PLAYING);
        if (stateChangeReturn == GST_STATE_CHANGE_FAILURE)
            throw std::runtime_error("Unable to set the pipeline to the
playing state.");

        //  Talk to the message bus
        this->gstBus =
gst_element_get_bus(reinterpret_cast<GstElement*>(this->gstPipeline));
        unique_gmob<GstMessage> gstMessage = nullptr;

        this->shouldTerminate = false;
        while (!this->shouldTerminate)
        {
            gstMessage = gst_bus_timed_pop_filtered(this->gstBus, 100 *
GST_MSECOND,
                (GstMessageType)(GST_MESSAGE_STATE_CHANGED |
GST_MESSAGE_ERROR | GST_MESSAGE_EOS | GST_MESSAGE_DURATION));

            if (gstMessage)
            {
                this->handleMessage(gstMessage.get());
                gstMessage.reset();
            }
            else
            {
                //  If we got no message, a timeout period has expired.
                if (this->isPlaying)
                {
                    // Query the stream position (in nanoseconds).
                    if (!gst_element_query_position(

reinterpret_cast<GstElement*>(this->gstPipeline),
                            GST_FORMAT_TIME,
                            &this->streamPosition))
                        GST_DEBUG("Could not query current position.");

                    // Query the duration if we don't have it already.
                    if (!GST_CLOCK_TIME_IS_VALID(this->streamDuration))
                    {
                        if (!gst_element_query_duration(

reinterpret_cast<GstElement*>(this->gstPipeline),
                                GST_FORMAT_TIME,
                                &this->streamDuration))
                            GST_DEBUG("Could not get pipeline duration.");
                    }

                    //  Print position and duration.
                    if (this->printProgress)
                    {
                        g_print("Position %" GST_TIME_FORMAT " / %"
GST_TIME_FORMAT "\r",
                            GST_TIME_ARGS(this->streamPosition),
GST_TIME_ARGS(this->streamDuration));
                    }
                }
            }
        }
    }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20180326/7db19e2d/attachment.html>


More information about the gstreamer-devel mailing list