gjdwebserver-overlay/media-video/megapixels/files/27a1e606d680295e0b4caceadf74ff5857ac16b2.patch

131 lines
5.1 KiB
Diff

From 27a1e606d680295e0b4caceadf74ff5857ac16b2 Mon Sep 17 00:00:00 2001
From: kgmt0 <kritphong@teknik.io>
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];