Download raw body.
mplayer: use XShm 1.2
On Sun, Dec 15, 2024 at 07:08:23PM +0100, Matthieu Herrb wrote:
> Hi again.
>
> So mplayer is using the XShm extention to share memory with the X
> server. Unfortunatly, on OpenBSD the X server and the mplayer process
> don't run with the same uid, leading to the patches to set the shared
> memory segement permissions to 0777. (one can see them with `ipcs -m`
> while mplayer is running).
>
> A number of years ago the X.Org developpers provided a solution for
> this in XShm 1.2. Unfortunatly at this time they only implemented it
> in libxcb, considering that it would soon replace libX11 and libXext
> completely, and this has prevented many projects using XShm to upgrade
> their code.
>
> Here is a relarively crude patch to x11/mplayer to implement XShm 1.2
> support in vo_x11 and vo_xv backends. The configure bits in particular
> are not very nice and will probably require more work to be
> upstreamed.
>
> But at least there are no longer wide open shared memory segments
> containing the p0rn you're watching while running mplayer.
>
> ok, comments ?
>
> PS: this needs the p2 (add sdl-image bdep) patch I sent earlier to
> apply.
>
oops while doing the mpv patches I found a few issues left over. New
version below:
Index: Makefile
===================================================================
RCS file: /local/cvs/ports/x11/mplayer/Makefile,v
diff -u -p -u -r1.333 Makefile
--- Makefile 2 Dec 2024 06:14:53 -0000 1.333
+++ Makefile 15 Dec 2024 20:49:57 -0000
@@ -3,7 +3,7 @@ COMMENT= movie player supporting many fo
V= 20240803
FFMPEG_V= 6.1.2
DISTNAME= mplayer-${V}
-REVISION= 2
+REVISION= 3
CATEGORIES= x11 multimedia
SITES= https://comstyle.com/source/
EXTRACT_SUFX= .tar.xz
@@ -17,12 +17,12 @@ MAINTAINER= Brad Smith <brad@comstyle.co
# GPLv2
PERMIT_PACKAGE= Yes
-WANTLIB= EGL GL SDL X11 Xext Xinerama Xss Xv Xxf86dga Xxf86vm ass \
+WANTLIB= EGL GL SDL X11 X11-xcb Xext Xinerama Xss Xv Xxf86dga Xxf86vm ass \
avcodec avformat avutil bluray bs2b bz2 c cdda_interface \
cdda_paranoia crypto dv dvdnav dvdread enca fontconfig \
freetype fribidi gif iconv jpeg m mng mp3lame curses png \
postproc pthread sndio ssl swscale swresample util x264 \
- xvidcore z
+ xcb xcb-shm xvidcore z
COMPILER= base-clang ports-gcc
COMPILER_LANGS= c
Index: patches/patch-configure
===================================================================
RCS file: /local/cvs/ports/x11/mplayer/patches/patch-configure,v
diff -u -p -u -r1.97 patch-configure
--- patches/patch-configure 24 Nov 2024 08:50:45 -0000 1.97
+++ patches/patch-configure 15 Dec 2024 20:49:57 -0000
@@ -1,3 +1,5 @@
+Add support for xcb-shm
+
Index: configure
--- configure.orig
+++ configure
@@ -15,7 +17,24 @@ Index: configure
# Use this before starting a check
echocheck() {
echo "============ Checking for $@ ============" >> "$TMPLOG"
-@@ -1521,39 +1528,39 @@ echo configuration: $configuration > "$TMPLOG"
+@@ -694,6 +701,7 @@ _mplayer=yes
+ _x11=auto
+ _xshape=auto
+ _xss=auto
++_xcb_shm=auto
+ _dga1=auto
+ _dga2=auto
+ _xv=auto
+@@ -1042,6 +1050,8 @@ for ac_option do
+ --disable-xshape) _xshape=no ;;
+ --enable-xss) _xss=yes ;;
+ --disable-xss) _xss=no ;;
++ --enable-xcb_shm) _xcb_shm=yes ;;
++ --disable-xcb-shm) _xcb_shm=no ;;
+ --enable-xv) _xv=yes ;;
+ --disable-xv) _xv=no ;;
+ --enable-vda) _vda=yes ;;
+@@ -1521,39 +1531,39 @@ echo configuration: $configuration > "$TMPLOG"
echo >> "$TMPLOG"
@@ -87,7 +106,7 @@ Index: configure
list_subparts() {
test ! -e ffmpeg/libav${3} && return 1
pattern="s/^[^#]*${1}.*([^ ,]*, *\([^ ,)]*\).*/\1_${2}/p"
-@@ -1990,7 +1997,10 @@ fi
+@@ -1990,7 +2000,10 @@ fi
if arm ; then
cc_check && host_arch=aarch64 || host_arch=arm
fi
@@ -98,7 +117,7 @@ Index: configure
echo "Detected operating system: $system_name"
echo "Detected host architecture: $host_arch"
-@@ -2544,7 +2554,7 @@ case "$host_arch" in
+@@ -2544,7 +2557,7 @@ case "$host_arch" in
arch='sparc'
iproc='sparc'
if test "$host_arch" = "sparc64" ; then
@@ -107,7 +126,7 @@ Index: configure
proc='ultrasparc'
def_fast_64bit='#define HAVE_FAST_64BIT 1'
elif sunos ; then
-@@ -2846,7 +2856,14 @@ EOF
+@@ -2846,7 +2859,14 @@ EOF
arch='arc'
iproc='arc'
;;
@@ -122,7 +141,7 @@ Index: configure
*)
echo "The architecture of your CPU ($host_arch) is not supported by this configure script"
echo "It seems nobody has ported MPlayer to your OS or CPU type yet."
-@@ -2920,7 +2937,7 @@ cat > $TMPC << EOF
+@@ -2920,7 +2940,7 @@ cat > $TMPC << EOF
int ff_extern;
EOF
cc_check -c || die "Symbol mangling check failed."
@@ -131,7 +150,7 @@ Index: configure
extern_prefix=${sym%%ff_extern*}
def_extern_asm="#define EXTERN_ASM $extern_prefix"
def_extern_prefix="#define EXTERN_PREFIX \"$extern_prefix\""
-@@ -2985,7 +3002,7 @@ else
+@@ -2985,7 +3005,7 @@ else
fi
CFLAGS="-D_ISOC99_SOURCE -I. -Iffmpeg $CFLAGS"
@@ -140,7 +159,7 @@ Index: configure
# On glibc, add some more CPPFLAGS for enabling required functionality.
cpp_condition_check features.h "defined __GLIBC__" &&
-@@ -3066,7 +3083,7 @@ elif test $relocatable = "yes" ; then
+@@ -3066,7 +3086,7 @@ elif test $relocatable = "yes" ; then
fi
echores $relocatable
@@ -149,7 +168,27 @@ Index: configure
# Checking assembler (_as) compatibility...
# Added workaround for older as that reads from stdin by default - atmos
as_version=$(echo '' | $_as -version 2>&1 | sed -n 's/^.*assembler \(version \)*\([0-9.]*\).*$/\2/p')
-@@ -6338,12 +6355,16 @@ fi #if irix
+@@ -4982,6 +5002,19 @@ else
+ fi
+ echores "$_x11"
+
++echocheck "xcb shm extension"
++if test "$_xcb_shm" = auto ; then
++ _xcb_shm=no
++ statement_check "xcb/shm.h" 'xcb_shm_query_version(NULL)' -lX11-xcb -lxcb-shm -lxcb && _xcb_shm=yes
++fi
++if test "$_xcb_shm" = yes ; then
++ def_xcb_shm='#define CONFIG_XCB_SHM 1'
++ libs_mplayer="$libs_mplayer -lX11-xcb -lxcb-shm -lxcb"
++else
++ def_xcb_shm='#undef CONFIG_XCB_SHM'
++fi
++echores "$_xcb_shm"
++
+ echocheck "Xss screensaver extensions"
+ if test "$_xss" = auto ; then
+ _xss=no
+@@ -6338,12 +6371,16 @@ fi #if irix
echocheck "sndio audio"
if test "$_sndio" = auto ; then
_sndio=no
@@ -168,7 +207,7 @@ Index: configure
else
def_sndio='#undef CONFIG_SNDIO_AUDIO'
noaomodules="sndio $noaomodules"
-@@ -6526,7 +6547,7 @@ echocheck "cdparanoia"
+@@ -6526,7 +6563,7 @@ echocheck "cdparanoia"
if test "$_cdparanoia" = auto ; then
_cdparanoia=no
for inc_tmp in "" "-I/usr/include/cdda" "-I/usr/local/include/cdda" ; do
@@ -177,7 +216,7 @@ Index: configure
_cdparanoia=yes && extra_cflags="$extra_cflags $inc_tmp" && break
done
fi
-@@ -8417,6 +8438,7 @@ extra_ldflags="$extra_ldflags $libm"
+@@ -8417,6 +8454,7 @@ extra_ldflags="$extra_ldflags $libm"
# XML documentation tests
echocheck "XML catalogs"
for try_catalog in \
@@ -185,7 +224,7 @@ Index: configure
/etc/sgml/catalog \
/usr/share/xml/docbook/*/catalog.xml \
/opt/local/share/xml/docbook-xml/*/catalog.xml \
-@@ -8444,6 +8466,7 @@ fi
+@@ -8444,6 +8482,7 @@ fi
echocheck "XML chunked stylesheet"
for try_chunk_xsl in \
@@ -193,7 +232,7 @@ Index: configure
/usr/share/xml/docbook/*/html/chunk.xsl \
/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/html/chunk.xsl \
/usr/share/sgml/docbook/yelp/docbook/html/chunk.xsl \
-@@ -8469,6 +8492,7 @@ fi
+@@ -8469,6 +8508,7 @@ fi
echocheck "XML monolithic stylesheet"
for try_docbook_xsl in \
@@ -201,7 +240,7 @@ Index: configure
/usr/share/xml/docbook/*/html/docbook.xsl \
/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/html/docbook.xsl \
/usr/share/sgml/docbook/yelp/docbook/html/docbook.xsl \
-@@ -8522,6 +8546,7 @@ EOF
+@@ -8522,6 +8562,7 @@ EOF
echocheck "XML DTD"
#FIXME: This should prefer higher version numbers, not the other way around ..
for try_dtd in \
@@ -209,7 +248,15 @@ Index: configure
/usr/share/xml/docbook/*/dtd/4*/docbookx.dtd \
/usr/share/xml/docbook/*/docbookx.dtd \
/usr/share/sgml/docbook/*/docbookx.dtd \
-@@ -9732,9 +9757,6 @@ cmp -s "$TMPH" config.h || mv -f "$TMPH" config.h
+@@ -9433,6 +9474,7 @@ $def_xf86keysym
+ $def_xinerama
+ $def_xmga
+ $def_xss
++$def_xcb_shm
+ $def_xv
+ $def_xvr100
+ $def_yuv4mpeg
+@@ -9732,9 +9774,6 @@ cmp -s "$TMPH" config.h || mv -f "$TMPH" config.h
############################################################################
@@ -219,7 +266,7 @@ Index: configure
# Create avconfig.h for FFmpeg.
cat > "$TMPH" << EOF
/* Generated by mpconfigure */
-@@ -9827,8 +9849,6 @@ print_enabled_components libavformat/demuxer_list.c AV
+@@ -9827,8 +9866,6 @@ print_enabled_components libavformat/demuxer_list.c AV
print_enabled_components libavformat/muxer_list.c AVOutputFormat muxer_list $libavmuxers
print_enabled_components libavformat/protocol_list.c URLProtocol url_protocols $libavprotocols
print_enabled_filters libavfilter/filter_list.c AVFilter filter_list $libavfilters
Index: patches/patch-libvo_vo_x11_c
===================================================================
RCS file: /local/cvs/ports/x11/mplayer/patches/patch-libvo_vo_x11_c,v
diff -u -p -u -r1.1 patch-libvo_vo_x11_c
--- patches/patch-libvo_vo_x11_c 2 Dec 2024 06:14:53 -0000 1.1
+++ patches/patch-libvo_vo_x11_c 15 Dec 2024 20:49:57 -0000
@@ -1,15 +1,117 @@
-Revert "Use appropriate shared memory permissions."
-r38419
+Implement XShm 1.2
Index: libvo/vo_x11.c
--- libvo/vo_x11.c.orig
+++ libvo/vo_x11.c
-@@ -150,7 +150,7 @@ static void getMyXImage(void)
+@@ -38,7 +38,11 @@
+ #ifdef HAVE_SHM
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
++#include <sys/mman.h>
+ #include <X11/extensions/XShm.h>
++#include <X11/Xlib-xcb.h>
++#include <xcb/shm.h>
++#include <unistd.h>
+
+ static int Shmem_Flag;
+
+@@ -78,7 +82,9 @@ static unsigned char *ImageDataOrig;
+ static XImage *myximage = NULL;
+ static int depth, bpp;
+ static XWindowAttributes attribs;
+-
++#ifdef HAVE_SHM
++static char myshmname[128];
++#endif
+ static int int_pause;
+
+ static int Flip_Flag;
+@@ -123,9 +129,23 @@ static int dst_width;
+
+ static XVisualInfo vinfo;
+
++#ifdef HAVE_SHM
++static Bool XShmAttachFd(Display *dpy, XShmSegmentInfo *shminfo)
++{
++ xcb_connection_t *xcb_conn = XGetXCBConnection(dpy);
++
++ shminfo->shmseg = xcb_generate_id(xcb_conn);
++ xcb_shm_attach_fd(xcb_conn, shminfo->shmseg,
++ shminfo->shmid, shminfo->readOnly);
++ return 1;
++}
++#endif
++
+ static void getMyXImage(void)
+ {
+ #ifdef HAVE_SHM
++ size_t len;
++
+ if (mLocalDisplay && XShmQueryExtension(mDisplay))
+ Shmem_Flag = 1;
+ else
+@@ -148,33 +168,40 @@ static void getMyXImage(void)
+ "Shared memory error,disabling ( Ximage error )\n");
+ goto shmemerror;
}
- Shminfo[0].shmid = shmget(IPC_PRIVATE,
- myximage->bytes_per_line *
+- Shminfo[0].shmid = shmget(IPC_PRIVATE,
+- myximage->bytes_per_line *
- myximage->height, IPC_CREAT | SHM_R | SHM_W);
-+ myximage->height, IPC_CREAT | 0777);
- if (Shminfo[0].shmid < 0)
+- if (Shminfo[0].shmid < 0)
++ memcpy(myshmname, "/tmp/mplayer-x11-XXXXXXXXXX", sizeof(myshmname));
++ Shminfo[0].shmid = shm_mkstemp(myshmname);
++ if (Shminfo[0].shmid < 0)
{
XDestroyImage(myximage);
+ mp_msg(MSGT_VO, MSGL_V, "%s\n", strerror(errno));
+ //perror( strerror( errno ) );
+ mp_msg(MSGT_VO, MSGL_WARN,
+- "Shared memory error,disabling ( seg id error )\n");
++ "Shared memory error,disabling ( shm_open error )\n");
+ goto shmemerror;
+ }
+- Shminfo[0].shmaddr = (char *) shmat(Shminfo[0].shmid, 0, 0);
+-
+- if (Shminfo[0].shmaddr == ((char *) -1))
++ len = myximage->bytes_per_line * myximage->height;
++
++ Shminfo[0].shmaddr = mmap(NULL, len, PROT_READ | PROT_WRITE,
++ MAP_SHARED|__MAP_NOFAULT, Shminfo[0].shmid, 0);
++
++ if (Shminfo[0].shmaddr == MAP_FAILED)
+ {
+ XDestroyImage(myximage);
+- if (Shminfo[0].shmaddr != ((char *) -1))
+- shmdt(Shminfo[0].shmaddr);
+ mp_msg(MSGT_VO, MSGL_WARN,
+- "Shared memory error,disabling ( address error )\n");
++ "Shared memory error,disabling ( mmap error )\n");
+ goto shmemerror;
+ }
++ if (ftruncate(Shminfo[0].shmid, len) == -1)
++ {
++ XDestroyImage(myximage);
++ mp_msg(MSGT_VO, MSGL_WARN,
++ "Shared memory error,disabling ( fruncate error )\n");
++ goto shmemerror;
++ }
+ myximage->data = Shminfo[0].shmaddr;
+ ImageData = (unsigned char *) myximage->data;
+ Shminfo[0].readOnly = False;
+- XShmAttach(mDisplay, &Shminfo[0]);
++ XShmAttachFd(mDisplay, &Shminfo[0]);
+
+ XSync(mDisplay, False);
+
+@@ -218,9 +245,10 @@ static void freeMyXImage(void)
+ #ifdef HAVE_SHM
+ if (Shmem_Flag)
+ {
++ close(Shminfo[0].shmid);
++ shm_unlink(myshmname);
+ XShmDetach(mDisplay, &Shminfo[0]);
+ XDestroyImage(myximage);
+- shmdt(Shminfo[0].shmaddr);
+ } else
+ #endif
+ {
Index: patches/patch-libvo_vo_xv_c
===================================================================
RCS file: /local/cvs/ports/x11/mplayer/patches/patch-libvo_vo_xv_c,v
diff -u -p -u -r1.1 patch-libvo_vo_xv_c
--- patches/patch-libvo_vo_xv_c 2 Dec 2024 06:14:53 -0000 1.1
+++ patches/patch-libvo_vo_xv_c 15 Dec 2024 20:49:57 -0000
@@ -1,15 +1,78 @@
-Revert "Use appropriate shared memory permissions."
-r38419
+Implement XShm 1.2
Index: libvo/vo_xv.c
--- libvo/vo_xv.c.orig
+++ libvo/vo_xv.c
-@@ -279,7 +279,7 @@ static void allocate_xvimage(int foo)
+@@ -74,7 +74,11 @@ const LIBVO_EXTERN(xv)
+ #ifdef HAVE_SHM
+ #include <sys/ipc.h>
+ #include <sys/shm.h>
++#include <sys/mman.h>
+ #include <X11/extensions/XShm.h>
++#include <X11/Xlib-xcb.h>
++#include <xcb/shm.h>
++#include <unistd.h>
+
+ static XShmSegmentInfo Shminfo[NUM_BUFFERS];
+ static int Shmem_Flag;
+@@ -97,6 +101,9 @@ static int num_buffers = 1; // default
+ static int visible_buf = -1; // -1 means: no buffer was drawn yet
+ static XvImage *xvimage[NUM_BUFFERS];
+
++#ifdef HAVE_SHM
++static char myshmname[128];
++#endif
+
+ static uint32_t image_width;
+ static uint32_t image_height;
+@@ -110,6 +117,18 @@ static uint32_t max_width = 0, max_height = 0; // zero
+
+ static vo_draw_alpha_func draw_alpha_func;
+
++#ifdef HAVE_SHM
++static Bool XShmAttachFd(Display *dpy, XShmSegmentInfo *shminfo)
++{
++ xcb_connection_t *xcb_conn = XGetXCBConnection(dpy);
++
++ shminfo->shmseg = xcb_generate_id(xcb_conn);
++ xcb_shm_attach_fd(xcb_conn, shminfo->shmseg,
++ shminfo->shmid, shminfo->readOnly);
++ return 1;
++}
++#endif
++
+ static void fixup_osd_position(int *x0, int *y0, int *w, int *h)
+ {
+ *x0 += image_width * (vo_panscan_x >> 1) / (vo_dwidth + vo_panscan_x);
+@@ -278,15 +297,18 @@ static void allocate_xvimage(int foo)
+ NULL, image_width, image_height,
&Shminfo[foo]);
- Shminfo[foo].shmid =
+- Shminfo[foo].shmid =
- shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | SHM_R | SHM_W);
-+ shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777);
- Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0);
+- Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0);
++ memcpy(myshmname, "/tmp/mplayer-xv-XXXXXXXXXX", sizeof(myshmname));
++ Shminfo[foo].shmid = shm_mkstemp(myshmname);
++ Shminfo[foo].shmaddr = mmap(NULL, xvimage[foo]->data_size,
++ PROT_READ | PROT_WRITE, MAP_SHARED|__MAP_NOFAULT,
++ Shminfo[foo].shmid, 0);
++ ftruncate(Shminfo[foo].shmid, xvimage[foo]->data_size);
Shminfo[foo].readOnly = False;
+ xvimage[foo]->data = Shminfo[foo].shmaddr;
+- XShmAttach(mDisplay, &Shminfo[foo]);
++ XShmAttachFd(mDisplay, &Shminfo[foo]);
+ XSync(mDisplay, False);
+- shmctl(Shminfo[foo].shmid, IPC_RMID, 0);
++ shm_unlink(myshmname);
+ } else
+ #endif
+ {
+@@ -306,6 +328,7 @@ static void deallocate_xvimage(int foo)
+ if (Shmem_Flag)
+ {
+ XShmDetach(mDisplay, &Shminfo[foo]);
++ close(Shminfo[foo].shmid);
+ shmdt(Shminfo[foo].shmaddr);
+ } else
+ #endif
--
Matthieu Herrb
mplayer: use XShm 1.2