mirror of
https://github.com/openbsd/ports.git
synced 2026-06-17 23:13:55 +02:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user