This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/cgit.cgi/v4l-utils.git tree:

Subject: media-ctl: Check for Streams API support
Author:  Tomi Valkeinen <[email protected]>
Date:    Tue Aug 8 09:19:25 2023 +0300

Use the new VIDIOC_SUBDEV_S_CLIENT_CAP ioctl to inform the kernel that
we support streams, and use the return values of
VIDIOC_SUBDEV_S_CLIENT_CAP and VIDIOC_SUBDEV_QUERYCAP to decide if the
entity supports streams. If not, return an error in case the user tries
to use streams.

Signed-off-by: Tomi Valkeinen <[email protected]>
Reviewed-by: Laurent Pinchart <[email protected]>
Signed-off-by: Hans Verkuil <[email protected]>

 utils/media-ctl/libv4l2subdev.c | 56 +++++++++++++++++++++++++++++++++++++++++
 utils/media-ctl/mediactl-priv.h |  1 +
 2 files changed, 57 insertions(+)

---

http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=e2f95f692caec6dfcb0ce73148f42032161e59bb
diff --git a/utils/media-ctl/libv4l2subdev.c b/utils/media-ctl/libv4l2subdev.c
index 2144a5275544..16e1284cc0a3 100644
--- a/utils/media-ctl/libv4l2subdev.c
+++ b/utils/media-ctl/libv4l2subdev.c
@@ -48,6 +48,12 @@
 
 int v4l2_subdev_open(struct media_entity *entity)
 {
+       struct v4l2_subdev_client_capability clientcap = {};
+       struct v4l2_subdev_capability subdevcap = {};
+       bool subdev_streams;
+       bool client_streams;
+       int ret;
+
        if (entity->fd != -1)
                return 0;
 
@@ -60,6 +66,16 @@ int v4l2_subdev_open(struct media_entity *entity)
                return ret;
        }
 
+       ret = ioctl(entity->fd, VIDIOC_SUBDEV_QUERYCAP, &subdevcap);
+       subdev_streams = !ret && (subdevcap.capabilities & 
V4L2_SUBDEV_CAP_STREAMS);
+
+       clientcap.capabilities = V4L2_SUBDEV_CLIENT_CAP_STREAMS;
+
+       ret = ioctl(entity->fd, VIDIOC_SUBDEV_S_CLIENT_CAP, &clientcap);
+       client_streams = !ret && (clientcap.capabilities & 
V4L2_SUBDEV_CLIENT_CAP_STREAMS);
+
+       entity->supports_streams = subdev_streams && client_streams;
+
        return 0;
 }
 
@@ -80,6 +96,11 @@ int v4l2_subdev_get_format(struct media_entity *entity,
        if (ret < 0)
                return ret;
 
+       if (!entity->supports_streams && stream) {
+               media_dbg(entity->media, "Streams API not supported\n");
+               return -ENOTSUP;
+       }
+
        memset(&fmt, 0, sizeof(fmt));
        fmt.pad = pad;
        fmt.stream = stream;
@@ -105,6 +126,11 @@ int v4l2_subdev_set_format(struct media_entity *entity,
        if (ret < 0)
                return ret;
 
+       if (!entity->supports_streams && stream) {
+               media_dbg(entity->media, "Streams API not supported\n");
+               return -ENOTSUP;
+       }
+
        memset(&fmt, 0, sizeof(fmt));
        fmt.pad = pad;
        fmt.stream = stream;
@@ -133,6 +159,11 @@ int v4l2_subdev_get_selection(struct media_entity *entity,
        if (ret < 0)
                return ret;
 
+       if (!entity->supports_streams && stream) {
+               media_dbg(entity->media, "Streams API not supported\n");
+               return -ENOTSUP;
+       }
+
        memset(&u.sel, 0, sizeof(u.sel));
        u.sel.pad = pad;
        u.sel.target = target;
@@ -172,6 +203,11 @@ int v4l2_subdev_set_selection(struct media_entity *entity,
        if (ret < 0)
                return ret;
 
+       if (!entity->supports_streams && stream) {
+               media_dbg(entity->media, "Streams API not supported\n");
+               return -ENOTSUP;
+       }
+
        memset(&u.sel, 0, sizeof(u.sel));
        u.sel.pad = pad;
        u.sel.stream = stream;
@@ -215,6 +251,11 @@ int v4l2_subdev_get_routing(struct media_entity *entity,
        if (ret < 0)
                return ret;
 
+       if (!entity->supports_streams) {
+               media_dbg(entity->media, "Streams API not supported\n");
+               return -ENOTSUP;
+       }
+
        ret = ioctl(entity->fd, VIDIOC_SUBDEV_G_ROUTING, &routing);
        if (ret == -1 && errno != ENOSPC)
                return -errno;
@@ -257,6 +298,11 @@ int v4l2_subdev_set_routing(struct media_entity *entity,
        if (ret < 0)
                return ret;
 
+       if (!entity->supports_streams) {
+               media_dbg(entity->media, "Streams API not supported\n");
+               return -ENOTSUP;
+       }
+
        ret = ioctl(entity->fd, VIDIOC_SUBDEV_S_ROUTING, &routing);
        if (ret == -1)
                return -errno;
@@ -347,6 +393,11 @@ int v4l2_subdev_get_frame_interval(struct media_entity 
*entity,
        if (ret < 0)
                return ret;
 
+       if (!entity->supports_streams && stream) {
+               media_dbg(entity->media, "Streams API not supported\n");
+               return -ENOTSUP;
+       }
+
        memset(&ival, 0, sizeof(ival));
        ival.pad = pad;
        ival.stream = stream;
@@ -370,6 +421,11 @@ int v4l2_subdev_set_frame_interval(struct media_entity 
*entity,
        if (ret < 0)
                return ret;
 
+       if (!entity->supports_streams && stream) {
+               media_dbg(entity->media, "Streams API not supported\n");
+               return -ENOTSUP;
+       }
+
        memset(&ival, 0, sizeof(ival));
        ival.pad = pad;
        ival.stream = stream;
diff --git a/utils/media-ctl/mediactl-priv.h b/utils/media-ctl/mediactl-priv.h
index a0d3a55a15a3..eb55e07eab22 100644
--- a/utils/media-ctl/mediactl-priv.h
+++ b/utils/media-ctl/mediactl-priv.h
@@ -33,6 +33,7 @@ struct media_entity {
        struct media_link *links;
        unsigned int max_links;
        unsigned int num_links;
+       bool supports_streams;
 
        char devname[32];
        int fd;

_______________________________________________
linuxtv-commits mailing list
[email protected]
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to