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