[Spice-devel] [PATCH spice-gtk v2 5/5] display-gst: Use Playbin for GStreamer 1.9.0 onwards

Christophe Fergeau cfergeau at redhat.com
Tue Jun 6 15:47:25 UTC 2017


On Fri, May 12, 2017 at 09:25:44AM -0400, Frediano Ziglio wrote:
> > +#if GST_CHECK_VERSION(1,9,0)
> > +static void app_source_setup(GstElement *pipeline, GstElement *source,
> > SpiceGstDecoder *decoder)
> > +{
> > +    GstCaps *caps;
> > +
> > +    /* - We schedule the frame display ourselves so set sync=false on
> > appsink
> > +     *   so the pipeline decodes them as fast as possible. This will also
> > +     *   minimize the risk of frames getting lost when we rebuild the
> > +     *   pipeline.
> > +     * - Set max-bytes=0 on appsrc so it does not drop frames that may be
> > +     *   needed by those that follow.
> > +     */
> > +    caps =
> > gst_caps_from_string(gst_opts[decoder->base.codec_type].dec_caps);
> > +    g_object_set(source,
> > +                 "caps", caps,
> > +                 "is-live", TRUE,
> > +                 "format", GST_FORMAT_TIME,
> > +                 "max-bytes", 0,
> > +                 "block", TRUE,
> > +                 NULL);
> > +    gst_caps_unref(caps);
> > +    decoder->appsrc = GST_APP_SRC(gst_object_ref(source));
> > +}
> > +#endif
> > +
> >  static gboolean create_pipeline(SpiceGstDecoder *decoder)
> >  {
> > -    gchar *desc;
> >      GstAppSinkCallbacks appsink_cbs = { NULL };
> > -    GError *err = NULL;
> >      GstBus *bus;
> > +#if GST_CHECK_VERSION(1,9,0)
> > +    GstElement *playbin, *sink;
> > +    gint flags;
> > +    GstCaps *caps;
> >  
> > +    playbin = gst_element_factory_make("playbin", "playbin");
> > +    if (playbin == NULL) {
> > +        spice_warning("error upon creation of 'playbin' element");
> > +        return FALSE;
> > +    }
> > +
> > +    sink = gst_element_factory_make("appsink", "sink");
> > +    if (sink == NULL) {
> > +        spice_warning("error upon creation of 'appsink' element");
> > +        gst_object_unref(playbin);
> > +        return FALSE;
> > +    }
> > +
> > +    caps = gst_caps_from_string("video/x-raw,format=BGRx");
> > +    g_object_set(sink,
> > +                 "caps", caps,
> > +                 "sync", FALSE,
> > +                 "drop", FALSE,
> > +                 NULL);
> > +    gst_caps_unref(caps);
> > +
> > +    g_object_set(playbin,
> > +                 "uri", "appsrc://",
> > +                 "video-sink", gst_object_ref(sink),
> > +                 NULL);
> > +
> > +    g_signal_connect(playbin, "source-setup", G_CALLBACK(app_source_setup),
> > decoder);
> > +
> 
> I would still put this before setting the uri property.
> Documentation state that "This signal is usually emitted from the context
> of a GStreamer streaming thread." which looks like "we are free to change in
> the future".

app_source_setup can run from GStreamer streaming thread and sets
decoder->appsrc, which spice_gst_decoder_queue_frame() then reads and
checks for NULL. Is spice_gst_decoder_queue_frame() running from the
GStreamer streaming thread as well?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170606/4fb861c9/attachment.sig>


More information about the Spice-devel mailing list