Compare commits

...

21 Commits

Author SHA1 Message Date
Cameron Gutman aede16c85c Version 10.9 2022-10-07 22:02:56 -05:00
Cameron Gutman 61a82e6394 Merge remote-tracking branch 'origin/weblate' 2022-10-07 21:55:19 -05:00
Sargon-Isa 5a92925d6a Translated using Weblate (German)
Currently translated at 100.0% (226 of 226 strings)

Translation: Moonlight Game Streaming/moonlight-android
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-android/de/
2022-10-08 04:54:57 +02:00
Cameron Gutman fe697c918f Update moonlight-common-c with speculative RFI support 2022-10-07 21:54:00 -05:00
Cameron Gutman bc57a285ce Fix unescaped character 2022-10-04 20:03:10 -05:00
Cameron Gutman 85d8943b64 Merge remote-tracking branch 'origin/weblate' 2022-10-04 19:56:52 -05:00
Cameron Gutman aa6c32968b Add a special termination message for ML_ERROR_FRAME_CONVERSION 2022-10-04 19:51:49 -05:00
Cameron Gutman ad1808fb4e Update moonlight-common-c with further fixes for GFE 3.26 2022-10-04 19:50:49 -05:00
Kamil Szyc 576610e4c3 Translated using Weblate (Polish)
Currently translated at 1.7% (4 of 225 strings)

Translation: Moonlight Game Streaming/moonlight-android
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-android/pl/
2022-10-04 12:24:06 +02:00
Martin Dimitrov ace2266f14 Translated using Weblate (Bulgarian)
Currently translated at 59.5% (134 of 225 strings)

Translation: Moonlight Game Streaming/moonlight-android
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-android/bg/
2022-10-04 12:24:06 +02:00
Alexandru-Marian Buza 41cedfa6ec Fix requestMetaKeyEvent for Samsung devices with android 10+ (#1134)
Co-authored-by: Alexandru Buza <abuza@iqnox.com>
2022-10-03 22:50:04 -05:00
Cameron Gutman d46fab33b3 Enable HEVC RFI for Exynos decoders 2022-10-03 22:23:59 -05:00
Cameron Gutman 585dc45595 Enable RFI for HEVC on Qualcomm and Nvidia decoders 2022-10-03 21:33:05 -05:00
Cameron Gutman c3c9354a00 Update moonlight-common-c to support reliable RFI for HEVC 2022-10-03 21:32:11 -05:00
Cameron Gutman bdc8d08e65 Switch back to AGP 7.2.2
AGP 7.3.0 produces invalid bytecode for ControllerHandler, causing dex validation errors on Android Jelly Bean and KitKat

Fixes #1132
2022-10-03 21:30:01 -05:00
Cameron Gutman 9c792d3272 Adjust RendererException text to attempt to parse correctly in Google Play App Vitals 2022-10-03 21:28:37 -05:00
Cameron Gutman 23bc4daf9f Refactor input event handling in the Game activity 2022-10-03 21:25:43 -05:00
Kamil Szyc fd85ca2004 Added translation using Weblate (Polish) 2022-10-03 11:42:50 +02:00
Martin Dimitrov aadf88add1 Added translation using Weblate (Bulgarian) 2022-10-02 19:24:17 +02:00
sanhoe f14ce61ee3 Translated using Weblate (Korean)
Currently translated at 100.0% (225 of 225 strings)

Translation: Moonlight Game Streaming/moonlight-android
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-android/ko/
2022-09-29 12:16:23 +02:00
Cameron Gutman 539daf5789 Don't adjust maxBytesPerPicDenom and maxBitsPerMbDenom on newer devices 2022-09-23 21:27:27 -05:00
14 changed files with 265 additions and 96 deletions
+2 -2
View File
@@ -9,8 +9,8 @@ android {
minSdk 16
targetSdk 33
versionName "10.8.4"
versionCode = 293
versionName "10.9"
versionCode = 296
// Generate native debug symbols to allow Google Play to symbolicate our native crashes
ndk.debugSymbolLevel = 'FULL'
+28 -8
View File
@@ -87,10 +87,9 @@ import java.util.Locale;
public class Game extends Activity implements SurfaceHolder.Callback,
OnGenericMotionListener, OnTouchListener, NvConnectionListener, EvdevListener,
OnSystemUiVisibilityChangeListener, GameGestures, StreamView.InputCallbacks,
PerfOverlayListener, UsbDriverService.UsbDriverStateListener
{
OnGenericMotionListener, OnTouchListener, NvConnectionListener, EvdevListener,
OnSystemUiVisibilityChangeListener, GameGestures, StreamView.InputCallbacks,
PerfOverlayListener, UsbDriverService.UsbDriverStateListener, View.OnKeyListener {
private int lastButtonState = 0;
// Only 2 touches are supported
@@ -235,6 +234,7 @@ public class Game extends Activity implements SurfaceHolder.Callback,
// Listen for non-touch events on the game surface
streamView = findViewById(R.id.surfaceView);
streamView.setOnGenericMotionListener(this);
streamView.setOnKeyListener(this);
streamView.setInputCallbacks(this);
// Listen for touch events on the background touch view to enable trackpad mode
@@ -256,6 +256,13 @@ public class Game extends Activity implements SurfaceHolder.Callback,
InputDevice.SOURCE_CLASS_POSITION | // Touchpads
InputDevice.SOURCE_CLASS_TRACKBALL // Mice (pointer capture)
);
backgroundTouchView.requestUnbufferedDispatch(
InputDevice.SOURCE_CLASS_BUTTON | // Keyboards
InputDevice.SOURCE_CLASS_JOYSTICK | // Gamepads
InputDevice.SOURCE_CLASS_POINTER | // Touchscreens and mice (w/o pointer capture)
InputDevice.SOURCE_CLASS_POSITION | // Touchpads
InputDevice.SOURCE_CLASS_TRACKBALL // Mice (pointer capture)
);
// Since the OS isn't going to batch for us, we have to batch mouse events to
// avoid triggering a bug in GeForce Experience that can lead to massive latency.
@@ -269,9 +276,6 @@ public class Game extends Activity implements SurfaceHolder.Callback,
inputCaptureProvider = InputCaptureManager.getInputCaptureProvider(this, this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// The view must be focusable for pointer capture to work.
streamView.setFocusable(true);
streamView.setDefaultFocusHighlightEnabled(false);
streamView.setOnCapturedPointerListener(new View.OnCapturedPointerListener() {
@Override
public boolean onCapturedPointer(View view, MotionEvent motionEvent) {
@@ -692,7 +696,7 @@ public class Game extends Activity implements SurfaceHolder.Callback,
if (manager != null) {
Class<?>[] parameterTypes = new Class<?>[2];
parameterTypes[0] = String.class;
parameterTypes[0] = ComponentName.class;
parameterTypes[1] = boolean.class;
Method requestMetaKeyEventMethod = semWindowManager.getDeclaredMethod("requestMetaKeyEvent", parameterTypes);
requestMetaKeyEventMethod.invoke(manager, this.getComponentName(), enabled);
@@ -1909,6 +1913,10 @@ public class Game extends Activity implements SurfaceHolder.Callback,
message = getResources().getString(R.string.early_termination_error);
break;
case MoonBridge.ML_ERROR_FRAME_CONVERSION:
message = getResources().getString(R.string.frame_conversion_error);
break;
default:
message = getResources().getString(R.string.conn_terminated_msg);
break;
@@ -2189,4 +2197,16 @@ public class Game extends Activity implements SurfaceHolder.Callback,
suppressPipRefCount--;
updatePipAutoEnter();
}
@Override
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
switch (keyEvent.getAction()) {
case KeyEvent.ACTION_DOWN:
return handleKeyDown(keyEvent);
case KeyEvent.ACTION_UP:
return handleKeyUp(keyEvent);
default:
return false;
}
}
}
@@ -10,6 +10,7 @@ import org.jcodec.codecs.h264.H264Utils;
import org.jcodec.codecs.h264.io.model.SeqParameterSet;
import org.jcodec.codecs.h264.io.model.VUIParameters;
import com.limelight.BuildConfig;
import com.limelight.LimeLog;
import com.limelight.R;
import com.limelight.nvstream.av.video.VideoDecoderRenderer;
@@ -197,7 +198,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
// for even required levels of HEVC.
MediaCodecInfo hevcDecoderInfo = MediaCodecHelper.findProbableSafeDecoder("video/hevc", -1);
if (hevcDecoderInfo != null) {
if (!MediaCodecHelper.decoderIsWhitelistedForHevc(hevcDecoderInfo.getName(), meteredNetwork, prefs)) {
if (!MediaCodecHelper.decoderIsWhitelistedForHevc(hevcDecoderInfo.getName())) {
LimeLog.info("Found HEVC decoder, but it's not whitelisted - "+hevcDecoderInfo.getName());
// Force HEVC enabled if the user asked for it
@@ -1283,6 +1284,8 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
LimeLog.info("Adding bitstream restrictions");
sps.vuiParams.bitstreamRestriction = new VUIParameters.BitstreamRestriction();
sps.vuiParams.bitstreamRestriction.motionVectorsOverPicBoundariesFlag = true;
sps.vuiParams.bitstreamRestriction.maxBytesPerPicDenom = 2;
sps.vuiParams.bitstreamRestriction.maxBitsPerMbDenom = 1;
sps.vuiParams.bitstreamRestriction.log2MaxMvLengthHorizontal = 16;
sps.vuiParams.bitstreamRestriction.log2MaxMvLengthVertical = 16;
sps.vuiParams.bitstreamRestriction.numReorderFrames = 0;
@@ -1296,8 +1299,11 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
// These values are the defaults for the fields, but they are more aggressive
// than what GFE sends in 2.5.11, but it doesn't seem to cause picture problems.
sps.vuiParams.bitstreamRestriction.maxBytesPerPicDenom = 2;
sps.vuiParams.bitstreamRestriction.maxBitsPerMbDenom = 1;
// We'll leave these alone for "modern" devices just in case they care.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
sps.vuiParams.bitstreamRestriction.maxBytesPerPicDenom = 2;
sps.vuiParams.bitstreamRestriction.maxBitsPerMbDenom = 1;
}
// log2_max_mv_length_horizontal and log2_max_mv_length_vertical are set to more
// conservative values by GFE 2.5.11. We'll let those values stand.
@@ -1533,7 +1539,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
public String toString() {
String str = "";
str += "Hang time: "+hangTimeMs+" ms\n";
str += "Hang time: "+hangTimeMs+" ms"+ RendererException.DELIMITER;
str += super.toString();
return str;
@@ -1542,6 +1548,7 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
static class RendererException extends RuntimeException {
private static final long serialVersionUID = 8985937536997012406L;
protected static final String DELIMITER = BuildConfig.DEBUG ? "\n" : " | ";
private String text;
@@ -1578,42 +1585,42 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
str = "ErrorWhileStreaming";
}
str += "Format: "+String.format("%x", renderer.videoFormat)+"\n";
str += "AVC Decoder: "+((renderer.avcDecoder != null) ? renderer.avcDecoder.getName():"(none)")+"\n";
str += "HEVC Decoder: "+((renderer.hevcDecoder != null) ? renderer.hevcDecoder.getName():"(none)")+"\n";
str += "Format: "+String.format("%x", renderer.videoFormat)+DELIMITER;
str += "AVC Decoder: "+((renderer.avcDecoder != null) ? renderer.avcDecoder.getName():"(none)")+DELIMITER;
str += "HEVC Decoder: "+((renderer.hevcDecoder != null) ? renderer.hevcDecoder.getName():"(none)")+DELIMITER;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && renderer.avcDecoder != null) {
Range<Integer> avcWidthRange = renderer.avcDecoder.getCapabilitiesForType("video/avc").getVideoCapabilities().getSupportedWidths();
str += "AVC supported width range: "+avcWidthRange+"\n";
str += "AVC supported width range: "+avcWidthRange+DELIMITER;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
Range<Double> avcFpsRange = renderer.avcDecoder.getCapabilitiesForType("video/avc").getVideoCapabilities().getAchievableFrameRatesFor(renderer.initialWidth, renderer.initialHeight);
str += "AVC achievable FPS range: "+avcFpsRange+"\n";
str += "AVC achievable FPS range: "+avcFpsRange+DELIMITER;
} catch (IllegalArgumentException e) {
str += "AVC achievable FPS range: UNSUPPORTED!\n";
str += "AVC achievable FPS range: UNSUPPORTED!"+DELIMITER;
}
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && renderer.hevcDecoder != null) {
Range<Integer> hevcWidthRange = renderer.hevcDecoder.getCapabilitiesForType("video/hevc").getVideoCapabilities().getSupportedWidths();
str += "HEVC supported width range: "+hevcWidthRange+"\n";
str += "HEVC supported width range: "+hevcWidthRange+DELIMITER;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
Range<Double> hevcFpsRange = renderer.hevcDecoder.getCapabilitiesForType("video/hevc").getVideoCapabilities().getAchievableFrameRatesFor(renderer.initialWidth, renderer.initialHeight);
str += "HEVC achievable FPS range: " + hevcFpsRange + "\n";
str += "HEVC achievable FPS range: " + hevcFpsRange + DELIMITER;
} catch (IllegalArgumentException e) {
str += "HEVC achievable FPS range: UNSUPPORTED!\n";
str += "HEVC achievable FPS range: UNSUPPORTED!"+DELIMITER;
}
}
}
str += "Configured format: "+renderer.configuredFormat+"\n";
str += "Input format: "+renderer.inputFormat+"\n";
str += "Output format: "+renderer.outputFormat+"\n";
str += "Adaptive playback: "+renderer.adaptivePlayback+"\n";
str += "GL Renderer: "+renderer.glRenderer+"\n";
//str += "Build fingerprint: "+Build.FINGERPRINT+"\n";
str += "Configured format: "+renderer.configuredFormat+DELIMITER;
str += "Input format: "+renderer.inputFormat+DELIMITER;
str += "Output format: "+renderer.outputFormat+DELIMITER;
str += "Adaptive playback: "+renderer.adaptivePlayback+DELIMITER;
str += "GL Renderer: "+renderer.glRenderer+DELIMITER;
//str += "Build fingerprint: "+Build.FINGERPRINT+DELIMITER;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
str += "SOC: "+Build.SOC_MANUFACTURER+" - "+Build.SOC_MODEL+"\n";
str += "Performance class: "+Build.VERSION.MEDIA_PERFORMANCE_CLASS+"\n";
str += "SOC: "+Build.SOC_MANUFACTURER+" - "+Build.SOC_MODEL+DELIMITER;
str += "Performance class: "+Build.VERSION.MEDIA_PERFORMANCE_CLASS+DELIMITER;
/*str += "Vendor params: ";
List<String> params = renderer.videoDecoder.getSupportedVendorParameters();
if (params.isEmpty()) {
@@ -1624,35 +1631,34 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer implements C
str += param + " ";
}
}
str += "\n";*/
str += DELIMITER;*/
}
str += "Foreground: "+renderer.foreground+"\n";
str += "Consecutive crashes: "+renderer.consecutiveCrashCount+"\n";
str += "RFI active: "+renderer.refFrameInvalidationActive+"\n";
str += "Using modern SPS patching: "+(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)+"\n";
str += "Fused IDR frames: "+renderer.fusedIdrFrame+"\n";
str += "Video dimensions: "+renderer.initialWidth+"x"+renderer.initialHeight+"\n";
str += "FPS target: "+renderer.refreshRate+"\n";
str += "Bitrate: "+renderer.prefs.bitrate+" Kbps \n";
str += "CSD stats: "+renderer.numVpsIn+", "+renderer.numSpsIn+", "+renderer.numPpsIn+"\n";
str += "Frames in-out: "+renderer.numFramesIn+", "+renderer.numFramesOut+"\n";
str += "Total frames received: "+renderer.globalVideoStats.totalFramesReceived+"\n";
str += "Total frames rendered: "+renderer.globalVideoStats.totalFramesRendered+"\n";
str += "Frame losses: "+renderer.globalVideoStats.framesLost+" in "+renderer.globalVideoStats.frameLossEvents+" loss events\n";
str += "Average end-to-end client latency: "+renderer.getAverageEndToEndLatency()+"ms\n";
str += "Average hardware decoder latency: "+renderer.getAverageDecoderLatency()+"ms\n";
str += "Frame pacing mode: "+renderer.prefs.framePacing+"\n";
str += "Consecutive crashes: "+renderer.consecutiveCrashCount+DELIMITER;
str += "RFI active: "+renderer.refFrameInvalidationActive+DELIMITER;
str += "Using modern SPS patching: "+(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)+DELIMITER;
str += "Fused IDR frames: "+renderer.fusedIdrFrame+DELIMITER;
str += "Video dimensions: "+renderer.initialWidth+"x"+renderer.initialHeight+DELIMITER;
str += "FPS target: "+renderer.refreshRate+DELIMITER;
str += "Bitrate: "+renderer.prefs.bitrate+" Kbps"+DELIMITER;
str += "CSD stats: "+renderer.numVpsIn+", "+renderer.numSpsIn+", "+renderer.numPpsIn+DELIMITER;
str += "Frames in-out: "+renderer.numFramesIn+", "+renderer.numFramesOut+DELIMITER;
str += "Total frames received: "+renderer.globalVideoStats.totalFramesReceived+DELIMITER;
str += "Total frames rendered: "+renderer.globalVideoStats.totalFramesRendered+DELIMITER;
str += "Frame losses: "+renderer.globalVideoStats.framesLost+" in "+renderer.globalVideoStats.frameLossEvents+" loss events"+DELIMITER;
str += "Average end-to-end client latency: "+renderer.getAverageEndToEndLatency()+"ms"+DELIMITER;
str += "Average hardware decoder latency: "+renderer.getAverageDecoderLatency()+"ms"+DELIMITER;
str += "Frame pacing mode: "+renderer.prefs.framePacing+DELIMITER;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (originalException instanceof CodecException) {
CodecException ce = (CodecException) originalException;
str += "Diagnostic Info: "+ce.getDiagnosticInfo()+"\n";
str += "Recoverable: "+ce.isRecoverable()+"\n";
str += "Transient: "+ce.isTransient()+"\n";
str += "Diagnostic Info: "+ce.getDiagnosticInfo()+DELIMITER;
str += "Recoverable: "+ce.isRecoverable()+DELIMITER;
str += "Transient: "+ce.isTransient()+DELIMITER;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
str += "Codec Error Code: "+ce.getErrorCode()+"\n";
str += "Codec Error Code: "+ce.getErrorCode()+DELIMITER;
}
}
}
@@ -31,7 +31,6 @@ public class MediaCodecHelper {
private static final List<String> blacklistedDecoderPrefixes;
private static final List<String> spsFixupBitstreamFixupDecoderPrefixes;
private static final List<String> blacklistedAdaptivePlaybackPrefixes;
private static final List<String> deprioritizedHevcDecoders;
private static final List<String> baselineProfileHackPrefixes;
private static final List<String> directSubmitPrefixes;
private static final List<String> constrainedHighProfilePrefixes;
@@ -71,7 +70,10 @@ public class MediaCodecHelper {
static {
refFrameInvalidationAvcPrefixes = new LinkedList<>();
refFrameInvalidationHevcPrefixes = new LinkedList<>();
refFrameInvalidationHevcPrefixes.add("omx.exynos");
refFrameInvalidationHevcPrefixes.add("c2.exynos");
// Qualcomm and NVIDIA may be added at runtime
}
@@ -195,14 +197,6 @@ public class MediaCodecHelper {
// during initialization to avoid SoCs with broken HEVC decoders.
}
static {
deprioritizedHevcDecoders = new LinkedList<>();
// These are decoders that work but aren't used by default for various reasons.
// Qualcomm is currently the only decoders in this group.
}
static {
useFourSlicesPrefixes = new LinkedList<>();
@@ -325,19 +319,15 @@ public class MediaCodecHelper {
// Tegra K1 and later can do reference frame invalidation properly
if (configInfo.reqGlEsVersion >= 0x30000) {
LimeLog.info("Added omx.nvidia to AVC reference frame invalidation support list");
LimeLog.info("Added omx.nvidia to reference frame invalidation support list");
refFrameInvalidationAvcPrefixes.add("omx.nvidia");
refFrameInvalidationHevcPrefixes.add("omx.nvidia");
LimeLog.info("Added omx.qcom/c2.qti to AVC reference frame invalidation support list");
LimeLog.info("Added omx.qcom/c2.qti to reference frame invalidation support list");
refFrameInvalidationAvcPrefixes.add("omx.qcom");
refFrameInvalidationHevcPrefixes.add("omx.qcom");
refFrameInvalidationAvcPrefixes.add("c2.qti");
// Prior to M, we were tricking the decoder into using baseline profile, which
// won't support RFI properly.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
LimeLog.info("Added omx.intel to AVC reference frame invalidation support list");
refFrameInvalidationAvcPrefixes.add("omx.intel");
}
refFrameInvalidationHevcPrefixes.add("c2.qti");
}
// Qualcomm's early HEVC decoders break hard on our HEVC stream. The best check to
@@ -349,13 +339,9 @@ public class MediaCodecHelper {
// (see comment on isGLES31SnapdragonRenderer).
//
if (isGLES31SnapdragonRenderer(glRenderer)) {
// We prefer reference frame invalidation support (which is only doable on AVC on
// older Qualcomm chips) vs. enabling HEVC by default. The user can override using the settings
// to force HEVC on. If HDR or mobile data will be used, we'll override this and use
// HEVC anyway.
LimeLog.info("Added omx.qcom/c2.qti to deprioritized HEVC decoders based on GLES 3.1+ support");
deprioritizedHevcDecoders.add("omx.qcom");
deprioritizedHevcDecoders.add("c2.qti");
LimeLog.info("Added omx.qcom/c2.qti to HEVC decoders based on GLES 3.1+ support");
whitelistedHevcDecoders.add("omx.qcom");
whitelistedHevcDecoders.add("c2.qti");
}
else {
blacklistedDecoderPrefixes.add("OMX.qcom.video.decoder.hevc");
@@ -616,7 +602,7 @@ public class MediaCodecHelper {
return isDecoderInList(refFrameInvalidationHevcPrefixes, decoderName);
}
public static boolean decoderIsWhitelistedForHevc(String decoderName, boolean meteredData, PreferenceConfiguration prefs) {
public static boolean decoderIsWhitelistedForHevc(String decoderName) {
// Google didn't have official support for HEVC (or more importantly, a CTS test) until
// Lollipop. I've seen some MediaTek devices on 4.4 crash when attempting to use HEVC,
// so I'm restricting HEVC usage to Lollipop and higher.
@@ -634,21 +620,6 @@ public class MediaCodecHelper {
return false;
}
// Some devices have HEVC decoders that we prefer not to use
// typically because it can't support reference frame invalidation.
// However, we will use it for HDR and for streaming over mobile networks
// since it works fine otherwise. We will also use it for 4K because RFI
// is currently disabled due to issues with video corruption.
if (isDecoderInList(deprioritizedHevcDecoders, decoderName)) {
if (meteredData || (prefs.width == 3840 && prefs.height == 2160)) {
LimeLog.info("Selected deprioritized decoder");
return true;
}
else {
return false;
}
}
return isDecoderInList(whitelistedHevcDecoders, decoderName);
}
@@ -45,6 +45,7 @@ public class MoonBridge {
public static final int ML_ERROR_NO_VIDEO_FRAME = -101;
public static final int ML_ERROR_UNEXPECTED_EARLY_TERMINATION = -102;
public static final int ML_ERROR_PROTECTED_CONTENT = -103;
public static final int ML_ERROR_FRAME_CONVERSION = -104;
public static final int ML_PORT_INDEX_TCP_47984 = 0;
public static final int ML_PORT_INDEX_TCP_47989 = 1;
+7 -1
View File
@@ -14,7 +14,13 @@
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
android:layout_gravity="center"
android:focusable="true"
android:focusableInTouchMode="true"
android:focusedByDefault="true"
android:defaultFocusHighlightEnabled="false">
<requestFocus />
</com.limelight.ui.StreamView>
<TextView
android:id="@+id/performanceOverlay"
+144
View File
@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pair_incorrect_pin">Неправилен ПИН</string>
<string name="no_video_received_error">Няма получено видео от хоста.</string>
<string name="pacing_latency">Предпочитане на най-ниската латентност</string>
<string name="pacing_balanced_alt">Балансирано с FPS лимит</string>
<string name="pacing_smoothness">Предпочитане на най-плавно видео (може значително да увеличи латентността)</string>
<string name="conn_metered">Предупреждение: Вашата активна мрежова връзка се измерва!</string>
<string name="conn_client_latency_hw">латентност на хардуерния декодер:</string>
<string name="conn_hardware_latency">Средна латентност на хардуерно декодиране:</string>
<string name="ip_hint">IP адрес на GeForce PC</string>
<string name="pcview_menu_send_wol">Изпращане на Wake-On-LAN заявка</string>
<string name="pcview_menu_delete_pc">Изтрий компютъра</string>
<string name="pcview_menu_test_network">Тестване на мрежовата връзка</string>
<string name="pcview_menu_details">Детайли</string>
<string name="nettest_title_waiting">Тестване на мрежовата връзка</string>
<string name="nettest_title_done">Тестът на мрежата е завършен</string>
<string name="pairing">Сдвояване…</string>
<string name="pair_pc_offline">Компютърът е офлайн</string>
<string name="pair_pc_ingame">Компютърът в момента е в игра. Трябва да затворите играта преди сдвояване.</string>
<string name="pair_pairing_title">Сдвояване</string>
<string name="wol_waking_pc">Събуждащ се компютъра…</string>
<string name="unpair_fail">Неуспешно раздвояване</string>
<string name="unpair_error">Устройството не беше сдвоено</string>
<string name="error_pc_offline">Компютърът е офлайн</string>
<string name="title_decoding_error">Видеодекодерът крашна</string>
<string name="no_frame_received_error">Мрежовата ви връзка не работи добре. Намалете настройката си за битрейт на видео или опитайте с по-бърза връзка.</string>
<string name="conn_client_latency">Средна латентност при декодиране на кадър:</string>
<string name="conn_starting">Стартиране</string>
<string name="conn_terminated_title">Връзката е прекратена</string>
<string name="yes">Да</string>
<string name="applist_menu_hide_app">Скриване на приложението</string>
<string name="applist_refresh_title">Списък с приложения</string>
<string name="summary_resolution_list">Увеличете, за да подобрите яснотата на изображението. Намалете за по-добра производителност на устройства от по-нисък клас и по-бавни мрежи.</string>
<string name="title_fps_list">Кадрова честота на видео</string>
<string name="scut_deleted_pc">Компютърът е изтрит</string>
<string name="scut_not_paired">Компютърът не е сдвоен</string>
<string name="scut_pc_not_found">Компютърът не е намерен</string>
<string name="scut_invalid_uuid">Предоставеният компютър не е валиден</string>
<string name="scut_invalid_app_id">Предоставеното приложение не е валидно</string>
<string name="help_loading_msg">Помощната страница се зарежда…</string>
<string name="help_loading_title">Помощ</string>
<string name="pcview_menu_header_online">Онлайн</string>
<string name="pcview_menu_header_unknown">Презареждане</string>
<string name="pcview_menu_pair_pc">Сдвояване с компютър</string>
<string name="pcview_menu_header_offline">Извън линия</string>
<string name="pcview_menu_app_list">Вижте Всички Приложения</string>
<string name="pcview_menu_unpair_pc">Раздвояване</string>
<string name="nettest_text_waiting">Moonlight тества вашата мрежова връзка, за да определи дали NVIDIA GameStream е блокиран.
\n
\nТова може да отнеме няколко секунди…</string>
<string name="nettest_text_success">Вашата мрежа изглежда не блокира Moonlight. Ако все още имате проблеми със свързването, проверете настройките на защитната стена на вашия компютър.
\n
\nАко се опитвате да стриймвате през интернет, инсталирайте Moonlight Internet Hosting Tool на вашия компютър и стартирайте включения тестер за интернет стрийминг, за да проверите интернет връзката на вашия компютър.</string>
<string name="nettest_text_inconclusive">Мрежовият тест не можа да бъде извършен, защото нито един от сървърите за тестване на връзката на Moonlight не е достъпен. Проверете връзката си с интернет или опитайте отново по-късно.</string>
<string name="nettest_text_failure">Текущата мрежова връзка на вашето устройство изглежда блокира Moonlight. Стриймването през интернет може да не работи, докато сте свързани към тази мрежа.
\n
\nСледните мрежови портове са блокирани:
\n</string>
<string name="nettest_text_blocked">Текущата мрежова връзка на вашето устройство блокира Moonlight. Стриймването през интернет може да не работи, докато сте свързани към тази мрежа.</string>
<string name="pair_pairing_msg">Моля, въведете следния ПИН на избрания компютър:</string>
<string name="pair_fail">Неуспешно сдвояване</string>
<string name="pair_already_in_progress">Сдвояването вече е в ход</string>
<string name="wol_pc_online">Компютърът е онлайн</string>
<string name="wol_no_mac">Компютърът не може да бъде събуден, защото GFE не изпрати MAC адрес</string>
<string name="wol_fail">Неуспешно изпращане на Wake-On-LAN пакети</string>
<string name="wol_waking_msg">Може да отнеме няколко секунди, докато вашият компютър се събуди. Ако не стане, уверете се, че е конфигуриран правилно за Wake-On-LAN.</string>
<string name="unpairing">Раздвояване…</string>
<string name="unpair_success">Раздвояването бе успешно</string>
<string name="video_decoder_init_failed">Видео декодерът не успя да се инициализира. Вашето устройство може да не поддържа избраната резолюция или честота.</string>
<string name="error_manager_not_running">Услугата ComputerManager не работи. Моля, изчакайте няколко секунди или рестартирайте приложението.</string>
<string name="error_404">GFE върна грешка HTTP 404. Уверете се, че вашият компютър има поддръжана видео карта. Използването на софтуер за отдалечен работен плот също може да причини тази грешка. Опитайте да рестартирате машината си или да преинсталирате GFE.</string>
<string name="message_decoding_error">Moonlight претърпя срив поради несъвместимост с видеодекодера на това устройство. Уверете се, че GeForce Experience е актуализиран до най-новата версия на вашия компютър. Опитайте да коригирате настройките за стриймване, ако сривовете продължат.</string>
<string name="title_decoding_reset">Нулиране на видео настройките</string>
<string name="message_decoding_reset">Видео декодерът на вашето устройство продължава да се срива при избраните от вас настройки за стриймване. Настройките са нулирани по подразбиране.</string>
<string name="audioconf_stereo">Стерео</string>
<string name="applist_refresh_msg">Приложенията се опресняват…</string>
<string name="error_usb_prohibited">USB достъпът е забранен от администратора на вашето устройство. Проверете настройките на Knox или MDM.</string>
<string name="audioconf_71surround">7.1 съраунд звук</string>
<string name="audioconf_51surround">5.1 съраунд звук</string>
<string name="videoformat_hevcauto">Автоматично</string>
<string name="videoformat_hevcalways">Винаги използване на HEVC (може да крашне)</string>
<string name="videoformat_hevcnever">Никога да не се използва HEVC</string>
<string name="summary_frame_pacing">Посочете как да се балансира забавянето и плавността на видеото</string>
<string name="title_frame_pacing">Стъпка на видео кадрите</string>
<string name="pacing_balanced">Балансирано</string>
<string name="check_ports_msg">Проверете вашата защитна стена и правилата за препращане на портове за порт(ове):</string>
<string name="conn_establishing_title">Установяване на връзка</string>
<string name="conn_establishing_msg">Стартиране на връзка</string>
<string name="conn_error_msg">Неуспешно стартиране</string>
<string name="conn_terminated_msg">Връзката беше прекратена</string>
<string name="conn_error_title">Грешка при свързване</string>
<string name="no">Не</string>
<string name="help">Помощ</string>
<string name="lost_connection">Загубена връзка с компютър</string>
<string name="title_details">Подробности</string>
<string name="delete_pc_msg">Сигурни ли сте, че искате да изтриете този компютър\?</string>
<string name="poor_connection_msg">Лоша връзка с компютъра</string>
<string name="perf_overlay_streamdetails">Видео поток: %1$s %2$.2f FPS</string>
<string name="perf_overlay_decoder">Декодер: %1$s</string>
<string name="perf_overlay_netdrops">Кадри, пропуснати от вашата мрежова връзка: %1$.2f%%</string>
<string name="perf_overlay_incomingfps">Входяща честота на кадрите от мрежата: %1$.2f FPS</string>
<string name="perf_overlay_netlatency">Средно забавяне на мрежата: %1$d ms (variance: %2$d ms)</string>
<string name="applist_connect_msg">Свързване с компютъра…</string>
<string name="perf_overlay_renderingfps">Кадрова честота на изобразяване: %1$.2f FPS</string>
<string name="perf_overlay_dectime">Средно време за декодиране: %1$.2f ms</string>
<string name="applist_menu_quit">Прекратяване на сесията</string>
<string name="msg_add_pc">Свързване към компютъра…</string>
<string name="applist_menu_resume">Възобновяване на сесията</string>
<string name="applist_menu_quit_and_start">Изключване на текущата игра и стартиране</string>
<string name="applist_menu_cancel">Отказ</string>
<string name="applist_menu_details">Виж детайлите</string>
<string name="applist_menu_scut">Създаване на пряк път</string>
<string name="applist_refresh_error_title">Грешка</string>
<string name="applist_menu_tv_channel">Добавяне към канал</string>
<string name="applist_refresh_error_msg">Неуспешно получаване на списък с приложения</string>
<string name="applist_quit_success">Успешно изключване</string>
<string name="applist_quit_app">Изключване</string>
<string name="applist_quit_fail">Неуспешно изключване</string>
<string name="applist_details_id">ID на приложението:</string>
<string name="applist_quit_confirmation">Сигурни ли сте, че искате да затворите работещото приложение\? Всички незапазени данни ще бъдат загубени.</string>
<string name="title_add_pc">Ръчно добавяне на компютър</string>
<string name="addpc_fail">Неуспешна връзка с посочения компютър. Уверете се, че необходимите портове са разрешени през защитната стена.</string>
<string name="category_basic_settings">Основни настройки</string>
<string name="addpc_success">Успешно добавен компютър</string>
<string name="addpc_enter_ip">Трябва да въведете IP адрес</string>
<string name="addpc_wrong_sitelocal">Този адрес не изглежда правилен. Трябва да използвате публичния IP адрес на вашия рутер за стриймване през интернет.</string>
<string name="title_resolution_list">Видео резолюция</string>
<string name="summary_fps_list">Увеличете за по-плавен видео поток. Намалете за по-добра производителност на устройства от по-нисък клас.</string>
<string name="title_seekbar_bitrate">Видео битрейт</string>
<string name="suffix_seekbar_bitrate_mbps">Mbps</string>
<string name="title_audio_config_list">Конфигурация на съраунд звук</string>
<string name="summary_audio_config_list">Активиране на 5.1 или 7.1 съраунд звук за системи за домашно кино</string>
<string name="summary_seekbar_bitrate">Увеличете за по-добро качество на изображението. Намалете, за да подобрите производителността при по-бавни връзки.</string>
<string name="resolution_prefix_native_portrait">(Портрет)</string>
<string name="title_checkbox_enable_audiofx">Активиране на поддръжката на системния еквалайзер</string>
<string name="title_checkbox_stretch_video">Разтегляне на видеото на цял екран</string>
<string name="resolution_prefix_native_landscape">(Пейзаж)</string>
<string name="category_audio_settings">Аудио настройки</string>
<string name="category_input_settings">Настройки за въвеждане</string>
<string name="title_checkbox_touchscreen_trackpad">Използване на сензорния екран като тракпад</string>
<string name="title_checkbox_multi_controller">Автоматично откриване на наличен контролер</string>
<string name="summary_checkbox_multi_controller">Премахването на отметката от тази опция принуждава контролер винаги да присъства</string>
</resources>
+3
View File
@@ -259,4 +259,7 @@
<string name="title_checkbox_reduce_refresh_rate">Aktualisierungsrate verringern erlauben</string>
<string name="summary_checkbox_reduce_refresh_rate">Durch das Verringern der Display Aktualisierungsrate, kann, auf Kosten der Video-Latenz, der Akkuverbrauch reduziert werden</string>
<string name="resolution_prefix_native_landscape">(Landscape)</string>
<string name="frame_conversion_error">Der Host-PC hat einen schwerwiegenden Videocodierungsfehler gemeldet.
\n
\nVersuchen Sie, den HDR-Modus zu deaktivieren, die Streaming-Auflösung zu ändern oder die Bildschirmauflösung des Host-PCs zu ändern.</string>
</resources>
+4
View File
@@ -255,4 +255,8 @@
<string name="title_frame_pacing">비디오 프레임 처리방식</string>
<string name="pacing_smoothness">가장 부드러운 비디오 선호(대기 시간이 크게 증가할 수 있음)</string>
<string name="category_help">도움말</string>
<string name="resolution_prefix_native_landscape">(가로)</string>
<string name="resolution_prefix_native_portrait">(세로)</string>
<string name="title_checkbox_reduce_refresh_rate">주사율 감소 허용</string>
<string name="summary_checkbox_reduce_refresh_rate">화면 주사율을 낮춰서 영상 지연 시간이 증가하고 전력을 절약할 수 있습니다.</string>
</resources>
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="scut_deleted_pc">PC usunięty</string>
<string name="scut_pc_not_found">PC nie znaleziony</string>
<string name="pcview_menu_header_unknown">Odświeżanie</string>
<string name="scut_not_paired">PC niesparowany</string>
</resources>
+1
View File
@@ -74,6 +74,7 @@
<string name="no_video_received_error">No video received from host.</string>
<string name="no_frame_received_error">Your network connection isn\'t performing well. Reduce your video bitrate setting or try a faster connection.</string>
<string name="early_termination_error">Something went wrong on your host PC when starting the stream.\n\nMake sure you don\'t have any DRM-protected content open on your host PC. You can also try restarting your host PC.\n\nIf the issue persists, try reinstalling your GPU drivers and GeForce Experience.</string>
<string name="frame_conversion_error">The host PC reported a fatal video encoding error.\n\nTry disabling HDR mode, changing the streaming resolution, or changing your host PC\'s display resolution.</string>
<string name="check_ports_msg">Check your firewall and port forwarding rules for port(s):</string>
<!-- Start application messages -->
+1 -1
View File
@@ -5,7 +5,7 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath 'com.android.tools.build:gradle:7.2.2'
}
}
@@ -0,0 +1,6 @@
- Qualcomm devices now use HEVC by default for improved efficiency
- Added system key capture on Samsung devices running Android 10 or later
- Improved frame loss handling when using HEVC
- Fixed streaming crash on devices running Android 4.1 to 4.4
- Fixed streaming at resolutions below 720x540 with GeForce Experience 3.26
- Updated community contributed translations from Weblate