Map HLS sample formats to the correct codec string

This change fixes format creation for traditional preparation of streams
where the master playlist contains more than one codec string per track
type.

Issue: #7877
PiperOrigin-RevId: 338538693
This commit is contained in:
aquilescanta 2020-10-22 21:33:03 +01:00 committed by Oliver Woodman
parent ccf78f99c4
commit 4783c329cc
3 changed files with 60 additions and 6 deletions

View File

@ -250,16 +250,37 @@ public final class MimeTypes {
*/
public static boolean containsCodecsCorrespondingToMimeType(
@Nullable String codecs, String mimeType) {
if (codecs == null) {
return false;
return getCodecsCorrespondingToMimeType(codecs, mimeType) != null;
}
/**
* Returns a subsequence of {@code codecs} containing the codec strings that correspond to the
* given {@code mimeType}. Returns null if {@code mimeType} is null, {@code codecs} is null, or
* {@code codecs} does not contain a codec that corresponds to {@code mimeType}.
*
* @param codecs An RFC 6381 codecs string.
* @param mimeType A MIME type to look for.
* @return A subsequence of {@code codecs} containing the codec strings that correspond to the
* given {@code mimeType}. Returns null if {@code mimeType} is null, {@code codecs} is null,
* or {@code codecs} does not contain a codec that corresponds to {@code mimeType}.
*/
@Nullable
public static String getCodecsCorrespondingToMimeType(
@Nullable String codecs, @Nullable String mimeType) {
if (codecs == null || mimeType == null) {
return null;
}
String[] codecList = Util.splitCodecs(codecs);
StringBuilder builder = new StringBuilder();
for (String codec : codecList) {
if (mimeType.equals(getMediaMimeType(codec))) {
return true;
if (builder.length() > 0) {
builder.append(",");
}
builder.append(codec);
}
}
return false;
return builder.length() > 0 ? builder.toString() : null;
}
/**

View File

@ -60,6 +60,37 @@ public final class MimeTypesTest {
.isFalse();
}
@Test
public void getCodecsCorrespondingToMimeType_returnsCorrectResult() {
assertThat(
MimeTypes.getCodecsCorrespondingToMimeType(
/* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.AUDIO_AAC))
.isEqualTo("mp4a.40.2");
assertThat(
MimeTypes.getCodecsCorrespondingToMimeType(
/* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.VIDEO_H264))
.isEqualTo("avc1.4D5015,avc1.4D4015");
assertThat(
MimeTypes.getCodecsCorrespondingToMimeType(
/* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.AUDIO_AC3))
.isEqualTo("ac-3");
assertThat(
MimeTypes.getCodecsCorrespondingToMimeType(
/* codecs= */ "unknown-codec,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.AUDIO_AC3))
.isEqualTo("ac-3");
assertThat(
MimeTypes.getCodecsCorrespondingToMimeType(
/* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", MimeTypes.VIDEO_H265))
.isNull();
assertThat(
MimeTypes.getCodecsCorrespondingToMimeType(
/* codecs= */ "avc1.4D5015,ac-3,mp4a.40.2,avc1.4D4015", null))
.isNull();
assertThat(MimeTypes.getCodecsCorrespondingToMimeType(/* codecs= */ null, MimeTypes.AUDIO_AAC))
.isNull();
}
@Test
public void isText_returnsCorrectResult() {
assertThat(MimeTypes.isText(MimeTypes.TEXT_VTT)).isTrue();

View File

@ -1404,8 +1404,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
return sampleFormat;
}
int sampleTrackType = MimeTypes.getTrackType(sampleFormat.sampleMimeType);
@Nullable String codecs = Util.getCodecsOfType(playlistFormat.codecs, sampleTrackType);
@Nullable
String codecs =
MimeTypes.getCodecsCorrespondingToMimeType(
playlistFormat.codecs, sampleFormat.sampleMimeType);
@Nullable String sampleMimeType = MimeTypes.getMediaMimeType(codecs);
Format.Builder formatBuilder =