diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParser.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParser.java index 861e1f326f..9247fe01bd 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParser.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParser.java @@ -152,6 +152,8 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser= 0) { durationUs = (long) (durationSec * C.MICROS_PER_SECOND); diff --git a/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/playlist/HlsMediaPlaylistParserTest.java b/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/playlist/HlsMediaPlaylistParserTest.java index af603704fa..410e92fbba 100644 --- a/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/playlist/HlsMediaPlaylistParserTest.java +++ b/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/playlist/HlsMediaPlaylistParserTest.java @@ -1279,6 +1279,94 @@ public class HlsMediaPlaylistParserTest { .isEqualTo(msToUs(Util.parseXsDateTime("2024-11-11T04:35:19.353-08:00"))); } + @Test + public void parseMediaPlaylist_withDuration_durationSetCorrectly() throws IOException { + Uri playlistUri = Uri.parse("https://example.com/test.m3u8"); + String playlistString = + "#EXTM3U\n" + + "#EXT-X-TARGETDURATION:6\n" + + "#EXT-X-PROGRAM-DATE-TIME:2020-01-02T21:55:40.000Z\n" + + "#EXTINF:6,\n" + + "main1.0.ts\n" + + "#EXT-X-ENDLIST" + + "\n" + + "#EXT-X-DATERANGE:" + + "ID=\"ad0-0\"," + + "CLASS=\"com.apple.hls.interstitial\"," + + "START-DATE=\"2020-01-02T21:55:41.123Z\"," + + "DURATION=2.222," + + "X-ASSET-URI=\"http://example.com/media-0-0.m3u8\"" + + "\n"; + HlsPlaylistParser hlsPlaylistParser = new HlsPlaylistParser(); + + HlsMediaPlaylist mediaPlaylist = + (HlsMediaPlaylist) + hlsPlaylistParser.parse( + playlistUri, new ByteArrayInputStream(Util.getUtf8Bytes(playlistString))); + + assertThat(mediaPlaylist.interstitials.get(0).durationUs).isEqualTo(2_222_000L); + } + + @Test + public void parseMediaPlaylist_withDurationAfterPlannedDuration_durationSetCorrectly() + throws IOException { + Uri playlistUri = Uri.parse("https://example.com/test.m3u8"); + String playlistString = + "#EXTM3U\n" + + "#EXT-X-TARGETDURATION:6\n" + + "#EXT-X-PROGRAM-DATE-TIME:2020-01-02T21:55:40.000Z\n" + + "#EXTINF:6,\n" + + "main1.0.ts\n" + + "#EXT-X-ENDLIST" + + "\n" + + "#EXT-X-DATERANGE:" + + "ID=\"ad0-0\"," + + "CLASS=\"com.apple.hls.interstitial\"," + + "START-DATE=\"2020-01-02T21:55:41.123Z\"," + + "PLANNED-DURATION=1.111," + + "DURATION=2.222," + + "X-ASSET-URI=\"http://example.com/media-0-0.m3u8\"" + + "\n"; + HlsPlaylistParser hlsPlaylistParser = new HlsPlaylistParser(); + + HlsMediaPlaylist mediaPlaylist = + (HlsMediaPlaylist) + hlsPlaylistParser.parse( + playlistUri, new ByteArrayInputStream(Util.getUtf8Bytes(playlistString))); + + assertThat(mediaPlaylist.interstitials.get(0).durationUs).isEqualTo(2_222_000L); + } + + @Test + public void parseMediaPlaylist_withDurationBeforePlannedDuration_durationSetCorrectly() + throws IOException { + Uri playlistUri = Uri.parse("https://example.com/test.m3u8"); + String playlistString = + "#EXTM3U\n" + + "#EXT-X-TARGETDURATION:6\n" + + "#EXT-X-PROGRAM-DATE-TIME:2020-01-02T21:55:40.000Z\n" + + "#EXTINF:6,\n" + + "main1.0.ts\n" + + "#EXT-X-ENDLIST" + + "\n" + + "#EXT-X-DATERANGE:" + + "DURATION=2.234," + + "ID=\"ad0-0\"," + + "CLASS=\"com.apple.hls.interstitial\"," + + "START-DATE=\"2020-01-02T21:55:41.123Z\"," + + "PLANNED-DURATION=3.456," + + "X-ASSET-URI=\"http://example.com/media-0-0.m3u8\"" + + "\n"; + HlsPlaylistParser hlsPlaylistParser = new HlsPlaylistParser(); + + HlsMediaPlaylist mediaPlaylist = + (HlsMediaPlaylist) + hlsPlaylistParser.parse( + playlistUri, new ByteArrayInputStream(Util.getUtf8Bytes(playlistString))); + + assertThat(mediaPlaylist.interstitials.get(0).durationUs).isEqualTo(2_234_000L); + } + @Test public void parseMediaPlaylist_withInterstitialWithoutId_throwsParserException() { Uri playlistUri = Uri.parse("https://example.com/test.m3u8");