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

Pavel Grunt pgrunt at redhat.com
Thu Jul 20 08:03:37 UTC 2017


Victor,

it is faster to write NACK

On Thu, 2017-07-20 at 07:26 +0200, Victor Toso wrote:
> A new day, a new thread
> 
> 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.
> 
> By reading your commit log, your are fixing a single use case by
> checking element's names that are hard coded to our codebase.
> 
> The reason for the following two patches were to remove the usage of
> hard coded names to check and play the stream.
> 
> Shortlog: display-gst: Use Playbin for GStreamer 1.9.0 onwards
> Commit  : ed697dd7fa165632bd0cbdb34c971c8001c433fa
> Victor Toso on Mon, 10 Jul 2017 17:34:23 +0200
> 
> Shortlog: display-gst: check GstRegistry for decoding elements
> Commit  : c9209aef946b3ad517e7794d2e5648caf5ee2bf9
> Victor Toso on Mon, 10 Jul 2017 17:33:10 +0200
> 
> So, this patch is going backwards in regard to one of the objectives of
> playbin's introducing besides the fact that it does not guarantee a
> solution for 3rd party plugins that might be filtered out.

if going backwards means to not break compatibility with the previous release
then yes, it goes backwards.

> 
> So, Let's try to be clear about what's going on:
> 
> The regression introduced by c9209aef946b3 is that avdec_h264 is filter
> out in gstvideo_has_codec() and for that reason, for systems that do not
> have any other decoder, our caps for decoding h264 will be disabled,
> which is a regression.
> 
> To fix the issue in a way that follows the objective of current code, we
> should simply fix the filter as I've suggested at [0]. By the way, I
> went to the GStreamer folks about this filtering issue and I understood
> that my code in regard to the filtering is wrong due the assumption of
> what is a subset. That's a bug alright.
> 
> https://lists.freedesktop.org/archives/spice-devel/2017-July/038634.html
> 
> Pavel, you saying that patch is incorrect is wrong.

Victor, I cannot say it is correct when it does something incorrectly...

>  If you want, you can
> say _incomplete_, but that's a fix.
> 
> Incomplete you may say, because you think it is important to check for
> h264parse element. I'm not against that
Aren't you?

>  but I do think we, again, need
> to approach #gstreamer folks and check with them that we want a more
> robust check for enabling or not a streaming given a video-codec. If we
> go this way and checking for parses seem important, we should do it in a
> more generic fashion.
> 
> Again, I would go with my patch that fixes an issue and see from now on
> how to make our check more robust and I would not be surprise if there
> is no way to guarantee 100% that checking every single element in a
> pipeline would in fact decode a stream and that's because we don't have
> the parameters for the stream itself embedded in our protocol besides
> other issues that may occur.

Victor, it is checking for the elements used for GST < 1.9 (consider el7,
etc...)

> 
> So, yes, if you remove h264parse from registry, we will say that the
> stream can be decoded with avdec_h264 while it can't. I think that's a
> weak argument

Victor, you have used the same argument for my oneliner
https://lists.freedesktop.org/archives/spice-devel/2017-July/038629.html


>  in favor of your patch and as I'm saying a few times now,
> we should consider failure an option, fallback to image compression or
> different streams with different video-codec types....

then you should remove the configure checks as well... (but it wasn't an
intention of your playbin series)

Have a nice day,
Pavel

>  if the fallback
> does not work, it is a bug even with your patch.
> 
> Cheers,
> 
> 
> > ---
> >  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


More information about the Spice-devel mailing list