mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-21 03:52:48 +00:00
Only apply the constrained high profile SPS modification to Intel devices to avoid crashing other devices
This commit is contained in:
parent
1d9efb30e2
commit
2f219aac6f
@ -31,6 +31,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer {
|
|||||||
private final boolean needsSpsBitstreamFixup, isExynos4;
|
private final boolean needsSpsBitstreamFixup, isExynos4;
|
||||||
private VideoDepacketizer depacketizer;
|
private VideoDepacketizer depacketizer;
|
||||||
private final boolean adaptivePlayback, directSubmit;
|
private final boolean adaptivePlayback, directSubmit;
|
||||||
|
private final boolean constrainedHighProfile;
|
||||||
private int initialWidth, initialHeight;
|
private int initialWidth, initialHeight;
|
||||||
|
|
||||||
private boolean needsBaselineSpsHack;
|
private boolean needsBaselineSpsHack;
|
||||||
@ -56,7 +57,8 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer {
|
|||||||
if (decoder == null) {
|
if (decoder == null) {
|
||||||
// This case is handled later in setup()
|
// This case is handled later in setup()
|
||||||
needsSpsBitstreamFixup = isExynos4 =
|
needsSpsBitstreamFixup = isExynos4 =
|
||||||
adaptivePlayback = directSubmit = false;
|
adaptivePlayback = directSubmit =
|
||||||
|
constrainedHighProfile = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,6 +69,7 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer {
|
|||||||
adaptivePlayback = MediaCodecHelper.decoderSupportsAdaptivePlayback(decoderName, decoder);
|
adaptivePlayback = MediaCodecHelper.decoderSupportsAdaptivePlayback(decoderName, decoder);
|
||||||
needsSpsBitstreamFixup = MediaCodecHelper.decoderNeedsSpsBitstreamRestrictions(decoderName, decoder);
|
needsSpsBitstreamFixup = MediaCodecHelper.decoderNeedsSpsBitstreamRestrictions(decoderName, decoder);
|
||||||
needsBaselineSpsHack = MediaCodecHelper.decoderNeedsBaselineSpsHack(decoderName, decoder);
|
needsBaselineSpsHack = MediaCodecHelper.decoderNeedsBaselineSpsHack(decoderName, decoder);
|
||||||
|
constrainedHighProfile = MediaCodecHelper.decoderNeedsConstrainedHighProfile(decoderName, decoder);
|
||||||
isExynos4 = MediaCodecHelper.isExynos4Device();
|
isExynos4 = MediaCodecHelper.isExynos4Device();
|
||||||
if (needsSpsBitstreamFixup) {
|
if (needsSpsBitstreamFixup) {
|
||||||
LimeLog.info("Decoder "+decoderName+" needs SPS bitstream restrictions fixup");
|
LimeLog.info("Decoder "+decoderName+" needs SPS bitstream restrictions fixup");
|
||||||
@ -74,6 +77,9 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer {
|
|||||||
if (needsBaselineSpsHack) {
|
if (needsBaselineSpsHack) {
|
||||||
LimeLog.info("Decoder "+decoderName+" needs baseline SPS hack");
|
LimeLog.info("Decoder "+decoderName+" needs baseline SPS hack");
|
||||||
}
|
}
|
||||||
|
if (constrainedHighProfile) {
|
||||||
|
LimeLog.info("Decoder "+decoderName+" needs constrained high profile");
|
||||||
|
}
|
||||||
if (isExynos4) {
|
if (isExynos4) {
|
||||||
LimeLog.info("Decoder "+decoderName+" is on Exynos 4");
|
LimeLog.info("Decoder "+decoderName+" is on Exynos 4");
|
||||||
}
|
}
|
||||||
@ -535,21 +541,17 @@ public class MediaCodecDecoderRenderer extends EnhancedDecoderRenderer {
|
|||||||
sps.vuiParams.bitstreamRestriction = null;
|
sps.vuiParams.bitstreamRestriction = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set constraint flags 4 & 5 to make this Constrained High Profile
|
// Some devices benefit from setting constraint flags 4 & 5 to make this Constrained
|
||||||
// which allows the decoder to assume there will be no B-frames and
|
// High Profile which allows the decoder to assume there will be no B-frames and
|
||||||
// reduce delay and buffering accordingly.
|
// reduce delay and buffering accordingly. Some devices (Marvell, Exynos 4) don't
|
||||||
//
|
// like it so we only set them on devices that are confirmed to benefit from it.
|
||||||
// This profile is fairly new (standardized in H264 revision 2012-06) and
|
if (constrainedHighProfile) {
|
||||||
// it's known that at least some devices don't like these previously unused
|
LimeLog.info("Setting constraint set flags for constrained high profile");
|
||||||
// constraints being set. To minimize the chance of interfering with old devices,
|
|
||||||
// I'm only setting these on KitKat or higher. It's an arbitrary limitation and could
|
|
||||||
// change if it causes problems.
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
|
||||||
sps.constraint_set_4_flag = true;
|
sps.constraint_set_4_flag = true;
|
||||||
sps.constraint_set_5_flag = true;
|
sps.constraint_set_5_flag = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Force the constraints unset for < 4.4 (some may be set by default)
|
// Force the constraints unset otherwise (some may be set by default)
|
||||||
sps.constraint_set_4_flag = false;
|
sps.constraint_set_4_flag = false;
|
||||||
sps.constraint_set_5_flag = false;
|
sps.constraint_set_5_flag = false;
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ public class MediaCodecHelper {
|
|||||||
private static final List<String> whitelistedAdaptiveResolutionPrefixes;
|
private static final List<String> whitelistedAdaptiveResolutionPrefixes;
|
||||||
private static final List<String> baselineProfileHackPrefixes;
|
private static final List<String> baselineProfileHackPrefixes;
|
||||||
private static final List<String> directSubmitPrefixes;
|
private static final List<String> directSubmitPrefixes;
|
||||||
|
private static final List<String> constrainedHighProfilePrefixes;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
directSubmitPrefixes = new LinkedList<String>();
|
directSubmitPrefixes = new LinkedList<String>();
|
||||||
@ -68,6 +69,9 @@ public class MediaCodecHelper {
|
|||||||
whitelistedAdaptiveResolutionPrefixes.add("omx.qcom");
|
whitelistedAdaptiveResolutionPrefixes.add("omx.qcom");
|
||||||
whitelistedAdaptiveResolutionPrefixes.add("omx.sec");
|
whitelistedAdaptiveResolutionPrefixes.add("omx.sec");
|
||||||
whitelistedAdaptiveResolutionPrefixes.add("omx.TI");
|
whitelistedAdaptiveResolutionPrefixes.add("omx.TI");
|
||||||
|
|
||||||
|
constrainedHighProfilePrefixes = new LinkedList<String>();
|
||||||
|
constrainedHighProfilePrefixes.add("omx.intel");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isDecoderInList(List<String> decoderList, String decoderName) {
|
private static boolean isDecoderInList(List<String> decoderList, String decoderName) {
|
||||||
@ -116,6 +120,10 @@ public class MediaCodecHelper {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean decoderNeedsConstrainedHighProfile(String decoderName, MediaCodecInfo decoderInfo) {
|
||||||
|
return isDecoderInList(constrainedHighProfilePrefixes, decoderName);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean decoderCanDirectSubmit(String decoderName, MediaCodecInfo decoderInfo) {
|
public static boolean decoderCanDirectSubmit(String decoderName, MediaCodecInfo decoderInfo) {
|
||||||
return isDecoderInList(directSubmitPrefixes, decoderName) && !isExynos4Device();
|
return isDecoderInList(directSubmitPrefixes, decoderName) && !isExynos4Device();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user