mirror of
https://github.com/samsonjs/media.git
synced 2026-03-26 09:35:47 +00: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
3d8c9b0bf8
commit
806681dd16
3 changed files with 60 additions and 6 deletions
|
|
@ -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…
Reference in a new issue