[Spice-devel] [PATCH spice-gtk v5 4/9] channel-display: implement preferred video codec msgc

Victor Toso victortoso at redhat.com
Thu Jan 19 07:46:50 UTC 2017


Hi,

On Wed, Jan 18, 2017 at 11:27:40AM +0100, Pavel Grunt wrote:
> Hi Victor,
>
> On Fri, 2017-01-06 at 09:18 +0100, Victor Toso wrote:
> > From: Victor Toso <me at victortoso.com>
> >
> > * SPICE_MSGC_DISPLAY_PREFERRED_VIDEO_CODEC_TYPE
> >
> > This message was introduced in protocol 0.12.13 to establish client
> > side preference on video codec to be used in streams.
> >
> > At this moment, we only introduce a new API [0] to select *the*
> > preferred video codec for client; In a later time, it should be
> > possible to use this message upon connection in order to to give
> > higher priority for video codecs with better performance and with
> > hardware decoding capabilities.
> >
> > [0] spice_display_change_preferred_video_codec_type()
>
> Why not support more than one codec in the api? It could accept a
> string which would be translated to the message. iow the message
> allows to handle more than one codec, the api should do the same.

I did it this way for two reasons:

1-) spice-gtk will get smarter about which video-codecs have hw
    decoding. Overall, that means that the API
    spice_display_change_preferred_video_codec_type() will be used
    mostly for testing.

2-) spice-server is the one that really controls the streaming. When the
    priority patch gets in it would be very likely that, in near future,
    we would give high priority for video-codecs with hw encoding - this
    makes the client-side options only matter if it is aligned with
    spice-server preferences.

TL;DR - I would say this API is mostly for testing and we should try
harder to detect hw encoding capabilities in spice-server and hw
decoding capabilities in spice-gtk.

If applications really need it, we can extend in the future.

  toso

>
> Pavel
> > 
> > Note that host preference for encoding is expected to be considered
> > first then the client's preference.
> > 
> > Signed-off-by: Victor Toso <victortoso at redhat.com>
> > ---
> >  configure.ac                         |  2 +-
> >  doc/reference/spice-gtk-sections.txt |  1 +
> >  src/channel-display.c                | 37
> > ++++++++++++++++++++++++++++++++++++
> >  src/channel-display.h                |  1 +
> >  src/map-file                         |  1 +
> >  src/spice-glib-sym-file              |  1 +
> >  6 files changed, 42 insertions(+), 1 deletion(-)
> > 
> > diff --git a/configure.ac b/configure.ac
> > index f3e7f8d..aa60e91 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -69,7 +69,7 @@ AC_CHECK_LIBM
> >  AC_SUBST(LIBM)
> >  
> >  AC_CONFIG_SUBDIRS([spice-common])
> > -PKG_CHECK_MODULES([SPICE_PROTOCOL], [spice-protocol >= 0.12.12])
> > +PKG_CHECK_MODULES([SPICE_PROTOCOL], [spice-protocol >= 0.12.13])
> >  
> >  COMMON_CFLAGS='-I${top_builddir}/spice-common/
> > -I${top_srcdir}/spice-common/ ${SPICE_PROTOCOL_CFLAGS}'
> >  AC_SUBST(COMMON_CFLAGS)
> > diff --git a/doc/reference/spice-gtk-sections.txt
> > b/doc/reference/spice-gtk-sections.txt
> > index 386e737..4e090f6 100644
> > --- a/doc/reference/spice-gtk-sections.txt
> > +++ b/doc/reference/spice-gtk-sections.txt
> > @@ -168,6 +168,7 @@ spice_display_get_gl_scanout
> >  spice_display_gl_draw_done
> >  spice_display_get_primary
> >  spice_display_change_preferred_compression
> > +spice_display_change_preferred_video_codec_type
> >  spice_gl_scanout_free
> >  <SUBSECTION Standard>
> >  SPICE_DISPLAY_CHANNEL
> > diff --git a/src/channel-display.c b/src/channel-display.c
> > index ca56cd1..1d71fd3 100644
> > --- a/src/channel-display.c
> > +++ b/src/channel-display.c
> > @@ -525,6 +525,43 @@ void
> > spice_display_change_preferred_compression(SpiceChannel *channel,
> > gint comp
> >  }
> >  
> >  /**
> > + * spice_display_change_preferred_video_codec:
> > + * @channel: a #SpiceDisplayChannel
> > + * @compression: a #SpiceVideoCodecType
> > + *
> > + * Tells the spice server to change the preferred video codec type
> > for
> > + * streaming in @channel. Application can set only one preferred
> > video codec.
> > + *
> > + * Since: 0.34
> > + */
> > +void spice_display_change_preferred_video_codec_type(SpiceChannel
> > *channel, gint codec_type)
> > +{
> > +    SpiceMsgOut *out;
> > +    SpiceMsgcDisplayPreferredVideoCodecType *msg;
> > +
> > +    g_return_if_fail(SPICE_IS_DISPLAY_CHANNEL(channel));
> > +    g_return_if_fail(codec_type >= SPICE_VIDEO_CODEC_TYPE_MJPEG);
> > +    g_return_if_fail(codec_type < SPICE_VIDEO_CODEC_TYPE_ENUM_END);
> > +
> > +    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");
> > +        return;
> > +    }
> > +
> > +    CHANNEL_DEBUG(channel, "changing preferred video codec type to
> > %d", codec_type);
> > +
> > +    msg = g_malloc0(sizeof(SpiceMsgcDisplayPreferredVideoCodecType)
> > +
> > +                    (sizeof(SpiceVideoCodecType) * 1));
> > +    msg->num_of_codecs = 1;
> > +    msg->codecs[0] = codec_type;
> > +
> > +    out = spice_msg_out_new(channel,
> > SPICE_MSGC_DISPLAY_PREFERRED_VIDEO_CODEC_TYPE);
> > +    out->marshallers->msgc_display_preferred_video_codec_type(out-
> > >marshaller, msg);
> > +    spice_msg_out_send_internal(out);
> > +    g_free(msg);
> > +}
> > +
> > +/**
> >   * spice_display_get_gl_scanout:
> >   * @channel: a #SpiceDisplayChannel
> >   *
> > diff --git a/src/channel-display.h b/src/channel-display.h
> > index ad82a16..fccf228 100644
> > --- a/src/channel-display.h
> > +++ b/src/channel-display.h
> > @@ -149,6 +149,7 @@
> > gboolean        spice_display_get_primary(SpiceChannel *channel,
> > guint32 surface
> >                                            SpiceDisplayPrimary
> > *primary);
> >  
> >  void spice_display_change_preferred_compression(SpiceChannel
> > *channel, gint compression);
> > +void spice_display_change_preferred_video_codec_type(SpiceChannel
> > *channel, gint codec_type);
> >  
> >  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 3d92153..31cafc2 100644
> > --- a/src/map-file
> > +++ b/src/map-file
> > @@ -21,6 +21,7 @@ spice_channel_type_to_string;
> >  spice_client_error_quark;
> >  spice_cursor_channel_get_type;
> >  spice_display_change_preferred_compression;
> > +spice_display_change_preferred_video_codec_type;
> >  spice_display_channel_get_type;
> >  spice_display_get_gl_scanout;
> >  spice_display_get_grab_keys;
> > diff --git a/src/spice-glib-sym-file b/src/spice-glib-sym-file
> > index 473c5ca..d73f799 100644
> > --- a/src/spice-glib-sym-file
> > +++ b/src/spice-glib-sym-file
> > @@ -19,6 +19,7 @@ spice_channel_type_to_string
> >  spice_client_error_quark
> >  spice_cursor_channel_get_type
> >  spice_display_change_preferred_compression
> > +spice_display_change_preferred_video_codec_type
> >  spice_display_channel_get_type
> >  spice_display_get_gl_scanout
> >  spice_display_get_primary
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170119/802c6fe5/attachment.sig>


More information about the Spice-devel mailing list