From 6a473d6026480c47b6d9f1b2d619039da3cd36ba Mon Sep 17 00:00:00 2001 From: antimof Date: Thu, 7 May 2020 09:22:39 +0300 Subject: [PATCH] Check availability of necessary Gstreamer plugins --- renderers/video_renderer_gstreamer.c | 29 +++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/renderers/video_renderer_gstreamer.c b/renderers/video_renderer_gstreamer.c index 23fb8d7..5ed2720 100644 --- a/renderers/video_renderer_gstreamer.c +++ b/renderers/video_renderer_gstreamer.c @@ -18,12 +18,7 @@ */ #include "video_renderer.h" -#include #include -#include -#include -#include -#include #include #include @@ -32,6 +27,28 @@ struct video_renderer_s { GstElement *appsrc, *pipeline, *sink; }; +static gboolean check_plugins (void) +{ + int i; + gboolean ret; + GstRegistry *registry; + const gchar *needed[] = { "app", "libav", "playback", "autodetect", NULL}; + + registry = gst_registry_get (); + ret = TRUE; + for (i = 0; i < g_strv_length ((gchar **) needed); i++) { + GstPlugin *plugin; + plugin = gst_registry_find_plugin (registry, needed[i]); + if (!plugin) { + g_print ("Required gstreamer plugin '%s' not found\n", needed[i]); + ret = FALSE; + continue; + } + gst_object_unref (plugin); + } + return ret; +} + video_renderer_t *video_renderer_init(logger_t *logger, background_mode_t background_mode, bool low_latency) { video_renderer_t *renderer; GError *error = NULL; @@ -42,6 +59,8 @@ video_renderer_t *video_renderer_init(logger_t *logger, background_mode_t backgr gst_init(NULL, NULL); renderer->logger = logger; + + assert(check_plugins ()); renderer->pipeline = gst_parse_launch("appsrc name=video_source stream-type=0 format=GST_FORMAT_TIME is-live=true !" "queue ! decodebin ! videoconvert ! autovideosink name=video_sink sync=false", &error);