Commit 806681dd by aquilescanta Committed by Ian Baker

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
parent 3d8c9b0b
...@@ -250,16 +250,37 @@ public final class MimeTypes { ...@@ -250,16 +250,37 @@ public final class MimeTypes {
*/ */
public static boolean containsCodecsCorrespondingToMimeType( public static boolean containsCodecsCorrespondingToMimeType(
@Nullable String codecs, String mimeType) { @Nullable String codecs, String mimeType) {
if (codecs == null) { return getCodecsCorrespondingToMimeType(codecs, mimeType) != null;
return false; }
/**
* 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); String[] codecList = Util.splitCodecs(codecs);
StringBuilder builder = new StringBuilder();
for (String codec : codecList) { for (String codec : codecList) {
if (mimeType.equals(getMediaMimeType(codec))) { 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;
} }
/** /**
......
...@@ -61,6 +61,37 @@ public final class MimeTypesTest { ...@@ -61,6 +61,37 @@ public final class MimeTypesTest {
} }
@Test @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() { public void isText_returnsCorrectResult() {
assertThat(MimeTypes.isText(MimeTypes.TEXT_VTT)).isTrue(); assertThat(MimeTypes.isText(MimeTypes.TEXT_VTT)).isTrue();
assertThat(MimeTypes.isText(MimeTypes.TEXT_SSA)).isTrue(); assertThat(MimeTypes.isText(MimeTypes.TEXT_SSA)).isTrue();
......
...@@ -1404,8 +1404,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -1404,8 +1404,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
return sampleFormat; return sampleFormat;
} }
int sampleTrackType = MimeTypes.getTrackType(sampleFormat.sampleMimeType); @Nullable
@Nullable String codecs = Util.getCodecsOfType(playlistFormat.codecs, sampleTrackType); String codecs =
MimeTypes.getCodecsCorrespondingToMimeType(
playlistFormat.codecs, sampleFormat.sampleMimeType);
@Nullable String sampleMimeType = MimeTypes.getMediaMimeType(codecs); @Nullable String sampleMimeType = MimeTypes.getMediaMimeType(codecs);
Format.Builder formatBuilder = Format.Builder formatBuilder =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment