From: Victor Toso <me@xxxxxxxxxxxxxx> On channel-display.c, for each SpiceVideoCodecType we need: - Its enum type; - The associated capability; - A name; On channel-display-gst.c, for each SpiceVideoCodecType we need: - Associated decoding elements for the pipeline; - Associated GstCaps, also for the video pipeline; Follow up patch will need the associated name for given SpiceVideoCodecType. Moving gst_opts[] array to channel-display-priv.h to be reused. This should also make slightly simpler when supporting a new video codec in the future. Signed-off-by: Victor Toso <victortoso@xxxxxxxxxx> --- src/channel-display-gst.c | 36 ------------------------------------ src/channel-display-priv.h | 43 +++++++++++++++++++++++++++++++++++++++++++ src/channel-display.c | 18 ++++-------------- 3 files changed, 47 insertions(+), 50 deletions(-) diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c index 8669562..acea4a2 100644 --- a/src/channel-display-gst.c +++ b/src/channel-display-gst.c @@ -50,42 +50,6 @@ typedef struct SpiceGstDecoder { guint timer_id; } SpiceGstDecoder; -/* FIXME: With gstreamer version 1.9.0 and higher, we are using playbin to - * create the pipeline for us and for that reason we don't need to keep track of - * decoder's name anymore. */ -static struct { - const gchar *dec_name; - const gchar *dec_caps; -} gst_opts[] = { - /* SpiceVideoCodecType starts at index 1 */ - { NULL, NULL }, - - /* SPICE_VIDEO_CODEC_TYPE_MJPEG */ - { "jpegdec", "image/jpeg" }, - - /* SPICE_VIDEO_CODEC_TYPE_VP8 - * - * typefind is unable to identify VP8 streams by design. - * See: https://bugzilla.gnome.org/show_bug.cgi?id=756457 - */ - { "vp8dec", "video/x-vp8" }, - - /* SPICE_VIDEO_CODEC_TYPE_H264 - * When setting video/x-h264, h264parse will complain if we don't have the - * stream-format or codec_data information. As stream-format is byte-stream - * (hardcoded in spice-server), let's add it here to avoid the warning. - */ - { "h264parse ! avdec_h264", "video/x-h264,stream-format=byte-stream" }, - - /* SPICE_VIDEO_CODEC_TYPE_VP9 */ - { "vp9dec", "video/x-vp9" }, -}; - -G_STATIC_ASSERT(G_N_ELEMENTS(gst_opts) <= SPICE_VIDEO_CODEC_TYPE_ENUM_END); - -#define VALID_VIDEO_CODEC_TYPE(codec) \ - (codec > 0 && codec < G_N_ELEMENTS(gst_opts)) - /* GstPlayFlags enum is in plugin's header which should not be exported. * https://bugzilla.gnome.org/show_bug.cgi?id=784279 */ diff --git a/src/channel-display-priv.h b/src/channel-display-priv.h index 3c9d119..00f71f8 100644 --- a/src/channel-display-priv.h +++ b/src/channel-display-priv.h @@ -150,6 +150,49 @@ struct display_stream { uint32_t report_drops_seq_len; }; +static const struct { + int cap; + const gchar name[8]; + + /* FIXME: With gstreamer version 1.9.0 and higher, we are using playbin to + * create the pipeline for us and for that reason we don't need to keep track of + * decoder's name anymore. */ + const gchar *dec_name; + const gchar *dec_caps; +} gst_opts[] = { + /* SpiceVideoCodecType starts at index 1 */ + { 0 }, + + /* SPICE_VIDEO_CODEC_TYPE_MJPEG */ + { SPICE_DISPLAY_CAP_CODEC_MJPEG, "mjpeg", + "jpegdec", "image/jpeg" }, + + /* SPICE_VIDEO_CODEC_TYPE_VP8 + * + * typefind is unable to identify VP8 streams by design. + * See: https://bugzilla.gnome.org/show_bug.cgi?id=756457 + */ + { SPICE_DISPLAY_CAP_CODEC_VP8, "vp8", + "vp8dec", "video/x-vp8" }, + + /* SPICE_VIDEO_CODEC_TYPE_H264 + * When setting video/x-h264, h264parse will complain if we don't have the + * stream-format or codec_data information. As stream-format is byte-stream + * (hardcoded in spice-server), let's add it here to avoid the warning. + */ + { SPICE_DISPLAY_CAP_CODEC_H264, "h264", + "h264parse ! avdec_h264", "video/x-h264,stream-format=byte-stream" }, + + /* SPICE_VIDEO_CODEC_TYPE_VP9 */ + { SPICE_DISPLAY_CAP_CODEC_VP9, "vp9", + "vp9dec", "video/x-vp9" }, +}; + +G_STATIC_ASSERT(G_N_ELEMENTS(gst_opts) <= SPICE_VIDEO_CODEC_TYPE_ENUM_END); + +#define VALID_VIDEO_CODEC_TYPE(codec) \ + (codec > 0 && codec < G_N_ELEMENTS(gst_opts)) + guint32 stream_get_time(display_stream *st); void stream_dropped_frame_on_playback(display_stream *st); void stream_display_frame(display_stream *st, SpiceFrame *frame, uint32_t width, uint32_t height, uint8_t* data); diff --git a/src/channel-display.c b/src/channel-display.c index 06c503c..e51064a 100644 --- a/src/channel-display.c +++ b/src/channel-display.c @@ -764,16 +764,6 @@ static HDC create_compatible_dc(void) static void spice_display_channel_reset_capabilities(SpiceChannel *channel) { guint i; - static const struct { - SpiceVideoCodecType type; - int cap; - const gchar name[8]; - } gst_codecs[] = { - {SPICE_VIDEO_CODEC_TYPE_MJPEG, SPICE_DISPLAY_CAP_CODEC_MJPEG, "mjpeg"}, - {SPICE_VIDEO_CODEC_TYPE_VP8, SPICE_DISPLAY_CAP_CODEC_VP8, "vp8"}, - {SPICE_VIDEO_CODEC_TYPE_H264, SPICE_DISPLAY_CAP_CODEC_H264, "h264"}, - {SPICE_VIDEO_CODEC_TYPE_VP9, SPICE_DISPLAY_CAP_CODEC_VP9, "vp9"}, - }; spice_channel_set_capability(SPICE_CHANNEL(channel), SPICE_DISPLAY_CAP_SIZED_STREAM); spice_channel_set_capability(SPICE_CHANNEL(channel), SPICE_DISPLAY_CAP_MONITORS_CONFIG); @@ -792,11 +782,11 @@ static void spice_display_channel_reset_capabilities(SpiceChannel *channel) #ifdef HAVE_BUILTIN_MJPEG spice_channel_set_capability(SPICE_CHANNEL(channel), SPICE_DISPLAY_CAP_CODEC_MJPEG); #endif - for (i = 0; i < G_N_ELEMENTS(gst_codecs); i++) { - if (gstvideo_has_codec(gst_codecs[i].type)) { - spice_channel_set_capability(SPICE_CHANNEL(channel), gst_codecs[i].cap); + for (i = 1; i < G_N_ELEMENTS(gst_opts); i++) { + if (gstvideo_has_codec(i)) { + spice_channel_set_capability(SPICE_CHANNEL(channel), gst_opts[i].cap); } else { - SPICE_DEBUG("GStreamer does not support the %s codec", gst_codecs[i].name); + SPICE_DEBUG("GStreamer does not support the %s codec", gst_opts[i].name); } } } -- 2.13.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel