Преглед на файлове

device: Add functions to set entity links and formats (MR 13)

Move part of mp_device_setup_link to a new function to allow
setting links between entities with entity and port indices,
and add a function to set entity pad formats.
Yassine Oudjana преди 3 години
родител
ревизия
7716faa801
променени са 2 файла, в които са добавени 72 реда и са изтрити 8 реда
  1. 58 8
      src/device.c
  2. 14 0
      src/device.h

+ 58 - 8
src/device.c

@@ -1,4 +1,5 @@
 #include "device.h"
+#include "mode.h"
 
 #include <errno.h>
 #include <fcntl.h>
@@ -159,6 +160,28 @@ mp_device_get_fd(const MPDevice *device)
         return device->fd;
 }
 
+bool
+mp_device_setup_entity_link(MPDevice *device,
+                            uint32_t source_entity_id,
+                            uint32_t sink_entity_id,
+                            uint32_t source_index,
+                            uint32_t sink_index,
+                            bool enabled)
+{
+        struct media_link_desc link = {};
+        link.flags = enabled ? MEDIA_LNK_FL_ENABLED : 0;
+        link.source.entity = source_entity_id;
+        link.source.index = source_index;
+        link.sink.entity = sink_entity_id;
+        link.sink.index = sink_index;
+        if (xioctl(device->fd, MEDIA_IOC_SETUP_LINK, &link) == -1) {
+                errno_printerr("MEDIA_IOC_SETUP_LINK");
+                return false;
+        }
+
+        return true;
+}
+
 bool
 mp_device_setup_link(MPDevice *device,
                      uint32_t source_pad_id,
@@ -172,17 +195,44 @@ mp_device_setup_link(MPDevice *device,
         const struct media_v2_pad *sink_pad = mp_device_get_pad(device, sink_pad_id);
         g_return_val_if_fail(sink_pad, false);
 
-        struct media_link_desc link = {};
-        link.flags = enabled ? MEDIA_LNK_FL_ENABLED : 0;
-        link.source.entity = source_pad->entity_id;
-        link.source.index = 0;
-        link.sink.entity = sink_pad->entity_id;
-        link.sink.index = 0;
-        if (xioctl(device->fd, MEDIA_IOC_SETUP_LINK, &link) == -1) {
-                errno_printerr("MEDIA_IOC_SETUP_LINK");
+        return mp_device_setup_entity_link(
+                device, source_pad->entity_id, 0, sink_pad->entity_id, 0, enabled);
+}
+
+bool
+mp_entity_pad_set_format(MPDevice *device,
+                         const struct media_v2_entity *entity,
+                         uint32_t pad,
+                         MPMode *mode)
+{
+        const struct media_v2_interface *interface =
+                mp_device_find_entity_interface(device, entity->id);
+        char path[260];
+        if (!mp_find_device_path(interface->devnode, path, 260)) {
+                g_printerr("Could not find path to %s\n", entity->name);
+                return false;
+        }
+
+        int fd = open(path, O_WRONLY);
+        if (fd == -1) {
+                errno_printerr("open");
                 return false;
         }
 
+        struct v4l2_subdev_format fmt = {};
+        fmt.pad = pad;
+        fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+        fmt.format.width = mode->width;
+        fmt.format.height = mode->height;
+        fmt.format.code = mp_pixel_format_to_v4l_bus_code(mode->pixel_format);
+        fmt.format.field = V4L2_FIELD_ANY;
+        if (xioctl(fd, VIDIOC_SUBDEV_S_FMT, &fmt) == -1) {
+                errno_printerr("VIDIOC_SUBDEV_S_FMT");
+                return false;
+        }
+
+        close(fd);
+
         return true;
 }
 

+ 14 - 0
src/device.h

@@ -1,5 +1,7 @@
 #pragma once
 
+#include "mode.h"
+
 #include <linux/media.h>
 #include <stdbool.h>
 #include <stddef.h>
@@ -17,11 +19,23 @@ void mp_device_close(MPDevice *device);
 
 int mp_device_get_fd(const MPDevice *device);
 
+bool mp_device_setup_entity_link(MPDevice *device,
+                                 uint32_t source_entity_id,
+                                 uint32_t sink_entity_id,
+                                 uint32_t source_index,
+                                 uint32_t sink_index,
+                                 bool enabled);
+
 bool mp_device_setup_link(MPDevice *device,
                           uint32_t source_pad_id,
                           uint32_t sink_pad_id,
                           bool enabled);
 
+bool mp_entity_pad_set_format(MPDevice *device,
+                              const struct media_v2_entity *entity,
+                              uint32_t pad,
+                              MPMode *mode);
+
 const struct media_device_info *mp_device_get_info(const MPDevice *device);
 const struct media_v2_entity *mp_device_find_entity(const MPDevice *device,
                                                     const char *driver_name);