From 4aaa7ca89501ceb6a3357cf41b15c31fa3ebd218 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 16 Aug 2025 15:10:31 -0400 Subject: [PATCH] fix(YouTube - Video playback): Disable HDR video does not disable Dolby Vision HDR (#5661) --- .../youtube/patches/DisableHdrPatch.java | 8 ++- .../youtube/video/hdr/DisableHdrPatch.kt | 54 ++++++++++--------- .../patches/youtube/video/hdr/Fingerprints.kt | 12 ----- 3 files changed, 34 insertions(+), 40 deletions(-) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/Fingerprints.kt diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableHdrPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableHdrPatch.java index 174e8a47e..d89bf72f5 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableHdrPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableHdrPatch.java @@ -1,5 +1,7 @@ package app.revanced.extension.youtube.patches; +import android.view.Display; + import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") @@ -8,8 +10,10 @@ public class DisableHdrPatch { /** * Injection point. */ - public static boolean disableHDRVideo() { - return !Settings.DISABLE_HDR_VIDEO.get(); + public static int[] disableHdrVideo(Display.HdrCapabilities capabilities) { + return Settings.DISABLE_HDR_VIDEO.get() + ? new int[0] + : capabilities.getSupportedHdrTypes(); } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt index 5d8e6d1c0..abea2c22c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt @@ -1,15 +1,16 @@ package app.revanced.patches.youtube.video.hdr -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.all.misc.transformation.transformInstructionsPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = @@ -24,6 +25,31 @@ val disableHdrPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, + // Override all calls of `getSupportedHdrTypes`. + transformInstructionsPatch( + filterMap = filterMap@{ classDef, _, instruction, instructionIndex -> + if (classDef.type.startsWith("Lapp/revanced/")) { + return@filterMap null + } + + val reference = instruction.getReference() + if (reference?.definingClass =="Landroid/view/Display\$HdrCapabilities;" + && reference.name == "getSupportedHdrTypes") { + return@filterMap instruction to instructionIndex + } + return@filterMap null + }, + transform = { method, entry -> + val (instruction, index) = entry + val register = (instruction as FiveRegisterInstruction).registerC + + method.replaceInstruction( + index, + "invoke-static/range { v$register .. v$register }, $EXTENSION_CLASS_DESCRIPTOR->" + + "disableHdrVideo(Landroid/view/Display\$HdrCapabilities;)[I", + ) + } + ) ) compatibleWith( @@ -43,29 +69,5 @@ val disableHdrPatch = bytecodePatch( PreferenceScreen.VIDEO.addPreferences( SwitchPreference("revanced_disable_hdr_video") ) - - hdrCapabilityFingerprint.let { - it.originalMethod.apply { - val stringIndex = it.stringMatches!!.first().index - val navigateIndex = indexOfFirstInstructionOrThrow(stringIndex) { - val reference = getReference() - reference?.parameterTypes == listOf("I", "Landroid/view/Display;") && - reference.returnType == "Z" - } - - // Modify the HDR lookup method (Method is in the same class as the fingerprint). - navigate(this).to(navigateIndex).stop().addInstructionsWithLabels( - 0, - """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableHDRVideo()Z - move-result v0 - if-nez v0, :useHdr - return v0 - :useHdr - nop - """ - ) - } - } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/Fingerprints.kt deleted file mode 100644 index fe8d2dce3..000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/Fingerprints.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.youtube.video.hdr - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -internal val hdrCapabilityFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - strings( - "av1_profile_main_10_hdr_10_plus_supported", - "video/av01" - ) -} \ No newline at end of file