From 8495a44382a77c4d1556e472e5698b604cca1edf Mon Sep 17 00:00:00 2001 From: Alex Andres Date: Sat, 31 Oct 2026 00:11:13 +0100 Subject: [PATCH 1/2] fix: build and test macOS on macos-15 runners macos-14 runner images are in brownout and will be retired on 2026-11-02. macos-15 still ships Xcode 16.1, which the build selects. --- .github/actions/prepare-macos/action.yml | 2 +- .github/workflows/platforms.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/prepare-macos/action.yml b/.github/actions/prepare-macos/action.yml index 2d25f1a0c..4fbca253b 100644 --- a/.github/actions/prepare-macos/action.yml +++ b/.github/actions/prepare-macos/action.yml @@ -11,7 +11,7 @@ runs: HOMEBREW_NO_AUTO_UPDATE: '1' HOMEBREW_NO_INSTALL_CLEANUP: '1' run: | - # Required on macos-14 + # Required since macos-14 brew install python-setuptools # nasm is what FFmpeg assembles its x86 code with, which the Intel # build needs even though the runner itself is Apple Silicon. diff --git a/.github/workflows/platforms.yml b/.github/workflows/platforms.yml index a4f39bb86..259cb3ddd 100644 --- a/.github/workflows/platforms.yml +++ b/.github/workflows/platforms.yml @@ -52,10 +52,10 @@ jobs: runs-on: ubuntu-22.04 profile: linux-aarch32 - name: macos_arm64 - runs-on: macos-14 + runs-on: macos-15 profile: '' - name: macos_x86-64 - runs-on: macos-14 + runs-on: macos-15 profile: macos-cross-x86_64 runs-on: ${{ matrix.platform.runs-on }} steps: @@ -132,7 +132,7 @@ jobs: java-distribution: liberica java-architecture: armv7 - name: macos_arm64 - runs-on: macos-14 + runs-on: macos-15 classifier: macos-aarch64 java-distribution: temurin java-architecture: '' From 17131675bef2623d3896cc9fd41608a7e3f72a4b Mon Sep 17 00:00:00 2001 From: Alex Andres Date: Sat, 31 Oct 2026 00:49:19 +0100 Subject: [PATCH 2/2] fix: let VideoToolbox decode High 10 and 4:4:4 H.264 in the fallback tests VideoToolbox decodes both on the macos-15 runners, which unlike macos-14 have working hardware decoding. The tests now require the software pictures either way. --- .../media/player/HardwareDecodingTest.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/webrtc-media/src/test/java/dev/onvoid/webrtc/media/player/HardwareDecodingTest.java b/webrtc-media/src/test/java/dev/onvoid/webrtc/media/player/HardwareDecodingTest.java index 670f0d56f..cc6040f30 100644 --- a/webrtc-media/src/test/java/dev/onvoid/webrtc/media/player/HardwareDecodingTest.java +++ b/webrtc-media/src/test/java/dev/onvoid/webrtc/media/player/HardwareDecodingTest.java @@ -98,7 +98,8 @@ class HardwareDecodingTest { * every eight frames: 1080p H.264 High with B-frames, 1080p VP9, 4K H.264, * and H.264 at 1366x768. {@code media-test-h264-10bit.mkv} (High 10) and * {@code media-test-h264-444.mkv} (High 4:4:4 Predictive) are 320x240, in - * formats no hardware decoder takes. All were made with FFmpeg (libx264 and + * formats most hardware decoders do not take; VideoToolbox does on macOS 15. + * All were made with FFmpeg (libx264 and * libvpx-vp9) from a moving gradient with a little noise, for example: *
 	 * ffmpeg -f lavfi -i "gradients=s=1920x1080:r=15:d=1:speed=0.02,noise=alls=4:allf=t,format=yuv420p" \
@@ -743,27 +744,30 @@ void h264MatchesSoftwareLaptopSize() throws Exception {
 	}
 
 	@Test
-	void tenBitH264FallsBack() throws Exception {
-		assertFallsBack(H264_10BIT);
+	void tenBitH264PlaysAsInSoftware() throws Exception {
+		assertPlaysAsInSoftware(H264_10BIT);
 	}
 
 	@Test
-	void h264444FallsBack() throws Exception {
-		assertFallsBack(H264_444);
+	void h264444PlaysAsInSoftware() throws Exception {
+		assertPlaysAsInSoftware(H264_444);
 	}
 
 	/**
-	 * A stream that hardware decoders do not take is played in software, with
-	 * the pictures software decoding gives and no error.
+	 * A stream that not every hardware decoder takes plays with the pictures
+	 * software decoding gives and no error: in software where the hardware does
+	 * not take it, and in hardware where it does. VideoToolbox decodes High 10
+	 * and 4:4:4 H.264 on macOS 15, and hands the pictures over as P010 and
+	 * NV24, whose luma swscale brings to 8 bits exactly as it does that of the
+	 * planar formats of software decoding.
 	 */
-	private void assertFallsBack(String asset) throws Exception {
+	private void assertPlaysAsInSoftware(String asset) throws Exception {
 		Result software = play(asset, false, 0);
 		Result hardware = play(asset, true, 0);
 
 		assertNull(software.error);
 		assertNull(hardware.error);
 
-		assertFalse(hardware.hardware);
 		assertEquals(15, hardware.frames.size());
 		assertEquals(software.frames, hardware.frames);
 	}