From 55a8e772698a36c176ad7c5b02559594be19458d Mon Sep 17 00:00:00 2001 From: Jeffy Chen Date: Wed, 11 May 2022 17:06:25 +0800 Subject: [PATCH 07/11] v4l2src: Filter out unavailable RK sources Use env "GST_V4L2SRC_RK_DEVICES" to specify available RK sources. Default is "_mainpath:_selfpath:_bypass:_scale". Signed-off-by: Jeffy Chen --- sys/v4l2/gstv4l2deviceprovider.c | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/sys/v4l2/gstv4l2deviceprovider.c b/sys/v4l2/gstv4l2deviceprovider.c index 7c2c87fea..291495506 100644 --- a/sys/v4l2/gstv4l2deviceprovider.c +++ b/sys/v4l2/gstv4l2deviceprovider.c @@ -146,6 +146,44 @@ gst_v4l2_device_provider_probe_device (GstV4l2DeviceProvider * provider, type = GST_V4L2_DEVICE_TYPE_SOURCE; v4l2obj->skip_try_fmt_probes = TRUE; + + if (!strncmp ((char *) v4l2obj->vcap.driver, "rk", strlen("rk"))) { + /* Filter out unavailable RK source devices */ + const gchar *devices, *ptr; + gchar pattern[64]; + gboolean found = FALSE; + + devices = g_getenv ("GST_V4L2SRC_RK_DEVICES"); + if (!devices) + devices = g_getenv ("GST_V4L2SRC_DEVICES"); + if (!devices) + devices = "_mainpath:_selfpath:_bypass:_scale"; + + while (devices && devices[0]) { + while (devices[0] == ':') + devices ++; + + if (!sscanf (devices, "%32[^:]", pattern)) + break; + + devices += strlen (pattern); + + if (!(ptr = strstr (device_name, pattern))) + continue; + + /* Name ends with pattern[0-9] */ + ptr += strlen (pattern); + if (ptr[0] == '\0' || (ptr[0] >= '0' && ptr[0] <= '9')) { + found = TRUE; + break; + } + } + + if (!found) { + GST_WARNING ("%s(%s) been ignored", device_path, device_name); + goto destroy; + } + } } if (v4l2obj->device_caps & -- 2.20.1