diff --git a/libcam/libcam/camview.c b/libcam/libcam/camview.c index e03445ff..7d187ad2 100644 --- a/libcam/libcam/camview.c +++ b/libcam/libcam/camview.c @@ -30,6 +30,7 @@ #include #include #include +#include #include /* support for internationalization - i18n */ #include @@ -120,6 +121,38 @@ static int encode_thread_running = 0; static char project_id[200]; +static char **card_keywords = NULL; +static int card_keyword_count = 0; + +static int is_invalid_card_keyword(const char *keyword) +{ + if (keyword == NULL || keyword[0] == '\0') { + return 1; + } + + for (const char *p = keyword; *p != '\0'; p++) { + if (!isspace((unsigned char)*p)) { + return 0; + } + } + + return 1; +} + +static void clear_card_keywords(void) +{ + if (card_keywords == NULL) { + return; + } + + for (int i = 0; i < card_keyword_count; i++) { + free(card_keywords[i]); + } + free(card_keywords); + card_keywords = NULL; + card_keyword_count = 0; +} + void set_video_time_capture(double video_time) { video_time_capture = video_time; @@ -1403,6 +1436,52 @@ const char* get_project_id(void) return project_id; } +void set_card_keywords(const char **keywords, int count) +{ + clear_card_keywords(); + + if (keywords == NULL || count <= 0) { + return; + } + + int valid_count = 0; + for (int i = 0; i < count; i++) { + if (!is_invalid_card_keyword(keywords[i])) { + valid_count++; + } + } + + if (valid_count == 0) { + return; + } + + card_keywords = calloc((size_t)valid_count, sizeof(char *)); + if (card_keywords == NULL) { + fprintf(stderr, "deepin-camera: failed to allocate card keywords\n"); + return; + } + + for (int i = 0; i < count; i++) { + if (is_invalid_card_keyword(keywords[i])) { + continue; + } + + card_keywords[card_keyword_count] = strdup(keywords[i]); + if (card_keywords[card_keyword_count] != NULL) { + card_keyword_count++; + } + } +} + +const char** get_card_keywords(int *count) +{ + if (count != NULL) { + *count = card_keyword_count; + } + + return (const char **)card_keywords; +} + void set_libva_driver_name(const char *name) { if (name != NULL) { diff --git a/libcam/libcam/camview.h b/libcam/libcam/camview.h index 506b8245..625f0b83 100644 --- a/libcam/libcam/camview.h +++ b/libcam/libcam/camview.h @@ -464,6 +464,32 @@ void set_project_id(const char *project_id); */ const char* get_project_id(void); +/* + * set camera card keywords + * args: + * keywords - camera card keyword string array. Each string is copied by this function; + * caller retains ownership of the input array and strings. + * count - keyword count + * + * asserts: + * none + * + * returns: none + */ +void set_card_keywords(const char **keywords, int count); + +/* + * get camera card keywords + * args: + * count - output keyword count + * + * asserts: + * none + * + * returns: pointer to camera card keyword string array + */ +const char** get_card_keywords(int *count); + /* * set libva driver name * args: diff --git a/libcam/libcam_v4l2core/v4l2_devices.c b/libcam/libcam_v4l2core/v4l2_devices.c index 86b35b59..2c8a1c3f 100644 --- a/libcam/libcam_v4l2core/v4l2_devices.c +++ b/libcam/libcam_v4l2core/v4l2_devices.c @@ -345,6 +345,21 @@ int enum_v4l2_devices() continue; /*next dir entry*/ } + int num_card_keywords = 0; + const char **card_keywords = get_card_keywords(&num_card_keywords); + + int is_card_keyword_device = 0; + for (int i = 0; i < num_card_keywords; i++) { + if(card_keywords[i] != NULL && strstr((const char *)v4l2_cap.card, card_keywords[i]) != NULL) { + is_card_keyword_device = 1; + break; + } + } + if(is_card_keyword_device) { + getV4l2()->m_v4l2_close(fd); + continue; /*next dir entry*/ + } + // when project_id equals UOS2025073011543 filter out ISP devices const char* current_project_id = get_project_id(); if (current_project_id != NULL && strcmp(current_project_id, UOS2025073011543) == 0) { diff --git a/src/assets/org.deepin.camera.encode.json b/src/assets/org.deepin.camera.encode.json index a8bfab9a..73fea1af 100644 --- a/src/assets/org.deepin.camera.encode.json +++ b/src/assets/org.deepin.camera.encode.json @@ -102,6 +102,16 @@ "permissions": "readwrite", "visibility": "private" }, + "CardKeywords": { + "value": ["IR Cam", "IR Camera", "Infrared", "IR_", "-IR", "ir_cam"], + "serial": 0, + "flags": ["global"], + "name": "camera card keywords", + "name[zh_CN]": "摄像头卡片名称关键字", + "description": "Set camera card name keywords", + "permissions": "readwrite", + "visibility": "private" + }, "preferredResolution": { "value": "", "serial": 0, diff --git a/src/main.cpp b/src/main.cpp index 99bef41a..fefa4861 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,7 @@ extern "C" { #include "cameraconfig.h" #include "acobjectlist.h" #include "dbus_adpator.h" +#include "globalutils.h" #include #ifdef DTKCORE_CLASS_DConfigFile @@ -29,6 +30,8 @@ extern "C" { #include #include +#include +#include #include #include @@ -205,6 +208,23 @@ int main(int argc, char *argv[]) DataManager::instance()->setDeviceBlacklist(deviceBlacklist); } + if (dconfig && dconfig->isValid() && dconfig->keyList().contains("CardKeywords")) { + QStringList cardKeywords = GlobalUtils::parseStringListConfig(dconfig->value("CardKeywords")); + QVector keywordBytes; + keywordBytes.reserve(cardKeywords.size()); + for (const QString &keyword : cardKeywords) { + keywordBytes.append(keyword.toUtf8()); + } + + QVector keywordData; + keywordData.reserve(keywordBytes.size()); + for (const QByteArray &keyword : keywordBytes) { + keywordData.append(keyword.constData()); + } + qInfo() << "card keywords:" << cardKeywords; + set_card_keywords(keywordData.data(), keywordData.size()); + } + if (dconfig && dconfig->isValid() && dconfig->keyList().contains("preferredResolution")) { QString preferredResolution = dconfig->value("preferredResolution").toString(); qInfo() << "preferred resolution:" << preferredResolution; diff --git a/src/src/globalutils.cpp b/src/src/globalutils.cpp index 24aa7390..8f8c43e7 100644 --- a/src/src/globalutils.cpp +++ b/src/src/globalutils.cpp @@ -87,3 +87,29 @@ void GlobalUtils::loadCameraConf() m_LowPerformanceBoards = QStringList(); } } + +QStringList GlobalUtils::parseStringListConfig(const QVariant &value) +{ + QStringList rawList; + + if (value.type() == QVariant::StringList) { + rawList = value.toStringList(); + } else if (value.type() == QVariant::List) { + const QVariantList variantList = value.toList(); + for (const QVariant &item : variantList) { + if (item.type() == QVariant::String) { + rawList.append(item.toString()); + } + } + } else { + return QStringList(); + } + + QStringList result; + for (const QString &keyword : rawList) { + if (!keyword.trimmed().isEmpty()) { + result.append(keyword); + } + } + return result; +} diff --git a/src/src/globalutils.h b/src/src/globalutils.h index 51e021d4..292a7ef2 100644 --- a/src/src/globalutils.h +++ b/src/src/globalutils.h @@ -7,6 +7,8 @@ #define GLOBALUTILS_H #include +#include +#include class GlobalUtils { @@ -17,6 +19,8 @@ class GlobalUtils // 加载相机配置 static void loadCameraConf(); + static QStringList parseStringListConfig(const QVariant &value); + private: static QStringList m_LowPerformanceBoards; };