From 6d878e400d4e2ebb4594d059752113aab818b7a7 Mon Sep 17 00:00:00 2001 From: Gerben Jan Dijkman Date: Tue, 28 May 2024 14:38:29 +0200 Subject: [PATCH] PPP patches --- ...0f3a02cffdf8b683f85cb32fc256d73615d9.patch | 23 + ...e606d680295e0b4caceadf74ff5857ac16b2.patch | 130 ++++ ...5bc223989cb165ba1b0716ab9f0ca9c43e53.patch | 572 ++++++++++++++++++ ....8.2.ebuild => megapixels-1.8.2-r1.ebuild} | 6 + media-video/snapshot/snapshot-46.3.ebuild | 239 -------- 5 files changed, 731 insertions(+), 239 deletions(-) create mode 100644 media-video/megapixels/files/06230f3a02cffdf8b683f85cb32fc256d73615d9.patch create mode 100644 media-video/megapixels/files/27a1e606d680295e0b4caceadf74ff5857ac16b2.patch create mode 100644 media-video/megapixels/files/d8b35bc223989cb165ba1b0716ab9f0ca9c43e53.patch rename media-video/megapixels/{megapixels-1.8.2.ebuild => megapixels-1.8.2-r1.ebuild} (81%) delete mode 100755 media-video/snapshot/snapshot-46.3.ebuild diff --git a/media-video/megapixels/files/06230f3a02cffdf8b683f85cb32fc256d73615d9.patch b/media-video/megapixels/files/06230f3a02cffdf8b683f85cb32fc256d73615d9.patch new file mode 100644 index 0000000..4a2a949 --- /dev/null +++ b/media-video/megapixels/files/06230f3a02cffdf8b683f85cb32fc256d73615d9.patch @@ -0,0 +1,23 @@ +From 06230f3a02cffdf8b683f85cb32fc256d73615d9 Mon Sep 17 00:00:00 2001 +From: kgmt0 +Date: Sat, 2 Jul 2022 12:15:22 +0700 +Subject: [PATCH] device: Make mp_device_setup_link() support non-zero pad + indices + +--- + src/device.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/device.c b/src/device.c +index b4d5f80..9e2db00 100644 +--- a/src/device.c ++++ b/src/device.c +@@ -197,7 +197,7 @@ mp_device_setup_link(MPDevice *device, + g_return_val_if_fail(sink_pad, false); + + return mp_device_setup_entity_link( +- device, source_pad->entity_id, sink_pad->entity_id, 0, 0, enabled); ++ device, source_pad->entity_id, sink_pad->entity_id, source_pad->index, sink_pad->index, enabled); + } + + bool diff --git a/media-video/megapixels/files/27a1e606d680295e0b4caceadf74ff5857ac16b2.patch b/media-video/megapixels/files/27a1e606d680295e0b4caceadf74ff5857ac16b2.patch new file mode 100644 index 0000000..f8ce7a7 --- /dev/null +++ b/media-video/megapixels/files/27a1e606d680295e0b4caceadf74ff5857ac16b2.patch @@ -0,0 +1,130 @@ +From 27a1e606d680295e0b4caceadf74ff5857ac16b2 Mon Sep 17 00:00:00 2001 +From: kgmt0 +Date: Thu, 1 Dec 2022 00:09:27 -0600 +Subject: [PATCH] Add media-formats and media-crops to the config file format + +--- + src/camera_config.c | 61 +++++++++++++++++++++++++++++++++++++++++++++ + src/camera_config.h | 23 +++++++++++++++++ + 2 files changed, 84 insertions(+) + +diff --git a/src/camera_config.c b/src/camera_config.c +index 6ff74d1..1102354 100644 +--- a/src/camera_config.c ++++ b/src/camera_config.c +@@ -184,6 +184,67 @@ config_ini_handler(void *user, + ++cc->num_media_links; + } + g_strfreev(linkdefs); ++ } else if (strcmp(name, "media-formats") == 0) { ++ struct mp_camera_config *cc = &cameras[index]; ++ char **formatdefs = g_strsplit(value, ",", 0); ++ ++ for (int i = 0; i < MP_MAX_FORMATS && formatdefs[i] != NULL; ++ ++i) { ++ char **entry = g_strsplit(formatdefs[i], ":", 5); ++ char *name = entry[0]; ++ int pad = strtoint(entry[1], NULL, 10); ++ char *format = entry[2]; ++ char *width = entry[3]; ++ char *height = entry[4]; ++ ++ const size_t name_size = ++ sizeof(cc->media_formats[i].name); ++ strncpy(cc->media_formats[i].name, ++ name, ++ name_size ); ++ ++ cc->media_formats[i].pad = pad; ++ ++ cc->media_formats[i].mode.pixel_format = ++ mp_pixel_format_from_str(format); ++ cc->media_formats[i].mode.width = ++ strtoint(width, NULL, 10); ++ cc->media_formats[i].mode.height = ++ strtoint(height, NULL, 10); ++ ++ cc->num_media_formats++; ++ ++ g_strfreev(entry); ++ } ++ } else if (strcmp(name, "media-crops") == 0) { ++ char **formatdefs = g_strsplit(value, ",", 0); ++ ++ for (int i = 0; i < MP_MAX_CROPS && formatdefs[i] != NULL; ++ ++i) { ++ char **entry = g_strsplit(formatdefs[i], ":", 6); ++ char *name = entry[0]; ++ int pad = strtoint(entry[1], NULL, 10); ++ int top = strtoint(entry[2], NULL, 10); ++ int left = strtoint(entry[3], NULL, 10); ++ int width = strtoint(entry[4], NULL, 10); ++ int height = strtoint(entry[5], NULL, 10); ++ ++ const size_t name_size = ++ sizeof(cc->media_crops[i].name); ++ strncpy(cc->media_crops[i].name, ++ name, ++ name_size ); ++ ++ cc->media_crops[i].pad = pad; ++ cc->media_crops[i].top = top; ++ cc->media_crops[i].left = left; ++ cc->media_crops[i].width = width; ++ cc->media_crops[i].height = height; ++ ++ cc->num_media_crops++; ++ ++ g_strfreev(entry); ++ } + } else if (strcmp(name, "colormatrix") == 0) { + sscanf(value, + "%f,%f,%f,%f,%f,%f,%f,%f,%f", +diff --git a/src/camera_config.h b/src/camera_config.h +index d53d36f..b1bd5a5 100644 +--- a/src/camera_config.h ++++ b/src/camera_config.h +@@ -7,6 +7,8 @@ + + #define MP_MAX_CAMERAS 5 + #define MP_MAX_LINKS 10 ++#define MP_MAX_FORMATS 10 ++#define MP_MAX_CROPS 10 + + struct mp_media_link_config { + char source_name[100]; +@@ -15,6 +17,21 @@ struct mp_media_link_config { + int target_port; + }; + ++struct mp_media_format_config { ++ char name[100]; ++ int pad; ++ MPMode mode; ++}; ++ ++struct mp_media_crop_config { ++ char name[100]; ++ int pad; ++ int left; ++ int top; ++ int width; ++ int height; ++}; ++ + struct mp_camera_config { + size_t index; + +@@ -30,6 +47,12 @@ struct mp_camera_config { + struct mp_media_link_config media_links[MP_MAX_LINKS]; + int num_media_links; + ++ struct mp_media_format_config media_formats[MP_MAX_FORMATS]; ++ int num_media_formats; ++ ++ struct mp_media_crop_config media_crops[MP_MAX_CROPS]; ++ int num_media_crops; ++ + float colormatrix[9]; + float forwardmatrix[9]; + float previewmatrix[9]; diff --git a/media-video/megapixels/files/d8b35bc223989cb165ba1b0716ab9f0ca9c43e53.patch b/media-video/megapixels/files/d8b35bc223989cb165ba1b0716ab9f0ca9c43e53.patch new file mode 100644 index 0000000..6d7bc6d --- /dev/null +++ b/media-video/megapixels/files/d8b35bc223989cb165ba1b0716ab9f0ca9c43e53.patch @@ -0,0 +1,572 @@ +From d8b35bc223989cb165ba1b0716ab9f0ca9c43e53 Mon Sep 17 00:00:00 2001 +From: kgmt0 +Date: Thu, 1 Dec 2022 00:13:27 -0600 +Subject: [PATCH] WIP: Support Pinephone Pro + +Both cameras work now but the quality is very poor. + +The config file format is extended to include 2 new options +"media-formats" and "media-crops" that can be used to set formats and +crops on a per-pad basis. These are needed to initialize Pinephone Pro's +media controller. + +Tested with Linux 6.0.8-1 from Arch Linux ARM (linux-megi). +--- + config/motorola,osprey.ini | 1 + + config/pine64,pinephone-pro.ini | 49 +++++++++ + config/xiaomi,scorpio.ini | 1 + + meson.build | 1 + + src/camera.c | 10 +- + src/device.c | 101 ++++++++++++++++++ + src/device.h | 14 +++ + src/io_pipeline.c | 184 ++++++++++++++++++++------------ + 8 files changed, 288 insertions(+), 73 deletions(-) + create mode 100644 config/pine64,pinephone-pro.ini + +diff --git a/config/motorola,osprey.ini b/config/motorola,osprey.ini +index ab8990d..5809a8e 100644 +--- a/config/motorola,osprey.ini ++++ b/config/motorola,osprey.ini +@@ -15,3 +15,4 @@ preview-rate=30 + preview-fmt=RGGB10P + rotate=270 + media-links=msm_csiphy0:1->msm_csid0:0,msm_csid0:1->msm_ispif0:0,msm_ispif0:1->msm_vfe0_rdi0:0 ++media-formats=msm_csiphy0:1:RGGB10P:4096:2304,msm_csid0:0:RGGB10P:4096:2304,msm_csid0:1:RGGB10P:4096:2304,msm_ispif0:0:RGGB10P:4096:2304,msm_ispif0:1:RGGB10P:4096:2304,msm_vfe0_rdi0:0:RGGB10P:4096:2304 +diff --git a/config/pine64,pinephone-pro.ini b/config/pine64,pinephone-pro.ini +new file mode 100644 +index 0000000..bd5cfcd +--- /dev/null ++++ b/config/pine64,pinephone-pro.ini +@@ -0,0 +1,49 @@ ++[device] ++make=PINE64 ++model=PinePhone ++ ++[rear] ++driver=imx258 1-001a ++media-driver=rkisp1 ++capture-width=1048 ++capture-height=780 ++capture-rate=30 ++capture-fmt=RGGB8 ++preview-width=1048 ++preview-height=780 ++preview-rate=30 ++preview-fmt=RGGB8 ++rotate=270 ++mirrored=false ++blacklevel=3 ++whitelevel=255 ++focallength=2.35 ++cropfactor=10.81 ++fnumber=2.2 ++iso-min=100 ++iso-max=64000 ++flash-path=/sys/class/leds/white:flash ++media-links=imx258 1-001a:0->rkisp1_csi:0,rkisp1_csi:1->rkisp1_isp:0,rkisp1_isp:2->rkisp1_resizer_mainpath:0 ++media-formats=imx258 1-001a:0:RGGB10P:1048:780,rkisp1_csi:0:RGGB10P:1048:780,rkisp1_isp:0:RGGB10P:1048:780,rkisp1_isp:2:RGGB8:1048:780,rkisp1_resizer_mainpath:0:RGGB8:1048:780,rkisp1_resizer_mainpath:1:RGGB8:1048:780 ++media-crops=rkisp1_isp:0:0:0:1048:780,rkisp1_isp:2:0:0:1048:780,rkisp1_resizer_mainpath:0:0:0:1048:768 ++ ++[front] ++driver=m00_f_ov8858 1-0036 ++media-driver=rkisp1 ++capture-width=3264 ++capture-height=2448 ++capture-rate=30 ++capture-fmt=BGGR8 ++preview-width=3264 ++preview-height=2448 ++preview-rate=30 ++preview-fmt=BGGR8 ++rotate=90 ++mirrored=true ++focallength=2.94 ++cropfactor=12.7 ++fnumber=2.4 ++flash-display=true ++media-links=m00_f_ov8858 1-0036:0->rkisp1_csi:0,rkisp1_csi:1->rkisp1_isp:0,rkisp1_isp:2->rkisp1_resizer_mainpath:0,rkisp1_resizer_mainpath:1->rkisp1_mainpath:0 ++media-formats=m00_f_ov8858 1-0036:0:BGGR10P:3264:2448,rkisp1_csi:0:BGGR10P:3264:2448,rkisp1_isp:0:BGGR10P:3264:2448,rkisp1_isp:2:BGGR8:3264:2448,rkisp1_resizer_mainpath:0:BGGR8:3264:2448,rkisp1_resizer_mainpath:1:BGGR8:3264:2448 ++media-crops=rkisp1_isp:0:0:0:3264:2448,rkisp1_isp:2:0:0:3264:2448,rkisp1_resizer_mainpath:0:0:0:3264:768 +diff --git a/config/xiaomi,scorpio.ini b/config/xiaomi,scorpio.ini +index cce6d49..14b7f29 100644 +--- a/config/xiaomi,scorpio.ini ++++ b/config/xiaomi,scorpio.ini +@@ -15,3 +15,4 @@ preview-rate=30 + preview-fmt=RGGB10P + rotate=90 + media-links=imx318 3-001a:0->msm_csiphy0:0,msm_csiphy0:1->msm_csid0:0,msm_csid0:1->msm_ispif0:0,msm_ispif0:1->msm_vfe0_rdi0:0 ++media-formats=imx318 3-001a:0:RGGB10P:3840:2160,msm_csiphy0:0:RGGB10P:3840:2160,msm_csiphy0:1:RGGB10P:3840:2160,msm_csid0:0:RGGB10P:3840:2160,msm_csid0:1:RGGB10P:3840:2160,msm_ispif0:0:RGGB10P:3840:2160,msm_ispif0:1:RGGB10P:3840:2160,msm_vfe0_rdi0:0:RGGB10P:3840:2160 +diff --git a/meson.build b/meson.build +index 3b98f19..d53dec9 100644 +--- a/meson.build ++++ b/meson.build +@@ -72,6 +72,7 @@ install_data( + 'config/pine64,pinephone-1.0.ini', + 'config/pine64,pinephone-1.1.ini', + 'config/pine64,pinephone-1.2.ini', ++ 'config/pine64,pinephone-pro.ini', + 'config/pine64,pinetab.ini', + 'config/xiaomi,scorpio.ini', + ], +diff --git a/src/camera.c b/src/camera.c +index 9a08f56..7368189 100644 +--- a/src/camera.c ++++ b/src/camera.c +@@ -305,11 +305,11 @@ mp_camera_set_mode(MPCamera *camera, MPMode *mode) + } + + // Update the mode +- mode->pixel_format = +- mp_pixel_format_from_v4l_bus_code(fmt.format.code); +- mode->frame_interval = interval.interval; +- mode->width = fmt.format.width; +- mode->height = fmt.format.height; ++ //mode->pixel_format = ++ // mp_pixel_format_from_v4l_bus_code(fmt.format.code); ++ //mode->frame_interval = interval.interval; ++ //mode->width = fmt.format.width; ++ //mode->height = fmt.format.height; + } + + // Set the mode for the video device +diff --git a/src/device.c b/src/device.c +index 9e2db00..1161861 100644 +--- a/src/device.c ++++ b/src/device.c +@@ -8,6 +8,8 @@ + #include + #include + #include ++#include ++#include + + bool + mp_find_device_path(struct media_v2_intf_devnode devnode, char *path, int length) +@@ -183,6 +185,25 @@ mp_device_setup_entity_link(MPDevice *device, + return true; + } + ++void ++mp_device_setup_media_link(MPDevice *device, ++ const struct mp_media_link_config *cfg, ++ bool enable) ++{ ++ const struct media_v2_entity *source_entity = ++ mp_device_find_entity(device, cfg->source_name); ++ ++ const struct media_v2_entity *target_entity = ++ mp_device_find_entity(device, cfg->target_name); ++ ++ mp_device_setup_entity_link(device, ++ source_entity->id, ++ target_entity->id, ++ cfg->source_port, ++ cfg->target_port, ++ enable); ++} ++ + bool + mp_device_setup_link(MPDevice *device, + uint32_t source_pad_id, +@@ -237,6 +258,73 @@ mp_entity_pad_set_format(MPDevice *device, + return true; + } + ++const struct media_v2_pad * ++mp_device_get_pad_at_index_from_entity(const MPDevice *device, uint32_t entity_id, uint32_t index) ++{ ++ for (int i = 0; i < device->num_pads; ++i) { ++ if (device->pads[i].entity_id == entity_id && index-- == 0) { ++ return &device->pads[i]; ++ } ++ } ++ return NULL; ++} ++ ++bool ++mp_device_setup_link_by_name(MPDevice *device, ++ const char *source_entity_name, ++ uint32_t source_pad_index, ++ const char *sink_entity_name, ++ uint32_t sink_pad_index, ++ bool enabled) ++{ ++ const struct media_v2_entity *source_entity = ++ mp_device_find_entity ++ (device, source_entity_name); ++ const struct media_v2_entity *sink_entity = ++ mp_device_find_entity ++ (device, sink_entity_name); ++ ++ struct media_link_desc link = {}; ++ link.flags = enabled ? MEDIA_LNK_FL_ENABLED : 0; ++ link.source.entity = source_entity->id; ++ link.source.index = source_pad_index; ++ link.sink.entity = sink_entity->id; ++ link.sink.index = sink_pad_index; ++ if (xioctl(device->fd, MEDIA_IOC_SETUP_LINK, &link) == -1) { ++ errno_printerr("MEDIA_IOC_SETUP_LINK"); ++ return false; ++ } ++ ++ return true; ++} ++ ++int ++mp_device_get_fd_by_name(const MPDevice *device, const char *driver_name) ++{ ++ struct media_entity_desc desc = {}; ++ ++ desc.id |= MEDIA_ENT_ID_FLAG_NEXT; ++ ++ while(true) { ++ desc.id |= MEDIA_ENT_ID_FLAG_NEXT; ++ if(xioctl(device->fd, MEDIA_IOC_ENUM_ENTITIES, &desc) == -1) { ++ errno_printerr("MEDIA_IOC_ENUM_ENTITIES"); ++ return -1; ++ } ++ ++ if(strncmp(desc.name, driver_name, 32) == 0) { ++ const uint32_t major = desc.dev.major; ++ const uint32_t minor = desc.dev.minor; ++ char path[256]; ++ int rc = snprintf(path, 256, "/dev/char/%u:%u", major, minor); ++ ++ return rc > 0 ? open(path, O_RDWR) : -1; ++ } ++ } ++ ++ return -1; ++} ++ + const struct media_v2_entity * + mp_device_find_entity(const MPDevice *device, const char *driver_name) + { +@@ -263,6 +351,19 @@ mp_device_find_entity_type(const MPDevice *device, const uint32_t type) + return NULL; + } + ++bool ++mp_xioctl(const MPDevice *device, const char *driver_name, unsigned long request, void *argp) ++{ ++ int fd = mp_device_get_fd_by_name(device, driver_name); ++ ++ if(fd < 0) ++ { ++ printf("ERROR: device with driver name %s not found\n", driver_name); ++ } ++ ++ return fd >= 0 && xioctl(fd, request, argp) != -1; ++} ++ + const struct media_device_info * + mp_device_get_info(const MPDevice *device) + { +diff --git a/src/device.h b/src/device.h +index 1894c67..b324e1a 100644 +--- a/src/device.h ++++ b/src/device.h +@@ -1,6 +1,7 @@ + #pragma once + + #include "mode.h" ++#include "camera_config.h" + + #include + #include +@@ -26,6 +27,10 @@ bool mp_device_setup_entity_link(MPDevice *device, + uint32_t sink_index, + bool enabled); + ++void mp_device_setup_media_link(MPDevice *device, ++ const struct mp_media_link_config *cfg, ++ bool enable); ++ + bool mp_device_setup_link(MPDevice *device, + uint32_t source_pad_id, + uint32_t sink_pad_id, +@@ -36,6 +41,15 @@ bool mp_entity_pad_set_format(MPDevice *device, + uint32_t pad, + MPMode *mode); + ++bool mp_xioctl(const MPDevice *device, const char *driver_name, unsigned long request, void *argp); ++ ++bool mp_device_setup_link_by_name(MPDevice *device, ++ const char *source_entity_name, ++ uint32_t source_pad_index, ++ const char *sink_entity_name, ++ uint32_t sink_pad_index, ++ bool enabled); ++ + 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); +diff --git a/src/io_pipeline.c b/src/io_pipeline.c +index 8434420..598118f 100644 +--- a/src/io_pipeline.c ++++ b/src/io_pipeline.c +@@ -47,7 +47,8 @@ struct camera_info { + // int media_fd; + + // struct mp_media_link media_links[MP_MAX_LINKS]; +- // int num_media_links; ++ struct mp_media_link_config media_links[MP_MAX_LINKS]; ++ int num_media_links; + + // int gain_ctrl; + }; +@@ -100,30 +101,52 @@ static bool want_focus = false; + static MPPipeline *pipeline; + static GSource *capture_source; + ++// TODO: move to device.c ++static void ++mp_setup_media_link_pad_crops(struct device_info *dev_info, ++ const struct mp_media_crop_config media_crops[], ++ int num_media_crops) ++{ ++ for(int i = 0; i < num_media_crops; i++) { ++ const struct mp_media_crop_config *crop = media_crops + i; ++ struct v4l2_subdev_crop v4l2_crop = {}; ++ v4l2_crop.pad = crop->pad; ++ v4l2_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE; ++ v4l2_crop.rect.top = crop->top; ++ v4l2_crop.rect.left = crop->left; ++ v4l2_crop.rect.width = crop->width; ++ v4l2_crop.rect.height = crop->height; ++ ++ if(!mp_xioctl(dev_info->device, crop->name, VIDIOC_SUBDEV_S_CROP, &v4l2_crop)) { ++ //errno_printerr("VIDIOC_SUBDEV_S_CROP"); ++ } ++ } ++} ++ + static void + mp_setup_media_link_pad_formats(struct device_info *dev_info, +- const struct mp_media_link_config media_links[], +- int num_media_links, +- MPMode *mode) ++ const struct mp_media_format_config media_formats[], ++ int num_media_formats) + { +- const struct media_v2_entity *entities[2]; +- int ports[2]; +- for (int i = 0; i < num_media_links; i++) { +- entities[0] = mp_device_find_entity( +- dev_info->device, (const char *)media_links[i].source_name); +- entities[1] = mp_device_find_entity( +- dev_info->device, (const char *)media_links[i].target_name); +- ports[0] = media_links[i].source_port; +- ports[1] = media_links[i].target_port; +- +- for (int j = 0; j < 2; j++) +- if (!mp_entity_pad_set_format( +- dev_info->device, entities[j], ports[j], mode)) { +- g_printerr("Failed to set %s:%d format\n", +- entities[j]->name, +- ports[j]); +- exit(EXIT_FAILURE); +- } ++ for(int i = 0; i < num_media_formats; i++) { ++ const struct mp_media_format_config *format = ++ media_formats + i; ++ const struct media_v2_entity *entity = ++ mp_device_find_entity ++ (dev_info->device, format->name); ++ MPMode *mode = ++ (MPMode *) ++ &format->mode; ++ bool successful = ++ mp_entity_pad_set_format ++ (dev_info->device, entity, format->pad, mode); ++ ++ if(!successful) { ++ g_printerr( "Failed to set %s:%d format\n", ++ entity->name, ++ format->pad ); ++ exit(EXIT_FAILURE); ++ } + } + } + +@@ -191,6 +214,9 @@ setup_camera(MPDeviceList **device_list, const struct mp_camera_config *config) + struct device_info *dev_info = &devices[device_index]; + + info->device_index = device_index; ++ info->num_media_links = config->num_media_links; ++ ++ memcpy(info->media_links, config->media_links, MP_MAX_LINKS * sizeof(struct mp_media_link_config)); + + const struct media_v2_entity *entity = + mp_device_find_entity(dev_info->device, config->dev_name); +@@ -205,11 +231,33 @@ setup_camera(MPDeviceList **device_list, const struct mp_camera_config *config) + + info->pad_id = pad->id; + +- // Make sure the camera starts out as disabled +- mp_device_setup_link(dev_info->device, +- info->pad_id, +- dev_info->interface_pad_id, +- false); ++ // Only disable the camera here if no links are defined in the ++ // config file. ++ if(config->num_media_links == 0) ++ { ++ // Make sure the camera starts out as disabled ++ mp_device_setup_link(dev_info->device, ++ info->pad_id, ++ dev_info->interface_pad_id, ++ false); ++ } ++ ++ // If links are defined, disable all of them. ++ const size_t num_links = ++ mp_device_get_num_links(dev_info->device); ++ const struct media_v2_link *links = ++ mp_device_get_links(dev_info->device); ++ ++ for(int i = 0; i < num_links; i++) { ++ const struct media_v2_link *link = links + i; ++ ++ if(!(link->flags & MEDIA_LNK_FL_IMMUTABLE)) { ++ mp_device_setup_link(dev_info->device, ++ link->source_id, ++ link->sink_id, ++ false); ++ } ++ } + + const struct media_v2_interface *interface = + mp_device_find_entity_interface(dev_info->device, +@@ -234,11 +282,14 @@ setup_camera(MPDeviceList **device_list, const struct mp_camera_config *config) + // the ov5640 driver where it won't allow setting the preview + // format initially. + MPMode mode = config->capture_mode; +- if (config->num_media_links) ++ if (config->num_media_formats) + mp_setup_media_link_pad_formats(dev_info, +- config->media_links, +- config->num_media_links, +- &mode); ++ config->media_formats, ++ config->num_media_formats); ++ if (config->num_media_crops) ++ mp_setup_media_link_pad_crops(dev_info, ++ config->media_crops, ++ config->num_media_crops); + mp_camera_set_mode(info->camera, &mode); + + // Trigger continuous auto focus if the sensor supports it +@@ -400,9 +451,12 @@ capture(MPPipeline *pipeline, const void *data) + mode = camera->capture_mode; + if (camera->num_media_links) + mp_setup_media_link_pad_formats(dev_info, +- camera->media_links, +- camera->num_media_links, +- &mode); ++ camera->media_formats, ++ camera->num_media_formats); ++ if (camera->num_media_crops) ++ mp_setup_media_link_pad_crops(dev_info, ++ camera->media_crops, ++ camera->num_media_crops); + mp_camera_set_mode(info->camera, &mode); + just_switched_mode = true; + +@@ -569,9 +623,13 @@ on_frame(MPBuffer buffer, void *_data) + if (camera->num_media_links) + mp_setup_media_link_pad_formats( + dev_info, +- camera->media_links, +- camera->num_media_links, +- &mode); ++ camera->media_formats, ++ camera->num_media_formats); ++ if (camera->num_media_crops) ++ mp_setup_media_link_pad_crops( ++ dev_info, ++ camera->media_crops, ++ camera->num_media_crops); + mp_camera_set_mode(info->camera, &mode); + just_switched_mode = true; + +@@ -587,25 +645,6 @@ on_frame(MPBuffer buffer, void *_data) + } + } + +-static void +-mp_setup_media_link(struct device_info *dev_info, +- const struct mp_media_link_config *cfg, +- bool enable) +-{ +- const struct media_v2_entity *source_entity = +- mp_device_find_entity(dev_info->device, cfg->source_name); +- +- const struct media_v2_entity *target_entity = +- mp_device_find_entity(dev_info->device, cfg->target_name); +- +- mp_device_setup_entity_link(dev_info->device, +- source_entity->id, +- target_entity->id, +- cfg->source_port, +- cfg->target_port, +- enable); +-} +- + static void + update_state(MPPipeline *pipeline, const struct mp_io_pipeline_state *state) + { +@@ -629,8 +668,8 @@ update_state(MPPipeline *pipeline, const struct mp_io_pipeline_state *state) + + // Disable media links + for (int i = 0; i < camera->num_media_links; i++) +- mp_setup_media_link( +- dev_info, &camera->media_links[i], false); ++ mp_device_setup_media_link( ++ dev_info->device, &camera->media_links[i], false); + } + + if (capture_source) { +@@ -644,23 +683,32 @@ update_state(MPPipeline *pipeline, const struct mp_io_pipeline_state *state) + struct camera_info *info = &cameras[camera->index]; + struct device_info *dev_info = &devices[info->device_index]; + +- mp_device_setup_link(dev_info->device, +- info->pad_id, +- dev_info->interface_pad_id, +- true); ++ // Only enable the camera here if no links are defined ++ // in the config file. ++ if(info->num_media_links == 0) ++ { ++ mp_device_setup_link(dev_info->device, ++ info->pad_id, ++ dev_info->interface_pad_id, ++ true); ++ } + +- // Enable media links ++ // If links are defined, enable all of them. + for (int i = 0; i < camera->num_media_links; i++) +- mp_setup_media_link( +- dev_info, &camera->media_links[i], true); ++ mp_device_setup_media_link( ++ dev_info->device, &camera->media_links[i], true); + + mode = camera->preview_mode; + if (camera->num_media_links) + mp_setup_media_link_pad_formats( + dev_info, +- camera->media_links, +- camera->num_media_links, +- &mode); ++ camera->media_formats, ++ camera->num_media_formats); ++ if (camera->num_media_crops) ++ mp_setup_media_link_pad_crops( ++ dev_info, ++ camera->media_crops, ++ camera->num_media_crops); + mp_camera_set_mode(info->camera, &mode); + + mp_camera_start_capture(info->camera); diff --git a/media-video/megapixels/megapixels-1.8.2.ebuild b/media-video/megapixels/megapixels-1.8.2-r1.ebuild similarity index 81% rename from media-video/megapixels/megapixels-1.8.2.ebuild rename to media-video/megapixels/megapixels-1.8.2-r1.ebuild index 07a4166..f5bfc20 100755 --- a/media-video/megapixels/megapixels-1.8.2.ebuild +++ b/media-video/megapixels/megapixels-1.8.2-r1.ebuild @@ -28,6 +28,12 @@ DEPEND=" media-libs/libmegapixels " +PATCHES=( + "${FILESDIR}"/06230f3a02cffdf8b683f85cb32fc256d73615d9.patch' + "${FILESDIR}"/27a1e606d680295e0b4caceadf74ff5857ac16b2.patch' + "${FILESDIR}"/d8b35bc223989cb165ba1b0716ab9f0ca9c43e53.patch' +) + RDEPEND="${DEPEND}" BDEPEND="" diff --git a/media-video/snapshot/snapshot-46.3.ebuild b/media-video/snapshot/snapshot-46.3.ebuild deleted file mode 100755 index 5742b3c..0000000 --- a/media-video/snapshot/snapshot-46.3.ebuild +++ /dev/null @@ -1,239 +0,0 @@ -# Copyright 1999-2022 Gentoo Authors -# Distributed under the terms of the GNU General Public License-2 - -EAPI=8 -CRATES=" - autocfg-1.1.0 - cfg-if-1.0.0 - pin-utils-0.1.0 - dlib-0.5.0 - field-offset-0.3.5 - form_urlencoded-1.1.0 - ctor-0.1.26 - crypto-common-0.1.6 - scoped-tls-1.0.1 - cairo-sys-rs-0.17.0 - async-recursion-1.0.4 - proc-macro-error-1.0.4 - serde_repr-0.1.12 - version_check-0.9.4 - serde_spanned-0.6.1 - sha1-0.10.5 - gsk4-sys-0.6.3 - memoffset-0.8.0 - gdk-pixbuf-sys-0.17.0 - quote-1.0.26 - futures-core-0.3.28 - gdk4-wayland-0.6.3 - xdg-home-1.0.0 - muldiv-1.0.1 - thread_local-1.1.7 - futures-io-0.3.28 - memoffset-0.7.1 - graphene-sys-0.17.0 - temp-dir-0.1.11 - gdk4-x11-sys-0.6.3 - async-trait-0.1.68 - async-lock-2.7.0 - bitflags-1.3.2 - tracing-log-0.1.3 - tinyvec_macros-0.1.1 - rand_chacha-0.3.1 - proc-macro-error-attr-1.0.4 - downcast-rs-1.2.0 - gdk4-wayland-sys-0.6.3 - pretty-hex-0.3.0 - zbus_names-2.5.0 - waker-fn-1.1.0 - wayland-sys-0.30.1 - event-listener-2.5.3 - futures-executor-0.3.28 - iana-time-zone-0.1.56 - futures-macro-0.3.28 - graphene-rs-0.17.1 - lazy_static-1.4.0 - gstreamer-gl-x11-0.20.0 - gobject-sys-0.17.4 - hex-0.4.3 - zvariant_utils-1.0.0 - async-global-executor-2.3.1 - zvariant_derive-3.12.0 - gstreamer-gl-egl-0.20.0 - generic-array-0.14.7 - thiserror-impl-1.0.40 - parking-2.1.0 - concurrent-queue-2.2.0 - enumflags2-0.7.7 - semver-1.0.17 - num-integer-0.1.45 - gstreamer-gl-wayland-sys-0.20.0 - libloading-0.7.4 - version-compare-0.1.1 - gstreamer-gl-x11-sys-0.20.0 - heck-0.4.1 - toml_datetime-0.6.1 - locale_config-0.3.0 - async-fs-1.6.0 - gstreamer-gl-egl-sys-0.20.0 - enumflags2_derive-0.7.7 - thiserror-1.0.40 - static_assertions-1.1.0 - gdk-pixbuf-0.17.0 - futures-channel-0.3.28 - crossbeam-utils-0.8.15 - futures-task-0.3.28 - indexmap-1.9.3 - slab-0.4.8 - pin-project-lite-0.2.9 - async-channel-1.8.0 - byteorder-1.4.3 - io-lifetimes-1.0.10 - atomic-waker-1.1.1 - ordered-stream-0.2.0 - ppv-lite86-0.2.17 - libadwaita-sys-0.4.1 - unicode-ident-1.0.8 - pango-sys-0.17.0 - nu-ansi-term-0.46.0 - gstreamer-base-sys-0.20.0 - atomic_refcell-0.1.10 - overload-0.1.1 - option-operations-0.5.0 - serde_derive-1.0.160 - toml-0.7.3 - digest-0.10.6 - num-rational-0.4.1 - percent-encoding-2.2.0 - socket2-0.4.9 - zbus_macros-3.12.0 - pkg-config-0.3.26 - system-deps-6.0.5 - derivative-2.2.0 - unicode-bidi-0.3.13 - typenum-1.16.0 - smallvec-1.10.0 - async-io-1.13.0 - glib-macros-0.17.9 - gstreamer-base-0.20.5 - anyhow-1.0.70 - getrandom-0.2.9 - target-lexicon-0.12.7 - once_cell-1.17.1 - rand-0.8.5 - pango-0.17.4 - tracing-attributes-0.1.24 - value-bag-1.0.0-alpha.9 - memchr-2.5.0 - proc-macro-crate-1.3.1 - serde-1.0.160 - gstreamer-audio-0.20.4 - wayland-scanner-0.30.0 - polling-2.8.0 - gio-sys-0.17.4 - wayland-client-0.30.1 - paste-1.0.12 - gstreamer-pbutils-0.20.5 - gstreamer-pbutils-sys-0.20.0 - gstreamer-video-sys-0.20.0 - gstreamer-sys-0.20.0 - gstreamer-gl-0.20.0 - gtk4-sys-0.6.3 - proc-macro2-1.0.56 - tracing-core-0.1.30 - hashbrown-0.12.3 - glib-sys-0.17.4 - async-task-4.4.0 - num-traits-0.2.15 - cfg-expr-0.15.1 - gdk4-sys-0.6.3 - wayland-backend-0.1.2 - url-2.3.1 - cc-1.0.79 - libadwaita-0.4.1 - futures-lite-1.13.0 - tinyvec-1.6.0 - sharded-slab-0.1.4 - cairo-rs-0.17.0 - gstreamer-video-0.20.4 - rand_core-0.6.4 - gstreamer-gl-sys-0.20.0 - tracing-0.1.38 - zvariant-3.12.0 - ashpd-0.4.0 - gdk4-0.6.3 - kv-log-macro-1.0.7 - gstreamer-audio-sys-0.20.0 - gst-plugin-gtk4-0.10.5 - futures-sink-0.3.28 - toml_edit-0.19.8 - async-executor-1.5.1 - async-broadcast-0.5.1 - blocking-1.3.1 - log-0.4.17 - gsk4-0.6.3 - chrono-0.4.24 - gtk4-macros-0.6.6 - futures-util-0.3.28 - block-buffer-0.10.4 - gstreamer-gl-wayland-0.20.0 - cpufeatures-0.2.7 - rustc_version-0.4.0 - unicode-normalization-0.1.22 - fastrand-1.9.0 - gettext-rs-0.7.0 - gio-0.17.9 - gst-plugin-version-helper-0.7.5 - gdk4-x11-0.6.3 - winnow-0.4.1 - zbus-3.12.0 - idna-0.3.0 - aho-corasick-1.0.1 - quick-xml-0.23.1 - tracing-subscriber-0.3.17 - nix-0.26.2 - syn-2.0.15 - glib-0.17.9 - regex-1.8.1 - async-std-1.12.0 - syn-1.0.109 - rustix-0.37.15 - regex-syntax-0.7.1 - gstreamer-0.20.5 - gtk4-0.6.6 - libc-0.2.142 - linux-raw-sys-0.3.4 - gettext-sys-0.21.3 -" - -inherit cargo gnome2-utils meson toolchain-funcs xdg - -DESCRIPTION="Gnome Camera Application" -HOMEPAGE="https://gitlab.gnome.org/GNOME/snapshot" -SRC_URI="https://gitlab.gnome.org/GNOME/snapshot/-/archive/${PV}/snapshot-${PV}.tar.gz" -SRC_URI+=" $(cargo_crate_uris ${CRATES})" - -#RESTRICT="network-sandbox" - -LICENSE="GPL-3" -SLOT="0" -KEYWORDS="~amd64 ~arm64" - -DEPEND=" - >=x11-libs/gtk+-3.0 - >=gui-libs/libadwaita-1.4.0_alpha - >=media-libs/gstreamer-1.20.0 - media-video/wireplumber - media-video/pipewire[gstreamer] -" -RDEPEND="${DEPEND}" -BDEPEND="" - -pkg_postinst() { - xdg_pkg_postinst - gnome2_schemas_update -} - -pkg_postrm() { - xdg_pkg_postrm - gnome2_schemas_update -}