use gst_macos fix for "Official" GStreamer >= 1.22 packages

This commit is contained in:
F. Duncanh
2023-09-25 01:14:14 -04:00
parent 6350794fac
commit e475a61885
6 changed files with 99 additions and 77 deletions

View File

@@ -42,6 +42,11 @@ add_subdirectory( lib/playfair )
add_subdirectory( lib )
add_subdirectory( renderers )
if ( GST_MACOS )
add_definitions( -DGST_MACOS )
message ( STATUS "define GST_MACOS" )
endif()
add_executable( uxplay uxplay.cpp )
target_link_libraries( uxplay
renderers

View File

@@ -652,15 +652,12 @@ should <strong>not</strong> install (or should uninstall) the GStreamer
supplied by their package manager, if they use the “official”
release.</p>
<ul>
<li><strong>ADDED 2023-01-25: in the current 1.22.x releases something
in the GStreamer macOS binaries appears to not be working (UxPlay starts
receiving the AirPlay stream, but the video window does not
open)</strong>. If you have this problem, use the older GStreamer-1.20.7
binary packages until a fix is found. <em>You could instead compile the
“official” GStreamer-1.22.x release from source: GStreamer-1.22.0 has
been successfully built this way on a system using MacPorts: see</em> <a
href="https://github.com/FDH2/UxPlay/wiki/Building-GStreamer-from-Source-on-macOS-with-MacPorts">the
UxPlay Wiki</a>.</li>
<li>Since GStreamer v1.22, the “Official” (gstreamer.freedesktop.org)
macOS binaries require a wrapper “gst_macos_main” around the actual main
program (uxplay). This should have been applied during the UxPlay
compilation process, and the initial UxPlay terminal message should
confirm it is being used. (UxPlay can also be built using “Official”
GStreamer v.1.20.7 binaries, which work without the wrapper.)</li>
</ul>
<p><strong>Using Homebrews GStreamer</strong>: pkg-config is needed:
(“brew install pkg-config gstreamer”). This causes a large number of
@@ -676,10 +673,27 @@ any extra non-Homebrew plugins (that you build yourself) there, and
instead set GST_PLUGIN_PATH to point to their location (Homebrew does
not supply a complete GStreamer, but seems to have everything needed for
UxPlay).</p>
<p>Finally, build and install uxplay: open a terminal and change into
the UxPlay source directory (“UxPlay-master” for zipfile downloads,
“UxPlay” for “git clone” downloads) and build/install with “cmake . ;
make ; sudo make install” (same as for Linux).</p>
<p><strong>Using GStreamer installed from MacPorts</strong>: this is
<strong>not</strong> recommended, as currently the MacPorts GStreamer is
old (v1.16.2), unmaintained, and built to use X11:</p>
<ul>
<li>Instead <a
href="https://github.com/FDH2/UxPlay/wiki/Building-GStreamer-from-Source-on-macOS-with-MacPorts">build
gstreamer yourself</a> if you use MacPorts and do not want to use the
“Official” Gstreamer binaries.</li>
</ul>
<p><em>(If you really wish to use the MacPorts GStreamer-1.16.2, install
pkgconf (“sudo port install pkgconf”), then “sudo port install
gstreamer1-gst-plugins-base gstreamer1-gst-plugins-good
gstreamer1-gst-plugins-bad gstreamer1-gst-libav”. For X11 support on
macOS, compile UxPlay using a special cmake option
<code>-DUSE_X11=ON</code>, and run it from an XQuartz terminal with -vs
ximagesink; older non-retina macs require a lower resolution when using
X11: <code>uxplay -s 800x600</code>.)</em></p>
<p>After installing GStreamer, build and install uxplay: open a terminal
and change into the UxPlay source directory (“UxPlay-master” for zipfile
downloads, “UxPlay” for “git clone” downloads) and build/install with
“cmake . ; make ; sudo make install” (same as for Linux).</p>
<ul>
<li><p>Running UxPlay while checking for GStreamer warnings (do this
with “export GST_DEBUG=2” before runnng UxPlay) reveals that with the
@@ -707,23 +721,6 @@ when the window width is changed by dragging its side; the option “-vs
osxvideosink force-aspect-ratio=true” can be used to make the window
have the correct aspect ratio when it first opens.</p></li>
</ul>
<p><strong><em>Using GStreamer installed from MacPorts (not
recommended):</em></strong></p>
<p>To install: “sudo port install pkgconf”; “sudo port install
gstreamer1-gst-plugins-base gstreamer1-gst-plugins-good
gstreamer1-gst-plugins-bad gstreamer1-gst-libav”. <strong>The MacPorts
GStreamer is old (v1.16.2) and built to use X11</strong>: use the
special CMake option <code>-DUSE_X11=ON</code> when building UxPlay.
Then uxplay must be run from an XQuartz terminal, and needs option “-vs
ximagesink”. On a unibody (non-retina) MacBook Pro, the default
resolution wxh = 1920x1080 was too large, but using option “-s 800x600”
worked. The MacPorts GStreamer pipeline seems fragile against attempts
to change the X11 window size, or to rotations that switch a connected
client between portrait and landscape mode while uxplay is running.
Using the MacPorts X11 GStreamer seems only possible if the image size
is left unchanged from the initial “-s wxh” setting (also use the
iPad/iPhone setting that locks the screen orientation against switching
between portrait and landscape mode as the device is rotated).</p>
<h2
id="building-uxplay-on-microsoft-windows-using-msys2-with-the-mingw-64-compiler.">Building
UxPlay on Microsoft Windows, using MSYS2 with the MinGW-64

View File

@@ -518,11 +518,10 @@ so you don't have to install one.) Install both the gstreamer-1.0 and gstreamer-
to install (they install to /Library/FrameWorks/GStreamer.framework). Homebrew or MacPorts users should **not** install (or should uninstall)
the GStreamer supplied by their package manager, if they use the "official" release.
* **ADDED 2023-01-25: in the current 1.22.x releases something in the GStreamer macOS binaries appears to not be
working (UxPlay starts receiving the AirPlay stream, but the video window does not open)**. If
you have this problem, use the older GStreamer-1.20.7 binary packages until a fix is found. _You could instead
compile the "official" GStreamer-1.22.x release from source: GStreamer-1.22.0 has been successfully
built this way on a system using MacPorts: see_ [the UxPlay Wiki](https://github.com/FDH2/UxPlay/wiki/Building-GStreamer-from-Source-on-macOS-with-MacPorts).
* Since GStreamer v1.22, the "Official" (gstreamer.freedesktop.org) macOS binaries require a wrapper "gst_macos_main"
around the actual main program (uxplay). This should have been applied during the UxPlay compilation process, and
the initial UxPlay terminal message should confirm it is being used. (UxPlay can also be built using "Official" GStreamer v.1.20.7
binaries, which work without the wrapper.)
**Using Homebrew's GStreamer**: pkg-config is needed: ("brew install pkg-config gstreamer").
This causes a large number of extra packages to be installed by Homebrew as dependencies.
@@ -534,7 +533,22 @@ extra non-Homebrew plugins (that you build yourself) there, and instead set GST_
their location (Homebrew does not supply a complete GStreamer, but seems to have everything needed for UxPlay).
Finally, build and install uxplay: open a terminal and change into the UxPlay source directory
**Using GStreamer installed from MacPorts**: this is **not** recommended, as currently the MacPorts GStreamer
is old (v1.16.2), unmaintained, and built to use X11:
* Instead [build gstreamer yourself](https://github.com/FDH2/UxPlay/wiki/Building-GStreamer-from-Source-on-macOS-with-MacPorts)
if you use MacPorts and do not want to use the "Official" Gstreamer binaries.
_(If you really wish to use the MacPorts GStreamer-1.16.2,
install pkgconf ("sudo port install pkgconf"), then
"sudo port install gstreamer1-gst-plugins-base gstreamer1-gst-plugins-good gstreamer1-gst-plugins-bad gstreamer1-gst-libav".
For X11 support on macOS, compile UxPlay using a special cmake option `-DUSE_X11=ON`, and run
it from an XQuartz terminal with -vs ximagesink; older non-retina macs require a lower resolution
when using X11: `uxplay -s 800x600`.)_
After installing GStreamer, build and install uxplay: open a terminal and change into the UxPlay source directory
("UxPlay-master" for zipfile downloads, "UxPlay" for "git clone" downloads) and build/install with
"cmake . ; make ; sudo make install " (same as for Linux).
@@ -558,16 +572,6 @@ Finally, build and install uxplay: open a terminal and change into the UxPlay so
the option "-vs osxvideosink force-aspect-ratio=true" can be used to make the window have the
correct aspect ratio when it first opens.
***Using GStreamer installed from MacPorts (not recommended):***
To install: "sudo port install pkgconf"; "sudo port install gstreamer1-gst-plugins-base gstreamer1-gst-plugins-good gstreamer1-gst-plugins-bad gstreamer1-gst-libav".
**The MacPorts GStreamer is old (v1.16.2) and built to use X11**: use the special CMake option `-DUSE_X11=ON`
when building UxPlay. Then uxplay must be run from an XQuartz terminal, and needs
option "-vs ximagesink". On a unibody (non-retina) MacBook Pro, the default resolution wxh = 1920x1080
was too large, but using option "-s 800x600" worked. The MacPorts GStreamer pipeline
seems fragile against attempts to change the X11 window size, or to rotations that switch a connected client between portrait and landscape mode while uxplay is running. Using the MacPorts X11 GStreamer seems only possible if the image size is left unchanged from the initial "-s wxh" setting (also use the iPad/iPhone setting that locks the screen orientation against switching between portrait and landscape mode as the device is rotated).
## Building UxPlay on Microsoft Windows, using MSYS2 with the MinGW-64 compiler.
* tested on Windows 10 and 11, 64-bit.

View File

@@ -645,15 +645,13 @@ Shift-Click on them to install (they install to
should **not** install (or should uninstall) the GStreamer supplied by
their package manager, if they use the "official" release.
- **ADDED 2023-01-25: in the current 1.22.x releases something in the
GStreamer macOS binaries appears to not be working (UxPlay starts
receiving the AirPlay stream, but the video window does not open)**.
If you have this problem, use the older GStreamer-1.20.7 binary
packages until a fix is found. *You could instead compile the
"official" GStreamer-1.22.x release from source: GStreamer-1.22.0
has been successfully built this way on a system using MacPorts:
see* [the UxPlay
Wiki](https://github.com/FDH2/UxPlay/wiki/Building-GStreamer-from-Source-on-macOS-with-MacPorts).
- Since GStreamer v1.22, the "Official" (gstreamer.freedesktop.org)
macOS binaries require a wrapper "gst_macos_main" around the actual
main program (uxplay). This should have been applied during the
UxPlay compilation process, and the initial UxPlay terminal message
should confirm it is being used. (UxPlay can also be built using
"Official" GStreamer v.1.20.7 binaries, which work without the
wrapper.)
**Using Homebrew's GStreamer**: pkg-config is needed: ("brew install
pkg-config gstreamer"). This causes a large number of extra packages to
@@ -668,10 +666,27 @@ Homebrew installs gstreamer to `(HOMEBREW)/lib/gstreamer-1.0` where
point to their location (Homebrew does not supply a complete GStreamer,
but seems to have everything needed for UxPlay).
Finally, build and install uxplay: open a terminal and change into the
UxPlay source directory ("UxPlay-master" for zipfile downloads, "UxPlay"
for "git clone" downloads) and build/install with "cmake . ; make ; sudo
make install" (same as for Linux).
**Using GStreamer installed from MacPorts**: this is **not**
recommended, as currently the MacPorts GStreamer is old (v1.16.2),
unmaintained, and built to use X11:
- Instead [build gstreamer
yourself](https://github.com/FDH2/UxPlay/wiki/Building-GStreamer-from-Source-on-macOS-with-MacPorts)
if you use MacPorts and do not want to use the "Official" Gstreamer
binaries.
*(If you really wish to use the MacPorts GStreamer-1.16.2, install
pkgconf ("sudo port install pkgconf"), then "sudo port install
gstreamer1-gst-plugins-base gstreamer1-gst-plugins-good
gstreamer1-gst-plugins-bad gstreamer1-gst-libav". For X11 support on
macOS, compile UxPlay using a special cmake option `-DUSE_X11=ON`, and
run it from an XQuartz terminal with -vs ximagesink; older non-retina
macs require a lower resolution when using X11: `uxplay -s 800x600`.)*
After installing GStreamer, build and install uxplay: open a terminal
and change into the UxPlay source directory ("UxPlay-master" for zipfile
downloads, "UxPlay" for "git clone" downloads) and build/install with
"cmake . ; make ; sudo make install" (same as for Linux).
- Running UxPlay while checking for GStreamer warnings (do this with
"export GST_DEBUG=2" before runnng UxPlay) reveals that with the
@@ -703,24 +718,6 @@ make install" (same as for Linux).
option "-vs osxvideosink force-aspect-ratio=true" can be used to
make the window have the correct aspect ratio when it first opens.
***Using GStreamer installed from MacPorts (not recommended):***
To install: "sudo port install pkgconf"; "sudo port install
gstreamer1-gst-plugins-base gstreamer1-gst-plugins-good
gstreamer1-gst-plugins-bad gstreamer1-gst-libav". **The MacPorts
GStreamer is old (v1.16.2) and built to use X11**: use the special CMake
option `-DUSE_X11=ON` when building UxPlay. Then uxplay must be run from
an XQuartz terminal, and needs option "-vs ximagesink". On a unibody
(non-retina) MacBook Pro, the default resolution wxh = 1920x1080 was too
large, but using option "-s 800x600" worked. The MacPorts GStreamer
pipeline seems fragile against attempts to change the X11 window size,
or to rotations that switch a connected client between portrait and
landscape mode while uxplay is running. Using the MacPorts X11 GStreamer
seems only possible if the image size is left unchanged from the initial
"-s wxh" setting (also use the iPad/iPhone setting that locks the screen
orientation against switching between portrait and landscape mode as the
device is rotated).
## Building UxPlay on Microsoft Windows, using MSYS2 with the MinGW-64 compiler.
- tested on Windows 10 and 11, 64-bit.

View File

@@ -44,6 +44,11 @@ target_link_libraries ( renderers PUBLIC airplay )
if( GST_INCLUDE_DIRS MATCHES "/Library/FrameWorks/GStreamer.framework/include" )
set( GST_INCLUDE_DIRS "/Library/FrameWorks/GStreamer.framework/Headers")
message( STATUS "GST_INCLUDE_DIRS" ${GST_INCLUDE_DIRS} )
# fix to use -DGST_MACOS for "Official" GStreamer >= 1.22 packages
pkg_check_modules ( GST122 gstreamer-1.0>=1.22 )
if ( GST122_FOUND )
set( GST_MACOS "1" CACHE STRING "define GST_MACOS in uxplay.cpp" )
endif()
endif()
target_include_directories ( renderers PUBLIC ${GST_INCLUDE_DIRS} )
@@ -62,3 +67,4 @@ else()
endif()

View File

@@ -1505,8 +1505,21 @@ static void read_config_file(const char * filename, const char * uxplay_name) {
free (argv);
}
}
#ifdef GST_MACOS
/* workaround for GStreamer >= 1.22 "Official Builds" on macOS */
#include <TargetConditionals.h>
#include <gst/gstmacos.h>
void real_main (int argc, char *argv[]);
int main (int argc, char *argv[]) {
printf("*=== Using gst_macos_main wrapper for GStreamer >= 1.22 on macOS ===*\n");
return gst_macos_main ((GstMainFunc) real_main, argc, argv , NULL);
}
void real_main (int argc, char *argv[]) {
#else
int main (int argc, char *argv[]) {
#endif
std::vector<char> server_hw_addr;
std::string mac_address;
std::string config_file = "";