[Spice-devel] [PATCH spice-gtk v4 5/7] display-gst: check GstRegistry for decoding elements

Victor Toso victortoso at redhat.com
Tue Jul 4 11:11:56 UTC 2017


Hi,

On Tue, Jul 04, 2017 at 11:50:12AM +0200, Pavel Grunt wrote:
> On Wed, 2017-06-28 at 14:43 +0200, Victor Toso wrote:
> > From: Victor Toso <me at victortoso.com>
> > 
> > With this patch, we can find all the elements in the registry that are
> > video decoders which can handle the predefined GstCaps.
> > 
> > Main benefits are:
> > - We don't rely on a predefined list of GstElements. We don't need to
> >   update them;
> > - debugging: It does help to know what the registry has at runtime;
> > 
> > Signed-off-by: Victor Toso <victortoso at redhat.com>
> > Acked-by: Frediano Ziglio <fziglio at redhat.com>
> > Signed-off-by: Victor Toso <me at victortoso.com>
> > ---
> >  src/channel-display-gst.c | 56 ++++++++++++++++++++++++++++++++++++++++++--
> > ---
> >  1 file changed, 50 insertions(+), 6 deletions(-)
> > 
> > diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
> > index 57f0eb7..1b40002 100644
> > --- a/src/channel-display-gst.c
> > +++ b/src/channel-display-gst.c
> > @@ -521,16 +521,60 @@ VideoDecoder* create_gstreamer_decoder(int codec_type,
> > display_stream *stream)
> >      return (VideoDecoder*)decoder;
> >  }
> >  
> > +static void gstvideo_debug_available_decoders(int codec_type,
> > +                                              GList *all_decoders,
> > +                                              GList *codec_decoders)
> > +{
> > +    GList *l;
> > +    GString *msg = g_string_new(NULL);
> > +    /* Print list of available decoders to make debugging easier */
> > +    g_string_printf(msg, "From %3u video decoder elements, %2u can handle
> > caps %12s: ",
> > +                    g_list_length(all_decoders),
> > g_list_length(codec_decoders),
> > +                    gst_opts[codec_type].dec_caps);
> > +
> > +    for (l = codec_decoders; l != NULL; l = l->next) {
> > +        GstPluginFeature *pfeat = GST_PLUGIN_FEATURE(l->data);
> > +        g_string_append_printf(msg, "%s, ",
> > gst_plugin_feature_get_name(pfeat));
> > +    }
> > +
> > +    /* Drop trailing ", " */
> > +    g_string_truncate(msg, msg->len - 2);
> > +    spice_debug("%s", msg->str);
> > +    g_string_free(msg, TRUE);
> > +}
> > +
> >  G_GNUC_INTERNAL
> >  gboolean gstvideo_has_codec(int codec_type)
> >  {
> > -    gboolean has_codec = FALSE;
> > +    GList *all_decoders, *codec_decoders;
> > +    GstCaps *caps;
> > +    GstElementFactoryListType type;
> > +
> > +    g_return_val_if_fail(gstvideo_init(), FALSE);
> > +    g_return_val_if_fail(VALID_VIDEO_CODEC_TYPE(codec_type), FALSE);
> >  
> > -    VideoDecoder *decoder = create_gstreamer_decoder(codec_type, NULL);
> > -    if (decoder) {
> > -        has_codec = TRUE;
> > -        decoder->destroy(decoder);
> > +    type = GST_ELEMENT_FACTORY_TYPE_DECODER |
> > GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO;
>
> also GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE for "image/jpeg"

Indeed, I'll be including this in my local repository ...

>
> > +    all_decoders = gst_element_factory_list_get_elements(type,
> > GST_RANK_NONE);
> > +    if (all_decoders == NULL) {
> > +        spice_warning("No video decoders from GStreamer were found");
> > +        return FALSE;
> >      }
> >  
> > -    return has_codec;
> > +    caps = gst_caps_from_string(gst_opts[codec_type].dec_caps);
> > +    codec_decoders = gst_element_factory_list_filter(all_decoders, caps,
> > GST_PAD_SINK, TRUE);
> > +    gst_caps_unref(caps);
> > +
> > +    if (codec_decoders == NULL) {
> > +        spice_debug("From %u decoders, none can handle '%s'",
> > +                    g_list_length(all_decoders),
> > gst_opts[codec_type].dec_caps);
> > +        gst_plugin_feature_list_free(all_decoders);
> > +        return FALSE;
> > +    }
> > +
> > +    if (spice_util_get_debug())
> > +        gstvideo_debug_available_decoders(codec_type, all_decoders,
> > codec_decoders);
> > +
> > +    gst_plugin_feature_list_free(codec_decoders);
> > +    gst_plugin_feature_list_free(all_decoders);
> > +    return TRUE;
> >  }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170704/2d02aee3/attachment.sig>


More information about the Spice-devel mailing list