From c03d558715561a63c8e83a4fd846a309c306443e Mon Sep 17 00:00:00 2001 From: Marco Gulino Date: Sun, 9 Jun 2019 16:10:00 +0100 Subject: [PATCH] Fix crash on Fedora systems due to provider libusb - Add static libusb to Fedora docker images - Add static opencv to Fedora docker images (as libusb is pulled as an opencv indirect dependency) - Add safety mutex to prevent cameras double scan being triggered - Fix docker.py script with relative paths --- scripts/travis/package | 2 +- src/commons/opencv_utils.h | 1 + src/drivers/supporteddrivers.cpp | 5 +++++ src/drivers/v4l2/v4l2imagingworker.cpp | 2 +- support/docker/docker.py | 2 -- support/docker/dockerfile.py | 14 ++++++++------ support/docker/fedora.py | 2 +- support/docker/files/configuration-fedora-29.cmake | 2 +- support/docker/files/configuration-fedora-30.cmake | 2 +- support/docker/files/configuration-fedora-31.cmake | 2 +- support/docker/snippets/fedora.in | 3 +-- support/docker/snippets/opencv.in | 9 ++++----- 12 files changed, 25 insertions(+), 21 deletions(-) diff --git a/scripts/travis/package b/scripts/travis/package index be48ac4..4988cd3 100755 --- a/scripts/travis/package +++ b/scripts/travis/package @@ -1,6 +1,7 @@ #!/bin/bash set -e . ${TRAVIS_BUILD_DIR}/git_commit_date.sh +mkdir -p "$TRAVIS_BUILD_DIR/packages" if [ "${TRAVIS_OS_NAME}" == "linux" ]; then source ~/virtualenv/python3.6/bin/activate @@ -11,6 +12,5 @@ fi if [ "${TRAVIS_OS_NAME}" == "osx" ]; then cd "$TRAVIS_BUILD_DIR/build" make package -j4 - mkdir -p "$TRAVIS_BUILD_DIR/packages" cp -av *.dmg "$TRAVIS_BUILD_DIR/packages" fi diff --git a/src/commons/opencv_utils.h b/src/commons/opencv_utils.h index a853271..e65f86e 100644 --- a/src/commons/opencv_utils.h +++ b/src/commons/opencv_utils.h @@ -42,6 +42,7 @@ namespace cv { // const int COLOR_RGBA2RGB = CV_RGBA2RGB; // const int COLOR_HSV2BGR = CV_HSV2BGR; // const int COLOR_BGR2HSV = CV_BGR2HSV; +// const int COLOR_YUV2RGB_YUYV = CV_YUV2RGB_YUYV; // const int IMWRITE_JPEG_QUALITY = CV_IMWRITE_JPEG_QUALITY; // const int IMWRITE_PXM_BINARY = CV_IMWRITE_PXM_BINARY; // const int IMREAD_UNCHANGED = CV_LOAD_IMAGE_UNCHANGED; diff --git a/src/drivers/supporteddrivers.cpp b/src/drivers/supporteddrivers.cpp index 1196173..d499725 100644 --- a/src/drivers/supporteddrivers.cpp +++ b/src/drivers/supporteddrivers.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include "drivers/imagerexception.h" using namespace std; @@ -62,6 +64,7 @@ std::shared_ptr SupportedDriver::driver() DPTR_IMPL(SupportedDrivers) { SupportedDrivers *q; QList supported_drivers; + shared_ptr drivers_scan_mutex; void find_drivers(const QString &directory); void load_driver(const QString &filename); @@ -70,6 +73,7 @@ DPTR_IMPL(SupportedDrivers) { SupportedDrivers::SupportedDrivers(const QStringList &driversPath) : dptr(this) { + d->drivers_scan_mutex = make_shared(); for(const QString &path: driversPath) d->find_drivers(path); } @@ -134,6 +138,7 @@ void SupportedDrivers::aboutToQuit() QList SupportedDrivers::cameras() const { + QMutexLocker lock(d->drivers_scan_mutex.get()); qDebug() << "Detecting active cameras"; QList cameras; for(auto supported_driver: d->supported_drivers) { diff --git a/src/drivers/v4l2/v4l2imagingworker.cpp b/src/drivers/v4l2/v4l2imagingworker.cpp index a4f41f4..cbdc0f1 100644 --- a/src/drivers/v4l2/v4l2imagingworker.cpp +++ b/src/drivers/v4l2/v4l2imagingworker.cpp @@ -66,7 +66,7 @@ V4L2ImagingWorker::V4L2ImagingWorker(const V4L2DevicePtr& device, const v4l2_for // Compressed formats {V4L2_PIX_FMT_MJPEG, bind(&Private::import_frame, d.get(), _1)}, // YUV Colorspace - {V4L2_PIX_FMT_YUYV, bind(&Private::convert_frame, d.get(), _1, CV_8UC2, CV_YUV2RGB_YUYV, Frame::RGB)}, + {V4L2_PIX_FMT_YUYV, bind(&Private::convert_frame, d.get(), _1, CV_8UC2, cv::COLOR_YUV2RGB_YUYV, Frame::RGB)}, }; auto pixelformat = format.fmt.pix.pixelformat; if(!formats.contains(pixelformat)) diff --git a/support/docker/docker.py b/support/docker/docker.py index f014787..74e683e 100755 --- a/support/docker/docker.py +++ b/support/docker/docker.py @@ -11,7 +11,6 @@ docker_path = os.path.abspath(os.path.dirname(__file__)) code_path = os.path.dirname(os.path.dirname(docker_path)) -os.chdir(docker_path) images = [ Ubuntu('19.04', 'x86_64'), @@ -68,7 +67,6 @@ def list_images(): def package(args): if args.clean_logs: cleanup_logs() - destination_path = os.path.abspath(args.dest) if args.dest and args.dest != 'none' else None filtered_images = filter_images(args.images_filter) cmake_defines = args.cmake_define diff --git a/support/docker/dockerfile.py b/support/docker/dockerfile.py index 56febc4..cc4adab 100644 --- a/support/docker/dockerfile.py +++ b/support/docker/dockerfile.py @@ -5,8 +5,10 @@ import subprocess from datetime import datetime -images_dir = 'images' -logs_dir = os.path.abspath('./logs') +docker_path = os.path.abspath(os.path.dirname(__file__)) + +images_dir = os.path.join(docker_path, 'images') +logs_dir = os.path.abspath(os.path.join(docker_path, 'logs')) def cleanup_logs(): shutil.rmtree(logs_dir, ignore_errors=True) @@ -15,7 +17,7 @@ def cleanup_logs(): class Dockerfile: def __init__(self, name, snippets, files, substitutions): self.name = name - self.snippets = [Snippet(os.path.join('snippets', snippet + '.in')) for snippet in snippets] + self.snippets = [Snippet(os.path.join(docker_path, 'snippets', snippet + '.in')) for snippet in snippets] self.substitutions = substitutions self.files = files self.status = None @@ -33,8 +35,8 @@ def write(self): snippets = [] snippets.extend(self.snippets) - snippets.append(Snippet('snippets/workdir.in')) - snippets.append(Snippet('snippets/entrypoint.in')) + snippets.append(Snippet(os.path.join(docker_path, 'snippets/workdir.in'))) + snippets.append(Snippet(os.path.join(docker_path, 'snippets/entrypoint.in'))) for snippet in snippets: with open(dockerfile, 'a') as f: @@ -62,7 +64,7 @@ def package(self, code_path, destination_path, make_jobs, cmake_defines, stderr= '-e', 'MAKE_OPTS=-j{}'.format(make_jobs), ] - if destination_path and destination_path != 'none': + if destination_path: cmdline.extend([ '-v', '{}:/dest'.format(os.path.abspath(destination_path)), diff --git a/support/docker/fedora.py b/support/docker/fedora.py index 2c965fd..b3ed79a 100644 --- a/support/docker/fedora.py +++ b/support/docker/fedora.py @@ -3,6 +3,6 @@ class Fedora(LinuxBase): def __init__(self, version, arch): - super().__init__('fedora', 'fedora', version, arch) + super().__init__('fedora', 'fedora', version, arch, ['libusb', 'opencv']) diff --git a/support/docker/files/configuration-fedora-29.cmake b/support/docker/files/configuration-fedora-29.cmake index d9eed1a..51d36a3 100644 --- a/support/docker/files/configuration-fedora-29.cmake +++ b/support/docker/files/configuration-fedora-29.cmake @@ -1,3 +1,3 @@ include(${CMAKE_CURRENT_LIST_DIR}/configuration-fedora-base.cmake) -set(CPACK_RPM_PACKAGE_REQUIRES "libusb, qt5-qtbase >= 5.5.0, opencv >= 2.4.0 , fxload, CCfits" CACHE STRING "") +set(CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.5.0, fxload, CCfits, libdc1394" CACHE STRING "") diff --git a/support/docker/files/configuration-fedora-30.cmake b/support/docker/files/configuration-fedora-30.cmake index d9eed1a..51d36a3 100644 --- a/support/docker/files/configuration-fedora-30.cmake +++ b/support/docker/files/configuration-fedora-30.cmake @@ -1,3 +1,3 @@ include(${CMAKE_CURRENT_LIST_DIR}/configuration-fedora-base.cmake) -set(CPACK_RPM_PACKAGE_REQUIRES "libusb, qt5-qtbase >= 5.5.0, opencv >= 2.4.0 , fxload, CCfits" CACHE STRING "") +set(CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.5.0, fxload, CCfits, libdc1394" CACHE STRING "") diff --git a/support/docker/files/configuration-fedora-31.cmake b/support/docker/files/configuration-fedora-31.cmake index d9eed1a..51d36a3 100644 --- a/support/docker/files/configuration-fedora-31.cmake +++ b/support/docker/files/configuration-fedora-31.cmake @@ -1,3 +1,3 @@ include(${CMAKE_CURRENT_LIST_DIR}/configuration-fedora-base.cmake) -set(CPACK_RPM_PACKAGE_REQUIRES "libusb, qt5-qtbase >= 5.5.0, opencv >= 2.4.0 , fxload, CCfits" CACHE STRING "") +set(CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.5.0, fxload, CCfits, libdc1394" CACHE STRING "") diff --git a/support/docker/snippets/fedora.in b/support/docker/snippets/fedora.in index c0b050f..77f3c01 100644 --- a/support/docker/snippets/fedora.in +++ b/support/docker/snippets/fedora.in @@ -8,12 +8,11 @@ RUN yum install -y \ qt5-qtdeclarative-devel \ gcc-c++ \ cmake \ - opencv-devel \ boost-devel \ git \ - libusb-devel \ CCfits-devel \ libdc1394-devel \ + autoconf automake libtool libudev-devel \ && yum clean all -y WORKDIR /build RUN mkdir /cmake diff --git a/support/docker/snippets/opencv.in b/support/docker/snippets/opencv.in index 388d8b0..74a9b26 100644 --- a/support/docker/snippets/opencv.in +++ b/support/docker/snippets/opencv.in @@ -1,9 +1,8 @@ -#RUN cd / && git clone https://github.com/libusb/libusb.git libusb-git && cd libusb-git && ./autogen.sh && ./configure --enable-static=yes --enable-shared=no --prefix=/opt/libusb-git && make all install && cd / && rm -rf /libusb-git -RUN cd / && git clone https://github.com/opencv/opencv.git opencv-git -b 3.1.0 && \ +RUN cd / && git clone https://github.com/opencv/opencv.git opencv-git -b 4.1.0 && \ mkdir -p opencv-git/build && \ cd opencv-git/build && \ - $CMAKE_BIN ../ \ - -DCMAKE_INSTALL_PREFIX=/opt/opencv%{OPENCV_DIR_SUFFIX} \ + %{CMAKE_BIN} ../ \ + -DCMAKE_INSTALL_PREFIX=/opt/opencv-git \ -DCMAKE_BUILD_TYPE=Release \ -DWITH_WIN32UI=Off \ -DWITH_QT=Off \ @@ -28,4 +27,4 @@ RUN cd / && git clone https://github.com/opencv/opencv.git opencv-git -b 3.1.0 & -DBUILD_PERF_TESTS=Off \ && make all install && \ cd / && rm -rf /opencv-git -ENV CMAKE_PREFIX_PATH="/opt/opencv;$CMAKE_PREFIX_PATH}" +ENV CMAKE_PREFIX_PATH="/opt/opencv-git;$CMAKE_PREFIX_PATH}"