Skip to content

Commit

Permalink
Code-improvement (#32)
Browse files Browse the repository at this point in the history
  • Loading branch information
infra-monkey authored Mar 2, 2022
1 parent 949cd42 commit 926820f
Show file tree
Hide file tree
Showing 16 changed files with 110 additions and 144 deletions.
33 changes: 2 additions & 31 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,36 +36,7 @@ remove_definitions(
-DQT_NO_CAST_TO_ASCII
-DQT_NO_CAST_FROM_BYTEARRAY
)
set(QWebcamSettings_SRCS
QWebcamSettings.cpp
VideoDevice.cpp
helpers.cpp
)

kauth_install_actions(kcm.webcam.settings.udevhelper udevhelper.actions)
add_executable(udevhelper UdevHelper.cpp UdevHelper.h helpers.cpp helpers.h)
target_link_libraries(udevhelper KF5::Auth)
install(TARGETS udevhelper DESTINATION ${KAUTH_HELPER_INSTALL_DIR})
kauth_install_helper_files(udevhelper kcm.webcam.settings.udevhelper root)

add_library(kcm_webcam_settings MODULE ${QWebcamSettings_SRCS})

target_link_libraries(kcm_webcam_settings
KF5::ConfigCore
KF5::CoreAddons
KF5::Declarative
KF5::I18n
KF5::PlasmaQuick
KF5::QuickAddons
KF5::Auth
Qt5::Multimedia
)
target_compile_options (kcm_webcam_settings PUBLIC -fexceptions)
kcoreaddons_desktop_to_json(kcm_webcam_settings "package/metadata.desktop")

install(TARGETS kcm_webcam_settings DESTINATION ${KDE_INSTALL_PLUGINDIR}/kcms)
install(FILES package/metadata.desktop RENAME kcm_webcam_settings.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR}) # Install the desktop file
install(DIRECTORY translate/locale DESTINATION ${CMAKE_INSTALL_DATADIR})

add_subdirectory(src)

kpackage_install_package(package kcm_webcam_settings kcms) # Install our QML kpackage.
install(DIRECTORY translate/locale DESTINATION ${CMAKE_INSTALL_DATADIR})
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ The resolution and pixel format is defined through v4l2 but the applications don

The settings are set system wide. This means that if multiple users are configured on the system and define different settings, the last one to modify the settings will define it for everyone.

The Zoom Client will not use the settings defined in this module if "HD" is checked in the zoom camera settings.

# Security and permissions

The kcm need root permission to write the udev rules.
Expand Down
76 changes: 0 additions & 76 deletions kcm_webcam_settings.spec

This file was deleted.

Empty file removed metadata.desktop
Empty file.
46 changes: 46 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# SPDX-FileCopyrightText: Year Author <[email protected]>
#
# SPDX-License-Identifier: BSD-2-Clause

# cmake_minimum_required(VERSION 3.16)

# project(webcamkcm)

# set(QT_MIN_VERSION "5.15.0")
# set(KF5_MIN_VERSION "5.85.0")

# find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE)
# set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)

set(QWebcamSettings_SRCS
QWebcamSettings.cpp
VideoDevice.cpp
helpers.cpp
)

kauth_install_actions(kcm.webcam.settings.udevhelper udevhelper.actions)
add_executable(udevhelper UdevHelper.cpp UdevHelper.h helpers.cpp helpers.h)
target_link_libraries(udevhelper KF5::Auth)
install(TARGETS udevhelper DESTINATION ${KAUTH_HELPER_INSTALL_DIR})
kauth_install_helper_files(udevhelper kcm.webcam.settings.udevhelper root)

add_library(kcm_webcam_settings MODULE ${QWebcamSettings_SRCS})

target_link_libraries(kcm_webcam_settings
KF5::ConfigCore
KF5::CoreAddons
KF5::Declarative
KF5::I18n
KF5::PlasmaQuick
KF5::QuickAddons
KF5::Auth
Qt5::Multimedia
)
target_compile_options (kcm_webcam_settings PUBLIC -fexceptions)
kcoreaddons_desktop_to_json(kcm_webcam_settings "package/metadata.desktop")

install(TARGETS kcm_webcam_settings DESTINATION ${KDE_INSTALL_PLUGINDIR}/kcms)
install(FILES package/metadata.desktop RENAME kcm_webcam_settings.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR}) # Install the desktop file


kpackage_install_package(package kcm_webcam_settings kcms) # Install our QML kpackage.
2 changes: 1 addition & 1 deletion QWebcamSettings.cpp → src/QWebcamSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ QWebcamSettings::QWebcamSettings(QObject *parent, const QVariantList &args)
qCDebug(webcam_settings_kcm) << "QWebcamSettings::QWebcamSettings";
KAboutData *aboutData = new KAboutData(QStringLiteral("kcm_webcam_settings"),
i18nc("@title", "Webcam"),
QStringLiteral("0.0.1"),
QStringLiteral("0.0.5"),
QStringLiteral(""),
KAboutLicense::LicenseKey::GPL_V3,
i18nc("@info:credit", "Copyright 2021 Antoine Gatineau"));
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
93 changes: 58 additions & 35 deletions VideoDevice.cpp → src/VideoDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,29 +21,45 @@ VideoDevice::VideoDevice(const QCameraInfo camerainfo,QString device_serial, QSt
m_device_vendor_id = QString(device_vendorid);
m_device_model_id = QString(device_modelid);
m_device_path = QString(camerainfo.deviceName());
m_ctrl_brightness_visible = false;
m_ctrl_contrast_visible = false;
m_ctrl_sharpness_visible = false;
m_ctrl_saturation_visible = false;
m_ctrl_zoom_absolute_supported = false;
m_ctrl_zoom_optical_visible = false;
m_ctrl_zoom_digital_visible = false;
m_ctrl_auto_focus_visible = false;
m_ctrl_focus_visible = false;
qCDebug(webcam_settings_kcm) << "VideoDevice::VideoDevice" << m_device_name << m_device_path << m_device_vendor_id << m_device_model_id;
initializeCtrls();
initializeFormats();
}
VideoDevice::~VideoDevice() {}
VideoDevice::~VideoDevice() {
delete m_current_camera;
}

void VideoDevice::initializeCtrls() {
qCDebug(webcam_settings_kcm) << "VideoDevice::initializeCtrls";
for (const QString & label: m_ctrl_list){
initializeCtrl(label);
std::string cmd = std::string("v4l2-ctl -d " + m_device_path.toStdString() + " --list-ctrls");
QString output = QString::fromStdString(exec_cmd(cmd));
QStringList lines = output.split("\n");
for (const QString & line : lines) {
for (const QString & label: m_ctrl_list){
if (line.contains(label)){
initializeCtrl(label,line);
}
}
}


// initialize non-v4l2 controls
initializeCtrl("zoom_optical","");
initializeCtrl("zoom_digital","");
}

void VideoDevice::initializeCtrl(const QString ctrl_label) {
void VideoDevice::initializeCtrl(const QString ctrl_label, const QString line) {
bool is_defined;
std::string line,cmd;
if (m_is_dummy_device){
is_defined = false;
} else {
cmd = std::string("v4l2-ctl -d " + m_device_path.toStdString() + " --list-ctrls | grep " + ctrl_label.toStdString());
line = exec_cmd(cmd);
if (line.size() == 0) {
is_defined = false;
} else {
Expand All @@ -58,9 +74,9 @@ void VideoDevice::initializeCtrl(const QString ctrl_label) {
m_ctrl_brightness["step"] = 0;
if (!is_defined){return;}
m_ctrl_brightness["value"] = m_current_camera->imageProcessing()->brightness();
m_ctrl_brightness["min"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("min="),std::string(" "))));
m_ctrl_brightness["max"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("max="),std::string(" "))));
m_ctrl_brightness["step"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("step="),std::string(" "))));
m_ctrl_brightness["min"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("min="),std::string(" "))));
m_ctrl_brightness["max"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("max="),std::string(" "))));
m_ctrl_brightness["step"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("step="),std::string(" "))));
qCDebug(webcam_settings_kcm) << "VideoDevice::initializeCtrl Brightness: value: " << QString::number(m_ctrl_brightness["value"])
<< "min: " << m_ctrl_brightness["min"]
<< "max: " << m_ctrl_brightness["max"]
Expand All @@ -74,9 +90,9 @@ void VideoDevice::initializeCtrl(const QString ctrl_label) {
m_ctrl_contrast["step"] = 0;
if (!is_defined){return;}
m_ctrl_contrast["value"] = m_current_camera->imageProcessing()->contrast();
m_ctrl_contrast["min"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("min="),std::string(" "))));
m_ctrl_contrast["max"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("max="),std::string(" "))));
m_ctrl_contrast["step"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("step="),std::string(" "))));
m_ctrl_contrast["min"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("min="),std::string(" "))));
m_ctrl_contrast["max"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("max="),std::string(" "))));
m_ctrl_contrast["step"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("step="),std::string(" "))));
qCDebug(webcam_settings_kcm) << "VideoDevice::initializeCtrl Contrast: value: " << QString::number(m_ctrl_contrast["value"])
<< "min: " << m_ctrl_contrast["min"]
<< "max: " << m_ctrl_contrast["max"]
Expand All @@ -90,9 +106,9 @@ void VideoDevice::initializeCtrl(const QString ctrl_label) {
m_ctrl_sharpness["step"] = 0;
if (!is_defined){return;}
m_ctrl_sharpness["value"] = m_current_camera->imageProcessing()->sharpeningLevel();
m_ctrl_sharpness["min"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("min="),std::string(" "))));
m_ctrl_sharpness["max"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("max="),std::string(" "))));
m_ctrl_sharpness["step"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("step="),std::string(" "))));
m_ctrl_sharpness["min"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("min="),std::string(" "))));
m_ctrl_sharpness["max"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("max="),std::string(" "))));
m_ctrl_sharpness["step"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("step="),std::string(" "))));
qCDebug(webcam_settings_kcm) << "VideoDevice::initializeCtrl Sharpness: value: " << QString::number(m_ctrl_sharpness["value"])
<< "min: " << m_ctrl_sharpness["min"]
<< "max: " << m_ctrl_sharpness["max"]
Expand All @@ -106,9 +122,9 @@ void VideoDevice::initializeCtrl(const QString ctrl_label) {
m_ctrl_saturation["step"] = 0;
if (!is_defined){return;}
m_ctrl_saturation["value"] = m_current_camera->imageProcessing()->contrast();
m_ctrl_saturation["min"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("min="),std::string(" "))));
m_ctrl_saturation["max"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("max="),std::string(" "))));
m_ctrl_saturation["step"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("step="),std::string(" "))));
m_ctrl_saturation["min"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("min="),std::string(" "))));
m_ctrl_saturation["max"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("max="),std::string(" "))));
m_ctrl_saturation["step"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("step="),std::string(" "))));
qCDebug(webcam_settings_kcm) << "VideoDevice::initializeCtrl Saturation: value: " << QString::number(m_ctrl_saturation["value"])
<< "min: " << m_ctrl_saturation["min"]
<< "max: " << m_ctrl_saturation["max"]
Expand Down Expand Up @@ -168,8 +184,8 @@ void VideoDevice::initializeCtrl(const QString ctrl_label) {
m_ctrl_auto_focus["value"] = 0;
m_ctrl_auto_focus["default"] = 0;
if (!is_defined){return;}
m_ctrl_auto_focus["value"] = stoi(get_str_between_two_str(line,std::string("value="),std::string(" ")));
m_ctrl_auto_focus["default"] = stoi(get_str_between_two_str(line,std::string("default="),std::string(" ")));
m_ctrl_auto_focus["value"] = stoi(get_str_between_two_str(line.toStdString(),std::string("value="),std::string(" ")));
m_ctrl_auto_focus["default"] = stoi(get_str_between_two_str(line.toStdString(),std::string("default="),std::string(" ")));
qCDebug(webcam_settings_kcm) << "VideoDevice::initializeCtrl Auto Focus: value: " << m_ctrl_auto_focus["value"]
<< "default: " << m_ctrl_auto_focus["default"];
}
Expand All @@ -181,11 +197,11 @@ void VideoDevice::initializeCtrl(const QString ctrl_label) {
m_ctrl_focus["max"] = 0;
m_ctrl_focus["step"] = 0;
if (!is_defined){return;}
m_ctrl_focus["value"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("value="),std::string(" "))));
m_ctrl_focus["default"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("default="),std::string(" "))));
m_ctrl_focus["min"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("min="),std::string(" "))));
m_ctrl_focus["max"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("max="),std::string(" "))));
m_ctrl_focus["step"] = static_cast<double>(stoi(get_str_between_two_str(line,std::string("step="),std::string(" "))));
m_ctrl_focus["value"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("value="),std::string(" "))));
m_ctrl_focus["default"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("default="),std::string(" "))));
m_ctrl_focus["min"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("min="),std::string(" "))));
m_ctrl_focus["max"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("max="),std::string(" "))));
m_ctrl_focus["step"] = static_cast<double>(stoi(get_str_between_two_str(line.toStdString(),std::string("step="),std::string(" "))));
qCDebug(webcam_settings_kcm) << "VideoDevice::initializeCtrl Focus Absolute: value: " << QString::number(m_ctrl_focus["value"])
<< "min: " << m_ctrl_focus["min"]
<< "max: " << m_ctrl_focus["max"]
Expand All @@ -197,7 +213,7 @@ void VideoDevice::initializeCtrl(const QString ctrl_label) {
void VideoDevice::initializeFormats() {
qCDebug(webcam_settings_kcm) << "VideoDevice::initializeFormats";
qCDebug(webcam_settings_kcm) << "Initializing pixel formats for video device with path " << m_device_path;

std::string current_fmt,current_resolution,current_width,current_height;
if (m_is_dummy_device){
QStringList list = QStringList();
list.append("UNKOWN");
Expand All @@ -211,12 +227,19 @@ void VideoDevice::initializeFormats() {
} else {
int i = 0;
std::string cmd;
cmd = std::string("v4l2-ctl -d " + m_device_path.toStdString() + " --get-fmt-video | grep \"Pixel Format\"");
std::string current_fmt = get_str_between_two_str(exec_cmd(cmd)," \'","\' ");
cmd = std::string("v4l2-ctl -d " + m_device_path.toStdString() + " --get-fmt-video | grep \"Width/Height\"");
std::string current_resolution = get_str_between_two_str(exec_cmd(cmd),": ","\n");
std::string current_width = get_str_left_of_substr(current_resolution,"/");
std::string current_height = get_str_right_of_substr(current_resolution,"/");
cmd = std::string("v4l2-ctl -d " + m_device_path.toStdString() + " --get-fmt-video");
QString cmdoutput = QString::fromStdString(exec_cmd(cmd));
QStringList lines = cmdoutput.split("\n");
for (const QString & line : lines) {
if (line.contains("Pixel Format")) {
current_fmt = get_str_between_two_str(line.toStdString()," \'","\' ");
}
if (line.contains("Width/Height")) {
current_resolution = get_str_between_two_str(line.toStdString(),": ","\n");
current_width = get_str_left_of_substr(current_resolution,"/");
current_height = get_str_right_of_substr(current_resolution,"/");
}
}
qCDebug(webcam_settings_kcm) << "Current format " << QString::fromStdString(current_fmt) << QString::fromStdString(current_width) << QString::fromStdString(current_height);


Expand Down
2 changes: 1 addition & 1 deletion VideoDevice.h → src/VideoDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class VideoDevice : public QObject {
QString getVideoDeviceSerialId(){return m_device_serial;};
QString getVideoDevicePath(){return m_device_path;};
void initializeCtrls();
void initializeCtrl(const QString);
void initializeCtrl(const QString, const QString);
void initializeFormats();
QStringList getFormatList(){return m_format_list;};
bool setFormatIndex(int);
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 comments on commit 926820f

Please sign in to comment.