From 80d315481bc55a415aff91b5436e8d5cb2549d89 Mon Sep 17 00:00:00 2001 From: Pauljd Date: Wed, 4 Nov 2026 22:23:28 +0000 Subject: [PATCH] 0.108.2: GT picture fix on the installed 0.108.1 (VfW H.264 in MKV); lint opt-in for the copied reader Co-Authored-By: Claude Opus 5.5 (1M context) --- .../orbit/classic/mkv/DefaultEbmlReader.java | 1 + .../tv/orbit/classic/mkv/EbmlProcessor.java | 1 + .../java/tv/orbit/classic/mkv/EbmlReader.java | 1 + .../orbit/classic/mkv/MatroskaExtractor.java | 1 + .../java/tv/orbit/classic/mkv/Sniffer.java | 1 + .../tv/orbit/classic/mkv/VarintReader.java | 1 + docs/VERIFICATION-0.108.2.md | 24 +++++++++++++++++++ 7 files changed, 30 insertions(+) create mode 100644 docs/VERIFICATION-0.108.2.md diff --git a/android/app/src/main/java/tv/orbit/classic/mkv/DefaultEbmlReader.java b/android/app/src/main/java/tv/orbit/classic/mkv/DefaultEbmlReader.java index 9971742..7797c47 100644 --- a/android/app/src/main/java/tv/orbit/classic/mkv/DefaultEbmlReader.java +++ b/android/app/src/main/java/tv/orbit/classic/mkv/DefaultEbmlReader.java @@ -31,6 +31,7 @@ import java.lang.annotation.Target; import java.util.ArrayDeque; /** Default implementation of {@link EbmlReader}. */ +@androidx.annotation.OptIn(markerClass = androidx.media3.common.util.UnstableApi.class) /* package */ final class DefaultEbmlReader implements EbmlReader { @Documented diff --git a/android/app/src/main/java/tv/orbit/classic/mkv/EbmlProcessor.java b/android/app/src/main/java/tv/orbit/classic/mkv/EbmlProcessor.java index 313a2af..4f45586 100644 --- a/android/app/src/main/java/tv/orbit/classic/mkv/EbmlProcessor.java +++ b/android/app/src/main/java/tv/orbit/classic/mkv/EbmlProcessor.java @@ -29,6 +29,7 @@ import java.lang.annotation.Target; /** Defines EBML element IDs/types and processes events. */ @UnstableApi +@androidx.annotation.OptIn(markerClass = androidx.media3.common.util.UnstableApi.class) public interface EbmlProcessor { /** diff --git a/android/app/src/main/java/tv/orbit/classic/mkv/EbmlReader.java b/android/app/src/main/java/tv/orbit/classic/mkv/EbmlReader.java index 59aa257..88e400d 100644 --- a/android/app/src/main/java/tv/orbit/classic/mkv/EbmlReader.java +++ b/android/app/src/main/java/tv/orbit/classic/mkv/EbmlReader.java @@ -26,6 +26,7 @@ import java.io.IOException; * originally designed for the Matroska container format. More information about EBML and Matroska * is available here. */ +@androidx.annotation.OptIn(markerClass = androidx.media3.common.util.UnstableApi.class) /* package */ interface EbmlReader { /** diff --git a/android/app/src/main/java/tv/orbit/classic/mkv/MatroskaExtractor.java b/android/app/src/main/java/tv/orbit/classic/mkv/MatroskaExtractor.java index 57c2182..43de1a8 100644 --- a/android/app/src/main/java/tv/orbit/classic/mkv/MatroskaExtractor.java +++ b/android/app/src/main/java/tv/orbit/classic/mkv/MatroskaExtractor.java @@ -83,6 +83,7 @@ import java.util.UUID; /** Extracts data from the Matroska and WebM container formats. */ @UnstableApi +@androidx.annotation.OptIn(markerClass = androidx.media3.common.util.UnstableApi.class) public class MatroskaExtractor implements Extractor { /** diff --git a/android/app/src/main/java/tv/orbit/classic/mkv/Sniffer.java b/android/app/src/main/java/tv/orbit/classic/mkv/Sniffer.java index 7952893..6a76561 100644 --- a/android/app/src/main/java/tv/orbit/classic/mkv/Sniffer.java +++ b/android/app/src/main/java/tv/orbit/classic/mkv/Sniffer.java @@ -25,6 +25,7 @@ import java.io.IOException; * Utility class that peeks from the input stream in order to determine whether it appears to be * compatible input for this extractor. */ +@androidx.annotation.OptIn(markerClass = androidx.media3.common.util.UnstableApi.class) /* package */ final class Sniffer { /** The number of bytes to search for a valid header in {@link #sniff(ExtractorInput)}. */ diff --git a/android/app/src/main/java/tv/orbit/classic/mkv/VarintReader.java b/android/app/src/main/java/tv/orbit/classic/mkv/VarintReader.java index 24f97c9..81af3af 100644 --- a/android/app/src/main/java/tv/orbit/classic/mkv/VarintReader.java +++ b/android/app/src/main/java/tv/orbit/classic/mkv/VarintReader.java @@ -21,6 +21,7 @@ import java.io.EOFException; import java.io.IOException; /** Reads EBML variable-length integers (varints) from an {@link ExtractorInput}. */ +@androidx.annotation.OptIn(markerClass = androidx.media3.common.util.UnstableApi.class) /* package */ final class VarintReader { private static final int STATE_BEGIN_READING = 0; diff --git a/docs/VERIFICATION-0.108.2.md b/docs/VERIFICATION-0.108.2.md new file mode 100644 index 0000000..e5443c1 --- /dev/null +++ b/docs/VERIFICATION-0.108.2.md @@ -0,0 +1,24 @@ +# 0.108.2: Dragon Ball GT's picture, built on the installed 0.108.1 + +**Paul's report (4 November 2026, 21:58):** Dragon Ball GT on Vortex "won't play on this device". + +**What the box showed:** +- S1 E4 (item 228430) failed with `noVideoDecoder=video/x-unknown`. +- A 3-minute test of S1 E5 (228431) played sound and English subtitles with **no video track** (`video=none`). +- Emby reports every GT episode as H.264 640x480 in MKV with Vorbis audio. The library has only one copy, 64 episodes. +- **The cause:** the files carry their H.264 in the old Video for Windows wrapper (Matroska CodecID V_MS/VFW/FOURCC). Media3's Matroska reader recognises that wrapper only for DivX/Xvid, H.263 and VC-1, and labels anything else video/x-unknown. +- Paul doesn't own the Emby server, so remuxing the files there isn't an option. He asked for the fix in the app. + +**The fix:** +- `tv/orbit/classic/mkv/` is a copy of Media3 1.8.0's Matroska reader (Apache 2.0). It's unchanged apart from its package and one addition: `parseFourCcPrivate` also maps H.264 FourCCs (H264, X264, AVC1, DAVC, VSSH, either case) to video/avc. The stream is passed as it is, with its parameter sets in band, which the decoder reads. +- `OrbitExtractorsFactory` is Media3's DefaultExtractorsFactory with only the Matroska reader swapped. The programme, picture and ident players use it. +- Every other format and subtitle path is Media3's own. +- It's built on 0.108.1, the version on the box, so Advent and The Naughty List aren't in it. The same change is on main for later releases. + +## Checks + +- 482 unit tests run, 0 failures. `OrbitMatroskaTest` adds 3: the H.264 FourCCs map, other FourCCs stay Media3's, and only the Matroska reader is swapped. Lint shows the same warnings as before and no errors. +- **Not provable off the box:** that GT now shows its picture. After the install, a 3-minute test of S1 E5 must show `video=video/avc` with a first frame. +- **Episode 4:** item 228430 stays on the failed list from 21:56. It can be cleared, so it's booked again, once the picture is confirmed. + +APK: `outputs/revision-0.108.2`, signed, versionCode 162. **Not installed.**