Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update Dolby Vision format handling #2023

Merged
merged 2 commits into from
Jan 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -317,15 +317,24 @@ private boolean isCodecProfileAndLevelSupported(
int profile = codecProfileAndLevel.first;
int level = codecProfileAndLevel.second;
if (MimeTypes.VIDEO_DOLBY_VISION.equals(format.sampleMimeType)) {
// If this codec is H264 or H265, we only support the Dolby Vision base layer and need to map
// the Dolby Vision profile to the corresponding base layer profile. Also assume all levels of
// this base layer profile are supported.
if (MimeTypes.VIDEO_H264.equals(mimeType)) {
profile = CodecProfileLevel.AVCProfileHigh;
level = 0;
} else if (MimeTypes.VIDEO_H265.equals(mimeType)) {
profile = CodecProfileLevel.HEVCProfileMain10;
level = 0;
// If this codec is H.264, H.265 or AV1, we only support the Dolby Vision base layer and need
// to map the Dolby Vision profile to the corresponding base layer profile. Also assume all
// levels of this base layer profile are supported.
switch (mimeType) {
case MimeTypes.VIDEO_H264:
profile = CodecProfileLevel.AVCProfileHigh;
level = 0;
break;
case MimeTypes.VIDEO_H265:
profile = CodecProfileLevel.HEVCProfileMain10;
level = 0;
break;
case MimeTypes.VIDEO_AV1:
profile = CodecProfileLevel.AV1ProfileMain10;
level = 0;
break;
default:
break;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1144,11 +1144,11 @@ public static int getCodecMaxInputSize(MediaCodecInfo codecInfo, Format format)

String sampleMimeType = checkNotNull(format.sampleMimeType);
if (MimeTypes.VIDEO_DOLBY_VISION.equals(sampleMimeType)) {
// Dolby vision can be a wrapper around H264 or H265. We assume it's wrapping H265 by default
// because it's the common case, and because some devices may fail to allocate the codec when
// the larger buffer size required for H264 is requested. We size buffers for H264 only if the
// format contains sufficient information for us to determine unambiguously that it's a H264
// profile.
// Dolby vision can be a wrapper around H.264, H.265 or AV1. We assume it's wrapping H.265 by
// default because it's the common case, and because some devices may fail to allocate the
// codec when the larger buffer size required for H.264/AV1 is requested. We size buffers
// for H.264/AV1 only if the format contains sufficient information for us to determine
// unambiguously that it's a H.264/AV1 based profile.
sampleMimeType = MimeTypes.VIDEO_H265;
@Nullable
Pair<Integer, Integer> codecProfileAndLevel = MediaCodecUtil.getCodecProfileAndLevel(format);
Expand All @@ -1158,6 +1158,8 @@ public static int getCodecMaxInputSize(MediaCodecInfo codecInfo, Format format)
|| profile == CodecProfileLevel.DolbyVisionProfileDvavPer
|| profile == CodecProfileLevel.DolbyVisionProfileDvavPen) {
sampleMimeType = MimeTypes.VIDEO_H264;
} else if (profile == CodecProfileLevel.DolbyVisionProfileDvav110) {
sampleMimeType = MimeTypes.VIDEO_AV1;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,17 @@ public static DolbyVisionConfig parse(ParsableByteArray data) {
int dvProfile = (profileData >> 1);
int dvLevel = ((profileData & 0x1) << 5) | ((data.readUnsignedByte() >> 3) & 0x1F);
String codecsPrefix;
if (dvProfile == 4 || dvProfile == 5 || dvProfile == 7) {
if (dvProfile == 4 || dvProfile == 5 || dvProfile == 7 || dvProfile == 8) {
codecsPrefix = "dvhe";
} else if (dvProfile == 8) {
codecsPrefix = "hev1";
} else if (dvProfile == 9) {
codecsPrefix = "avc3";
codecsPrefix = "dvav";
} else if (dvProfile == 10) {
codecsPrefix = "dav1";
} else {
return null;
}
String codecs = codecsPrefix + ".0" + dvProfile + (dvLevel < 10 ? ".0" : ".") + dvLevel;
String codecs = codecsPrefix + (dvProfile < 10 ? ".0" : ".") + dvProfile
+ (dvLevel < 10 ? ".0" : ".") + dvLevel;
return new DolbyVisionConfig(dvProfile, dvLevel, codecs);
}

Expand Down