diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index 7c1301de..80136488 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -475,6 +475,8 @@ public class Game extends Activity implements SurfaceHolder.Callback, .setClientRefreshRateX100((int)(displayRefreshRate * 100)) .setAudioConfiguration(prefConfig.audioConfiguration) .setAudioEncryption(true) + .setColorSpace(decoderRenderer.getPreferredColorSpace()) + .setColorRange(decoderRenderer.getPreferredColorRange()) .build(); // Initialize the connection 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 58b45607..8d04427c 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -326,6 +326,14 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C return false; } + public int getPreferredColorSpace() { + return MoonBridge.COLORSPACE_REC_601; + } + + public int getPreferredColorRange() { + return MoonBridge.COLOR_RANGE_LIMITED; + } + public void notifyVideoForeground() { foreground = true; } diff --git a/app/src/main/java/com/limelight/nvstream/NvConnection.java b/app/src/main/java/com/limelight/nvstream/NvConnection.java index b99be0df..95a7ddf7 100644 --- a/app/src/main/java/com/limelight/nvstream/NvConnection.java +++ b/app/src/main/java/com/limelight/nvstream/NvConnection.java @@ -319,7 +319,9 @@ public class NvConnection { context.streamConfig.getClientRefreshRateX100(), context.streamConfig.getEncryptionFlags(), context.riKey.getEncoded(), ib.array(), - context.videoCapabilities); + context.videoCapabilities, + context.streamConfig.getColorSpace(), + context.streamConfig.getColorRange()); if (ret != 0) { // LiStartConnection() failed, so the caller is not expected // to stop the connection themselves. We need to release their diff --git a/app/src/main/java/com/limelight/nvstream/StreamConfiguration.java b/app/src/main/java/com/limelight/nvstream/StreamConfiguration.java index bf300723..347f7402 100644 --- a/app/src/main/java/com/limelight/nvstream/StreamConfiguration.java +++ b/app/src/main/java/com/limelight/nvstream/StreamConfiguration.java @@ -27,6 +27,8 @@ public class StreamConfiguration { private boolean enableHdr; private int attachedGamepadMask; private int encryptionFlags; + private int colorRange; + private int colorSpace; public static class Builder { private StreamConfiguration config = new StreamConfiguration(); @@ -131,7 +133,17 @@ public class StreamConfiguration { config.supportsHevc = supportsHevc; return this; } - + + public StreamConfiguration.Builder setColorRange(int colorRange) { + config.colorRange = colorRange; + return this; + } + + public StreamConfiguration.Builder setColorSpace(int colorSpace) { + config.colorSpace = colorSpace; + return this; + } + public StreamConfiguration build() { return config; } @@ -226,4 +238,12 @@ public class StreamConfiguration { public int getEncryptionFlags() { return encryptionFlags; } + + public int getColorRange() { + return colorRange; + } + + public int getColorSpace() { + return colorSpace; + } } 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 e0a65cd8..cb1eeba0 100644 --- a/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java +++ b/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java @@ -30,6 +30,13 @@ public class MoonBridge { public static final int FRAME_TYPE_PFRAME = 0; public static final int FRAME_TYPE_IDR = 1; + public static final int COLORSPACE_REC_601 = 0; + public static final int COLORSPACE_REC_709 = 1; + public static final int COLORSPACE_REC_2020 = 2; + + public static final int COLOR_RANGE_LIMITED = 0; + public static final int COLOR_RANGE_FULL = 1; + public static final int CAPABILITY_DIRECT_SUBMIT = 1; public static final int CAPABILITY_REFERENCE_FRAME_INVALIDATION_AVC = 2; public static final int CAPABILITY_REFERENCE_FRAME_INVALIDATION_HEVC = 4; @@ -272,7 +279,8 @@ public class MoonBridge { int clientRefreshRateX100, int encryptionFlags, byte[] riAesKey, byte[] riAesIv, - int videoCapabilities); + int videoCapabilities, + int colorSpace, int colorRange); public static native void stopConnection(); diff --git a/app/src/main/jni/moonlight-core/callbacks.c b/app/src/main/jni/moonlight-core/callbacks.c index 5e85bc2f..c542e5f5 100644 --- a/app/src/main/jni/moonlight-core/callbacks.c +++ b/app/src/main/jni/moonlight-core/callbacks.c @@ -386,7 +386,8 @@ Java_com_limelight_nvstream_jni_MoonBridge_startConnection(JNIEnv *env, jclass c jint clientRefreshRateX100, jint encryptionFlags, jbyteArray riAesKey, jbyteArray riAesIv, - jint videoCapabilities) { + jint videoCapabilities, + jint colorSpace, jint colorRange) { SERVER_INFORMATION serverInfo = { .address = (*env)->GetStringUTFChars(env, address, 0), .serverInfoAppVersion = (*env)->GetStringUTFChars(env, appVersion, 0), @@ -406,6 +407,8 @@ Java_com_limelight_nvstream_jni_MoonBridge_startConnection(JNIEnv *env, jclass c .hevcBitratePercentageMultiplier = hevcBitratePercentageMultiplier, .clientRefreshRateX100 = clientRefreshRateX100, .encryptionFlags = encryptionFlags, + .colorSpace = colorSpace, + .colorRange = colorRange }; jbyte* riAesKeyBuf = (*env)->GetByteArrayElements(env, riAesKey, NULL);