diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index b194615c..1410bd2b 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -1792,6 +1792,12 @@ public class Game extends Activity implements SurfaceHolder.Callback, controllerHandler.handleRumble(controllerNumber, lowFreqMotor, highFreqMotor); } + @Override + public void setHdrMode(boolean enabled) { + LimeLog.info("Display HDR mode: " + (enabled ? "enabled" : "disabled")); + decoderRenderer.setHdrMode(enabled); + } + @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (!surfaceCreated) { diff --git a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java index 14b7c194..1933978e 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -565,6 +565,11 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { videoDecoder.release(); } + @Override + public void setHdrMode(boolean enabled) { + // TODO: Set HDR metadata? + } + private boolean queueInputBuffer(int inputBufferIndex, int offset, int length, long timestampUs, int codecFlags) { try { videoDecoder.queueInputBuffer(inputBufferIndex, diff --git a/app/src/main/java/com/limelight/nvstream/NvConnectionListener.java b/app/src/main/java/com/limelight/nvstream/NvConnectionListener.java index 4879f2d3..f61ecec1 100644 --- a/app/src/main/java/com/limelight/nvstream/NvConnectionListener.java +++ b/app/src/main/java/com/limelight/nvstream/NvConnectionListener.java @@ -13,4 +13,6 @@ public interface NvConnectionListener { void displayTransientMessage(String message); void rumble(short controllerNumber, short lowFreqMotor, short highFreqMotor); + + void setHdrMode(boolean enabled); } diff --git a/app/src/main/java/com/limelight/nvstream/av/video/VideoDecoderRenderer.java b/app/src/main/java/com/limelight/nvstream/av/video/VideoDecoderRenderer.java index b0e76b6b..5de9fa7e 100644 --- a/app/src/main/java/com/limelight/nvstream/av/video/VideoDecoderRenderer.java +++ b/app/src/main/java/com/limelight/nvstream/av/video/VideoDecoderRenderer.java @@ -15,4 +15,6 @@ public abstract class VideoDecoderRenderer { public abstract void cleanup(); public abstract int getCapabilities(); + + public abstract void setHdrMode(boolean enabled); } diff --git a/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java b/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java index e91a968c..c0571d16 100644 --- a/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java +++ b/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java @@ -240,6 +240,12 @@ public class MoonBridge { } } + public static void bridgeClSetHdrMode(boolean enabled) { + if (connectionListener != null) { + connectionListener.setHdrMode(enabled); + } + } + public static void setupBridge(VideoDecoderRenderer videoRenderer, AudioRenderer audioRenderer, NvConnectionListener connectionListener) { MoonBridge.videoRenderer = videoRenderer; MoonBridge.audioRenderer = audioRenderer; diff --git a/app/src/main/jni/moonlight-core/callbacks.c b/app/src/main/jni/moonlight-core/callbacks.c index 5fc1c4ae..a781e205 100644 --- a/app/src/main/jni/moonlight-core/callbacks.c +++ b/app/src/main/jni/moonlight-core/callbacks.c @@ -32,6 +32,7 @@ static jmethodID BridgeClConnectionStartedMethod; static jmethodID BridgeClConnectionTerminatedMethod; static jmethodID BridgeClRumbleMethod; static jmethodID BridgeClConnectionStatusUpdateMethod; +static jmethodID BridgeClSetHdrModeMethod; static jbyteArray DecodedFrameBuffer; static jshortArray DecodedAudioBuffer; @@ -92,6 +93,7 @@ Java_com_limelight_nvstream_jni_MoonBridge_init(JNIEnv *env, jclass clazz) { BridgeClConnectionTerminatedMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeClConnectionTerminated", "(I)V"); BridgeClRumbleMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeClRumble", "(SSS)V"); BridgeClConnectionStatusUpdateMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeClConnectionStatusUpdate", "(I)V"); + BridgeClSetHdrModeMethod = (*env)->GetStaticMethodID(env, clazz, "bridgeClSetHdrMode", "(Z)V"); } int BridgeDrSetup(int videoFormat, int width, int height, int redrawRate, void* context, int drFlags) { @@ -326,6 +328,16 @@ void BridgeClConnectionStatusUpdate(int connectionStatus) { } } +void BridgeClSetHdrMode(bool enabled) { + JNIEnv* env = GetThreadEnv(); + + (*env)->CallStaticVoidMethod(env, GlobalBridgeClass, BridgeClSetHdrModeMethod, enabled); + if ((*env)->ExceptionCheck(env)) { + // We will crash here + (*JVM)->DetachCurrentThread(JVM); + } +} + void BridgeClLogMessage(const char* format, ...) { va_list va; va_start(va, format); @@ -359,6 +371,7 @@ static CONNECTION_LISTENER_CALLBACKS BridgeConnListenerCallbacks = { .logMessage = BridgeClLogMessage, .rumble = BridgeClRumble, .connectionStatusUpdate = BridgeClConnectionStatusUpdate, + .setHdrMode = BridgeClSetHdrMode, }; JNIEXPORT jint JNICALL diff --git a/app/src/main/jni/moonlight-core/moonlight-common-c b/app/src/main/jni/moonlight-core/moonlight-common-c index 6001ece0..e62dc560 160000 --- a/app/src/main/jni/moonlight-core/moonlight-common-c +++ b/app/src/main/jni/moonlight-core/moonlight-common-c @@ -1 +1 @@ -Subproject commit 6001ece0b8bfcea6a8122a3e56f48f515e1aaaf5 +Subproject commit e62dc56047b038e5f2a5404b023fec453bf1bf8a