summaryrefslogtreecommitdiff
path: root/multimedia
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia')
-rw-r--r--multimedia/ab-av1/Makefile1
-rw-r--r--multimedia/alass/Makefile2
-rw-r--r--multimedia/arcan/Makefile2
-rw-r--r--multimedia/arcan/files/ffmpeg.patch57
-rw-r--r--multimedia/av1an/Makefile1
-rw-r--r--multimedia/ccextractor/Makefile2
-rw-r--r--multimedia/dovi_tool/Makefile2
-rw-r--r--multimedia/gstreamer1-plugins-rust/Makefile1
-rw-r--r--multimedia/gstreamer1/Makefile1
-rw-r--r--multimedia/guvcview/Makefile4
-rw-r--r--multimedia/helvum/Makefile2
-rw-r--r--multimedia/kooha/Makefile2
-rw-r--r--multimedia/libcec/Makefile2
-rw-r--r--multimedia/librav1e/Makefile2
-rw-r--r--multimedia/librespot/Makefile1
-rw-r--r--multimedia/libxine/Makefile11
-rw-r--r--multimedia/libxine/files/0a786d63bbdb2d780a9231f6772e84e743c72014.patch67
-rw-r--r--multimedia/libxine/files/1e7b184008860c8be2289c3cefd9dee57f06193a.patch475
-rw-r--r--multimedia/libxine/files/6f1000084f6084f49c95c202d12593e49916f58b.patch161
-rw-r--r--multimedia/libxine/files/73b833e7fe356cd2d9490dda4ebc9bfe16fce958.patch318
-rw-r--r--multimedia/libxine/files/771f4ae27e582123ff3500444718fc8f96186d74.patch (renamed from multimedia/libxine/files/patch-src_combined_ffmpeg_ff__audio__decoder.c)70
-rw-r--r--multimedia/libxine/files/9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc.patch (renamed from multimedia/libxine/files/ffmpeg8-1.patch)14
-rw-r--r--multimedia/libxine/files/a8fffd1193b2247c7f732d4df83dcc03fce96dbe.patch (renamed from multimedia/libxine/files/ffmpeg8-2.patch)0
-rw-r--r--multimedia/libxine/files/patch-src_combined_ffmpeg_demux__avformat.c35
-rw-r--r--multimedia/libzen/Makefile2
-rw-r--r--multimedia/mediainfo/Makefile2
-rw-r--r--multimedia/mediamtx/Makefile2
-rw-r--r--multimedia/minisatip/Makefile2
-rw-r--r--multimedia/minisatip/distinfo6
-rw-r--r--multimedia/navidrome/Makefile2
-rw-r--r--multimedia/neolink/Makefile2
-rw-r--r--multimedia/obs-studio/Makefile2
-rw-r--r--multimedia/py-subliminal/Makefile2
-rw-r--r--multimedia/py-subliminal/distinfo6
-rw-r--r--multimedia/qt6-multimedia/distinfo6
-rw-r--r--multimedia/qt6-multimedia/files/patch-cmake_FindFFmpeg.cmake4
-rw-r--r--multimedia/qt6-multimedia/files/patch-src_CMakeLists.txt4
-rw-r--r--multimedia/qt6-multimedia/files/patch-src_multimedia_CMakeLists.txt8
-rw-r--r--multimedia/qt6-multimedia/files/patch-src_multimedia_configure.cmake10
-rw-r--r--multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__instance.cpp6
-rw-r--r--multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__symbolloader.cpp6
-rw-r--r--multimedia/qt6-multimedia/files/patch-src_plugins_multimedia_ffmpeg_CMakeLists.txt6
-rw-r--r--multimedia/qt6-multimedia/pkg-plist47
-rw-r--r--multimedia/rav1e/Makefile2
-rw-r--r--multimedia/ringrtc/Makefile5
-rw-r--r--multimedia/ringrtc/Makefile.crates3
-rw-r--r--multimedia/ringrtc/distinfo16
-rw-r--r--multimedia/ringrtc/files/patch-src__webrtc_src_rtc__base_cpu__info.cc24
-rw-r--r--multimedia/ringrtc/update.txt2
-rw-r--r--multimedia/ringrtc/webrtc_fetch.sh2
-rw-r--r--multimedia/scte35dump/Makefile2
-rw-r--r--multimedia/subtitlecomposer/Makefile1
-rw-r--r--multimedia/termplay/Makefile2
-rw-r--r--multimedia/video-trimmer/Makefile2
-rw-r--r--multimedia/wl-screenrec/Makefile2
-rw-r--r--multimedia/x264/Makefile2
-rw-r--r--multimedia/x264/files/32c3b801191522961102d4bea292cdb61068d0dd.patch38
-rw-r--r--multimedia/youtui/Makefile1
58 files changed, 1315 insertions, 147 deletions
diff --git a/multimedia/ab-av1/Makefile b/multimedia/ab-av1/Makefile
index 51505135682d..a05b4048ccf3 100644
--- a/multimedia/ab-av1/Makefile
+++ b/multimedia/ab-av1/Makefile
@@ -1,6 +1,7 @@
PORTNAME= ab-av1
DISTVERSIONPREFIX= v
DISTVERSION= 0.10.3
+PORTREVISION= 1
CATEGORIES= multimedia
MAINTAINER= jbeich@FreeBSD.org
diff --git a/multimedia/alass/Makefile b/multimedia/alass/Makefile
index 9a3905913756..9b26da5e3b2c 100644
--- a/multimedia/alass/Makefile
+++ b/multimedia/alass/Makefile
@@ -1,7 +1,7 @@
PORTNAME= alass
DISTVERSIONPREFIX= v
DISTVERSION= 2.0.0
-PORTREVISION= 19
+PORTREVISION= 20
CATEGORIES= multimedia
MAINTAINER= yuri@FreeBSD.org
diff --git a/multimedia/arcan/Makefile b/multimedia/arcan/Makefile
index 2e1cfaaa9623..66617ffd2694 100644
--- a/multimedia/arcan/Makefile
+++ b/multimedia/arcan/Makefile
@@ -13,6 +13,8 @@ LICENSE_FILE_BSD3CLAUSE=${WRKSRC:H}/data/distr/LICENSE.BSD
LICENSE_FILE_GPLv2+ = ${WRKSRC:H}/data/distr/LICENSE.GPL
LICENSE_FILE_LGPL21+ = ${WRKSRC:H}/data/distr/LICENSE.LGPL
+EXTRA_PATCHES= ${FILESDIR}/ffmpeg.patch:-p1
+
BUILD_DEPENDS= evdev-proto>0:devel/evdev-proto
LIB_DEPENDS= libdrm.so:graphics/libdrm \
libfreetype.so:print/freetype2
diff --git a/multimedia/arcan/files/ffmpeg.patch b/multimedia/arcan/files/ffmpeg.patch
new file mode 100644
index 000000000000..c1038e0e3c90
--- /dev/null
+++ b/multimedia/arcan/files/ffmpeg.patch
@@ -0,0 +1,57 @@
+Index: src/frameserver/encode/default/encode_presets.c
+==================================================================
+--- src/frameserver/encode/default/encode_presets.c
++++ src/frameserver/encode/default/encode_presets.c
+@@ -61,11 +61,11 @@
+
+ if (avcodec_open2(dst->storage.video.context,
+ dst->storage.video.codec, NULL) != 0){
+ dst->storage.video.codec = NULL;
+ dst->storage.video.context = NULL;
+- avcodec_close(dst->storage.video.context);
++ avcodec_free_context(&dst->storage.video.context);
+ return false;
+ }
+
+ return true;
+ }
+@@ -89,11 +89,11 @@
+ "got %d kbit/s using %s\n", samplerate, abr,
+ (int)(ctx->bit_rate / 1000), codec->name);
+
+ if (avcodec_open2(
+ dst->storage.audio.context, dst->storage.audio.codec, NULL) != 0){
+- avcodec_close(dst->storage.audio.context);
++ avcodec_free_context(&dst->storage.audio.context);
+ dst->storage.audio.context = NULL;
+ dst->storage.audio.codec = NULL;
+ return false;
+ }
+
+@@ -179,11 +179,11 @@
+ LOG("(encode) video setup @ %d * %d, %f fps, %d kbit / s.\n",
+ width, height, fps, vbr / 1000);
+
+ if (avcodec_open2(dst->storage.video.context,
+ dst->storage.video.codec, &opts) != 0){
+- avcodec_close(dst->storage.video.context);
++ avcodec_free_context(&dst->storage.video.context);
+ dst->storage.video.context = NULL;
+ dst->storage.video.codec = NULL;
+ return false;
+ }
+
+@@ -245,11 +245,11 @@
+
+ LOG("(encode) video setup @ %d * %d, %f fps, %d kbit / s.\n",
+ width, height, fps, vbr / 1024);
+ if (avcodec_open2(dst->storage.video.context,
+ dst->storage.video.codec, &opts) != 0){
+- avcodec_close(dst->storage.video.context);
++ avcodec_free_context(&dst->storage.video.context);
+ dst->storage.video.context = NULL;
+ dst->storage.video.codec = NULL;
+ return false;
+ }
+
+
diff --git a/multimedia/av1an/Makefile b/multimedia/av1an/Makefile
index 7a2ef68e6465..4a02ce6bc2a7 100644
--- a/multimedia/av1an/Makefile
+++ b/multimedia/av1an/Makefile
@@ -1,5 +1,6 @@
PORTNAME= av1an
DISTVERSION= 0.5.0
+PORTREVISION= 1
CATEGORIES= multimedia
MAINTAINER= ports@FreeBSD.org
diff --git a/multimedia/ccextractor/Makefile b/multimedia/ccextractor/Makefile
index 5c505748b9eb..4eb1ab838384 100644
--- a/multimedia/ccextractor/Makefile
+++ b/multimedia/ccextractor/Makefile
@@ -1,4 +1,4 @@
-PORTREVISION= 2
+PORTREVISION= 3
COMMENT= Subtitle extractor
diff --git a/multimedia/dovi_tool/Makefile b/multimedia/dovi_tool/Makefile
index 350a6d9a69b3..df688ee12d73 100644
--- a/multimedia/dovi_tool/Makefile
+++ b/multimedia/dovi_tool/Makefile
@@ -1,6 +1,6 @@
PORTNAME= dovi_tool
DISTVERSION= 2.1.2
-PORTREVISION= 10
+PORTREVISION= 11
CATEGORIES= multimedia
MAINTAINER= michiel@vanbaak.eu
diff --git a/multimedia/gstreamer1-plugins-rust/Makefile b/multimedia/gstreamer1-plugins-rust/Makefile
index b6d43853fbbe..3d55e4c2a658 100644
--- a/multimedia/gstreamer1-plugins-rust/Makefile
+++ b/multimedia/gstreamer1-plugins-rust/Makefile
@@ -1,5 +1,6 @@
PORTNAME= gstreamer1-plugins-rust
DISTVERSION= ${gst-rust_VERSION}
+PORTREVISION= 1
CATEGORIES= multimedia
MAINTAINER= multimedia@FreeBSD.org
diff --git a/multimedia/gstreamer1/Makefile b/multimedia/gstreamer1/Makefile
index f65febe33bb1..7305ad711290 100644
--- a/multimedia/gstreamer1/Makefile
+++ b/multimedia/gstreamer1/Makefile
@@ -1,5 +1,6 @@
PORTNAME= gstreamer
PORTVERSION= ${_GST_VERSION}
+PORTREVISION= 1
CATEGORIES= multimedia
MASTER_SITES= https://gstreamer.freedesktop.org/src/gstreamer/
PKGNAMESUFFIX= 1
diff --git a/multimedia/guvcview/Makefile b/multimedia/guvcview/Makefile
index 5c8d1726983e..17cab1ed38b8 100644
--- a/multimedia/guvcview/Makefile
+++ b/multimedia/guvcview/Makefile
@@ -36,4 +36,8 @@ PULSEAUDIO_BROKEN= Doesn't show up as an audio backend at runtime
PULSEAUDIO_LIB_DEPENDS= libpulse.so:audio/pulseaudio
PULSEAUDIO_CMAKE_BOOL= USE_PULSE
+post-patch:
+ ${REINPLACE_CMD} -e 's/FF_/AV_/g' \
+ ${WRKDIR}/guvcview-src-2.2.1/gview_encoder/audio_codecs.c
+
.include <bsd.port.mk>
diff --git a/multimedia/helvum/Makefile b/multimedia/helvum/Makefile
index e4562f412724..186f92589e1a 100644
--- a/multimedia/helvum/Makefile
+++ b/multimedia/helvum/Makefile
@@ -1,6 +1,6 @@
PORTNAME= helvum
DISTVERSION= 0.5.1
-PORTREVISION= 20
+PORTREVISION= 21
CATEGORIES= multimedia
MAINTAINER= ports@FreeBSD.org
diff --git a/multimedia/kooha/Makefile b/multimedia/kooha/Makefile
index 806db2d5c3db..87ae227f131f 100644
--- a/multimedia/kooha/Makefile
+++ b/multimedia/kooha/Makefile
@@ -1,7 +1,7 @@
PORTNAME= kooha
DISTVERSIONPREFIX= v
DISTVERSION= 2.3.0
-PORTREVISION= 16
+PORTREVISION= 17
CATEGORIES= multimedia wayland
MAINTAINER= ports@FreeBSD.org
diff --git a/multimedia/libcec/Makefile b/multimedia/libcec/Makefile
index 9a777814c048..603d302662f6 100644
--- a/multimedia/libcec/Makefile
+++ b/multimedia/libcec/Makefile
@@ -13,7 +13,7 @@ LICENSE_FILE= ${WRKSRC}/LICENSE.md
LIB_DEPENDS= libp8-platform.so:devel/p8-platform
-USES= alias cmake compiler:c++11-lib pathfix pkgconfig shebangfix
+USES= alias cmake compiler:c++11-lib pkgconfig shebangfix
CMAKE_ARGS= -DCMAKE_REQUIRED_INCLUDES=${LOCALBASE}/include \
-DCMAKE_REQUIRED_FLAGS=-L${LOCALBASE}/lib \
diff --git a/multimedia/librav1e/Makefile b/multimedia/librav1e/Makefile
index d8b8c065be24..91b5ee8882f6 100644
--- a/multimedia/librav1e/Makefile
+++ b/multimedia/librav1e/Makefile
@@ -1,4 +1,4 @@
-PORTREVISION= 4
+PORTREVISION= 5
PKGNAMEPREFIX= lib
MASTERDIR= ${.CURDIR}/../rav1e
diff --git a/multimedia/librespot/Makefile b/multimedia/librespot/Makefile
index 8e8ad57f9805..78268c027b75 100644
--- a/multimedia/librespot/Makefile
+++ b/multimedia/librespot/Makefile
@@ -1,6 +1,7 @@
PORTNAME= librespot
DISTVERSIONPREFIX= v
DISTVERSION= 0.8.0
+PORTREVISION= 1
CATEGORIES= multimedia
MAINTAINER= driesm@FreeBSD.org
diff --git a/multimedia/libxine/Makefile b/multimedia/libxine/Makefile
index e3f6a2d82ad7..b8ca9980f6d7 100644
--- a/multimedia/libxine/Makefile
+++ b/multimedia/libxine/Makefile
@@ -32,8 +32,15 @@ LIB_DEPENDS= libFLAC.so:audio/flac \
libogg.so:audio/libogg \
libdvdnav.so:multimedia/libdvdnav
-EXTRA_PATCHES= ${FILESDIR}/ffmpeg8-1.patch:-p1 \
- ${FILESDIR}/ffmpeg8-2.patch:-p1
+# patch obtain via hg export -r <rev>
+EXTRA_PATCHES= \
+ ${FILESDIR}/771f4ae27e582123ff3500444718fc8f96186d74.patch:-p1 \
+ ${FILESDIR}/0a786d63bbdb2d780a9231f6772e84e743c72014.patch:-p1 \
+ ${FILESDIR}/6f1000084f6084f49c95c202d12593e49916f58b.patch:-p1 \
+ ${FILESDIR}/1e7b184008860c8be2289c3cefd9dee57f06193a.patch:-p1 \
+ ${FILESDIR}/73b833e7fe356cd2d9490dda4ebc9bfe16fce958.patch:-p1 \
+ ${FILESDIR}/9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc.patch:-p1 \
+ ${FILESDIR}/a8fffd1193b2247c7f732d4df83dcc03fce96dbe.patch:-p1
USES= compiler cpe gl gmake gnome iconv libtool:keepla jpeg \
localbase pathfix perl5 pkgconfig tar:xz xorg
diff --git a/multimedia/libxine/files/0a786d63bbdb2d780a9231f6772e84e743c72014.patch b/multimedia/libxine/files/0a786d63bbdb2d780a9231f6772e84e743c72014.patch
new file mode 100644
index 000000000000..d792fbc858df
--- /dev/null
+++ b/multimedia/libxine/files/0a786d63bbdb2d780a9231f6772e84e743c72014.patch
@@ -0,0 +1,67 @@
+# HG changeset patch
+# User Torsten Jager <t.jager@gmx.de>
+# Date 1675683900 -3600
+# Mon Feb 06 12:45:00 2023 +0100
+# Node ID 0a786d63bbdb2d780a9231f6772e84e743c72014
+# Parent b0a36ed8ec8f3f2de545502b93ec846561168b64
+Try to silence some cast align warnings 4.
+
+diff -r b0a36ed8ec8f -r 0a786d63bbdb src/combined/ffmpeg/ff_video_decoder.c
+--- a/src/combined/ffmpeg/ff_video_decoder.c Mon Feb 06 12:44:55 2023 +0100
++++ b/src/combined/ffmpeg/ff_video_decoder.c Mon Feb 06 12:45:00 2023 +0100
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2001-2022 the xine project
++ * Copyright (C) 2001-2023 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+@@ -1398,7 +1398,7 @@
+ #if defined(AV_PIX_FMT_YUV420P9) || defined(AV_PIX_FMT_YUV420P10)
+ static void ff_get_deep_color (uint8_t *src, int sstride, uint8_t *dest, int dstride,
+ int width, int height, uint8_t *tab) {
+- uint16_t *p = (uint16_t *) src;
++ uint16_t *p = (uint16_t *)ASSUME_ALIGNED_2 (src, 2);
+ uint8_t *q = dest;
+ int spad = sstride / 2 - width;
+ int dpad = dstride - width;
+@@ -1804,22 +1804,24 @@
+ #ifdef XFF_AVCODEC_SUB_ID
+ this->context->sub_id = _X_BE_32(&this->buf[30]);
+ #endif
+- this->context->extradata_size = this->size - 26;
+- if (this->context->extradata_size < 8) {
+- this->context->extradata_size= 8;
+- this->context->extradata = calloc(1, this->context->extradata_size +
+- AV_INPUT_BUFFER_PADDING_SIZE);
+- ((uint32_t *)this->context->extradata)[0] = 0;
+- if (codec_type == BUF_VIDEO_RV10)
+- ((uint32_t *)this->context->extradata)[1] = 0x10000000;
+- else
+- ((uint32_t *)this->context->extradata)[1] = 0x10003001;
++ if (this->size < 8 + 26) {
++ uint32_t *b = calloc (1, 8 + AV_INPUT_BUFFER_PADDING_SIZE);
++ if (b) {
++ this->context->extradata_size = 8;
++ this->context->extradata = (uint8_t *)b;
++ b[0] = 0;
++ if (codec_type == BUF_VIDEO_RV10)
++ b[1] = 0x10000000;
++ else
++ b[1] = 0x10003001;
++ }
+ } else {
+- this->context->extradata = malloc(this->context->extradata_size +
+- AV_INPUT_BUFFER_PADDING_SIZE);
+- memcpy(this->context->extradata, this->buf + 26,
+- this->context->extradata_size);
+- memset(this->context->extradata + this->context->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
++ this->context->extradata = malloc (this->size - 26 + AV_INPUT_BUFFER_PADDING_SIZE);
++ if (this->context->extradata) {
++ this->context->extradata_size = this->size - 26;
++ memcpy (this->context->extradata, this->buf + 26, this->context->extradata_size);
++ memset (this->context->extradata + this->context->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
++ }
+ }
+
+ xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
diff --git a/multimedia/libxine/files/1e7b184008860c8be2289c3cefd9dee57f06193a.patch b/multimedia/libxine/files/1e7b184008860c8be2289c3cefd9dee57f06193a.patch
new file mode 100644
index 000000000000..b6b4040a8478
--- /dev/null
+++ b/multimedia/libxine/files/1e7b184008860c8be2289c3cefd9dee57f06193a.patch
@@ -0,0 +1,475 @@
+# HG changeset patch
+# User Torsten Jager <t.jager@gmx.de>
+# Date 1715025355 -7200
+# Mon May 06 21:55:55 2024 +0200
+# Node ID 1e7b184008860c8be2289c3cefd9dee57f06193a
+# Parent d1954d852980ddc887a67a9f1a26626909561ff5
+ffmpeg compatibility update 1.
+
+diff -r d1954d852980 -r 1e7b18400886 src/combined/ffmpeg/ff_audio_decoder.c
+--- a/src/combined/ffmpeg/ff_audio_decoder.c Mon Apr 08 13:25:10 2024 +0200
++++ b/src/combined/ffmpeg/ff_audio_decoder.c Mon May 06 21:55:55 2024 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2001-2023 the xine project
++ * Copyright (C) 2001-2024 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+@@ -67,6 +67,7 @@
+
+ xine_t *xine;
+ float gain;
++ int bitexact;
+ } ff_audio_class_t;
+
+ typedef struct ff_audio_decoder_s {
+@@ -188,14 +189,25 @@
+ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "ffmpeg_audio_dec: found AAC ADTS syncword after %d bytes\n", i);
+ if (this->buftype == BUF_AUDIO_AAC_LATM) {
++ uint8_t *ed = NULL;
++ int es = 0;
+ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "ffmpeg_audio_dec: stream says LATM but is ADTS -> switching decoders\n");
+- if (this->decoder_ok) {
+- pthread_mutex_lock (&ffmpeg_lock);
+- avcodec_close (this->context);
+- pthread_mutex_unlock (&ffmpeg_lock);
+- this->decoder_ok = 0;
++ pthread_mutex_lock (&ffmpeg_lock);
++ if (this->context) {
++ ed = this->context->extradata;
++ es = this->context->extradata_size;
++ this->context->extradata = NULL;
++ this->context->extradata_size = 0;
++ XFF_FREE_CONTEXT (this->context);
+ }
++ this->decoder_ok = 0;
++ this->context = XFF_ALLOC_CONTEXT ();
++ if (this->context) {
++ this->context->extradata = ed;
++ this->context->extradata_size = es;
++ }
++ pthread_mutex_unlock (&ffmpeg_lock);
+ this->codec = NULL;
+ ff_audio_open_codec (this, BUF_AUDIO_AAC);
+ }
+@@ -349,6 +361,11 @@
+ return -1;
+ }
+
++ if (this->class->bitexact)
++ this->context->flags |= CODEC_FLAG_BITEXACT;
++ else
++ this->context->flags &= ~CODEC_FLAG_BITEXACT;
++
+ pthread_mutex_lock (&ffmpeg_lock);
+ if (XFF_AVCODEC_OPEN (this->context, this->codec) < 0) {
+ pthread_mutex_unlock (&ffmpeg_lock);
+@@ -1377,9 +1394,21 @@
+ }
+ #endif
+ pthread_mutex_lock (&ffmpeg_lock);
+- avcodec_close (this->context);
+- if (XFF_AVCODEC_OPEN (this->context, this->codec) < 0)
++ {
++ uint8_t *ed = this->context->extradata;
++ int es = this->context->extradata_size;
++ this->context->extradata = NULL;
++ this->context->extradata_size = 0;
++ XFF_FREE_CONTEXT (this->context);
+ this->decoder_ok = 0;
++ this->context = XFF_ALLOC_CONTEXT ();
++ if (this->context) {
++ this->context->extradata = ed;
++ this->context->extradata_size = es;
++ }
++ }
++ if (XFF_AVCODEC_OPEN (this->context, this->codec) >= 0)
++ this->decoder_ok = 1;
+ pthread_mutex_unlock (&ffmpeg_lock);
+ }
+
+@@ -1418,20 +1447,20 @@
+ XFF_FREE_FRAME (this->av_frame);
+ }
+ #endif
+- pthread_mutex_lock (&ffmpeg_lock);
+- avcodec_close (this->context);
+- pthread_mutex_unlock (&ffmpeg_lock);
+ }
++ pthread_mutex_lock (&ffmpeg_lock);
++ if (this->context) {
++ _x_freep (&this->context->extradata);
++ this->context->extradata_size = 0;
++ XFF_FREE_CONTEXT (this->context);
++ }
++ pthread_mutex_unlock (&ffmpeg_lock);
+
+ ff_audio_output_close(this);
+
+ xine_free_aligned (this->buf);
+ xine_free_aligned (this->decode_buffer);
+
+- _x_freep (&this->context->extradata);
+- this->context->extradata_size = 0;
+- XFF_FREE_CONTEXT (this->context);
+-
+ XFF_PACKET_UNREF (this->avpkt);
+
+ xine_pts_queue_delete (&this->pts_queue);
+@@ -1513,6 +1542,12 @@
+ free (this);
+ }
+
++static void ff_bitexact_cb (void *user_data, xine_cfg_entry_t *entry) {
++ ff_audio_class_t *class = (ff_audio_class_t *)user_data;
++
++ class->bitexact = entry->num_value;
++}
++
+ void *init_audio_plugin (xine_t *xine, const void *data) {
+
+ ff_audio_class_t *this ;
+@@ -1540,5 +1575,12 @@
+ 10, ff_gain_cb, this)
+ / (float)20);
+
++ this->bitexact = xine->config->register_bool (xine->config,
++ "audio.processing.ffmpeg_bitexact", 0,
++ _("Let FFmpeg use precise but slower math"),
++ _("Get slightly better sound, at the expense of speed.\n"
++ "Takes effect with next stream."),
++ 10, ff_bitexact_cb, this);
++
+ return this;
+ }
+diff -r d1954d852980 -r 1e7b18400886 src/combined/ffmpeg/ff_video_decoder.c
+--- a/src/combined/ffmpeg/ff_video_decoder.c Mon Apr 08 13:25:10 2024 +0200
++++ b/src/combined/ffmpeg/ff_video_decoder.c Mon May 06 21:55:55 2024 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2001-2023 the xine project
++ * Copyright (C) 2001-2024 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+@@ -128,6 +128,7 @@
+
+ int64_t pts;
+ int64_t last_pts;
++ int64_t tagged_pts;
+ int video_step;
+ int reported_video_step;
+ uint8_t pts_tag_pass;
+@@ -551,7 +552,9 @@
+ # ifdef XFF_FRAME_AGE
+ av_frame->age = 1;
+ # endif
++#ifdef XFF_AVCODEC_REORDERED_OPAQUE
+ av_frame->reordered_opaque = context->reordered_opaque;
++#endif
+
+ ffsf = ffsf_new (this);
+ if (!ffsf)
+@@ -862,7 +865,9 @@
+ # endif
+
+ /* take over pts for this frame to have it reordered */
++#ifdef XFF_AVCODEC_REORDERED_OPAQUE
+ av_frame->reordered_opaque = context->reordered_opaque;
++#endif
+
+ return 0;
+ }
+@@ -1142,9 +1147,13 @@
+ if (this->codec->id == CODEC_ID_VC1 &&
+ (!this->bih.biWidth || !this->bih.biHeight)) {
+ /* VC1 codec must be re-opened with correct width and height. */
+- avcodec_close(this->context);
+-
+- if (XFF_AVCODEC_OPEN (this->context, this->codec) < 0) {
++ if (this->context) {
++ _x_freep (&this->context->extradata);
++ this->context->extradata_size = 0;
++ XFF_FREE_CONTEXT (this->context);
++ }
++ this->context = XFF_ALLOC_CONTEXT ();
++ if (!(this->context && XFF_AVCODEC_OPEN (this->context, this->codec) >= 0)) {
+ pthread_mutex_unlock(&ffmpeg_lock);
+ xprintf (this->stream->xine, XINE_VERBOSITY_LOG,
+ _("ffmpeg_video_dec: couldn't open decoder (pass 2)\n"));
+@@ -1211,6 +1220,11 @@
+ /* dont want initial AV_NOPTS_VALUE here */
+ this->context->reordered_opaque = 0;
+ #endif
++
++#ifdef XFF_AVCODEC_FRAME_PTS
++ this->context->time_base.num = 1;
++ this->context->time_base.den = 90000 << 8;
++#endif
+ }
+
+ #ifdef ENABLE_VAAPI
+@@ -1959,7 +1973,26 @@
+ return (pts * 256) | this->pts_tag_pass;
+ }
+
+-static int64_t ff_untag_pts (ff_video_decoder_t *this, int64_t pts) {
++static int64_t ff_untag_pts (ff_video_decoder_t *this, AVFrame *av_frame) {
++ int64_t pts;
++#if defined(XFF_AVCODEC_FRAME_PTS)
++ pts = (av_frame->pts != AV_NOPTS_VALUE) ? av_frame->pts : 0;
++# if defined(XFF_AVCODEC_REORDERED_OPAQUE)
++ /* paranoia !!! */
++ if (pts != av_frame->reordered_opaque) {
++ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
++ LOG_MODULE ": WARNING: frame pts %" PRId64 " != reordered_opaque %" PRId64 ".\n",
++ pts, av_frame->reordered_opaque);
++ pts = av_frame->reordered_opaque;
++ }
++ av_frame->reordered_opaque = 0;
++# endif
++#elif defined(XFF_AVCODEC_REORDERED_OPAQUE)
++ pts = av_frame->reordered_opaque;
++ av_frame->reordered_opaque = 0;
++#else
++ pts = this->tagged_pts;
++#endif
+ if ((uint8_t)(pts & 0xff) == this->pts_tag_pass) {
+ /* restore sign. */
+ return pts >> 8;
+@@ -1984,7 +2017,9 @@
+ this->avpkt->data = buf;
+ this->avpkt->size = buf_size;
+ this->avpkt->flags = AV_PKT_FLAG_KEY;
+-
++# ifdef XFF_AVCODEC_FRAME_PTS
++ this->avpkt->pts = this->tagged_pts;
++# endif
+ # if XFF_PALETTE == 2 || XFF_PALETTE == 3
+ if (buf && this->palette_changed) {
+ uint8_t *sd = av_packet_new_side_data (this->avpkt, AV_PKT_DATA_PALETTE, 256 * 4);
+@@ -2094,9 +2129,14 @@
+ #endif
+
+ /* apply valid pts to first frame _starting_ thereafter only */
+- if (this->pts && !this->context->reordered_opaque) {
+- this->context->reordered_opaque =
+- this->av_frame->reordered_opaque = ff_tag_pts (this, this->pts);
++ if (this->pts && !this->tagged_pts) {
++ this->tagged_pts = ff_tag_pts (this, this->pts);
++#ifdef XFF_AVCODEC_REORDERED_OPAQUE
++ this->context->reordered_opaque = this->av_frame->reordered_opaque = this->tagged_pts;
++#endif
++#ifdef XFF_AVCODEC_FRAME_PTS
++ this->av_frame->pts = this->tagged_pts;
++#endif
+ this->pts = 0;
+ }
+
+@@ -2207,9 +2247,11 @@
+ img->top_field_first = this->av_frame->top_field_first;
+
+ /* get back reordered pts */
+- img->pts = ff_untag_pts (this, this->av_frame->reordered_opaque);
+- this->av_frame->reordered_opaque = 0;
++ img->pts = ff_untag_pts (this, this->av_frame);
++ this->tagged_pts = 0;
++#ifdef XFF_AVCODEC_REORDERED_OPAQUE
+ this->context->reordered_opaque = 0;
++#endif
+
+ if (this->av_frame->repeat_pict)
+ img->duration = this->video_step * 3 / 2;
+@@ -2330,9 +2372,14 @@
+ }
+
+ if (this->size == 0) {
++ this->tagged_pts = ff_tag_pts (this, this->pts);
+ /* take over pts when we are about to buffer a frame */
+- this->av_frame->reordered_opaque = ff_tag_pts(this, this->pts);
+- this->context->reordered_opaque = ff_tag_pts(this, this->pts);
++#ifdef XFF_AVCODEC_REORDERED_OPAQUE
++ this->av_frame->reordered_opaque = this->context->reordered_opaque = this->tagged_pts;
++#endif
++#ifdef XFF_AVCODEC_FRAME_PTS
++ this->av_frame->pts = this->tagged_pts;
++#endif
+ this->pts = 0;
+ }
+
+@@ -2405,7 +2452,10 @@
+ need_unref = 1;
+ #endif
+ /* reset consumed pts value */
+- this->context->reordered_opaque = ff_tag_pts(this, 0);
++ this->tagged_pts = ff_tag_pts (this, 0);
++#ifdef XFF_AVCODEC_REORDERED_OPAQUE
++ this->context->reordered_opaque = this->tagged_pts;
++#endif
+
+ if (err) {
+
+@@ -2439,10 +2489,14 @@
+ ff_check_bufsize(this, this->size);
+ memmove (this->buf, &chunk_buf[offset], this->size);
+ chunk_buf = this->buf;
+-
+ /* take over pts for next access unit */
+- this->av_frame->reordered_opaque = ff_tag_pts(this, this->pts);
+- this->context->reordered_opaque = ff_tag_pts(this, this->pts);
++ this->tagged_pts = ff_tag_pts (this, this->pts);
++#ifdef XFF_AVCODEC_REORDERED_OPAQUE
++ this->av_frame->reordered_opaque = this->context->reordered_opaque = this->tagged_pts;
++#endif
++#ifdef XFF_AVCODEC_FRAME_PTS
++ this->av_frame->pts = this->tagged_pts;
++#endif
+ this->pts = 0;
+ }
+ }
+@@ -2559,8 +2613,7 @@
+ ff_convert_frame(this, img, this->av_frame);
+ }
+
+- img->pts = ff_untag_pts(this, this->av_frame->reordered_opaque);
+- this->av_frame->reordered_opaque = 0;
++ img->pts = ff_untag_pts(this, this->av_frame);
+
+ /* workaround for weird 120fps streams */
+ if( video_step_to_use == 750 ) {
+@@ -2600,8 +2653,7 @@
+ this->output_format,
+ VO_BOTH_FIELDS|this->frame_flags);
+ /* set PTS to allow early syncing */
+- img->pts = ff_untag_pts(this, this->av_frame->reordered_opaque);
+- this->av_frame->reordered_opaque = 0;
++ img->pts = ff_untag_pts(this, this->av_frame);
+
+ img->duration = video_step_to_use;
+
+@@ -2783,7 +2835,7 @@
+ ff_convert_frame (this, img, this->av_frame2);
+ }
+
+- img->pts = ff_untag_pts (this, this->av_frame2->reordered_opaque);
++ img->pts = ff_untag_pts (this, this->av_frame2);
+
+ if (video_step_to_use == 750)
+ video_step_to_use = 0;
+@@ -2903,7 +2955,9 @@
+ if (this->decoder_ok) {
+
+ pthread_mutex_lock(&ffmpeg_lock);
+- avcodec_close (this->context);
++ _x_freep (&this->context->extradata);
++ this->context->extradata_size = 0;
++ XFF_FREE_CONTEXT (this->context);
+ pthread_mutex_unlock(&ffmpeg_lock);
+
+ #ifdef ENABLE_DIRECT_RENDERING
+@@ -2912,16 +2966,15 @@
+
+ this->stream->video_out->close(this->stream->video_out, this->stream);
+ this->decoder_ok = 0;
++ } else if (this->context) {
++ _x_freep (&this->context->extradata);
++ this->context->extradata_size = 0;
++ XFF_FREE_CONTEXT (this->context);
+ }
+
+ if (this->slice_offset_table)
+ free (this->slice_offset_table);
+
+- if (this->context) {
+- _x_freep (&this->context->extradata);
+- this->context->extradata_size = 0;
+- XFF_FREE_CONTEXT (this->context);
+- }
+
+ #if XFF_VIDEO > 1
+ XFF_PACKET_UNREF (this->avpkt);
+diff -r d1954d852980 -r 1e7b18400886 src/combined/ffmpeg/ffmpeg_compat.h
+--- a/src/combined/ffmpeg/ffmpeg_compat.h Mon Apr 08 13:25:10 2024 +0200
++++ b/src/combined/ffmpeg/ffmpeg_compat.h Mon May 06 21:55:55 2024 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2000-2022 the xine project
++ * Copyright (C) 2000-2024 the xine project
+ *
+ * This file is part of xine, a unix video player.
+ *
+@@ -54,9 +54,16 @@
+ #endif
+
+ /* reordered_opaque appeared in libavcodec 51.68.0 */
+-#define XFF_AVCODEC_REORDERED_OPAQUE
+-#if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(51,68,0)
+-# undef XFF_AVCODEC_REORDERED_OPAQUE
++#if LIBAVCODEC_VERSION_INT >= XFF_INT_VERSION(51,68,0) && LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(60,0,0)
++# define XFF_AVCODEC_REORDERED_OPAQUE
++#else
++# undef XFF_AVCODEC_REORDERED_OPAQUE
++#endif
++
++#if LIBAVCODEC_VERSION_INT >= XFF_INT_VERSION(58,33,100)
++# define XFF_AVCODEC_FRAME_PTS
++#else
++# undef XFF_AVCODEC_FRAME_PTS
+ #endif
+
+ /* colorspace and color_range were added before 52.29.0 */
+@@ -210,9 +217,11 @@
+ #endif
+
+ #if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(55,63,100)
+-# define XFF_FREE_CONTEXT(pp) do {av_free(pp); pp = NULL;} while (0)
++# define XFF_FREE_CONTEXT(pp) do {if (pp) avcodec_close (pp); av_free (pp); pp = NULL;} while (0)
++#elif LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(58,33,100)
++# define XFF_FREE_CONTEXT(pp) do {if (pp) avcodec_close (pp); avcodec_free_context (&(pp));} while (0)
+ #else
+-# define XFF_FREE_CONTEXT(pp) avcodec_free_context(&(pp))
++# define XFF_FREE_CONTEXT(pp) avcodec_free_context (&(pp))
+ #endif
+
+ #if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(54,59,100)
+@@ -303,4 +312,3 @@
+ #endif /* defined(LIBAVCODEC_VERSION_INT) */
+
+ #endif /* XINE_AVCODEC_COMPAT_H */
+-
+diff -r d1954d852980 -r 1e7b18400886 src/dxr3/ffmpeg_encoder.c
+--- a/src/dxr3/ffmpeg_encoder.c Mon Apr 08 13:25:10 2024 +0200
++++ b/src/dxr3/ffmpeg_encoder.c Mon May 06 21:55:55 2024 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2000-2022 the xine project
++ * Copyright (C) 2000-2024 the xine project
+ *
+ * This file is part of xine, a unix video player.
+ *
+@@ -127,10 +127,8 @@
+ unsigned char use_quantizer;
+
+ if (this->context) {
+- avcodec_close(this->context);
+- free(this->context);
++ XFF_FREE_CONTEXT (this->context);
+ free(this->picture);
+- this->context = NULL;
+ this->picture = NULL;
+ }
+
+@@ -344,10 +342,8 @@
+ #if XFF_ENCVIDEO > 1
+ XFF_PACKET_UNREF (this->pkt);
+ #endif
+- avcodec_close(this->context);
+ XFF_FREE_CONTEXT (this->context);
+ free(this->picture);
+- this->context = NULL;
+ this->picture = NULL;
+ }
+ return 1;
diff --git a/multimedia/libxine/files/6f1000084f6084f49c95c202d12593e49916f58b.patch b/multimedia/libxine/files/6f1000084f6084f49c95c202d12593e49916f58b.patch
new file mode 100644
index 000000000000..36b07bb7e0a0
--- /dev/null
+++ b/multimedia/libxine/files/6f1000084f6084f49c95c202d12593e49916f58b.patch
@@ -0,0 +1,161 @@
+# HG changeset patch
+# User Torsten Jager <t.jager@gmx.de>
+# Date 1675683905 -3600
+# Mon Feb 06 12:45:05 2023 +0100
+# Node ID 6f1000084f6084f49c95c202d12593e49916f58b
+# Parent 0a786d63bbdb2d780a9231f6772e84e743c72014
+Try to silence some cast align warnings 5.
+
+diff -r 0a786d63bbdb -r 6f1000084f60 src/combined/ffmpeg/ff_audio_decoder.c
+--- a/src/combined/ffmpeg/ff_audio_decoder.c Mon Feb 06 12:45:00 2023 +0100
++++ b/src/combined/ffmpeg/ff_audio_decoder.c Mon Feb 06 12:45:05 2023 +0100
+@@ -796,7 +796,7 @@
+ #define CLIP_16(v) ((v + 0x8000) & ~0xffff ? (v >> 31) ^ 0x7fff : v)
+
+ static int ff_audio_decode (ff_audio_decoder_t *this) {
+- int16_t *decode_buffer = (int16_t *)this->send.buf;
++ int16_t *decode_buffer = (int16_t *)ASSUME_ALIGNED_2 (this->send.buf, 2);
+ int consumed, got_frame = 0;
+ #if XFF_AUDIO >= 4
+ float gain = this->class->gain;
+@@ -871,13 +871,13 @@
+ const stype *p1, *p2, *p3, *p4;\
+ int i, sstep;\
+ int8_t *x = idx;\
+- int16_t *dptr = (int16_t *)decode_buffer + dindx;\
++ int16_t *dptr = decode_buffer + dindx;\
+ if (planar) {\
+- p1 = (stype *)this->av_frame->extended_data[x[0]];\
++ p1 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[0]], sizeof (stype));\
+ if (!p1) break;\
+ sstep = 1;\
+ } else {\
+- p1 = (stype *)this->av_frame->extended_data[0];\
++ p1 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype));\
+ if (!p1) break;\
+ p1 += x[0];\
+ sstep = this->ff_channels;\
+@@ -893,10 +893,10 @@
+ break;\
+ }\
+ if (planar) {\
+- p2 = (stype *)this->av_frame->extended_data[x[1]];\
++ p2 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[1]], sizeof (stype));\
+ if (!p2) break;\
+ } else\
+- p2 = (stype *)this->av_frame->extended_data[0] + x[1];\
++ p2 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[1];\
+ if (num == 2) {\
+ for (i = 0; i < samples; i++) {\
+ int32_t v = MIX_FIX(*p2);\
+@@ -911,10 +911,10 @@
+ break;\
+ }\
+ if (planar) {\
+- p3 = (stype *)this->av_frame->extended_data[x[2]];\
++ p3 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[2]], sizeof (stype));\
+ if (!p3) break;\
+ } else\
+- p3 = (stype *)this->av_frame->extended_data[0] + x[2];\
++ p3 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[2];\
+ if (num == 3) {\
+ for (i = 0; i < samples; i++) {\
+ int32_t v = MIX_FIX(*p2);\
+@@ -931,10 +931,10 @@
+ break;\
+ }\
+ if (planar) {\
+- p4 = (stype *)this->av_frame->extended_data[x[3]];\
++ p4 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[3]], sizeof (stype));\
+ if (!p4) break;\
+ } else\
+- p4 = (stype *)this->av_frame->extended_data[0] + x[3];\
++ p4 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[3];\
+ for (i = 0; i < samples; i++) {\
+ int32_t v = MIX_FIX(*p2);\
+ p2 += sstep;\
+@@ -1003,13 +1003,13 @@
+ int i, sstep;\
+ float gain3;\
+ int8_t *x = idx;\
+- int16_t *dptr = (int16_t *)decode_buffer + dindx;\
++ int16_t *dptr = decode_buffer + dindx;\
+ if (planar) {\
+- p1 = (stype *)this->av_frame->extended_data[x[0]];\
++ p1 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[0]], sizeof (stype));\
+ if (!p1) break;\
+ sstep = 1;\
+ } else {\
+- p1 = (stype *)this->av_frame->extended_data[0];\
++ p1 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype));\
+ if (!p1) break;\
+ p1 += x[0];\
+ sstep = this->ff_channels;\
+@@ -1025,10 +1025,10 @@
+ }\
+ gain3 = gain * 0.7071;\
+ if (planar) {\
+- p2 = (stype *)this->av_frame->extended_data[x[1]];\
++ p2 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[1]], sizeof (stype));\
+ if (!p2) break;\
+ } else\
+- p2 = (stype *)this->av_frame->extended_data[0] + x[1];\
++ p2 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[1];\
+ if (num == 2) {\
+ for (i = 0; i < samples; i++) {\
+ int32_t v = (*p1) * gain + (*p2) * gain3;\
+@@ -1040,10 +1040,10 @@
+ break;\
+ }\
+ if (planar) {\
+- p3 = (stype *)this->av_frame->extended_data[x[2]];\
++ p3 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[2]], sizeof (stype));\
+ if (!p3) break;\
+ } else\
+- p3 = (stype *)this->av_frame->extended_data[0] + x[2];\
++ p3 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[2];\
+ if (num == 3) {\
+ for (i = 0; i < samples; i++) {\
+ int32_t v = (*p1) * gain + (*p2 + *p3) * gain3;\
+@@ -1056,10 +1056,10 @@
+ break;\
+ }\
+ if (planar) {\
+- p4 = (stype *)this->av_frame->extended_data[x[3]];\
++ p4 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[3]], sizeof (stype));\
+ if (!p4) break;\
+ } else\
+- p4 = (stype *)this->av_frame->extended_data[0] + x[3];\
++ p4 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[3];\
+ for (i = 0; i < samples; i++) {\
+ int32_t v = (*p1) * gain + (*p2 + *p3 + *p4) * gain3;\
+ p1 += sstep;\
+@@ -1240,8 +1240,8 @@
+ /* the above codecs output float samples, not 16-bit integers */
+ int samples = this->send.len / sizeof(float);
+ float gain = this->class->gain;
+- float *p = (float *)this->decode_buffer;
+- int16_t *q = (int16_t *)this->decode_buffer;
++ float *p = (float *)ASSUME_ALIGNED_2 (this->decode_buffer, 4);
++ int16_t *q = (int16_t *)ASSUME_ALIGNED_2 (this->decode_buffer, 2);
+ int i;
+ for (i = samples; i; i--) {
+ int v = *p++ * gain;
+@@ -1255,7 +1255,7 @@
+ int samples = this->send.len / (this->ff_channels * 2);
+ int channels = this->ao_channels;
+ int ff_channels = this->ff_channels;
+- int16_t *p = (int16_t *)this->decode_buffer;
++ int16_t *p = (int16_t *)ASSUME_ALIGNED_2 (this->decode_buffer, 2);
+ int16_t *q = p;
+ int shift = this->downmix_shift, i, j;
+ /* downmix mono output to stereo first */
+@@ -1300,7 +1300,7 @@
+ }
+ /* final mono downmix */
+ if (channels > this->ao_channels) {
+- p = (int16_t *)this->decode_buffer;
++ p = (int16_t *)ASSUME_ALIGNED_2 (this->decode_buffer, 2);
+ q = p;
+ for (i = samples; i; i--) {
+ int v = *p++;
diff --git a/multimedia/libxine/files/73b833e7fe356cd2d9490dda4ebc9bfe16fce958.patch b/multimedia/libxine/files/73b833e7fe356cd2d9490dda4ebc9bfe16fce958.patch
new file mode 100644
index 000000000000..136750404be2
--- /dev/null
+++ b/multimedia/libxine/files/73b833e7fe356cd2d9490dda4ebc9bfe16fce958.patch
@@ -0,0 +1,318 @@
+# HG changeset patch
+# User Torsten Jager <t.jager@gmx.de>
+# Date 1715160885 -7200
+# Wed May 08 11:34:45 2024 +0200
+# Node ID 73b833e7fe356cd2d9490dda4ebc9bfe16fce958
+# Parent 1e7b184008860c8be2289c3cefd9dee57f06193a
+ffmpeg compatibility update 2.
+
+diff -r 1e7b18400886 -r 73b833e7fe35 src/combined/ffmpeg/ff_audio_decoder.c
+--- a/src/combined/ffmpeg/ff_audio_decoder.c Mon May 06 21:55:55 2024 +0200
++++ b/src/combined/ffmpeg/ff_audio_decoder.c Wed May 08 11:34:45 2024 +0200
+@@ -1393,6 +1393,9 @@
+ XFF_FREE_FRAME (this->av_frame);
+ }
+ #endif
++#if 1
++ avcodec_flush_buffers (this->context);
++#else
+ pthread_mutex_lock (&ffmpeg_lock);
+ {
+ uint8_t *ed = this->context->extradata;
+@@ -1410,6 +1413,7 @@
+ if (XFF_AVCODEC_OPEN (this->context, this->codec) >= 0)
+ this->decoder_ok = 1;
+ pthread_mutex_unlock (&ffmpeg_lock);
++#endif
+ }
+
+ ff_audio_reset_parser(this);
+diff -r 1e7b18400886 -r 73b833e7fe35 src/combined/ffmpeg/ff_video_decoder.c
+--- a/src/combined/ffmpeg/ff_video_decoder.c Mon May 06 21:55:55 2024 +0200
++++ b/src/combined/ffmpeg/ff_video_decoder.c Wed May 08 11:34:45 2024 +0200
+@@ -89,6 +89,11 @@
+ # define ENABLE_EMMS
+ #endif
+
++/*
++#undef XFF_AVCODEC_SLICE_TABLE
++#define XFF_AVCODEC_SLICE_TABLE 1
++*/
++
+ #define VIDEOBUFSIZE (128*1024)
+ #define SLICE_BUFFER_SIZE (1194*1024)
+
+@@ -148,11 +153,11 @@
+ int bufsize;
+ int size;
+ int skipframes;
+-
++#if XFF_AVCODEC_SLICE_TABLE == 1
+ int *slice_offset_table;
+ int slice_offset_size;
+ int slice_offset_pos;
+-
++#endif
+ AVFrame *av_frame;
+ AVFrame *av_frame2;
+ AVCodecContext *context;
+@@ -238,6 +243,13 @@
+ #if XFF_VIDEO > 1
+ XFF_PACKET_DECL (avpkt);
+ #endif
++
++#if XFF_AVCODEC_SLICE_TABLE == 2
++ uint8_t *temp_buf;
++ uint32_t temp_size;
++ int slice_num;
++ uint8_t slice_table[1 + 256 * 8];
++#endif
+ };
+
+ /* import color matrix names */
+@@ -1783,10 +1795,9 @@
+ this->size += buf->size;
+
+ if (buf->decoder_flags & BUF_FLAG_FRAME_END) {
+- int codec_type;
++ uint32_t codec_type = buf->type & 0xFFFF0000;
+
+ lprintf ("header complete\n");
+- codec_type = buf->type & 0xFFFF0000;
+
+ if (buf->decoder_flags & BUF_FLAG_STDHEADER) {
+
+@@ -1912,33 +1923,44 @@
+ #endif
+ }
+ else if (buf->decoder_info[1] == BUF_SPECIAL_RV_CHUNK_TABLE) {
+- /* o dear. Multiple decoding threads use individual contexts.
+- av_decode_video2 () does only copy the _pointer_ to the offsets,
+- not the offsets themselves. So we must not overwrite anything
+- that another thread has not yet read. */
+- int i, l, total;
+-
+- lprintf("BUF_SPECIAL_RV_CHUNK_TABLE\n");
+- l = buf->decoder_info[2] + 1;
+-
+- total = l * this->class->thread_count;
+- if (total < SLICE_OFFSET_SIZE)
+- total = SLICE_OFFSET_SIZE;
+- if (total > this->slice_offset_size) {
+- this->slice_offset_table = realloc (this->slice_offset_table, total * sizeof (int));
+- this->slice_offset_size = total;
+- }
+-
+- if (this->slice_offset_pos + l > this->slice_offset_size)
+- this->slice_offset_pos = 0;
+- this->context->slice_offset = this->slice_offset_table + this->slice_offset_pos;
+- this->context->slice_count = l;
+-
+- lprintf ("slice_count=%d\n", l);
+- for (i = 0; i < l; i++) {
+- this->slice_offset_table[this->slice_offset_pos++] =
+- ((uint32_t *)buf->decoder_info_ptr[2])[(2 * i) + 1];
+- lprintf("slice_offset[%d]=%d\n", i, this->context->slice_offset[i]);
++ {
++#if XFF_AVCODEC_SLICE_TABLE == 1
++ /* o dear. Multiple decoding threads use individual contexts.
++ * av_decode_video2 () does only copy the _pointer_ to the offsets,
++ * not the offsets themselves. So we must not overwrite anything
++ * that another thread has not yet read. */
++ int i, l, total;
++
++ lprintf("BUF_SPECIAL_RV_CHUNK_TABLE\n");
++ l = buf->decoder_info[2] + 1;
++
++ total = l * this->class->thread_count;
++ if (total < SLICE_OFFSET_SIZE)
++ total = SLICE_OFFSET_SIZE;
++ if (total > this->slice_offset_size) {
++ this->slice_offset_table = realloc (this->slice_offset_table, total * sizeof (int));
++ this->slice_offset_size = total;
++ }
++
++ if (this->slice_offset_pos + l > this->slice_offset_size)
++ this->slice_offset_pos = 0;
++ this->context->slice_offset = this->slice_offset_table + this->slice_offset_pos;
++ this->context->slice_count = l;
++
++ lprintf ("slice_count=%d\n", l);
++ for (i = 0; i < l; i++) {
++ this->slice_offset_table[this->slice_offset_pos++] =
++ ((uint32_t *)buf->decoder_info_ptr[2])[(2 * i) + 1];
++ lprintf("slice_offset[%d]=%d\n", i, this->context->slice_offset[i]);
++ }
++#elif XFF_AVCODEC_SLICE_TABLE == 2
++ /* (count-1):1, 1:4, (offs[0]):4, 1:4, (offs[1]:4, ... just in front of the frame bitstream.
++ * reverse engineered from ffmpeg/libavcodec/rv34.c. they seem to expect no
++ * external use of rv decoders, and did not document this. */
++ this->slice_table[0] = buf->decoder_info[2];
++ this->slice_num = this->slice_table[0] + 1;
++ memcpy (this->slice_table + 1, buf->decoder_info_ptr[2], 8 * this->slice_num);
++#endif
+ }
+ }
+ }
+@@ -2004,6 +2026,7 @@
+
+ static int decode_video_wrapper (ff_video_decoder_t *this,
+ AVFrame *av_frame, int *err, void *buf, size_t buf_size) {
++ uint32_t tsize = 0;
+ int len;
+
+ #if ENABLE_VAAPI
+@@ -2013,9 +2036,32 @@
+ }
+ #endif /* ENABLE_VAAPI */
+
++#if XFF_AVCODEC_SLICE_TABLE == 2
++ if ((this->slice_num > 0) && buf) {
++ uint32_t nsize;
++ tsize = 1 + this->slice_num * 8;
++ nsize = tsize + buf_size + AV_INPUT_BUFFER_PADDING_SIZE;
++ if (this->temp_size < nsize) {
++ nsize = nsize * 3 / 2;
++ free (this->temp_buf);
++ this->temp_buf = malloc (nsize);
++ if (!this->temp_buf)
++ nsize = 0;
++ this->temp_size = nsize;
++ nsize = tsize + buf_size + AV_INPUT_BUFFER_PADDING_SIZE;
++ }
++ if (this->temp_size >= nsize) {
++ memcpy (this->temp_buf, this->slice_table, tsize);
++ memcpy (this->temp_buf + tsize, buf, buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
++ buf = this->temp_buf;
++ }
++ this->slice_num = 0;
++ }
++#endif
++
+ #if XFF_VIDEO > 1
+ this->avpkt->data = buf;
+- this->avpkt->size = buf_size;
++ this->avpkt->size = buf_size + tsize;
+ this->avpkt->flags = AV_PKT_FLAG_KEY;
+ # ifdef XFF_AVCODEC_FRAME_PTS
+ this->avpkt->pts = this->tagged_pts;
+@@ -2486,7 +2532,6 @@
+ this->size -= len;
+
+ if (this->size > 0) {
+- ff_check_bufsize(this, this->size);
+ memmove (this->buf, &chunk_buf[offset], this->size);
+ chunk_buf = this->buf;
+ /* take over pts for next access unit */
+@@ -2615,8 +2660,8 @@
+
+ img->pts = ff_untag_pts(this, this->av_frame);
+
+- /* workaround for weird 120fps streams */
+- if( video_step_to_use == 750 ) {
++ /* workaround for weird 120fps streams, as well as some rv20 with frame duration 3pts. */
++ if (video_step_to_use <= 750) {
+ /* fallback to the VIDEO_PTS_MODE */
+ video_step_to_use = 0;
+ }
+@@ -2837,7 +2882,7 @@
+
+ img->pts = ff_untag_pts (this, this->av_frame2);
+
+- if (video_step_to_use == 750)
++ if (video_step_to_use <= 750)
+ video_step_to_use = 0;
+ img->duration = this->av_frame2->repeat_pict ? video_step_to_use * 3 / 2 : video_step_to_use;
+ img->progressive_frame = !this->av_frame2->interlaced_frame;
+@@ -2941,6 +2986,9 @@
+ mpeg_parser_reset(this->mpeg_parser);
+
+ /* this->pts_tag_pass = 0; */
++#if XFF_AVCODEC_SLICE_TABLE == 2
++ this->slice_num = 0;
++#endif
+ }
+
+ static void ff_dispose (video_decoder_t *this_gen) {
+@@ -2953,12 +3001,15 @@
+ rgb2yuy2_free (this->rgb2yuy2);
+
+ if (this->decoder_ok) {
++ uint8_t *ed;
+
+ pthread_mutex_lock(&ffmpeg_lock);
+- _x_freep (&this->context->extradata);
++ ed = this->context->extradata;
++ this->context->extradata = NULL;
+ this->context->extradata_size = 0;
+ XFF_FREE_CONTEXT (this->context);
+ pthread_mutex_unlock(&ffmpeg_lock);
++ _x_freep (&ed);
+
+ #ifdef ENABLE_DIRECT_RENDERING
+ ff_free_dr1_frames (this, 1);
+@@ -2972,9 +3023,11 @@
+ XFF_FREE_CONTEXT (this->context);
+ }
+
+- if (this->slice_offset_table)
+- free (this->slice_offset_table);
+-
++#if XFF_AVCODEC_SLICE_TABLE == 1
++ free (this->slice_offset_table);
++#elif XFF_AVCODEC_SLICE_TABLE == 2
++ free (this->temp_buf);
++#endif
+
+ #if XFF_VIDEO > 1
+ XFF_PACKET_UNREF (this->avpkt);
+@@ -3062,21 +3115,25 @@
+ this->decoder_ok = 0;
+ this->aspect_ratio = 0;
+ this->pts_tag_pass = 0;
+-#ifdef HAVE_POSTPROC
++# ifdef HAVE_POSTPROC
+ this->pp_quality = 0;
+ this->our_context = NULL;
+ this->our_mode = NULL;
+-#endif
++# endif
+ this->mpeg_parser = NULL;
+ this->set_stream_info = 0;
+ this->rgb2yuy2 = NULL;
+-#ifdef ENABLE_VAAPI
++# ifdef ENABLE_VAAPI
+ this->accel = NULL;
+ this->accel_img = NULL;
+-#endif
+-#if XFF_VIDEO == 3
++# endif
++# if XFF_VIDEO == 3
+ this->flush_packet_sent = 0;
+-#endif
++# endif
++# if XFF_AVCODEC_SLICE_TABLE == 2
++ this->temp_size = 0;
++ this->temp_buf = NULL;
++# endif
+ #endif
+
+ this->video_decoder.decode_data = ff_decode_data;
+diff -r 1e7b18400886 -r 73b833e7fe35 src/combined/ffmpeg/ffmpeg_compat.h
+--- a/src/combined/ffmpeg/ffmpeg_compat.h Mon May 06 21:55:55 2024 +0200
++++ b/src/combined/ffmpeg/ffmpeg_compat.h Wed May 08 11:34:45 2024 +0200
+@@ -139,6 +139,14 @@
+ # define XFF_PALETTE 3
+ #endif
+
++#if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(59,42,100)
++/* AVCodecContext.slice_{offset,count} */
++# define XFF_AVCODEC_SLICE_TABLE 1
++#else
++/* inline offset table before the frame. */
++# define XFF_AVCODEC_SLICE_TABLE 2
++#endif
++
+ #if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(59,0,100) /** << revise this */
+ # define XFF_VAAPI 1 /** << libavcodec/vaapi.h */
+ #else
diff --git a/multimedia/libxine/files/patch-src_combined_ffmpeg_ff__audio__decoder.c b/multimedia/libxine/files/771f4ae27e582123ff3500444718fc8f96186d74.patch
index 2108a84e9540..11056aa8cdbf 100644
--- a/multimedia/libxine/files/patch-src_combined_ffmpeg_ff__audio__decoder.c
+++ b/multimedia/libxine/files/771f4ae27e582123ff3500444718fc8f96186d74.patch
@@ -1,5 +1,50 @@
---- src/combined/ffmpeg/ff_audio_decoder.c.orig 2022-09-08 21:43:29 UTC
-+++ src/combined/ffmpeg/ff_audio_decoder.c
+# HG changeset patch
+# User Torsten Jager <t.jager@gmx.de>
+# Date 1674929040 -3600
+# Sat Jan 28 19:04:00 2023 +0100
+# Node ID 771f4ae27e582123ff3500444718fc8f96186d74
+# Parent 250f1c09f4244c3e7ca7d414410c57bd387792c3
+ffmpeg compatibility update.
+
+diff -r 250f1c09f424 -r 771f4ae27e58 src/combined/ffmpeg/demux_avformat.c
+--- a/src/combined/ffmpeg/demux_avformat.c Wed Jan 25 17:03:55 2023 +0100
++++ b/src/combined/ffmpeg/demux_avformat.c Sat Jan 28 19:04:00 2023 +0100
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2013-2022 the xine project
++ * Copyright (C) 2013-2023 the xine project
+ * Copyright (C) 2013-2020 Petri Hintukainen <phintuka@users.sourceforge.net>
+ *
+ * This file is part of xine, a free video player.
+@@ -423,8 +423,13 @@
+ }
+
+ #ifdef XFF_CODECPAR
++# if XFF_AUDIO_CHANNEL_LAYOUT < 2
+ if (st->codecpar && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
+ st->codecpar->sample_rate != 0 && st->codecpar->channels != 0)
++# else
++ if (st->codecpar && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
++ st->codecpar->sample_rate != 0 && st->codecpar->ch_layout.nb_channels != 0)
++# endif
+ #else
+ if (st->codec && st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
+ st->codec->sample_rate != 0 && st->codec->channels != 0)
+@@ -501,7 +506,11 @@
+ buf->size = extradata_size + sizeof(xine_waveformatex);
+ buf->decoder_info[1] = ctx->sample_rate;
+ buf->decoder_info[2] = ctx->bits_per_coded_sample;
++#if XFF_AUDIO_CHANNEL_LAYOUT < 2
+ buf->decoder_info[3] = ctx->channels;
++#else
++ buf->decoder_info[3] = ctx->ch_layout.nb_channels;
++#endif
+ buf->decoder_flags = BUF_FLAG_HEADER | BUF_FLAG_STDHEADER | BUF_FLAG_FRAME_END;
+
+ this->stream->audio_fifo->put (this->stream->audio_fifo, buf);
+diff -r 250f1c09f424 -r 771f4ae27e58 src/combined/ffmpeg/ff_audio_decoder.c
+--- a/src/combined/ffmpeg/ff_audio_decoder.c Wed Jan 25 17:03:55 2023 +0100
++++ b/src/combined/ffmpeg/ff_audio_decoder.c Sat Jan 28 19:04:00 2023 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2001-2022 the xine project
@@ -7,7 +52,7 @@
*
* This file is part of xine, a free video player.
*
-@@ -303,7 +303,11 @@ static void ff_audio_init_codec(ff_audio_decoder_t *th
+@@ -303,7 +303,11 @@
this->context->bits_per_sample = this->ff_bits;
this->context->sample_rate = this->ff_sample_rate;
@@ -19,7 +64,7 @@
this->context->codec_id = this->codec->id;
this->context->codec_type = this->codec->type;
this->context->codec_tag = _x_stream_info_get(this->stream, XINE_STREAM_INFO_AUDIO_FOURCC);
-@@ -527,17 +531,76 @@ static void ff_audio_output_close(ff_audio_decoder_t *
+@@ -527,16 +531,75 @@
this->ao_mode = 0;
}
@@ -49,11 +94,10 @@
+# ifdef AV_CH_FRONT_LEFT
ff_map = this->context->channel_layout;
if (!ff_map) /* wma2 bug */
--#endif
+# endif
- ff_map = ((uint64_t)1 << this->context->channels) - 1;
++ ff_map = ((uint64_t)1 << this->context->channels) - 1;
+ ff_num = ff_list_channels (ff_list, ff_map);
-
++
+#else /* XFF_AUDIO_CHANNEL_LAYOUT == 2 */
+
+ ff_num = this->context->ch_layout.nb_channels;
@@ -93,12 +137,12 @@
+ ff_num = ff_list_channels (ff_list, ff_map);
+ }
+
-+#endif
-+
+ #endif
+- ff_map = ((uint64_t)1 << this->context->channels) - 1;
+
if ((caps != this->ao_caps) || (ff_map != this->ff_map)) {
unsigned int i, j;
- /* ff: see names[] below; xine: L R RL RR C LFE */
-@@ -562,7 +625,7 @@ static void ff_map_channels (ff_audio_decoder_t *this)
+@@ -562,7 +625,7 @@
this->ao_caps = caps;
this->ff_map = ff_map;
@@ -107,7 +151,7 @@
/* silence out */
for (i = 0; i < MAX_CHANNELS; i++)
-@@ -576,20 +639,23 @@ static void ff_map_channels (ff_audio_decoder_t *this)
+@@ -576,20 +639,23 @@
this->left[0] = this->right[0] = 0;
tries = wishlist + 0 * num_modes;
} else if (this->ff_channels == 2) { /* stereo */
@@ -139,7 +183,7 @@
}
this->left[0] = this->map[0] < 0 ? 0 : this->map[0];
this->map[0] = -1;
-@@ -641,8 +707,8 @@ static void ff_map_channels (ff_audio_decoder_t *this)
+@@ -641,8 +707,8 @@
"rear center",
"side left", "side right"
};
diff --git a/multimedia/libxine/files/ffmpeg8-1.patch b/multimedia/libxine/files/9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc.patch
index be5805b82061..1b5b5aa78e3f 100644
--- a/multimedia/libxine/files/ffmpeg8-1.patch
+++ b/multimedia/libxine/files/9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc.patch
@@ -9,6 +9,13 @@ FFmpeg compatibilty update.
diff -r 9e326869fe0f -r 9bb3977ea7e2 src/combined/ffmpeg/ff_video_decoder.c
--- a/src/combined/ffmpeg/ff_video_decoder.c Sat May 31 15:55:00 2025 +0200
+++ b/src/combined/ffmpeg/ff_video_decoder.c Sat Sep 13 10:59:45 2025 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2001-2024 the xine project
++ * Copyright (C) 2001-2025 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
@@ -60,6 +60,10 @@
#include "ffmpeg_compat.h"
@@ -91,6 +98,13 @@ diff -r 9e326869fe0f -r 9bb3977ea7e2 src/combined/ffmpeg/ff_video_decoder.c
diff -r 9e326869fe0f -r 9bb3977ea7e2 src/combined/ffmpeg/ffmpeg_compat.h
--- a/src/combined/ffmpeg/ffmpeg_compat.h Sat May 31 15:55:00 2025 +0200
+++ b/src/combined/ffmpeg/ffmpeg_compat.h Sat Sep 13 10:59:45 2025 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2000-2024 the xine project
++ * Copyright (C) 2000-2025 the xine project
+ *
+ * This file is part of xine, a unix video player.
+ *
@@ -319,4 +319,20 @@
# error avcodec.h must be included first !
#endif /* defined(LIBAVCODEC_VERSION_INT) */
diff --git a/multimedia/libxine/files/ffmpeg8-2.patch b/multimedia/libxine/files/a8fffd1193b2247c7f732d4df83dcc03fce96dbe.patch
index dffc575f70cd..dffc575f70cd 100644
--- a/multimedia/libxine/files/ffmpeg8-2.patch
+++ b/multimedia/libxine/files/a8fffd1193b2247c7f732d4df83dcc03fce96dbe.patch
diff --git a/multimedia/libxine/files/patch-src_combined_ffmpeg_demux__avformat.c b/multimedia/libxine/files/patch-src_combined_ffmpeg_demux__avformat.c
deleted file mode 100644
index 954c65f363e8..000000000000
--- a/multimedia/libxine/files/patch-src_combined_ffmpeg_demux__avformat.c
+++ /dev/null
@@ -1,35 +0,0 @@
---- src/combined/ffmpeg/demux_avformat.c.orig 2022-09-08 21:43:29 UTC
-+++ src/combined/ffmpeg/demux_avformat.c
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (C) 2013-2022 the xine project
-+ * Copyright (C) 2013-2023 the xine project
- * Copyright (C) 2013-2020 Petri Hintukainen <phintuka@users.sourceforge.net>
- *
- * This file is part of xine, a free video player.
-@@ -423,8 +423,13 @@ static int find_avformat_streams(avformat_demux_plugin
- }
-
- #ifdef XFF_CODECPAR
-+# if XFF_AUDIO_CHANNEL_LAYOUT < 2
- if (st->codecpar && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
- st->codecpar->sample_rate != 0 && st->codecpar->channels != 0)
-+# else
-+ if (st->codecpar && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
-+ st->codecpar->sample_rate != 0 && st->codecpar->ch_layout.nb_channels != 0)
-+# endif
- #else
- if (st->codec && st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
- st->codec->sample_rate != 0 && st->codec->channels != 0)
-@@ -501,7 +506,11 @@ static void send_headers_audio(avformat_demux_plugin_t
- buf->size = extradata_size + sizeof(xine_waveformatex);
- buf->decoder_info[1] = ctx->sample_rate;
- buf->decoder_info[2] = ctx->bits_per_coded_sample;
-+#if XFF_AUDIO_CHANNEL_LAYOUT < 2
- buf->decoder_info[3] = ctx->channels;
-+#else
-+ buf->decoder_info[3] = ctx->ch_layout.nb_channels;
-+#endif
- buf->decoder_flags = BUF_FLAG_HEADER | BUF_FLAG_STDHEADER | BUF_FLAG_FRAME_END;
-
- this->stream->audio_fifo->put (this->stream->audio_fifo, buf);
diff --git a/multimedia/libzen/Makefile b/multimedia/libzen/Makefile
index 6b925d2cc80c..4a06b74f3296 100644
--- a/multimedia/libzen/Makefile
+++ b/multimedia/libzen/Makefile
@@ -14,7 +14,7 @@ WWW= https://mediaarea.net/en/MediaInfo \
LICENSE= ZLIB
LICENSE_FILE= ${WRKSRC}/../../../License.txt
-USES= compiler:c++11-lang dos2unix libtool pathfix tar:xz
+USES= compiler:c++11-lang dos2unix libtool tar:xz
CONFIGURE_ARGS= --enable-shared --enable-static
GNU_CONFIGURE= yes
diff --git a/multimedia/mediainfo/Makefile b/multimedia/mediainfo/Makefile
index dbacfdfea770..192e2dee0972 100644
--- a/multimedia/mediainfo/Makefile
+++ b/multimedia/mediainfo/Makefile
@@ -16,7 +16,7 @@ LICENSE_FILE= ${WRKSRC}/../../../License.html
LIB_DEPENDS= libmediainfo.so:multimedia/libmediainfo \
libzen.so:multimedia/libzen
-USES= compiler:c++11-lang cpe libtool pathfix pkgconfig tar:xz
+USES= compiler:c++11-lang cpe libtool pkgconfig tar:xz
GNU_CONFIGURE= yes
diff --git a/multimedia/mediamtx/Makefile b/multimedia/mediamtx/Makefile
index f27d3db8a320..986d2cf41bf1 100644
--- a/multimedia/mediamtx/Makefile
+++ b/multimedia/mediamtx/Makefile
@@ -12,7 +12,7 @@ WWW= https://github.com/bluenviron/mediamtx
LICENSE= MIT
LICENSE_FILE= ${WRKSRC}/LICENSE
-USES= go:1.25,modules
+USES= go:1.25+,modules
GO_MODULE= github.com/bluenviron/mediamtx
USE_RC_SUBR= mediamtx
diff --git a/multimedia/minisatip/Makefile b/multimedia/minisatip/Makefile
index 850d35d5a81d..0b4ddbb34649 100644
--- a/multimedia/minisatip/Makefile
+++ b/multimedia/minisatip/Makefile
@@ -1,5 +1,5 @@
PORTNAME= minisatip
-PORTVERSION= 2.0.43
+PORTVERSION= 2.0.45
DISTVERSIONPREFIX= v
PORTEPOCH= 1
CATEGORIES= multimedia
diff --git a/multimedia/minisatip/distinfo b/multimedia/minisatip/distinfo
index 84655c23941c..3c165a9b4a5d 100644
--- a/multimedia/minisatip/distinfo
+++ b/multimedia/minisatip/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1764787919
-SHA256 (catalinii-minisatip-v2.0.43_GH0.tar.gz) = 8c2fae9abf2950333f86e59b96a49789772a8eea2e3e62b1e977df04cfa38710
-SIZE (catalinii-minisatip-v2.0.43_GH0.tar.gz) = 1645266
+TIMESTAMP = 1766133944
+SHA256 (catalinii-minisatip-v2.0.45_GH0.tar.gz) = 2a6c65b95bb023fe340e586078f4d64a5e64a50300f5f55c560d2925fdfee2ea
+SIZE (catalinii-minisatip-v2.0.45_GH0.tar.gz) = 1644611
diff --git a/multimedia/navidrome/Makefile b/multimedia/navidrome/Makefile
index 6a3ad84df445..3c97d16480aa 100644
--- a/multimedia/navidrome/Makefile
+++ b/multimedia/navidrome/Makefile
@@ -22,7 +22,7 @@ BUILD_DEPENDS+= npm>0:www/npm
LIB_DEPENDS+= libtag.so:audio/taglib
RUN_DEPENDS+= ffmpeg:multimedia/ffmpeg
-USES= cpe go:1.24,modules pkgconfig
+USES= cpe go:1.24+,modules pkgconfig
USE_GITHUB= yes
GH_TUPLE= Masterminds:squirrel:v1.5.4:masterminds_squirrel/vendor/github.com/Masterminds/squirrel \
RaveNoX:go-jsoncommentstrip:v1.0.0:ravenox_go_jsoncommentstrip/vendor/github.com/RaveNoX/go-jsoncommentstrip \
diff --git a/multimedia/neolink/Makefile b/multimedia/neolink/Makefile
index 94506d4d574a..ec414acbc0e1 100644
--- a/multimedia/neolink/Makefile
+++ b/multimedia/neolink/Makefile
@@ -2,7 +2,7 @@ PORTNAME= neolink
PORTVERSION= 0.3.0
DISTVERSIONPREFIX= v
DISTVERSIONSUFFIX= g20210903
-PORTREVISION= 38
+PORTREVISION= 39
CATEGORIES= multimedia
MAINTAINER= kevans@FreeBSD.org
diff --git a/multimedia/obs-studio/Makefile b/multimedia/obs-studio/Makefile
index 50d35cf37585..1f86f6e69c72 100644
--- a/multimedia/obs-studio/Makefile
+++ b/multimedia/obs-studio/Makefile
@@ -1,6 +1,6 @@
PORTNAME= obs-studio
DISTVERSION= 32.0.2
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= multimedia
MASTER_SITES= https://github.com/obsproject/obs-studio/releases/download/${DISTVERSION}/
DISTFILES= OBS-Studio-${DISTVERSION}-Sources${EXTRACT_SUFX}
diff --git a/multimedia/py-subliminal/Makefile b/multimedia/py-subliminal/Makefile
index e49e60d6d7ca..a2350941fe3d 100644
--- a/multimedia/py-subliminal/Makefile
+++ b/multimedia/py-subliminal/Makefile
@@ -1,5 +1,5 @@
PORTNAME= subliminal
-DISTVERSION= 2.4.0
+DISTVERSION= 2.5.0
CATEGORIES= multimedia python
MASTER_SITES= PYPI
PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
diff --git a/multimedia/py-subliminal/distinfo b/multimedia/py-subliminal/distinfo
index f01299e57ce6..2ed26e73b2a6 100644
--- a/multimedia/py-subliminal/distinfo
+++ b/multimedia/py-subliminal/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1756899778
-SHA256 (subliminal-2.4.0.tar.gz) = 73df6d1940166ef0e2cdeb4f8d655a4afe1082d481ec090ad2a9e66b1a1621fc
-SIZE (subliminal-2.4.0.tar.gz) = 3460114
+TIMESTAMP = 1765790082
+SHA256 (subliminal-2.5.0.tar.gz) = 3c79507e9c304895fb41eb0039b11f5abcb9f77376fe550cb605932836dfadc3
+SIZE (subliminal-2.5.0.tar.gz) = 3729315
diff --git a/multimedia/qt6-multimedia/distinfo b/multimedia/qt6-multimedia/distinfo
index d41555709db4..635040e13db6 100644
--- a/multimedia/qt6-multimedia/distinfo
+++ b/multimedia/qt6-multimedia/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1759303877
-SHA256 (KDE/Qt/6.9.3/qtmultimedia-everywhere-src-6.9.3.tar.xz) = a275bee7ea60c91851236acdf99d76b891da90f428b68f51fe332354f19b86f5
-SIZE (KDE/Qt/6.9.3/qtmultimedia-everywhere-src-6.9.3.tar.xz) = 9771140
+TIMESTAMP = 1763964336
+SHA256 (KDE/Qt/6.10.1/qtmultimedia-everywhere-src-6.10.1.tar.xz) = f7a4f9bc2840d4f0f9f7329f0dcb3d3500c54177b8e368091a3727c7320e67b8
+SIZE (KDE/Qt/6.10.1/qtmultimedia-everywhere-src-6.10.1.tar.xz) = 9923496
diff --git a/multimedia/qt6-multimedia/files/patch-cmake_FindFFmpeg.cmake b/multimedia/qt6-multimedia/files/patch-cmake_FindFFmpeg.cmake
index b3afbc959c8e..1882e3f8d185 100644
--- a/multimedia/qt6-multimedia/files/patch-cmake_FindFFmpeg.cmake
+++ b/multimedia/qt6-multimedia/files/patch-cmake_FindFFmpeg.cmake
@@ -1,6 +1,6 @@
---- cmake/FindFFmpeg.cmake.orig 2025-05-04 13:16:35 UTC
+--- cmake/FindFFmpeg.cmake.orig 2025-08-15 19:16:13 UTC
+++ cmake/FindFFmpeg.cmake
-@@ -278,7 +278,7 @@ function(__ffmpeg_internal_set_dependencies _component
+@@ -276,7 +276,7 @@ function(__ffmpeg_internal_set_dependencies _component
if (WIN32)
set(PC_FILE ${${_component}_LIBRARY_DIR}/../lib/pkgconfig/lib${lib}.pc)
else()
diff --git a/multimedia/qt6-multimedia/files/patch-src_CMakeLists.txt b/multimedia/qt6-multimedia/files/patch-src_CMakeLists.txt
index 4112b1c41f56..87d5d76b932e 100644
--- a/multimedia/qt6-multimedia/files/patch-src_CMakeLists.txt
+++ b/multimedia/qt6-multimedia/files/patch-src_CMakeLists.txt
@@ -1,9 +1,9 @@
Prevent building spatialaudio_quick3d if quick3d is installed and the feature
is disabled.
---- src/CMakeLists.txt.orig 2025-02-20 14:13:07 UTC
+--- src/CMakeLists.txt.orig 2025-08-15 19:16:13 UTC
+++ src/CMakeLists.txt
-@@ -26,7 +26,7 @@ endif()
+@@ -27,7 +27,7 @@ endif()
if(TARGET Qt::Quick)
add_subdirectory(multimediaquick)
endif()
diff --git a/multimedia/qt6-multimedia/files/patch-src_multimedia_CMakeLists.txt b/multimedia/qt6-multimedia/files/patch-src_multimedia_CMakeLists.txt
index 89722fa1d38a..a92e689b9be6 100644
--- a/multimedia/qt6-multimedia/files/patch-src_multimedia_CMakeLists.txt
+++ b/multimedia/qt6-multimedia/files/patch-src_multimedia_CMakeLists.txt
@@ -1,11 +1,11 @@
---- src/multimedia/CMakeLists.txt.orig 2025-05-04 13:16:35 UTC
+--- src/multimedia/CMakeLists.txt.orig 2025-08-15 19:16:13 UTC
+++ src/multimedia/CMakeLists.txt
-@@ -136,7 +136,7 @@ qt_internal_extend_target(Multimedia
+@@ -156,7 +156,7 @@ qt_internal_extend_target(Multimedia
)
qt_internal_extend_target(Multimedia
-- CONDITION LINUX OR ANDROID
-+ CONDITION UNIX OR ANDROID
+- CONDITION (LINUX OR ANDROID) AND QT_FEATURE_library
++ CONDITION (UNIX OR ANDROID) AND QT_FEATURE_library
SOURCES qsymbolsresolveutils.cpp qsymbolsresolveutils_p.h)
qt_internal_add_simd_part(Multimedia SIMD sse2
diff --git a/multimedia/qt6-multimedia/files/patch-src_multimedia_configure.cmake b/multimedia/qt6-multimedia/files/patch-src_multimedia_configure.cmake
index cbf22dd3f497..f9782a976418 100644
--- a/multimedia/qt6-multimedia/files/patch-src_multimedia_configure.cmake
+++ b/multimedia/qt6-multimedia/files/patch-src_multimedia_configure.cmake
@@ -1,11 +1,11 @@
---- src/multimedia/configure.cmake.orig 2025-08-18 00:47:41 UTC
+--- src/multimedia/configure.cmake.orig 2025-08-15 19:16:13 UTC
+++ src/multimedia/configure.cmake
-@@ -129,7 +129,7 @@ qt_feature("ffmpeg" PRIVATE
+@@ -237,7 +237,7 @@ qt_feature("ffmpeg" PRIVATE
ENABLE INPUT_ffmpeg STREQUAL 'yes'
DISABLE INPUT_ffmpeg STREQUAL 'no'
CONDITION FFmpeg_FOUND
-- AND (APPLE OR WIN32 OR ANDROID OR QNX OR QT_FEATURE_pulseaudio)
-+ AND (APPLE OR WIN32 OR ANDROID OR QNX OR OR QT_FEATURE_alsa OR QT_FEATURE_pulseaudio)
+- AND (APPLE OR WIN32 OR ANDROID OR QNX OR QT_FEATURE_pulseaudio OR QT_FEATURE_pipewire)
++ AND (APPLE OR WIN32 OR ANDROID OR QNX OR QT_FEATURE_alsa OR QT_FEATURE_pulseaudio OR QT_FEATURE_pipewire)
AND QT_FEATURE_thread
)
- qt_feature("pipewire" PRIVATE
+
diff --git a/multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__instance.cpp b/multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__instance.cpp
index 9139b9f3957a..739d5bf50160 100644
--- a/multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__instance.cpp
+++ b/multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__instance.cpp
@@ -2,9 +2,9 @@ Adapt to local symbols from multimedia/pipewire
PR: 284719
---- src/multimedia/pipewire/qpipewire_instance.cpp.orig 2025-02-20 14:13:07 UTC
+--- src/multimedia/pipewire/qpipewire_instance.cpp.orig 2025-08-15 19:16:13 UTC
+++ src/multimedia/pipewire/qpipewire_instance.cpp
-@@ -43,7 +43,7 @@ QPipeWireInstance::QPipeWireInstance()
+@@ -45,7 +45,7 @@ QPipeWireInstance::QPipeWireInstance()
QPipeWireInstance::QPipeWireInstance()
{
@@ -13,7 +13,7 @@ PR: 284719
qCDebug(lcPipewire) << "PipeWire initialized: compiled against" << pw_get_headers_version()
<< " running " << pw_get_library_version();
-@@ -52,7 +52,7 @@ QPipeWireInstance::~QPipeWireInstance()
+@@ -54,7 +54,7 @@ QPipeWireInstance::~QPipeWireInstance()
QPipeWireInstance::~QPipeWireInstance()
{
if (pw_check_library_version(0, 3, 49))
diff --git a/multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__symbolloader.cpp b/multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__symbolloader.cpp
index d55400eba281..41e12b8b0b52 100644
--- a/multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__symbolloader.cpp
+++ b/multimedia/qt6-multimedia/files/patch-src_multimedia_pipewire_qpipewire__symbolloader.cpp
@@ -2,9 +2,9 @@ Adapt to local symbols from multimedia/pipewire
PR: 284719
---- src/multimedia/pipewire/qpipewire_symbolloader.cpp.orig 2025-02-20 14:13:07 UTC
+--- src/multimedia/pipewire/qpipewire_symbolloader.cpp.orig 2025-08-15 19:16:13 UTC
+++ src/multimedia/pipewire/qpipewire_symbolloader.cpp
-@@ -14,8 +14,8 @@ BEGIN_INIT_FUNCS("pipewire-" PW_API_VERSION, "0")
+@@ -17,8 +17,8 @@ BEGIN_INIT_FUNCS("pipewire-" PW_API_VERSION, "0")
//BEGIN_INIT_FUNCS("pipewire-0.3", "0")
BEGIN_INIT_FUNCS("pipewire-" PW_API_VERSION, "0")
@@ -15,7 +15,7 @@ PR: 284719
INIT_OPT_FUNC(pw_check_library_version);
INIT_FUNC(pw_context_new);
INIT_FUNC(pw_context_destroy);
-@@ -44,8 +44,8 @@ END_INIT_FUNCS()
+@@ -52,8 +52,8 @@ END_INIT_FUNCS()
END_INIT_FUNCS()
diff --git a/multimedia/qt6-multimedia/files/patch-src_plugins_multimedia_ffmpeg_CMakeLists.txt b/multimedia/qt6-multimedia/files/patch-src_plugins_multimedia_ffmpeg_CMakeLists.txt
index dde899287a8a..e8ba5dbeb30e 100644
--- a/multimedia/qt6-multimedia/files/patch-src_plugins_multimedia_ffmpeg_CMakeLists.txt
+++ b/multimedia/qt6-multimedia/files/patch-src_plugins_multimedia_ffmpeg_CMakeLists.txt
@@ -1,7 +1,7 @@
---- src/plugins/multimedia/ffmpeg/CMakeLists.txt.orig 2025-03-09 20:10:22 UTC
+--- src/plugins/multimedia/ffmpeg/CMakeLists.txt.orig 2025-08-15 19:16:13 UTC
+++ src/plugins/multimedia/ffmpeg/CMakeLists.txt
-@@ -86,7 +86,7 @@ qt_internal_add_module(FFmpegMediaPluginImplPrivate
- ../../../3rdparty/signalsmith-stretch/
+@@ -92,7 +92,7 @@ qt_internal_add_module(FFmpegMediaPluginImplPrivate
+ ../../../3rdparty/signalsmith-stretch
)
-if (LINUX OR ANDROID)
diff --git a/multimedia/qt6-multimedia/pkg-plist b/multimedia/qt6-multimedia/pkg-plist
index b318ff7c9936..0ba5369ac219 100644
--- a/multimedia/qt6-multimedia/pkg-plist
+++ b/multimedia/qt6-multimedia/pkg-plist
@@ -1,7 +1,4 @@
-%%ALSA%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qalsaaudiodevice_p.h
-%%ALSA%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qalsaaudiodevices_p.h
-%%ALSA%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qalsaaudiosink_p.h
-%%ALSA%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qalsaaudiosource_p.h
+%%FFMPEG%%%%QT_INCDIR%%/QtFFmpegMediaPluginImpl/%%FULLVER%%/QtFFmpegMediaPluginImpl/private/ffmpeg_pch.h
%%FFMPEG%%%%QT_INCDIR%%/QtFFmpegMediaPluginImpl/%%FULLVER%%/QtFFmpegMediaPluginImpl/private/qffmpeg_p.h
%%FFMPEG%%%%QT_INCDIR%%/QtFFmpegMediaPluginImpl/%%FULLVER%%/QtFFmpegMediaPluginImpl/private/qffmpegaudiodecoder_p.h
%%FFMPEG%%%%QT_INCDIR%%/QtFFmpegMediaPluginImpl/%%FULLVER%%/QtFFmpegMediaPluginImpl/private/qffmpegaudioencoder_p.h
@@ -101,6 +98,11 @@
%%GSTREAMER%%%%QT_INCDIR%%/QtGstreamerMediaPluginImpl/QtGstreamerMediaPluginImplDepends
%%GSTREAMER%%%%QT_INCDIR%%/QtGstreamerMediaPluginImpl/QtGstreamerMediaPluginImplVersion
%%GSTREAMER%%%%QT_INCDIR%%/QtGstreamerMediaPluginImpl/qtgstreamermediapluginimplversion.h
+%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/q_pmr_emulation_p.h
+%%ALSA%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qalsaaudiodevice_p.h
+%%ALSA%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qalsaaudiodevices_p.h
+%%ALSA%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qalsaaudiosink_p.h
+%%ALSA%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qalsaaudiosource_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qaudio_alignment_support_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qaudio_platform_implementation_support_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qaudio_qiodevice_support_p.h
@@ -125,21 +127,34 @@
%%GSTREAMER%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qgstreamer_platformspecificinterface_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qhwvideobuffer_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qimagevideobuffer_p.h
-%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmaybe_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmediacapturesession_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmediaframeinput_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmediainputencoderinterface_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmediaplayer_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmediarecorder_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmediastoragelocation_p.h
+%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmemory_resource_tlsf_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmemoryvideobuffer_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmultimedia_assume_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmultimedia_enum_to_string_converter_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmultimedia_ranges_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qmultimediautils_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_async_support_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_audiocontextmanager_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_audiodevice_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_audiodevicemonitor_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_audiodevices_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_audiosink_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_audiosource_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_audiostream_p.h
%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_instance_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_propertydict_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_registry_support_p.h
%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_screencapture_p.h
%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_screencapturehelper_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_spa_compat_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_spa_pod_parser_support_p.h
+%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_spa_pod_support_p.h
%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_support_p.h
%%PIPEWIRE%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpipewire_symbolloader_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qplatformaudiobufferinput_p.h
@@ -170,8 +185,12 @@
%%PULSEAUDIO%%%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qpulsehelpers_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qrhitextureformats_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qrhivaluemapper_p.h
+%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qrtaudioengine_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qsamplecache_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qsharedhandle_p.h
+%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qsoundeffect_p.h
+%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qsoundeffectsynchronous_p.h
+%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qsoundeffectwithplayer_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qsymbolsresolveutils_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qtaggedtime_p.h
%%QT_INCDIR%%/QtMultimedia/%%FULLVER%%/QtMultimedia/private/qthreadlocalrhi_p.h
@@ -211,6 +230,7 @@
%%QT_INCDIR%%/QtMultimedia/QMediaPlayer
%%QT_INCDIR%%/QtMultimedia/QMediaRecorder
%%QT_INCDIR%%/QtMultimedia/QMediaTimeRange
+%%QT_INCDIR%%/QtMultimedia/QPlaybackOptions
%%QT_INCDIR%%/QtMultimedia/QScreenCapture
%%QT_INCDIR%%/QtMultimedia/QSoundEffect
%%QT_INCDIR%%/QtMultimedia/QVideoFrame
@@ -246,6 +266,7 @@
%%QT_INCDIR%%/QtMultimedia/qmediaplayer.h
%%QT_INCDIR%%/QtMultimedia/qmediarecorder.h
%%QT_INCDIR%%/QtMultimedia/qmediatimerange.h
+%%QT_INCDIR%%/QtMultimedia/qplaybackoptions.h
%%QT_INCDIR%%/QtMultimedia/qscreencapture.h
%%QT_INCDIR%%/QtMultimedia/qsoundeffect.h
%%QT_INCDIR%%/QtMultimedia/qtaudio.h
@@ -508,14 +529,14 @@ lib/cmake/Qt6SpatialAudioPrivate/Qt6SpatialAudioPrivateVersionlessTargets.cmake
%%QT_LIBDIR%%/libQt6SpatialAudio.so
%%QT_LIBDIR%%/libQt6SpatialAudio.so.6
%%QT_LIBDIR%%/libQt6SpatialAudio.so.%%FULLVER%%
-%%FFMPEG%%%%QT_LIBDIR%%/metatypes/qt6ffmpegmediapluginimplprivate_%%CMAKE_BUILD_TYPE%%_metatypes.json
-%%GSTREAMER%%%%QT_LIBDIR%%/metatypes/qt6gstreamermediapluginimplprivate_%%CMAKE_BUILD_TYPE%%_metatypes.json
-%%QT_LIBDIR%%/metatypes/qt6multimedia_%%CMAKE_BUILD_TYPE%%_metatypes.json
-%%QT_LIBDIR%%/metatypes/qt6multimediaquickprivate_%%CMAKE_BUILD_TYPE%%_metatypes.json
-%%QT_LIBDIR%%/metatypes/qt6multimediatestlibprivate_%%CMAKE_BUILD_TYPE%%_metatypes.json
-%%QT_LIBDIR%%/metatypes/qt6multimediawidgets_%%CMAKE_BUILD_TYPE%%_metatypes.json
-%%Q3D%%%%QT_LIBDIR%%/metatypes/qt6quick3dspatialaudioprivate_%%CMAKE_BUILD_TYPE%%_metatypes.json
-%%QT_LIBDIR%%/metatypes/qt6spatialaudio_%%CMAKE_BUILD_TYPE%%_metatypes.json
+%%FFMPEG%%%%QT_LIBDIR%%/metatypes/qt6ffmpegmediapluginimplprivate_metatypes.json
+%%GSTREAMER%%%%QT_LIBDIR%%/metatypes/qt6gstreamermediapluginimplprivate_metatypes.json
+%%QT_LIBDIR%%/metatypes/qt6multimedia_metatypes.json
+%%QT_LIBDIR%%/metatypes/qt6multimediaquickprivate_metatypes.json
+%%QT_LIBDIR%%/metatypes/qt6multimediatestlibprivate_metatypes.json
+%%QT_LIBDIR%%/metatypes/qt6multimediawidgets_metatypes.json
+%%Q3D%%%%QT_LIBDIR%%/metatypes/qt6quick3dspatialaudioprivate_metatypes.json
+%%QT_LIBDIR%%/metatypes/qt6spatialaudio_metatypes.json
%%FFMPEG%%%%QT_MKSPECDIR%%/features/ios/add_ios_ffmpeg_libraries.prf
%%FFMPEG%%%%QT_MKSPECDIR%%/modules/qt_lib_ffmpegmediapluginimpl_private.pri
%%GSTREAMER%%%%QT_MKSPECDIR%%/modules/qt_lib_gstreamermediapluginimpl_private.pri
diff --git a/multimedia/rav1e/Makefile b/multimedia/rav1e/Makefile
index 3c1f1c6e4b63..0e0550110ced 100644
--- a/multimedia/rav1e/Makefile
+++ b/multimedia/rav1e/Makefile
@@ -1,7 +1,7 @@
PORTNAME= rav1e
DISTVERSIONPREFIX= v
DISTVERSION= 0.8.1
-PORTREVISION?= 4
+PORTREVISION?= 5
CATEGORIES= multimedia
MAINTAINER= ports@FreeBSD.org
diff --git a/multimedia/ringrtc/Makefile b/multimedia/ringrtc/Makefile
index 7fd60f637555..9ee37e43afe5 100644
--- a/multimedia/ringrtc/Makefile
+++ b/multimedia/ringrtc/Makefile
@@ -1,6 +1,7 @@
PORTNAME= ringrtc
DISTVERSIONPREFIX= v
-DISTVERSION= 2.59.4
+DISTVERSION= 2.60.7
+PORTREVISION= 1
CATEGORIES= multimedia
MASTER_SITES= LOCAL/mikael/ringrtc/:boringssl \
LOCAL/mikael/ringrtc/:build \
@@ -62,7 +63,7 @@ GH_TUPLE= signalapp:ringrtc:${DISTVERSIONPREFIX}${DISTVERSION} \
signalapp:webrtc:${WEBRTC_REV}:webrtc
# sh net-im/signal-desktop/get_deps.sh
-WEBRTC_REV= 7339d
+WEBRTC_REV= 7339f
# modify webrtc_fetch.sh, then sh webrtc_fetch.sh
BORINGSSL_REV= ddb2ca4b48fca9a1c468d83dc513b837331843ac
diff --git a/multimedia/ringrtc/Makefile.crates b/multimedia/ringrtc/Makefile.crates
index 75f7587a8b8e..8614d9145e50 100644
--- a/multimedia/ringrtc/Makefile.crates
+++ b/multimedia/ringrtc/Makefile.crates
@@ -284,12 +284,15 @@ CARGO_CRATES= addr2line-0.24.2 \
sha2-0.10.9 \
shlex-1.3.0 \
signal-hook-registry-1.4.6 \
+ sketches-ddsketch-0.3.0 \
slab-0.4.11 \
smallvec-1.15.1 \
socket2-0.6.0 \
stable_deref_trait-1.2.0 \
static_assertions-1.1.0 \
strsim-0.11.1 \
+ strum-0.27.2 \
+ strum_macros-0.27.2 \
subtle-2.6.1 \
syn-1.0.109 \
syn-2.0.106 \
diff --git a/multimedia/ringrtc/distinfo b/multimedia/ringrtc/distinfo
index 9661c2482b19..78852f39f908 100644
--- a/multimedia/ringrtc/distinfo
+++ b/multimedia/ringrtc/distinfo
@@ -1,4 +1,4 @@
-TIMESTAMP = 1763124251
+TIMESTAMP = 1765873598
SHA256 (boringssl-ddb2ca4b48fca9a1c468d83dc513b837331843ac.tar.gz) = dd8bd3bff9215f945ea056c120443d076fece66fa3505b170d268e258d3b2419
SIZE (boringssl-ddb2ca4b48fca9a1c468d83dc513b837331843ac.tar.gz) = 47628099
SHA256 (build-66d076c7ab192991f67891b062b35404f3cb0739.tar.gz) = 9180093b827f7051f3ede09c6e405c53206f81016028f51c826ddb35d101dfb0
@@ -605,6 +605,8 @@ SHA256 (rust/crates/shlex-1.3.0.crate) = 0fda2ff0d084019ba4d7c6f371c95d8fd75ce35
SIZE (rust/crates/shlex-1.3.0.crate) = 18713
SHA256 (rust/crates/signal-hook-registry-1.4.6.crate) = b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b
SIZE (rust/crates/signal-hook-registry-1.4.6.crate) = 19277
+SHA256 (rust/crates/sketches-ddsketch-0.3.0.crate) = c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a
+SIZE (rust/crates/sketches-ddsketch-0.3.0.crate) = 13202
SHA256 (rust/crates/slab-0.4.11.crate) = 7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589
SIZE (rust/crates/slab-0.4.11.crate) = 18549
SHA256 (rust/crates/smallvec-1.15.1.crate) = 67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03
@@ -617,6 +619,10 @@ SHA256 (rust/crates/static_assertions-1.1.0.crate) = a2eb9349b6444b326872e140eb1
SIZE (rust/crates/static_assertions-1.1.0.crate) = 18480
SHA256 (rust/crates/strsim-0.11.1.crate) = 7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f
SIZE (rust/crates/strsim-0.11.1.crate) = 14266
+SHA256 (rust/crates/strum-0.27.2.crate) = af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf
+SIZE (rust/crates/strum-0.27.2.crate) = 8489
+SHA256 (rust/crates/strum_macros-0.27.2.crate) = 7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7
+SIZE (rust/crates/strum_macros-0.27.2.crate) = 30522
SHA256 (rust/crates/subtle-2.6.1.crate) = 13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292
SIZE (rust/crates/subtle-2.6.1.crate) = 14562
SHA256 (rust/crates/syn-1.0.109.crate) = 72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237
@@ -877,7 +883,7 @@ SHA256 (signalapp-libsignal-v0.78.3_GH0.tar.gz) = 5df4afee765414ed8c8012a289a4f4
SIZE (signalapp-libsignal-v0.78.3_GH0.tar.gz) = 2327582
SHA256 (signalapp-curve25519-dalek-signal-curve25519-4.1.3_GH0.tar.gz) = 8dd338dd7d558b7882310e8dc76ceca41ef448afd0532be208d4ff0f2924f334
SIZE (signalapp-curve25519-dalek-signal-curve25519-4.1.3_GH0.tar.gz) = 808022
-SHA256 (signalapp-ringrtc-v2.59.4_GH0.tar.gz) = 61219c6a785272d5f84981440635b2e345955d1e20d2e20c0ddea91930830e7c
-SIZE (signalapp-ringrtc-v2.59.4_GH0.tar.gz) = 870254
-SHA256 (signalapp-webrtc-7339d_GH0.tar.gz) = 5b15962e107019bba15f986893490f9933884f20b3b444b1ccffaf59a8096818
-SIZE (signalapp-webrtc-7339d_GH0.tar.gz) = 39954978
+SHA256 (signalapp-ringrtc-v2.60.7_GH0.tar.gz) = fc29d42793eb37b1b09e1a1bf03d5165d6b381ad42cce54d2e3fc69c40b7eb93
+SIZE (signalapp-ringrtc-v2.60.7_GH0.tar.gz) = 896668
+SHA256 (signalapp-webrtc-7339f_GH0.tar.gz) = af57baa890c8ff81513a4de89091bf57364d282a1a41b1a8310d107ca59fdb12
+SIZE (signalapp-webrtc-7339f_GH0.tar.gz) = 39956642
diff --git a/multimedia/ringrtc/files/patch-src__webrtc_src_rtc__base_cpu__info.cc b/multimedia/ringrtc/files/patch-src__webrtc_src_rtc__base_cpu__info.cc
deleted file mode 100644
index a529fe33ba81..000000000000
--- a/multimedia/ringrtc/files/patch-src__webrtc_src_rtc__base_cpu__info.cc
+++ /dev/null
@@ -1,24 +0,0 @@
---- src/webrtc/src/rtc_base/cpu_info.cc.orig 2025-10-31 11:52:51 UTC
-+++ src/webrtc/src/rtc_base/cpu_info.cc
-@@ -37,7 +37,9 @@
- #include <intrin.h>
- #endif
- #if defined(WEBRTC_ARCH_ARM_FAMILY) && defined(WEBRTC_LINUX)
-+#if !defined(WEBRTC_BSD)
- #include <asm/hwcap.h>
-+#endif
- #include <sys/auxv.h>
- #endif
-
-@@ -178,7 +180,11 @@ bool Supports(ISA instruction_set_architecture) {
- return 0 != (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON);
- #elif defined(WEBRTC_LINUX)
- uint64_t hwcap = 0;
-+#if defined(WEBRTC_BSD)
-+ elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
-+#else
- hwcap = getauxval(AT_HWCAP);
-+#endif
- #if defined(__aarch64__)
- if ((hwcap & HWCAP_ASIMD) != 0) {
- return true;
diff --git a/multimedia/ringrtc/update.txt b/multimedia/ringrtc/update.txt
index 48c6feec07ec..6451a4709cac 100644
--- a/multimedia/ringrtc/update.txt
+++ b/multimedia/ringrtc/update.txt
@@ -2,4 +2,4 @@ To update this port:
Bump DISTVERSION
eventually bump WEBRTC_REV (sh net-im/signal-desktop/get_deps.sh)
eventually update *_REV (sh multimedia/ringrtc/webrtc_fetch.sh)
-eventually update CARGO_CRATES (fetch -qo - https://raw.githubusercontent.com/signalapp/ringrtc/v2.59.4/Cargo.lock | awk -f /usr/ports/Mk/Scripts/cargo-crates.awk | portedit merge -i Makefile.crates)
+eventually update CARGO_CRATES (fetch -qo - https://raw.githubusercontent.com/signalapp/ringrtc/v2.60.7/Cargo.lock | awk -f /usr/ports/Mk/Scripts/cargo-crates.awk | portedit merge -i Makefile.crates)
diff --git a/multimedia/ringrtc/webrtc_fetch.sh b/multimedia/ringrtc/webrtc_fetch.sh
index 3f569011ef8e..58a5815465fc 100644
--- a/multimedia/ringrtc/webrtc_fetch.sh
+++ b/multimedia/ringrtc/webrtc_fetch.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-WEBRTC_REV=7339d
+WEBRTC_REV=7339f
boringssl_url="https://boringssl.googlesource.com/boringssl.git/+archive/"
build_url="https://chromium.googlesource.com/chromium/src/build.git/+archive/"
diff --git a/multimedia/scte35dump/Makefile b/multimedia/scte35dump/Makefile
index bfa35bc2acec..e6be803c66e4 100644
--- a/multimedia/scte35dump/Makefile
+++ b/multimedia/scte35dump/Makefile
@@ -1,7 +1,7 @@
PORTNAME= scte35dump
DISTVERSIONPREFIX= v
DISTVERSION= 0.1.8
-PORTREVISION= 14
+PORTREVISION= 15
CATEGORIES= multimedia
MAINTAINER= rodrigo@FreeBSD.org
diff --git a/multimedia/subtitlecomposer/Makefile b/multimedia/subtitlecomposer/Makefile
index 4c5ad65ef900..04cf495412d6 100644
--- a/multimedia/subtitlecomposer/Makefile
+++ b/multimedia/subtitlecomposer/Makefile
@@ -1,5 +1,6 @@
PORTNAME= subtitlecomposer
DISTVERSION= 0.8.2
+PORTREVISION= 1
CATEGORIES= multimedia kde
MASTER_SITES= KDE/stable/${PORTNAME}
diff --git a/multimedia/termplay/Makefile b/multimedia/termplay/Makefile
index 11940c2c0732..d23267355725 100644
--- a/multimedia/termplay/Makefile
+++ b/multimedia/termplay/Makefile
@@ -1,6 +1,6 @@
PORTNAME= termplay
DISTVERSION= 2.0.6
-PORTREVISION= 48
+PORTREVISION= 49
CATEGORIES= multimedia
MASTER_SITES= CRATESIO
DISTFILES= ${CARGO_DIST_SUBDIR}/${DISTNAME}${CARGO_CRATE_EXT}
diff --git a/multimedia/video-trimmer/Makefile b/multimedia/video-trimmer/Makefile
index 961ee519741f..e44a190961e1 100644
--- a/multimedia/video-trimmer/Makefile
+++ b/multimedia/video-trimmer/Makefile
@@ -1,7 +1,7 @@
PORTNAME= video-trimmer
DISTVERSIONPREFIX= v
DISTVERSION= 25.03
-PORTREVISION= 3
+PORTREVISION= 4
CATEGORIES= multimedia gnome
DIST_SUBDIR= gnome
diff --git a/multimedia/wl-screenrec/Makefile b/multimedia/wl-screenrec/Makefile
index ac5935c50a3c..9e2b6a1dfdee 100644
--- a/multimedia/wl-screenrec/Makefile
+++ b/multimedia/wl-screenrec/Makefile
@@ -1,7 +1,7 @@
PORTNAME= wl-screenrec
DISTVERSIONPREFIX= v
DISTVERSION= 0.1.5 # see PORTSCOUT comment below
-PORTREVISION= 13
+PORTREVISION= 14
CATEGORIES= multimedia wayland
MAINTAINER= ports@FreeBSD.org
diff --git a/multimedia/x264/Makefile b/multimedia/x264/Makefile
index 97a5a4643de4..b9dd3cdb4c03 100644
--- a/multimedia/x264/Makefile
+++ b/multimedia/x264/Makefile
@@ -26,6 +26,8 @@ MAINTAINER= bofh@FreeBSD.org
COMMENT?= H.264/MPEG-4 AVC Video Encoding (Front End CLI)
WWW= https://www.videolan.org/x264.html
+EXTRA_PATCHES= ${FILESDIR}/32c3b801191522961102d4bea292cdb61068d0dd.patch:-p1
+
LICENSE= GPLv2
LICENSE_NAME_PGO= PGO
LICENSE_FILE= ${WRKSRC}/COPYING
diff --git a/multimedia/x264/files/32c3b801191522961102d4bea292cdb61068d0dd.patch b/multimedia/x264/files/32c3b801191522961102d4bea292cdb61068d0dd.patch
new file mode 100644
index 000000000000..31ea7fc63bd6
--- /dev/null
+++ b/multimedia/x264/files/32c3b801191522961102d4bea292cdb61068d0dd.patch
@@ -0,0 +1,38 @@
+From 32c3b801191522961102d4bea292cdb61068d0dd Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin@martin.st>
+Date: Fri, 4 Apr 2025 16:59:34 +0300
+Subject: [PATCH] lavf: Update the code to work with the latest libavutil API
+
+---
+ input/lavf.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/input/lavf.c b/input/lavf.c
+index 90f4cec5..e2489963 100644
+--- a/input/lavf.c
++++ b/input/lavf.c
+@@ -33,6 +33,7 @@
+ #include <libavutil/error.h>
+ #include <libavutil/mem.h>
+ #include <libavutil/pixdesc.h>
++#include <libavutil/version.h>
+
+ #define FAIL_IF_ERROR( cond, ... ) FAIL_IF_ERR( cond, "lavf", __VA_ARGS__ )
+
+@@ -141,8 +142,13 @@ static int read_frame_internal( cli_pic_t *p_pic, lavf_hnd_t *h, int i_frame, vi
+ if( info )
+ {
+ info->fullrange = is_fullrange;
++#if LIBAVUTIL_VERSION_MAJOR < 60
+ info->interlaced = h->frame->interlaced_frame;
+ info->tff = h->frame->top_field_first;
++#else
++ info->interlaced = !!(h->frame->flags & AV_FRAME_FLAG_INTERLACED);
++ info->tff = !!(h->frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST);
++#endif
+ }
+
+ if( h->vfr_input )
+--
+GitLab
+
diff --git a/multimedia/youtui/Makefile b/multimedia/youtui/Makefile
index 7fe46dbcb9a0..6f55fdcc32ca 100644
--- a/multimedia/youtui/Makefile
+++ b/multimedia/youtui/Makefile
@@ -1,6 +1,7 @@
PORTNAME= youtui
DISTVERSIONPREFIX= youtui/v
DISTVERSION= 0.0.30
+PORTREVISION= 1
CATEGORIES= multimedia
MAINTAINER= yuri@FreeBSD.org