Detect HEVC HDR10 codec profile more accurately
In MediaCodecUtil, use Format.colorInfo, besides the codec string, to accurately map to a 10bit HEVC profile. PiperOrigin-RevId: 507500071
This commit is contained in:
parent
f630315af5
commit
a50ea94525
@ -35,6 +35,9 @@
|
|||||||
* Fix bug where some playbacks fail when tunneling is enabled and
|
* Fix bug where some playbacks fail when tunneling is enabled and
|
||||||
`AudioProcessors` are active, e.g. for gapless trimming
|
`AudioProcessors` are active, e.g. for gapless trimming
|
||||||
([#10847](https://github.com/google/ExoPlayer/issues/10847)).
|
([#10847](https://github.com/google/ExoPlayer/issues/10847)).
|
||||||
|
* Video:
|
||||||
|
* Map HEVC HDR10 format to `HEVCProfileMain10HDR10` instead of
|
||||||
|
`HEVCProfileMain10`.
|
||||||
* Text:
|
* Text:
|
||||||
* Fix `TextRenderer` passing an invalid (negative) index to
|
* Fix `TextRenderer` passing an invalid (negative) index to
|
||||||
`Subtitle.getEventTime` if a subtitle file contains no cues.
|
`Subtitle.getEventTime` if a subtitle file contains no cues.
|
||||||
|
@ -252,7 +252,7 @@ public final class MediaCodecUtil {
|
|||||||
return getVp9ProfileAndLevel(format.codecs, parts);
|
return getVp9ProfileAndLevel(format.codecs, parts);
|
||||||
case CODEC_ID_HEV1:
|
case CODEC_ID_HEV1:
|
||||||
case CODEC_ID_HVC1:
|
case CODEC_ID_HVC1:
|
||||||
return getHevcProfileAndLevel(format.codecs, parts);
|
return getHevcProfileAndLevel(format.codecs, parts, format.colorInfo);
|
||||||
case CODEC_ID_AV01:
|
case CODEC_ID_AV01:
|
||||||
return getAv1ProfileAndLevel(format.codecs, parts, format.colorInfo);
|
return getAv1ProfileAndLevel(format.codecs, parts, format.colorInfo);
|
||||||
case CODEC_ID_MP4A:
|
case CODEC_ID_MP4A:
|
||||||
@ -731,7 +731,8 @@ public final class MediaCodecUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static Pair<Integer, Integer> getHevcProfileAndLevel(String codec, String[] parts) {
|
private static Pair<Integer, Integer> getHevcProfileAndLevel(
|
||||||
|
String codec, String[] parts, @Nullable ColorInfo colorInfo) {
|
||||||
if (parts.length < 4) {
|
if (parts.length < 4) {
|
||||||
// The codec has fewer parts than required by the HEVC codec string format.
|
// The codec has fewer parts than required by the HEVC codec string format.
|
||||||
Log.w(TAG, "Ignoring malformed HEVC codec string: " + codec);
|
Log.w(TAG, "Ignoring malformed HEVC codec string: " + codec);
|
||||||
@ -748,7 +749,15 @@ public final class MediaCodecUtil {
|
|||||||
if ("1".equals(profileString)) {
|
if ("1".equals(profileString)) {
|
||||||
profile = CodecProfileLevel.HEVCProfileMain;
|
profile = CodecProfileLevel.HEVCProfileMain;
|
||||||
} else if ("2".equals(profileString)) {
|
} else if ("2".equals(profileString)) {
|
||||||
profile = CodecProfileLevel.HEVCProfileMain10;
|
if (colorInfo != null && colorInfo.colorTransfer == C.COLOR_TRANSFER_ST2084) {
|
||||||
|
profile = CodecProfileLevel.HEVCProfileMain10HDR10;
|
||||||
|
} else {
|
||||||
|
// For all other cases, we map to the Main10 profile. Note that this includes HLG
|
||||||
|
// HDR. On Android 13+, the platform guarantees that a decoder that advertises
|
||||||
|
// HEVCProfileMain10 will be able to decode HLG. This is not guaranteed for older
|
||||||
|
// Android versions, but we still map to Main10 for backwards compatibility.
|
||||||
|
profile = CodecProfileLevel.HEVCProfileMain10;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.w(TAG, "Unknown HEVC profile string: " + profileString);
|
Log.w(TAG, "Unknown HEVC profile string: " + profileString);
|
||||||
return null;
|
return null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user