Only apply the constrained high profile SPS modification to Intel devices to avoid crashing other devices

This commit is contained in:
Cameron Gutman 2015-10-12 20:54:50 -07:00
parent 1d9efb30e2
commit 2f219aac6f
2 changed files with 22 additions and 12 deletions

View File

@ -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;
} }

View File

@ -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();
} }