Commit 0501b677 by ojw28 Committed by GitHub

Merge pull request #4911 from Comcast/feature/hls-audio-text-id-uniqueness

Create unique id for HLS audio and text tracks
parents 9d947a56 35cc479f
...@@ -341,6 +341,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -341,6 +341,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
String name = parseStringAttr(line, REGEX_NAME, variableDefinitions); String name = parseStringAttr(line, REGEX_NAME, variableDefinitions);
String language = parseOptionalStringAttr(line, REGEX_LANGUAGE, variableDefinitions); String language = parseOptionalStringAttr(line, REGEX_LANGUAGE, variableDefinitions);
String groupId = parseOptionalStringAttr(line, REGEX_GROUP_ID, variableDefinitions); String groupId = parseOptionalStringAttr(line, REGEX_GROUP_ID, variableDefinitions);
String id = String.format("%s:%s", groupId, name);
Format format; Format format;
switch (parseStringAttr(line, REGEX_TYPE, variableDefinitions)) { switch (parseStringAttr(line, REGEX_TYPE, variableDefinitions)) {
case TYPE_AUDIO: case TYPE_AUDIO:
...@@ -348,7 +349,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -348,7 +349,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
String sampleMimeType = codecs != null ? MimeTypes.getMediaMimeType(codecs) : null; String sampleMimeType = codecs != null ? MimeTypes.getMediaMimeType(codecs) : null;
format = format =
Format.createAudioContainerFormat( Format.createAudioContainerFormat(
/* id= */ name, /* id= */ id,
/* label= */ name, /* label= */ name,
/* containerMimeType= */ MimeTypes.APPLICATION_M3U8, /* containerMimeType= */ MimeTypes.APPLICATION_M3U8,
sampleMimeType, sampleMimeType,
...@@ -368,7 +369,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -368,7 +369,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
case TYPE_SUBTITLES: case TYPE_SUBTITLES:
format = format =
Format.createTextContainerFormat( Format.createTextContainerFormat(
/* id= */ name, /* id= */ id,
/* label= */ name, /* label= */ name,
/* containerMimeType= */ MimeTypes.APPLICATION_M3U8, /* containerMimeType= */ MimeTypes.APPLICATION_M3U8,
/* sampleMimeType= */ MimeTypes.TEXT_VTT, /* sampleMimeType= */ MimeTypes.TEXT_VTT,
...@@ -394,7 +395,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -394,7 +395,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
} }
muxedCaptionFormats.add( muxedCaptionFormats.add(
Format.createTextContainerFormat( Format.createTextContainerFormat(
/* id= */ name, /* id= */ id,
/* label= */ name, /* label= */ name,
/* containerMimeType= */ null, /* containerMimeType= */ null,
/* sampleMimeType= */ mimeType, /* sampleMimeType= */ mimeType,
......
...@@ -75,7 +75,7 @@ public class HlsMasterPlaylistParserTest { ...@@ -75,7 +75,7 @@ public class HlsMasterPlaylistParserTest {
private static final String PLAYLIST_WITH_CC = private static final String PLAYLIST_WITH_CC =
" #EXTM3U \n" " #EXTM3U \n"
+ "#EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS," + "#EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS,GROUP-ID=\"cc1\","
+ "LANGUAGE=\"es\",NAME=\"Eng\",INSTREAM-ID=\"SERVICE4\"\n" + "LANGUAGE=\"es\",NAME=\"Eng\",INSTREAM-ID=\"SERVICE4\"\n"
+ "#EXT-X-STREAM-INF:BANDWIDTH=1280000," + "#EXT-X-STREAM-INF:BANDWIDTH=1280000,"
+ "CODECS=\"mp4a.40.2,avc1.66.30\",RESOLUTION=304x128\n" + "CODECS=\"mp4a.40.2,avc1.66.30\",RESOLUTION=304x128\n"
...@@ -90,6 +90,14 @@ public class HlsMasterPlaylistParserTest { ...@@ -90,6 +90,14 @@ public class HlsMasterPlaylistParserTest {
+ "CLOSED-CAPTIONS=NONE\n" + "CLOSED-CAPTIONS=NONE\n"
+ "http://example.com/low.m3u8\n"; + "http://example.com/low.m3u8\n";
private static final String PLAYLIST_WITH_SUBTITLES =
" #EXTM3U \n"
+ "#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=\"sub1\","
+ "LANGUAGE=\"es\",NAME=\"Eng\"\n"
+ "#EXT-X-STREAM-INF:BANDWIDTH=1280000,"
+ "CODECS=\"mp4a.40.2,avc1.66.30\",RESOLUTION=304x128\n"
+ "http://example.com/low.m3u8\n";
private static final String PLAYLIST_WITH_AUDIO_MEDIA_TAG = private static final String PLAYLIST_WITH_AUDIO_MEDIA_TAG =
"#EXTM3U\n" "#EXTM3U\n"
+ "#EXT-X-STREAM-INF:BANDWIDTH=2227464,CODECS=\"avc1.640020,mp4a.40.2\",AUDIO=\"aud1\"\n" + "#EXT-X-STREAM-INF:BANDWIDTH=2227464,CODECS=\"avc1.640020,mp4a.40.2\",AUDIO=\"aud1\"\n"
...@@ -217,6 +225,33 @@ public class HlsMasterPlaylistParserTest { ...@@ -217,6 +225,33 @@ public class HlsMasterPlaylistParserTest {
} }
@Test @Test
public void testAudioIdPropagation() throws IOException {
HlsMasterPlaylist playlist = parseMasterPlaylist(PLAYLIST_URI, PLAYLIST_WITH_AUDIO_MEDIA_TAG);
Format firstAudioFormat = playlist.audios.get(0).format;
assertThat(firstAudioFormat.id).isEqualTo("aud1:English");
Format secondAudioFormat = playlist.audios.get(1).format;
assertThat(secondAudioFormat.id).isEqualTo("aud2:English");
}
@Test
public void testCCIdPropagation() throws IOException {
HlsMasterPlaylist playlist = parseMasterPlaylist(PLAYLIST_URI, PLAYLIST_WITH_CC);
Format firstTextFormat = playlist.muxedCaptionFormats.get(0);
assertThat(firstTextFormat.id).isEqualTo("cc1:Eng");
}
@Test
public void testSubtitleIdPropagation() throws IOException {
HlsMasterPlaylist playlist = parseMasterPlaylist(PLAYLIST_URI, PLAYLIST_WITH_SUBTITLES);
Format firstTextFormat = playlist.subtitles.get(0).format;
assertThat(firstTextFormat.id).isEqualTo("sub1:Eng");
}
@Test
public void testIndependentSegments() throws IOException { public void testIndependentSegments() throws IOException {
HlsMasterPlaylist playlistWithIndependentSegments = HlsMasterPlaylist playlistWithIndependentSegments =
parseMasterPlaylist(PLAYLIST_URI, PLAYLIST_WITH_INDEPENDENT_SEGMENTS); parseMasterPlaylist(PLAYLIST_URI, PLAYLIST_WITH_INDEPENDENT_SEGMENTS);
......
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