Hi, On Wed, Oct 19, 2016 at 06:28:33AM -0400, Frediano Ziglio wrote: > > > > From: Victor Toso <me@xxxxxxxxxxxxxx> > > > > Signed-off-by: Victor Toso <victortoso@xxxxxxxxxx> > > --- > > src/channel-display-gst.c | 78 > > +++++++++++++++++++++++++---------------------- > > 1 file changed, 42 insertions(+), 36 deletions(-) > > > > diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c > > index de774f2..68ebd1f 100644 > > --- a/src/channel-display-gst.c > > +++ b/src/channel-display-gst.c > > @@ -50,6 +50,37 @@ typedef struct SpiceGstDecoder { > > guint timer_id; > > } SpiceGstDecoder; > > > > +static struct { > > + const gchar *dec_name; > > + const gchar *dec_caps; > > +} gst_opts[] = { > > Why not const? Are you going to change it dynamically? My initial plan, yes! I plan to include an gint rank, that would be a setting for preference.. that could be changed given user input (doing it dynamically would be mostly for testing) > I would also add a static assert to check that this array has exactly > SPICE_VIDEO_CODEC_TYPE_ENUM_END items to avoid overflows when the > list of encoders will be expanded. Sure, will do. Thanks! toso > > > + /* decodebin will use vaapi if installed, which for a time could > > + * intentionally crash the application. So only use decodebin as a > > + * fallback or when SPICE_GSTVIDEO_AUTO is set. > > + * See: https://bugs.freedesktop.org/show_bug.cgi?id=90884 > > + */ > > + { "decodebin", "" }, > > + > > + /* SPICE_VIDEO_CODEC_TYPE_MJPEG */ > > + { "jpegdec", "caps=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", "caps=video/x-vp8" }, > > + > > + /* SPICE_VIDEO_CODEC_TYPE_H264 > > + * h264 streams detection works fine and setting an incomplete cap > > + * causes errors. So let typefind do all the work. > > + */ > > + { "h264parse ! avdec_h264", "" }, > > + > > +}; > > + > > +#define VALID_VIDEO_CODEC_TYPE(codec) \ > > + (codec > 0 && codec < SPICE_VIDEO_CODEC_TYPE_ENUM_END) > > > > /* ---------- SpiceFrame ---------- */ > > > > @@ -249,45 +280,20 @@ static void free_pipeline(SpiceGstDecoder *decoder) > > > > static gboolean create_pipeline(SpiceGstDecoder *decoder) > > { > > - const gchar *src_caps, *gstdec_name; > > gchar *desc; > > + gboolean auto_enabled; > > + guint opt; > > GstAppSinkCallbacks appsink_cbs = { 0 }; > > GError *err = NULL; > > > > - switch (decoder->base.codec_type) { > > - case SPICE_VIDEO_CODEC_TYPE_MJPEG: > > - src_caps = "caps=image/jpeg"; > > - gstdec_name = "jpegdec"; > > - break; > > - case SPICE_VIDEO_CODEC_TYPE_VP8: > > - /* typefind is unable to identify VP8 streams by design. > > - * See: https://bugzilla.gnome.org/show_bug.cgi?id=756457 > > - */ > > - src_caps = "caps=video/x-vp8"; > > - gstdec_name = "vp8dec"; > > - break; > > - case SPICE_VIDEO_CODEC_TYPE_H264: > > - /* h264 streams detection works fine and setting an incomplete cap > > - * causes errors. So let typefind do all the work. > > - */ > > - src_caps = ""; > > - gstdec_name = "h264parse ! avdec_h264"; > > - break; > > - default: > > - SPICE_DEBUG("Unknown codec type %d. Trying decodebin.", > > - decoder->base.codec_type); > > - src_caps = ""; > > - gstdec_name = NULL; > > - break; > > - } > > - > > - /* decodebin will use vaapi if installed, which for a time could > > - * intentionally crash the application. So only use decodebin as a > > - * fallback or when SPICE_GSTVIDEO_AUTO is set. > > - * See: https://bugs.freedesktop.org/show_bug.cgi?id=90884 > > - */ > > - if (gstdec_name == NULL || g_getenv("SPICE_GSTVIDEO_AUTO") != NULL) { > > - gstdec_name = "decodebin"; > > + auto_enabled = (g_getenv("SPICE_GSTVIDEO_AUTO") != NULL); > > + if (auto_enabled || !VALID_VIDEO_CODEC_TYPE(decoder->base.codec_type)) { > > + SPICE_DEBUG("Trying %s for codec type %d %s", > > + gst_opts[0].dec_name, decoder->base.codec_type, > > + (auto_enabled) ? "(SPICE_GSTVIDEO_AUTO is set)" : ""); > > + opt = 0; > > + } else { > > + opt = decoder->base.codec_type; > > } > > > > /* - We schedule the frame display ourselves so set sync=false on > > appsink > > @@ -300,7 +306,7 @@ static gboolean create_pipeline(SpiceGstDecoder *decoder) > > desc = g_strdup_printf("appsrc name=src is-live=true format=time > > max-bytes=0 block=true " > > "%s ! %s ! videoconvert ! appsink name=sink " > > "caps=video/x-raw,format=BGRx sync=false > > drop=false", > > - src_caps, gstdec_name); > > + gst_opts[opt].dec_caps, gst_opts[opt].dec_name); > > SPICE_DEBUG("GStreamer pipeline: %s", desc); > > > > decoder->pipeline = gst_parse_launch_full(desc, NULL, > > GST_PARSE_FLAG_FATAL_ERRORS, &err); > > Frediano > _______________________________________________ > 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