From ae852eb911ead9aac74285de2546d4c3436d6e1a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 15 May 2017 22:28:24 -0700 Subject: [PATCH] Allow video decoder capabilities to be set at runtime --- .../main/java/com/limelight/nvstream/ConnectionContext.java | 2 ++ .../src/main/java/com/limelight/nvstream/NvConnection.java | 4 +++- .../limelight/nvstream/av/video/VideoDecoderRenderer.java | 2 ++ .../main/java/com/limelight/nvstream/jni/MoonBridge.java | 3 ++- moonlight-common/src/main/jni/moonlight-core/callbacks.c | 6 ++++-- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/ConnectionContext.java b/moonlight-common/src/main/java/com/limelight/nvstream/ConnectionContext.java index d86bf73c..a07a09ba 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/ConnectionContext.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/ConnectionContext.java @@ -19,4 +19,6 @@ public class ConnectionContext { public int negotiatedWidth, negotiatedHeight; public int negotiatedFps; + + public int videoCapabilities; } diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/NvConnection.java b/moonlight-common/src/main/java/com/limelight/nvstream/NvConnection.java index a356b842..5aa736b4 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/NvConnection.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/NvConnection.java @@ -230,13 +230,15 @@ public class NvConnection { context.negotiatedWidth, context.negotiatedHeight, context.negotiatedFps, context.streamConfig.getBitrate(), context.streamConfig.getRemote(), context.streamConfig.getAudioConfiguration(), - context.streamConfig.getHevcSupported(), context.riKey.getEncoded(), ib.array()); + context.streamConfig.getHevcSupported(), context.riKey.getEncoded(), ib.array(), + context.videoCapabilities); } public void start(AudioRenderer audioRenderer, VideoDecoderRenderer videoDecoderRenderer, NvConnectionListener connectionListener) { MoonBridge.setupBridge(videoDecoderRenderer, audioRenderer, connectionListener); context.connListener = connectionListener; + context.videoCapabilities = videoDecoderRenderer.getCapabilities(); new Thread(new Runnable() { public void run() { diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/av/video/VideoDecoderRenderer.java b/moonlight-common/src/main/java/com/limelight/nvstream/av/video/VideoDecoderRenderer.java index 76ffab1d..0b408d86 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/av/video/VideoDecoderRenderer.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/av/video/VideoDecoderRenderer.java @@ -6,4 +6,6 @@ public abstract class VideoDecoderRenderer { public abstract int submitDecodeUnit(byte[] frameData); public abstract void cleanup(); + + public abstract int getCapabilities(); } diff --git a/moonlight-common/src/main/java/com/limelight/nvstream/jni/MoonBridge.java b/moonlight-common/src/main/java/com/limelight/nvstream/jni/MoonBridge.java index 7f32053b..d172649a 100644 --- a/moonlight-common/src/main/java/com/limelight/nvstream/jni/MoonBridge.java +++ b/moonlight-common/src/main/java/com/limelight/nvstream/jni/MoonBridge.java @@ -127,7 +127,8 @@ public class MoonBridge { int width, int height, int fps, int bitrate, boolean streamingRemotely, int audioConfiguration, boolean supportsHevc, - byte[] riAesKey, byte[] riAesIv); + byte[] riAesKey, byte[] riAesIv, + int videoCapabilities); public static native void stopConnection(); diff --git a/moonlight-common/src/main/jni/moonlight-core/callbacks.c b/moonlight-common/src/main/jni/moonlight-core/callbacks.c index 24e6827c..90cbfa11 100644 --- a/moonlight-common/src/main/jni/moonlight-core/callbacks.c +++ b/moonlight-common/src/main/jni/moonlight-core/callbacks.c @@ -269,7 +269,6 @@ static DECODER_RENDERER_CALLBACKS BridgeVideoRendererCallbacks = { .setup = BridgeDrSetup, .cleanup = BridgeDrCleanup, .submitDecodeUnit = BridgeDrSubmitDecodeUnit, - .capabilities = CAPABILITY_SLICES_PER_FRAME(4), // HACK: This was common-java's default }; static AUDIO_RENDERER_CALLBACKS BridgeAudioRendererCallbacks = { @@ -294,7 +293,8 @@ Java_com_limelight_nvstream_jni_MoonBridge_startConnection(JNIEnv *env, jobject jint width, jint height, jint fps, jint bitrate, jboolean streamingRemotely, jint audioConfiguration, jboolean supportsHevc, - jbyteArray riAesKey, jbyteArray riAesIv) { + jbyteArray riAesKey, jbyteArray riAesIv, + jint videoCapabilities) { SERVER_INFORMATION serverInfo = { .address = (*env)->GetStringUTFChars(env, address, 0), .serverInfoAppVersion = (*env)->GetStringUTFChars(env, appVersion, 0), @@ -318,6 +318,8 @@ Java_com_limelight_nvstream_jni_MoonBridge_startConnection(JNIEnv *env, jobject memcpy(streamConfig.remoteInputAesIv, riAesIvBuf, sizeof(streamConfig.remoteInputAesIv)); (*env)->ReleaseByteArrayElements(env, riAesIv, riAesIvBuf, JNI_ABORT); + BridgeVideoRendererCallbacks.capabilities = videoCapabilities; + int ret = LiStartConnection(&serverInfo, &streamConfig, &BridgeConnListenerCallbacks, &BridgeVideoRendererCallbacks, &BridgeAudioRendererCallbacks, NULL, 0); (*env)->ReleaseStringUTFChars(env, address, serverInfo.address);