mirror of
https://github.com/androidx/media.git
synced 2025-05-11 09:39:52 +08:00
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:
parent
ccf78f99c4
commit
4783c329cc
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
|
@ -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 =
|
||||
|
Loading…
x
Reference in New Issue
Block a user