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

Kevin Pouget kpouget at redhat.com
Wed Jul 10 15:41:39 UTC 2019


ping

On Thu, Jul 4, 2019 at 12:29 PM Kevin Pouget <kpouget at redhat.com> 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 at redhat.com>
> ---
>  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
>  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);
> +
> +    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)
> +        {
> +            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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20190710/800d5fd8/attachment.html>


More information about the Spice-devel mailing list