Re: [PATCH spice-gtk 1/2] spice-client-gtk-module: allow sending multiple preferred video codecs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jul 11, 2019 at 08:52:44AM +0200, Kevin Pouget wrote:
> Hello,
> 
> On Thu, Jul 11, 2019 at 8:16 AM Victor Toso <victortoso@xxxxxxxxxx> wrote:
> >
> > Hi,
> >
> > On Thu, Jul 04, 2019 at 12:29:21PM +0200, Kevin Pouget wrote:
> > > spice_display_channel_change_preferred_video_codec_types: new function
> > > for sending an array of video codecs instead of only one.
> > >
> > > Signed-off-by: Kevin Pouget <kpouget@xxxxxxxxxx>
> >
> > Looks fine,
> >
> > > ---
> > >  doc/reference/spice-gtk-sections.txt |  1 +
> > >  src/channel-display.c                | 76 +++++++++++++++++++++++-----
> > >  src/channel-display.h                |  2 +
> > >  src/map-file                         |  1 +
> > >  src/spice-glib-sym-file              |  1 +
> > >  5 files changed, 68 insertions(+), 13 deletions(-)
> > >
> > > diff --git a/doc/reference/spice-gtk-sections.txt b/doc/reference/spice-gtk-sections.txt
> > > index a0336aa..33f4038 100644
> > > --- a/doc/reference/spice-gtk-sections.txt
> > > +++ b/doc/reference/spice-gtk-sections.txt
> > > @@ -185,6 +185,7 @@ spice_display_change_preferred_compression
> > >  spice_display_channel_change_preferred_compression
> > >  spice_display_change_preferred_video_codec_type
> > >  spice_display_channel_change_preferred_video_codec_type
> > > +spice_display_channel_change_preferred_video_codec_types
> >
> > Sounds like we could deprecate the previous one but IMHO,
> 
> yes, the previous one should be deprecated, no good reason to keep both.
> Should I update the patch ?

My point was that we might keep it and deprecate both later on
when we define a better protocol message but I don't really mind.
Yep, you can do it in this patch as it introduces the
replacement.
 
> > eventually this preferred-video-codec protocol message might be
> > replaced by something with more relevant info of decoding
> > capabilities for better decision on encoding side... video-codec
> > type alone doesn't say much but for the time being, it was what
> > we could get...
> 
> indeed, we'll see with the rest of the smart streaming work what
> relevant information the client can tell

Yeah! Not trivial to get this info reliably but it would be
smart.

> > >  spice_gl_scanout_free
> > >  <SUBSECTION Standard>
> > >  SPICE_DISPLAY_CHANNEL
> > > diff --git a/src/channel-display.c b/src/channel-display.c
> > > index 9a83c53..4558a56 100644
> > > --- a/src/channel-display.c
> > > +++ b/src/channel-display.c
> > > @@ -20,6 +20,7 @@
> > >  #ifdef HAVE_SYS_TYPES_H
> > >  #include <sys/types.h>
> > >  #endif
> > > +#include <glib/gi18n-lib.h>
> > >
> > >  #include "spice-client.h"
> > >  #include "spice-common.h"
> > > @@ -610,18 +611,15 @@ void spice_display_channel_change_preferred_compression(SpiceChannel *channel, g
> > >  }
> > >
> > >  static void spice_display_send_client_preferred_video_codecs(SpiceChannel *channel,
> > > -                                                             const GArray *codecs)
> > > +                                                             const gint *codecs, gsize ncodecs)
> > >  {
> > > -    guint i;
> > >      SpiceMsgOut *out;
> > >      SpiceMsgcDisplayPreferredVideoCodecType *msg;
> > >
> > >      msg = g_malloc0(sizeof(SpiceMsgcDisplayPreferredVideoCodecType) +
> > > -                    (sizeof(SpiceVideoCodecType) * codecs->len));
> > > -    msg->num_of_codecs = codecs->len;
> > > -    for (i = 0; i < codecs->len; i++) {
> > > -        msg->codecs[i] = g_array_index(codecs, gint, i);
> > > -    }
> > > +                    (sizeof(SpiceVideoCodecType) * ncodecs));
> > > +    msg->num_of_codecs = ncodecs;
> > > +    memcpy(msg->codecs, codecs, sizeof(*codecs) * ncodecs);
> > >
> > >      out = spice_msg_out_new(channel, SPICE_MSGC_DISPLAY_PREFERRED_VIDEO_CODEC_TYPE);
> > >      out->marshallers->msgc_display_preferred_video_codec_type(out->marshaller, msg);
> > > @@ -659,8 +657,6 @@ void spice_display_change_preferred_video_codec_type(SpiceChannel *channel, gint
> > >   */
> > >  void spice_display_channel_change_preferred_video_codec_type(SpiceChannel *channel, gint codec_type)
> > >  {
> > > -    GArray *codecs;
> > > -
> > >      g_return_if_fail(SPICE_IS_DISPLAY_CHANNEL(channel));
> > >      g_return_if_fail(codec_type >= SPICE_VIDEO_CODEC_TYPE_MJPEG &&
> > >                       codec_type < SPICE_VIDEO_CODEC_TYPE_ENUM_END);
> > > @@ -675,10 +671,64 @@ void spice_display_channel_change_preferred_video_codec_type(SpiceChannel *chann
> > >       * This array can be rearranged to have @codec_type in the front (which is
> > >       * the preferred for the client side) */
> > >      CHANNEL_DEBUG(channel, "changing preferred video codec type to %s", gst_opts[codec_type].name);
> > > -    codecs = g_array_new(FALSE, FALSE, sizeof(gint));
> > > -    g_array_append_val(codecs, codec_type);
> > > -    spice_display_send_client_preferred_video_codecs(channel, codecs);
> > > -    g_array_unref(codecs);
> > > +    spice_display_send_client_preferred_video_codecs(channel, &codec_type, 1);
> > > +}
> > > +
> > > +/**
> > > + * spice_display_channel_change_preferred_video_codecs_types:
> > > + * @channel: a #SpiceDisplayChannel
> > > + * @codecs: an array of @ncodecs #SpiceVideoCodecType types
> > > + * @ncodecs: the number of codec types in the @codecs array
> > > + * @err: #GError describing the reason why the change failed
> > > + *
> > > + * Tells the spice server the ordered preferred video codec types to
> > > + * use for streaming in @channel.
> > > + *
> > > + * Returns: %TRUE if the preferred codec list was successfully changed, and %FALSE
> > > + * otherwise.
> > > + *
> > > + * Since: 0.38
> > > + */
> > > +gboolean spice_display_channel_change_preferred_video_codec_types(SpiceChannel *channel,
> > > +                                                                  const gint *codecs, gsize ncodecs,
> > > +                                                                  GError **err)
> > > +{
> > > +    gsize i;
> > > +    GString *msg;
> > > +
> > > +    g_return_val_if_fail(SPICE_IS_DISPLAY_CHANNEL(channel), FALSE);
> >
> > Is it expected to work with ncodecs = 0? (Didn't follow previous
> > discussion)
> 
> I will add this guard:
> 
> > g_return_val_if_fail(ncodecs != 0, FALSE);
> 
> as the server side doesnt't want to receive 0 codecs:

Ok

> > in dcc.c:dcc_handle_preferred_video_codec_type() :
> >> g_return_val_if_fail(msg->num_of_codecs > 0, TRUE);
> 
> > Didn't test yet but looks fine.
> 
> thanks,
>
> Kevin
> 
> > > +
> > > +    if (!spice_channel_test_capability(channel, SPICE_DISPLAY_CAP_PREF_VIDEO_CODEC_TYPE)) {
> > > +        CHANNEL_DEBUG(channel, "does not have capability to change the preferred video codec type");
> > > +        g_set_error_literal(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
> > > +                            _("Channel does not have capability to change the preferred video codec type"));
> > > +
> > > +        return FALSE;
> > > +    }
> > > +
> > > +    msg = g_string_new("changing preferred video codec type to: ");
> > > +    for (i = 0; i < ncodecs; i++) {
> > > +        gint codec_type = codecs[i];
> > > +
> > > +        if (codec_type < SPICE_VIDEO_CODEC_TYPE_MJPEG ||
> > > +            codec_type >= SPICE_VIDEO_CODEC_TYPE_ENUM_END)
> > > +        {

Open braces should be in the above line

With this and the guard above,
Acked-by: Victor Toso <victortoso@xxxxxxxxxx>

> > > +            g_string_free(msg, TRUE);
> > > +            g_set_error(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
> > > +                        _("Invalid codec-type found (%d) ... "), codec_type);
> > > +
> > > +            return FALSE;
> > > +        }
> > > +
> > > +        g_string_append_printf(msg, "%s ", gst_opts[codec_type].name);
> > > +
> > > +    }
> > > +    CHANNEL_DEBUG(channel, "%s", msg->str);
> > > +    g_string_free(msg, TRUE);
> > > +
> > > +    spice_display_send_client_preferred_video_codecs(channel, codecs, ncodecs);
> > > +
> > > +    return TRUE;
> > >  }
> > >
> > >  /**
> > > diff --git a/src/channel-display.h b/src/channel-display.h
> > > index 5b48d2f..cf18538 100644
> > > --- a/src/channel-display.h
> > > +++ b/src/channel-display.h
> > > @@ -150,6 +150,8 @@ gboolean        spice_display_channel_get_primary(SpiceChannel *channel, guint32
> > >
> > >  void spice_display_channel_change_preferred_compression(SpiceChannel *channel, gint compression);
> > >  void spice_display_channel_change_preferred_video_codec_type(SpiceChannel *channel, gint codec_type);
> > > +gboolean spice_display_channel_change_preferred_video_codec_types(SpiceChannel *channel, const gint *codecs,
> > > +                                                                  gsize ncodecs, GError **err);
> > >
> > >  GType           spice_gl_scanout_get_type     (void) G_GNUC_CONST;
> > >  void            spice_gl_scanout_free         (SpiceGlScanout *scanout);
> > > diff --git a/src/map-file b/src/map-file
> > > index 500683c..3cb9873 100644
> > > --- a/src/map-file
> > > +++ b/src/map-file
> > > @@ -25,6 +25,7 @@ spice_display_change_preferred_compression;
> > >  spice_display_change_preferred_video_codec_type;
> > >  spice_display_channel_change_preferred_compression;
> > >  spice_display_channel_change_preferred_video_codec_type;
> > > +spice_display_channel_change_preferred_video_codec_types;
> > >  spice_display_channel_get_gl_scanout;
> > >  spice_display_channel_get_primary;
> > >  spice_display_channel_get_type;
> > > diff --git a/src/spice-glib-sym-file b/src/spice-glib-sym-file
> > > index 2df1cc0..c3b2561 100644
> > > --- a/src/spice-glib-sym-file
> > > +++ b/src/spice-glib-sym-file
> > > @@ -23,6 +23,7 @@ spice_display_change_preferred_compression
> > >  spice_display_change_preferred_video_codec_type
> > >  spice_display_channel_change_preferred_compression
> > >  spice_display_channel_change_preferred_video_codec_type
> > > +spice_display_channel_change_preferred_video_codec_types
> > >  spice_display_channel_get_gl_scanout
> > >  spice_display_channel_get_primary
> > >  spice_display_channel_get_type
> > > --
> > > 2.21.0
> > >
> > > _______________________________________________
> > > Spice-devel mailing list
> > > Spice-devel@xxxxxxxxxxxxxxxxxxxxx
> > > https://lists.freedesktop.org/mailman/listinfo/spice-devel

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel

[Index of Archives]     [Linux Virtualization]     [Linux Virtualization]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]