[RFC PATCH] media: v4l2-dev: sysfs: Support streaming attribute

From: Kieran Bingham
Date: Fri Dec 23 2022 - 18:17:54 EST


Provide a streaming attribute to allow userspace to interogate if a device
is actively streaming or not.

This will allow desktop notifications to report if a camera or device
is active on the system, rather than just 'open' which can occur when
configuring the device.

Bug: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/2669
Signed-off-by: Kieran Bingham <kieran.bingham@xxxxxxxxxxxxxxxx>
---

This is a quick POC to see if such a facility makes sense.
I'm weary that not all video devices may have the queues registered on
the struct video_device, but this seems like an effective way to be able
to determine if a device is actively streaming on a system.


Documentation/ABI/stable/sysfs-class-video | 9 +++++++++
MAINTAINERS | 1 +
drivers/media/v4l2-core/v4l2-dev.c | 13 +++++++++++++
3 files changed, 23 insertions(+)
create mode 100644 Documentation/ABI/stable/sysfs-class-video

diff --git a/Documentation/ABI/stable/sysfs-class-video b/Documentation/ABI/stable/sysfs-class-video
new file mode 100644
index 000000000000..99dd27475a92
--- /dev/null
+++ b/Documentation/ABI/stable/sysfs-class-video
@@ -0,0 +1,9 @@
+What: /sys/class/video4linux/video<n>/streaming
+Date: January 2023
+KernelVersion: 6.3
+Contact: Kieran Bingham <kieran.bingham@xxxxxxxxxxxxxxxx>
+Description:
+ Indicates if the video device has an actively streaming queue.
+ This may indicate that the device is capturing or outputing
+ video data.
+Users:
diff --git a/MAINTAINERS b/MAINTAINERS
index 11987154eeee..8449f5a6c0da 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12867,6 +12867,7 @@ S: Maintained
W: https://linuxtv.org
Q: http://patchwork.kernel.org/project/linux-media/list/
T: git git://linuxtv.org/media_tree.git
+F: Documentation/ABI/stable/sysfs-class-video
F: Documentation/admin-guide/media/
F: Documentation/devicetree/bindings/media/
F: Documentation/driver-api/media/
diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
index 397d553177fa..7d800309d076 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -30,6 +30,7 @@
#include <media/v4l2-device.h>
#include <media/v4l2-ioctl.h>
#include <media/v4l2-event.h>
+#include <media/videobuf2-core.h>

#define VIDEO_NUM_DEVICES 256
#define VIDEO_NAME "video4linux"
@@ -85,7 +86,19 @@ static ssize_t name_show(struct device *cd,
}
static DEVICE_ATTR_RO(name);

+static ssize_t streaming_show(struct device *cd,
+ struct device_attribute *attr, char *buf)
+{
+ struct video_device *vdev = to_video_device(cd);
+
+ int active = vdev->queue ? vb2_is_streaming(vdev->queue) : false;
+
+ return sprintf(buf, "%s\n", active ? "active" : "inactive");
+}
+static DEVICE_ATTR_RO(streaming);
+
static struct attribute *video_device_attrs[] = {
+ &dev_attr_streaming.attr,
&dev_attr_name.attr,
&dev_attr_dev_debug.attr,
&dev_attr_index.attr,
--
2.34.1