diff --git a/libraries/common/src/main/java/androidx/media3/common/util/Util.java b/libraries/common/src/main/java/androidx/media3/common/util/Util.java index a87dd46b93..4bde64b95f 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/Util.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/Util.java @@ -2115,6 +2115,34 @@ public final class Util { return builder.length() > 0 ? builder.toString() : null; } + /** + * Returns a copy of {@code codecs} without the codecs whose track type matches {@code + * trackType}. + * + * @param codecs A codec sequence string, as defined in RFC 6381. + * @param trackType The {@link C.TrackType track type}. + * @return A copy of {@code codecs} without the codecs whose track type matches {@code + * trackType}. If this ends up empty, or {@code codecs} is null, returns null. + */ + @UnstableApi + @Nullable + public static String getCodecsWithoutType(@Nullable String codecs, @C.TrackType int trackType) { + String[] codecArray = splitCodecs(codecs); + if (codecArray.length == 0) { + return null; + } + StringBuilder builder = new StringBuilder(); + for (String codec : codecArray) { + if (trackType != MimeTypes.getTrackTypeOfCodec(codec)) { + if (builder.length() > 0) { + builder.append(","); + } + builder.append(codec); + } + } + return builder.length() > 0 ? builder.toString() : null; + } + /** * Splits a codecs sequence string, as defined in RFC 6381, into individual codec strings. * diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParser.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParser.java index 22142445bd..0bae8d8c7b 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParser.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParser.java @@ -418,30 +418,19 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser 1) { - supplementalProfiles = codecsAndProfiles[1]; - } + String[] supplementalCodecsString = Util.splitAtFirst(supplementalCodecsStrings, ","); + // TODO: Support more than one element + String[] codecsAndProfiles = Util.split(supplementalCodecsString[0], "/"); + supplementalCodecs = codecsAndProfiles[0]; + if (codecsAndProfiles.length > 1) { + supplementalProfiles = codecsAndProfiles[1]; } } String videoCodecs = Util.getCodecsOfType(codecs, C.TRACK_TYPE_VIDEO); if (isDolbyVisionFormat(videoRange, videoCodecs, supplementalCodecs, supplementalProfiles)) { videoCodecs = supplementalCodecs != null ? supplementalCodecs : videoCodecs; - String[] codecArray = Util.splitCodecs(codecs); - StringBuilder builder = new StringBuilder(); - for (String codec : codecArray) { - if (builder.length() > 0) { - builder.append(","); - } - builder.append(MimeTypes.getTrackTypeOfCodec(codec) == C.TRACK_TYPE_VIDEO - ? videoCodecs - : codec); - } - codecs = builder.length() > 0 ? builder.toString() : codecs; + String nonVideoCodecs = Util.getCodecsWithoutType(codecs, C.TRACK_TYPE_VIDEO); + codecs = nonVideoCodecs != null ? videoCodecs + "," + nonVideoCodecs : videoCodecs; } String resolutionString =