<div dir="auto"><div>Mathieu,</div><div dir="auto"><br></div><div dir="auto">More then just picking the right elements, I also need to set GObject properties on one of the elements before it gets used. Is that also achievable?<br><br><div class="gmail_quote" dir="auto"><div dir="ltr">On Tue, Mar 27, 2018, 4:12 AM Mathieu Duponchelle <<a href="mailto:mathieu@centricular.com">mathieu@centricular.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
The GES timeline can indeed be used in a regular gstreamer pipeline,
but there<br>
are some undocumented quirks, amongst them the "query-position"
signal emitted<br>
by the NLEComposition wrapped by the GESTrack object, this is why
using GESPipeline<br>
is the recommended approach.<br>
<br>
You can have fine-grained control over the encoders that will be
picked by encodebin,<br>
by setting the ranks of the various encoder plugins, for example if
your system has<br>
both software and hardware encoders for H264, you would list the
encoder plugins<br>
with gst_element_factory_list_filter, then set the ranks of those
plugins with<br>
gst_plugin_feature_get_rank, according to your order of preference.
This will ensure<br>
that the appropriate elements are picked by encodebin when
constructing itself, and<br>
spare you some low-level concerns.<br>
<br>
<div class="m_-3826226719482276326moz-cite-prefix">On 03/27/2018 04:20 AM, David Ing
wrote:<br>
</div>
<blockquote type="cite">
<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" target="_blank" rel="noreferrer">mathieu@centricular.com</a>></div>
<div>>To: <a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" rel="noreferrer">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" target="_blank" rel="noreferrer">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>
<br>
<fieldset class="m_-3826226719482276326mimeAttachmentHeader"></fieldset>
<br>
<pre>_______________________________________________
gstreamer-devel mailing list
<a class="m_-3826226719482276326moz-txt-link-abbreviated" href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" rel="noreferrer">gstreamer-devel@lists.freedesktop.org</a>
<a class="m_-3826226719482276326moz-txt-link-freetext" href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank" rel="noreferrer">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a>
</pre>
</blockquote>
<br>
</div>
_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" rel="noreferrer">gstreamer-devel@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" rel="noreferrer noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
</blockquote></div></div></div>