<div dir="ltr">

<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">Mathieu,</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><br></div><div dir="auto" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">Yes the reported duration is correct.<br></div><div dir="auto" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><br></div><div dir="auto" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">I am not using GESPipeline because I need fine control over the encoders, and GESPipeline doesn't seem to allow that.  I think it forces the usage of encodebin which picks encoders in its own way.</div><div dir="auto" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">I can tell you that the documentation for GES suggests that <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">GESPipeline exists for </span> convenience (but not because it is more compatible with GESTimeline).  It also suggests that GESTimeline talks about how it is just another GstElement which can be plugged into a GstPipeline accordingly. 

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Is the documentation wrong?</span>

</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><br></div><div dir="auto" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">I tried casting the GESPipeline down to a GstPipeline and building the pipeline manually myself but it didn't work.  <span style="font-size:12.8px">Do you think it should have worked?  (Perhaps I didn't try hard enough.)</span></div><div dir="auto" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><span style="font-size:12.8px"><br></span></div><div dir="auto" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><span style="font-size:12.8px">Or is there some way of telling the GESPipeline to use specific GstElements with specific settings?  (I don't see anything that might allow that.)</span></div>

<div><br></div>--------------------------------<br><div><div>>Date: Tue, 27 Mar 2018 02:35:38 +0200</div><div>>From: Mathieu Duponchelle <<a href="mailto:mathieu@centricular.com">mathieu@centricular.com</a>></div><div>>To: <a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a></div><div>>Subject: Re: v 1.12, Incorrect current position of GstPipeline is</div><div>        reported</div><div>>Message-ID: <<a href="mailto:4f917e98-9649-e779-fe29-40078ae035e7@centricular.com">4f917e98-9649-e779-fe29-40078ae035e7@centricular.com</a>></div><div>>Content-Type: text/plain; charset="utf-8"</div><div>></div><div>>Also, more importantly, do you have any reason for not using GESPipeline?</div><div>></div><div>>If not, I advise you do so, as it's the recommended way to run a GES timeline.</div><div>></div><div>>On 03/27/2018 02:20 AM, David Ing wrote:</div><div>>> I have a gstreamer pipeline which basically incorporates a GESTimeline, two encoders (audio and video), a muxer, and a filesink.</div><div>>></div><div>>> When I run the pipeline, I periodically query the stream position (as shown in code below) and print into the terminal (stdout).</div><div>>></div><div>>> 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.</div><div>>></div><div>>> My goal is to get an accurate indication of the job's progress as it runs</div><div>>></div><div>>> Other things I've tried.</div><div>>></div><div>>>   * Tried listening for GST_MESSAGE_PROGRESS messages, but I don't get any.</div><div>>>   * 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.</div><div>>></div><div>>> The code for my main loop is shown below.  The progress printing occurs near the very bottom of the loop.</div><div>>></div><div>>>     /// Run the job.  Will throw exception if unsuccessful.</div><div>>>     void CompositionJob::run()</div><div>>>     {</div><div>>>         GstStateChangeReturn stateChangeReturn;</div><div>>>         </div><div>>>         //  Start playing the pipeline.</div><div>>>         stateChangeReturn = gst_element_set_state(reinterpret_cast<GstElement*>(this->gstPipeline), GST_STATE_PLAYING);</div><div>>>         if (stateChangeReturn == GST_STATE_CHANGE_FAILURE)</div><div>>>             throw std::runtime_error("Unable to set the pipeline to the playing state.");</div><div>>></div><div>>>         //  Talk to the message bus</div><div>>>         this->gstBus = gst_element_get_bus(reinterpret_cast<GstElement*>(this->gstPipeline));</div><div>>>         unique_gmob<GstMessage> gstMessage = nullptr;</div><div>>>         </div><div>>>         this->shouldTerminate = false;</div><div>>>         while (!this->shouldTerminate)</div><div>>>         {</div><div>>>             gstMessage = gst_bus_timed_pop_filtered(this->gstBus, 100 * GST_MSECOND,</div><div>>>                 (GstMessageType)(GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS | GST_MESSAGE_DURATION));</div><div>>></div><div>>>             if (gstMessage)</div><div>>>             {</div><div>>>                 this->handleMessage(gstMessage.get());</div><div>>>                 gstMessage.reset();</div><div>>>             }</div><div>>>             else</div><div>>>             {</div><div>>>                 //  If we got no message, a timeout period has expired.</div><div>>>                 if (this->isPlaying)</div><div>>>                 {</div><div>>>                     // Query the stream position (in nanoseconds).</div><div>>>                     if (!gst_element_query_position(</div><div>>>                             reinterpret_cast<GstElement*>(this->gstPipeline),</div><div>>>                             GST_FORMAT_TIME,</div><div>>>                             &this->streamPosition))</div><div>>>                         GST_DEBUG("Could not query current position.");</div><div>>></div><div>>>                     // Query the duration if we don't have it already.</div><div>>>                     if (!GST_CLOCK_TIME_IS_VALID(this->streamDuration))</div><div>>>                     {</div><div>>>                         if (!gst_element_query_duration(</div><div>>>                                 reinterpret_cast<GstElement*>(this->gstPipeline),</div><div>>>                                 GST_FORMAT_TIME,</div><div>>>                                 &this->streamDuration))</div><div>>>                             GST_DEBUG("Could not get pipeline duration.");</div><div>>>                     }</div><div>>></div><div>>>                     //  Print position and duration.</div><div>>>                     if (this->printProgress)</div><div>>>                     {</div><div>>>                         g_print("Position %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r",</div><div>>>                             GST_TIME_ARGS(this->streamPosition), GST_TIME_ARGS(this->streamDuration));</div><div>>>                     }</div><div>>>                 }</div><div>>>             }</div><div>>>         }</div><div>>>     }</div><div>>> </div></div></div>