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@xxxxxxxxxxxxxx> > > > > 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@xxxxxxxxxx> > > Acked-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > > Signed-off-by: Victor Toso <me@xxxxxxxxxxxxxx> > > --- > > 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; > > }
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel