git: c1e1ca750be9 - main - multimedia/guvcview: New port: Webcam viewer/recorder

From: Vladimir Druzenko <vvd_at_FreeBSD.org>
Date: Mon, 25 Aug 2025 11:33:06 UTC
The branch main has been updated by vvd:

URL: https://cgit.FreeBSD.org/ports/commit/?id=c1e1ca750be9ef9a224ef1ca3a2675d484a04f23

commit c1e1ca750be9ef9a224ef1ca3a2675d484a04f23
Author:     Thompson, Walker Riggs <walker.thompson@urz.uni-heidelberg.de>
AuthorDate: 2025-08-25 11:29:24 +0000
Commit:     Vladimir Druzenko <vvd@FreeBSD.org>
CommitDate: 2025-08-25 11:33:01 +0000

    multimedia/guvcview: New port: Webcam viewer/recorder
    
    Guvcview is an application for capturing and viewing video from
    devices supported by the linux kernel video4linux2 interface.
    
    https://guvcview.sourceforge.net/
    
    PR:             288329
    Co-authored-by: Vladimir Druzenko <vvd@FreeBSD.org>
---
 multimedia/Makefile                                |  1 +
 multimedia/guvcview/Makefile                       | 39 ++++++++++++
 multimedia/guvcview/distinfo                       |  3 +
 .../guvcview/files/patch-guvcview_guvcview.c       | 31 ++++++++++
 .../guvcview/files/patch-guvcview_video__capture.c | 71 ++++++++++++++++++++++
 .../guvcview/files/patch-gview__audio_gviewaudio.h | 11 ++++
 .../files/patch-gview__encoder_gviewencoder.h      | 11 ++++
 .../guvcview/files/patch-gview__encoder_muxer.c    | 11 ++++
 .../files/patch-gview__render_gviewrender.h        | 11 ++++
 .../files/patch-gview__v4l2core_gviewv4l2core.h    | 11 ++++
 .../files/patch-gview__v4l2core_v4l2__core.c       | 14 +++++
 multimedia/guvcview/pkg-descr                      |  2 +
 multimedia/guvcview/pkg-plist                      | 69 +++++++++++++++++++++
 13 files changed, 285 insertions(+)

diff --git a/multimedia/Makefile b/multimedia/Makefile
index 97d423f15213..69c66edb0cab 100644
--- a/multimedia/Makefile
+++ b/multimedia/Makefile
@@ -113,6 +113,7 @@
     SUBDIR += gstreamermm
     SUBDIR += gtk-pipe-viewer
     SUBDIR += gtk-youtube-viewer
+    SUBDIR += guvcview
     SUBDIR += handbrake
     SUBDIR += haruna
     SUBDIR += harvid
diff --git a/multimedia/guvcview/Makefile b/multimedia/guvcview/Makefile
new file mode 100644
index 000000000000..5c8d1726983e
--- /dev/null
+++ b/multimedia/guvcview/Makefile
@@ -0,0 +1,39 @@
+PORTNAME=	guvcview
+DISTVERSION=	2.2.1
+CATEGORIES=	multimedia
+MASTER_SITES=	SOURCEFORGE/guvcview/source
+DISTNAME=	${PORTNAME}-src-${DISTVERSION}
+
+MAINTAINER=	walker.thompson@urz.uni-heidelberg.de
+COMMENT=	Simple v4l2 full-featured video grabber
+WWW=		https://guvcview.sourceforge.net/
+
+LICENSE=	GPLv2
+
+BUILD_DEPENDS=	${LOCALBASE}/include/linux/videodev.h:multimedia/v4l_compat \
+		vulkan-headers>0:graphics/vulkan-headers
+LIB_DEPENDS=	libavcodec.so:multimedia/ffmpeg \
+		libgsl.so:math/gsl \
+		libpng.so:graphics/png \
+		libportaudio.so:audio/portaudio \
+		libudev.so:devel/libudev-devd \
+		libv4l2.so:multimedia/libv4l
+
+USES=		cmake gl gettext-runtime gettext-tools localbase:ldflags ninja \
+		pkgconfig qt:6 sdl tar:bz2
+USE_GL=		opengl
+USE_QT=		base
+USE_SDL=	sdl2
+
+CMAKE_ON=	USE_QT6 USE_SDL2
+CMAKE_OFF=	USE_GTK3 USE_SFML
+
+CFLAGS+=	-DNAME_MAX=MAXNAMLEN
+LDFLAGS+=	-lintl
+
+OPTIONS_DEFINE=		PULSEAUDIO
+PULSEAUDIO_BROKEN=	Doesn't show up as an audio backend at runtime
+PULSEAUDIO_LIB_DEPENDS=	libpulse.so:audio/pulseaudio
+PULSEAUDIO_CMAKE_BOOL=	USE_PULSE
+
+.include <bsd.port.mk>
diff --git a/multimedia/guvcview/distinfo b/multimedia/guvcview/distinfo
new file mode 100644
index 000000000000..890ef8dda756
--- /dev/null
+++ b/multimedia/guvcview/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1748610514
+SHA256 (guvcview-src-2.2.1.tar.bz2) = d2adc7ce762961e853c3e16b511bad61504492d12f3e2eb7e30da4a2f7ade5af
+SIZE (guvcview-src-2.2.1.tar.bz2) = 355747
diff --git a/multimedia/guvcview/files/patch-guvcview_guvcview.c b/multimedia/guvcview/files/patch-guvcview_guvcview.c
new file mode 100644
index 000000000000..6a77e654b7ae
--- /dev/null
+++ b/multimedia/guvcview/files/patch-guvcview_guvcview.c
@@ -0,0 +1,31 @@
+--- guvcview/guvcview.c.orig	2024-11-02 13:15:33 UTC
++++ guvcview/guvcview.c
+@@ -28,6 +28,7 @@
+ #include <sys/resource.h>
+ #include <sys/stat.h>
+ #include <sys/syscall.h>
++#include <pthread_np.h>
+ #include <unistd.h>
+ 
+ #include "config.h"
+@@ -226,8 +227,8 @@ int main(int argc, char *argv[]) {
+ #endif
+ 
+   if (debug_level > 1)
+-    printf("GUVCVIEW: main thread (tid: %u)\n",
+-           (unsigned int)syscall(SYS_gettid));
++    printf("GUVCVIEW: main thread (tid: %d)\n",
++           pthread_getthreadid_np());
+ 
+   /*set the v4l2 core verbosity*/
+   v4l2core_set_verbosity(debug_level);
+@@ -393,8 +394,7 @@ int main(int argc, char *argv[]) {
+         gui_error("Guvcview error", "could not start the video capture thread",
+                   1);
+       } else if (debug_level > 2)
+-        printf("GUVCVIEW: created capture thread with tid: %u\n",
+-               (unsigned int)capture_thread);
++        printf("GUVCVIEW: created capture thread\n");
+ 
+       struct timespec now;
+       clock_gettime(CLOCK_REALTIME, &now);
diff --git a/multimedia/guvcview/files/patch-guvcview_video__capture.c b/multimedia/guvcview/files/patch-guvcview_video__capture.c
new file mode 100644
index 000000000000..2effe5e75b70
--- /dev/null
+++ b/multimedia/guvcview/files/patch-guvcview_video__capture.c
@@ -0,0 +1,71 @@
+i+--- guvcview/video_capture.c.orig	2024-11-02 13:15:33 UTC
++++ guvcview/video_capture.c
+@@ -34,6 +34,7 @@
+ /* support for internationalization - i18n */
+ #include <libintl.h>
+ #include <locale.h>
++#include <pthread_np.h>
+ 
+ #include "config.h"
+ #include "core_io.h"
+@@ -82,6 +83,7 @@ static __THREAD_TYPE encoder_thread;
+ static v4l2_dev_t *my_vd = NULL;
+ 
+ static __THREAD_TYPE encoder_thread;
++static __THREAD_TYPE encoder_audio_thread;
+ 
+ static int my_encoder_status = 0;
+ 
+@@ -622,8 +624,8 @@ static void *audio_processing_loop(void *data) {
+   encoder_context_t *encoder_ctx = (encoder_context_t *)data;
+ 
+   if (debug_level > 1)
+-    printf("GUVCVIEW: audio thread (tid: %u)\n",
+-           (unsigned int)syscall(SYS_gettid));
++    printf("GUVCVIEW: audio thread (tid: %d)\n",
++           pthread_getthreadid_np());
+ 
+   audio_context_t *audio_ctx = get_audio_context();
+   if (!audio_ctx) {
+@@ -717,8 +719,8 @@ static void *encoder_loop(void *data) {
+   my_encoder_status = 1;
+ 
+   if (debug_level > 1)
+-    printf("GUVCVIEW: encoder thread (tid: %u)\n",
+-           (unsigned int)syscall(SYS_gettid));
++    printf("GUVCVIEW: encoder thread (tid: %d)\n",
++           pthread_getthreadid_np());
+ 
+   /*get the audio context*/
+   audio_context_t *audio_ctx = get_audio_context();
+@@ -830,8 +832,7 @@ static void *encoder_loop(void *data) {
+       fprintf(stderr, "GUVCVIEW: encoder audio thread creation failed (%i)\n",
+               ret);
+     else if (debug_level > 2)
+-      printf("GUVCVIEW: created audio encoder thread with tid: %u\n",
+-             (unsigned int)encoder_audio_thread);
++      printf("GUVCVIEW: created audio encoder thread\n");
+   }
+ 
+   while (video_capture_get_save_video()) {
+@@ -914,8 +915,8 @@ void *capture_loop(void *data) {
+   quit = 0;
+ 
+   if (debug_level > 1)
+-    printf("GUVCVIEW: capture thread (tid: %u)\n",
+-           (unsigned int)syscall(SYS_gettid));
++    printf("GUVCVIEW: capture thread (tid: %d)\n",
++           pthread_getthreadid_np()); 
+ 
+   int ret = 0;
+ 
+@@ -1210,8 +1211,7 @@ int start_encoder_thread() {
+   if (ret)
+     fprintf(stderr, "GUVCVIEW: encoder thread creation failed (%i)\n", ret);
+   else if (debug_level > 2)
+-    printf("GUVCVIEW: created encoder thread with tid: %u\n",
+-           (unsigned int)encoder_thread);
++    printf("GUVCVIEW: created encoder thread\n");
+ 
+   return ret;
+ }
diff --git a/multimedia/guvcview/files/patch-gview__audio_gviewaudio.h b/multimedia/guvcview/files/patch-gview__audio_gviewaudio.h
new file mode 100644
index 000000000000..c4832a643fbf
--- /dev/null
+++ b/multimedia/guvcview/files/patch-gview__audio_gviewaudio.h
@@ -0,0 +1,11 @@
+--- gview_audio/gviewaudio.h.orig	2025-05-30 18:37:32 UTC
++++ gview_audio/gviewaudio.h
+@@ -32,8 +32,6 @@
+ #ifndef GVIEWAUDIO_H
+ #define GVIEWAUDIO_H
+ 
+-#include <features.h>
+-
+ #include <inttypes.h>
+ #include <pthread.h>
+ #include <sys/types.h>
diff --git a/multimedia/guvcview/files/patch-gview__encoder_gviewencoder.h b/multimedia/guvcview/files/patch-gview__encoder_gviewencoder.h
new file mode 100644
index 000000000000..4539de241cd4
--- /dev/null
+++ b/multimedia/guvcview/files/patch-gview__encoder_gviewencoder.h
@@ -0,0 +1,11 @@
+--- gview_encoder/gviewencoder.h.orig	2025-05-30 18:38:22 UTC
++++ gview_encoder/gviewencoder.h
+@@ -32,8 +32,6 @@
+ #ifndef GVIEWENCODER_H
+ #define GVIEWENCODER_H
+ 
+-#include <features.h>
+-
+ #include <inttypes.h>
+ #include <sys/types.h>
+ 
diff --git a/multimedia/guvcview/files/patch-gview__encoder_muxer.c b/multimedia/guvcview/files/patch-gview__encoder_muxer.c
new file mode 100644
index 000000000000..ecb8e788bcb1
--- /dev/null
+++ b/multimedia/guvcview/files/patch-gview__encoder_muxer.c
@@ -0,0 +1,11 @@
+--- gview_encoder/muxer.c.orig	2024-11-02 13:15:33 UTC
++++ gview_encoder/muxer.c
+@@ -30,7 +30,7 @@ Inc., 59 Temple Place, Suite 330, Boston, MA  02111-13
+ #include <unistd.h>
+ // #include <errno.h>
+ #include <assert.h>
+-#include <sys/statfs.h>
++#include <sys/mount.h>
+ /* support for internationalization - i18n */
+ #include <libintl.h>
+ #include <locale.h>
diff --git a/multimedia/guvcview/files/patch-gview__render_gviewrender.h b/multimedia/guvcview/files/patch-gview__render_gviewrender.h
new file mode 100644
index 000000000000..7b740ffd3b57
--- /dev/null
+++ b/multimedia/guvcview/files/patch-gview__render_gviewrender.h
@@ -0,0 +1,11 @@
+--- gview_render/gviewrender.h.orig	2025-05-30 18:38:11 UTC
++++ gview_render/gviewrender.h
+@@ -32,8 +32,6 @@
+ #ifndef GVIEWRENDER_H
+ #define GVIEWRENDER_H
+ 
+-#include <features.h>
+-
+ #include <inttypes.h>
+ #include <sys/types.h>
+ 
diff --git a/multimedia/guvcview/files/patch-gview__v4l2core_gviewv4l2core.h b/multimedia/guvcview/files/patch-gview__v4l2core_gviewv4l2core.h
new file mode 100644
index 000000000000..92109f29a5e9
--- /dev/null
+++ b/multimedia/guvcview/files/patch-gview__v4l2core_gviewv4l2core.h
@@ -0,0 +1,11 @@
+--- gview_v4l2core/gviewv4l2core.h.orig	2025-05-30 18:37:59 UTC
++++ gview_v4l2core/gviewv4l2core.h
+@@ -22,8 +22,6 @@
+ #ifndef GVIEWV4L2CORE_H
+ #define GVIEWV4L2CORE_H
+ 
+-#include <features.h>
+-
+ #include <inttypes.h>
+ #include <libudev.h>
+ #include <linux/media.h>
diff --git a/multimedia/guvcview/files/patch-gview__v4l2core_v4l2__core.c b/multimedia/guvcview/files/patch-gview__v4l2core_v4l2__core.c
new file mode 100644
index 000000000000..dd263d52b42f
--- /dev/null
+++ b/multimedia/guvcview/files/patch-gview__v4l2core_v4l2__core.c
@@ -0,0 +1,14 @@
+--- gview_v4l2core/v4l2_core.c.orig	2024-11-02 13:15:33 UTC
++++ gview_v4l2core/v4l2_core.c
+@@ -96,9 +96,9 @@ int xioctl(int fd, int IOCTL_X, void *arg) {
+   int ret = 0;
+   int tries = IOCTL_RETRY;
+   do {
+-    if (!disable_libv4l2)
++/*    if (!disable_libv4l2)
+       ret = v4l2_ioctl(fd, IOCTL_X, arg);
+-    else
++    else*/
+       ret = ioctl(fd, IOCTL_X, arg);
+   } while (ret && tries-- &&
+            ((errno == EINTR) || (errno == EAGAIN) || (errno == ETIMEDOUT)));
diff --git a/multimedia/guvcview/pkg-descr b/multimedia/guvcview/pkg-descr
new file mode 100644
index 000000000000..8cbd6240a078
--- /dev/null
+++ b/multimedia/guvcview/pkg-descr
@@ -0,0 +1,2 @@
+Guvcview is an application for capturing and viewing video from
+devices supported by the linux kernel video4linux2 interface.
diff --git a/multimedia/guvcview/pkg-plist b/multimedia/guvcview/pkg-plist
new file mode 100644
index 000000000000..0276e0166ecf
--- /dev/null
+++ b/multimedia/guvcview/pkg-plist
@@ -0,0 +1,69 @@
+bin/guvcview
+lib/libgviewaudio.so
+lib/libgviewaudio.so.2
+lib/libgviewaudio.so.2.2.0
+lib/libgviewencoder.so
+lib/libgviewencoder.so.2
+lib/libgviewencoder.so.2.2.1
+lib/libgviewrender.so
+lib/libgviewrender.so.2
+lib/libgviewrender.so.2.2.1
+lib/libgviewv4l2core.so
+lib/libgviewv4l2core.so.2
+lib/libgviewv4l2core.so.2.2.1
+share/appdata/guvcview.appdata.xml
+share/applications/guvcview.desktop
+share/locale/bg/LC_MESSAGES/guvcview.mo
+share/locale/bg/LC_MESSAGES/gview_v4l2core.mo
+share/locale/bs/LC_MESSAGES/guvcview.mo
+share/locale/bs/LC_MESSAGES/gview_v4l2core.mo
+share/locale/cs/LC_MESSAGES/guvcview.mo
+share/locale/cs/LC_MESSAGES/gview_v4l2core.mo
+share/locale/da/LC_MESSAGES/guvcview.mo
+share/locale/da/LC_MESSAGES/gview_v4l2core.mo
+share/locale/de/LC_MESSAGES/guvcview.mo
+share/locale/de/LC_MESSAGES/gview_v4l2core.mo
+share/locale/en_AU/LC_MESSAGES/guvcview.mo
+share/locale/en_AU/LC_MESSAGES/gview_v4l2core.mo
+share/locale/es/LC_MESSAGES/guvcview.mo
+share/locale/es/LC_MESSAGES/gview_v4l2core.mo
+share/locale/eu/LC_MESSAGES/guvcview.mo
+share/locale/eu/LC_MESSAGES/gview_v4l2core.mo
+share/locale/fo/LC_MESSAGES/guvcview.mo
+share/locale/fo/LC_MESSAGES/gview_v4l2core.mo
+share/locale/fr/LC_MESSAGES/guvcview.mo
+share/locale/fr/LC_MESSAGES/gview_v4l2core.mo
+share/locale/gl/LC_MESSAGES/guvcview.mo
+share/locale/gl/LC_MESSAGES/gview_v4l2core.mo
+share/locale/he/LC_MESSAGES/guvcview.mo
+share/locale/he/LC_MESSAGES/gview_v4l2core.mo
+share/locale/hr/LC_MESSAGES/guvcview.mo
+share/locale/hr/LC_MESSAGES/gview_v4l2core.mo
+share/locale/it/LC_MESSAGES/guvcview.mo
+share/locale/it/LC_MESSAGES/gview_v4l2core.mo
+share/locale/ja/LC_MESSAGES/guvcview.mo
+share/locale/ja/LC_MESSAGES/gview_v4l2core.mo
+share/locale/lv/LC_MESSAGES/guvcview.mo
+share/locale/lv/LC_MESSAGES/gview_v4l2core.mo
+share/locale/nl/LC_MESSAGES/guvcview.mo
+share/locale/nl/LC_MESSAGES/gview_v4l2core.mo
+share/locale/pl/LC_MESSAGES/guvcview.mo
+share/locale/pl/LC_MESSAGES/gview_v4l2core.mo
+share/locale/pt/LC_MESSAGES/guvcview.mo
+share/locale/pt/LC_MESSAGES/gview_v4l2core.mo
+share/locale/pt_BR/LC_MESSAGES/guvcview.mo
+share/locale/pt_BR/LC_MESSAGES/gview_v4l2core.mo
+share/locale/ru/LC_MESSAGES/guvcview.mo
+share/locale/ru/LC_MESSAGES/gview_v4l2core.mo
+share/locale/si/LC_MESSAGES/guvcview.mo
+share/locale/si/LC_MESSAGES/gview_v4l2core.mo
+share/locale/sr/LC_MESSAGES/guvcview.mo
+share/locale/sr/LC_MESSAGES/gview_v4l2core.mo
+share/locale/tr/LC_MESSAGES/guvcview.mo
+share/locale/tr/LC_MESSAGES/gview_v4l2core.mo
+share/locale/uk/LC_MESSAGES/guvcview.mo
+share/locale/uk/LC_MESSAGES/gview_v4l2core.mo
+share/locale/zh_TW/LC_MESSAGES/guvcview.mo
+share/locale/zh_TW/LC_MESSAGES/gview_v4l2core.mo
+share/man/man1/guvcview.1.gz
+share/pixmaps/guvcview.png