Implement XShm 1.2 for vo_xv and vo_x11 backends in mplayer.

Unlike traditional XShm which requires shared memory segments to be
mode 777 when shared between processes running with different uids,
this keeps the shared memory owned by the uid of the client
and passes a file descriptor to the X server and keeps the contents
of the shared memory private.
ok brad (maintainer), kmos@
This commit is contained in:
matthieu
2025-02-19 05:43:13 +00:00
parent 30d1f4dbc8
commit ebb5ccbcde
4 changed files with 243 additions and 31 deletions
+3 -3
View File
@@ -3,7 +3,7 @@ COMMENT= movie player supporting many formats
V= 20240803
FFMPEG_V= 6.1.2
DISTNAME= mplayer-${V}
REVISION= 1
REVISION= 2
CATEGORIES= x11 multimedia
SITES= https://comstyle.com/source/
EXTRACT_SUFX= .tar.xz
@@ -17,12 +17,12 @@ MAINTAINER= Brad Smith <brad@comstyle.com>
# 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
+62 -15
View File
@@ -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
+109 -7
View File
@@ -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
{
+69 -6
View File
@@ -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