[Spice-devel] [PATCH spice-gtk] gst: Fix detection of h264 stream decoder

Victor Toso victortoso at redhat.com
Wed Jul 19 13:40:11 UTC 2017


On Wed, Jul 19, 2017 at 03:30:49PM +0200, Pavel Grunt wrote:
> On Wed, 2017-07-19 at 15:23 +0200, Victor Toso wrote:
> > Hi,
> > 
> > On Wed, Jul 19, 2017 at 02:59:00PM +0200, Pavel Grunt wrote:
> > > GStreamer's avdec_h264 needs h264parse to be able to process H264 video
> > > streams. However the check for elements through GstRegistry does not
> > > take into account the possible pipeline of elements (like "h264parse !
> > > avdec_h264").
> > > 
> > > Fix that by checking for the elements by their name.
> > 
> > As I mentioned before, given the extra complexity that this is
> > requiring, I'm not convinced that it is a good fix because it relies on
> > the fact that we know the elements that we need (hard coded).
> > 
> > 1-) An user might have a different subset of plugins, like the fluendo
> >     ones or a different 3rd party ones. Do that work when we check for
> >     h264parse avdec_h264? I don't think so as it should be different
> >     plugins (one that people pay to have in their system)
>
> This checks for presence of all the requirred plugins, for both
> h264parse and avdec_h264. the user must have both to detect it.

I can have h264 stream decoded without avdec_h264 -> Not required

I _might_ _still_ have failures due lack of plugins on runtime even with
h264parse -> Not enough

> It fixes the "regression" caused by the GstRegistry patch by checking for the
> elements like it was done before (but without parsing the full pipeline)

It does fix for this case. I would prefer to be agnostic about plugins,
really.

> >
> > 2-) If playbin just needs an extra plugin, we don't check it and that
> >     means the pipeline will fail even if the caps were enabled.
>
> It is about the plugin combinations already tested in the past. We have their
> name (and their usage in a pipeline) in the header file

That's correct but it doesn't mean that with playbin it'll be always
correct as we are trying to increase the possibilities (i.e not depend
solely on avdec_h264)

I don't think we will agree because you want to check for h264parse and
that's one thing I want to avoid.

> >
> > I do think the right approach is as I mentioned before, fix the
> > filtering to show all decoders for h264 and that's it. If the pipeline
> > fails, that's fine because it is *hard* to *ensure* that it'll work
> > anyway without an actual video stream.
> > 
> > > ---
> > >  src/channel-display-gst.c | 25 +++++++++++++++++++++++++
> > >  1 file changed, 25 insertions(+)
> > > 
> > > diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
> > > index 5042fc8..a9a044a 100644
> > > --- a/src/channel-display-gst.c
> > > +++ b/src/channel-display-gst.c
> > > @@ -666,6 +666,31 @@ gboolean gstvideo_has_codec(int codec_type)
> > >      codec_decoders = gst_element_factory_list_filter(all_decoders, caps,
> > > GST_PAD_SINK, TRUE);
> > >      gst_caps_unref(caps);
> > > 
> > > +    /* Check for the presence of decoding elements that could be filter
> > > out.
> > > +     * TODO: Improve filtering to avoid this...
> > > +     */
> > > +    {
> > > +        GList *decoder_elements = NULL;
> > > +        gchar **decoders_by_names;
> > > +        guint i = 0;
> > > +        decoders_by_names = g_strsplit(gst_opts[codec_type].dec_name, "!",
> > > -1);
> > > +        for (i = 0; decoders_by_names[i] != NULL; i++) {
> > > +            GstElementFactory *element =
> > > gst_element_factory_find(g_strstrip(decoders_by_names[i]));
> > > +            if (element == NULL) {
> > > +                gst_plugin_feature_list_free(decoder_elements);
> > > +                decoder_elements = NULL;
> > > +                break;
> > > +            }
> > > +            if (g_list_find(codec_decoders, element)) {
> > > +                gst_object_unref(element);
> > > +            } else {
> > > +                decoder_elements = g_list_append(decoder_elements,
> > > element);
> > > +            }
> > > +        }
> > > +        codec_decoders = g_list_concat(codec_decoders, decoder_elements);
> > > +        g_strfreev(decoders_by_names);
> > > +    }
> > > +
> > >      if (codec_decoders == NULL) {
> > >          spice_debug("From %u decoders, none can handle '%s'",
> > >                      g_list_length(all_decoders),
> > > gst_opts[codec_type].dec_caps);
> > > -- 
> > > 2.13.3
> > > 
> > > _______________________________________________
> > > Spice-devel mailing list
> > > Spice-devel at lists.freedesktop.org
> > > https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- 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/20170719/ba356590/attachment-0001.sig>


More information about the Spice-devel mailing list