Merge "MediaCodecInfo: consider only critical flags for level support check"
This commit is contained in:
@@ -934,13 +934,25 @@ public final class MediaCodecInfo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
levelCaps = createFromProfileLevel(mMime, profile, maxLevel);
|
levelCaps = createFromProfileLevel(mMime, profile, maxLevel);
|
||||||
// remove profile from this format otherwise levelCaps.isFormatSupported will
|
// We must remove the profile from this format otherwise levelCaps.isFormatSupported
|
||||||
// get into this same conditon and loop forever.
|
// will get into this same condition and loop forever. Furthermore, since levelCaps
|
||||||
Map<String, Object> mapWithoutProfile = new HashMap<>(map);
|
// does not contain features and bitrate specific keys, keep only keys relevant for
|
||||||
mapWithoutProfile.remove(MediaFormat.KEY_PROFILE);
|
// a level check.
|
||||||
MediaFormat formatWithoutProfile = new MediaFormat(mapWithoutProfile);
|
Map<String, Object> levelCriticalFormatMap = new HashMap<>(map);
|
||||||
if (levelCaps != null && !levelCaps.isFormatSupported(formatWithoutProfile)) {
|
final Set<String> criticalKeys =
|
||||||
return false;
|
isVideo() ? VideoCapabilities.VIDEO_LEVEL_CRITICAL_FORMAT_KEYS :
|
||||||
|
isAudio() ? AudioCapabilities.AUDIO_LEVEL_CRITICAL_FORMAT_KEYS :
|
||||||
|
null;
|
||||||
|
|
||||||
|
// critical keys will always contain KEY_MIME, but should also contain others to be
|
||||||
|
// meaningful
|
||||||
|
if (criticalKeys != null && criticalKeys.size() > 1 && levelCaps != null) {
|
||||||
|
levelCriticalFormatMap.keySet().retainAll(criticalKeys);
|
||||||
|
|
||||||
|
MediaFormat levelCriticalFormat = new MediaFormat(levelCriticalFormatMap);
|
||||||
|
if (!levelCaps.isFormatSupported(levelCriticalFormat)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mAudioCaps != null && !mAudioCaps.supportsFormat(format)) {
|
if (mAudioCaps != null && !mAudioCaps.supportsFormat(format)) {
|
||||||
@@ -1633,6 +1645,16 @@ public final class MediaCodecInfo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* package private */
|
||||||
|
// must not contain KEY_PROFILE
|
||||||
|
static final Set<String> AUDIO_LEVEL_CRITICAL_FORMAT_KEYS = Set.of(
|
||||||
|
// We don't set level-specific limits for audio codecs today. Key candidates would
|
||||||
|
// be sample rate, bit rate or channel count.
|
||||||
|
// MediaFormat.KEY_SAMPLE_RATE,
|
||||||
|
// MediaFormat.KEY_CHANNEL_COUNT,
|
||||||
|
// MediaFormat.KEY_BIT_RATE,
|
||||||
|
MediaFormat.KEY_MIME);
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
public boolean supportsFormat(MediaFormat format) {
|
public boolean supportsFormat(MediaFormat format) {
|
||||||
Map<String, Object> map = format.getMap();
|
Map<String, Object> map = format.getMap();
|
||||||
@@ -2357,6 +2379,15 @@ public final class MediaCodecInfo {
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* package private */
|
||||||
|
// must not contain KEY_PROFILE
|
||||||
|
static final Set<String> VIDEO_LEVEL_CRITICAL_FORMAT_KEYS = Set.of(
|
||||||
|
MediaFormat.KEY_WIDTH,
|
||||||
|
MediaFormat.KEY_HEIGHT,
|
||||||
|
MediaFormat.KEY_FRAME_RATE,
|
||||||
|
MediaFormat.KEY_BIT_RATE,
|
||||||
|
MediaFormat.KEY_MIME);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @hide
|
* @hide
|
||||||
* @throws java.lang.ClassCastException */
|
* @throws java.lang.ClassCastException */
|
||||||
|
|||||||
Reference in New Issue
Block a user