<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>