From f076a5ebd6347b3e915267dc47de424f1211d009 Mon Sep 17 00:00:00 2001 From: Steve Mayhew Date: Wed, 17 Jul 2019 16:39:24 -0700 Subject: [PATCH] IFrame only exposed as a video track.Plays correctly --- .../exoplayer2/source/hls/HlsMediaPeriod.java | 50 +++++++++++++++++++ .../hls/playlist/HlsMasterPlaylist.java | 6 ++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java index 5b06c74d2a..eeb06e6b96 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java @@ -35,6 +35,7 @@ import com.google.android.exoplayer2.source.SequenceableLoader; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist; +import com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.IFrameVariant; import com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.Rendition; import com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.Variant; import com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker; @@ -470,6 +471,7 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper : Collections.emptyMap(); boolean hasVariants = !masterPlaylist.variants.isEmpty(); + boolean hasIFrameVariants = !masterPlaylist.iFrameVariants.isEmpty(); List audioRenditions = masterPlaylist.audios; List subtitleRenditions = masterPlaylist.subtitles; @@ -486,6 +488,15 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper overridingDrmInitData); } + if (hasIFrameVariants) { + buildAndPrepareIFrameSampleStreamWrappers( + masterPlaylist, + positionUs, + sampleStreamWrappers, + overridingDrmInitData + ); + } + // TODO: Build video stream wrappers here. buildAndPrepareAudioSampleStreamWrappers( @@ -673,6 +684,45 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper } } + /** + * Build a set of SampleStream wrappers around the IFrame (IDR) only variants found + * for the MediaPeriod at positionUS. + * + * @param masterPlaylist - master playlist with the IFrame variants + * @param positionUs - position to begin loading samples from + * @param sampleStreamWrappers - [output] list is filled. + */ + private void buildAndPrepareIFrameSampleStreamWrappers( + HlsMasterPlaylist masterPlaylist, + long positionUs, + List sampleStreamWrappers, + Map overridingDrmInitData) { + + int selectedVariantsCount = masterPlaylist.iFrameVariants.size(); + Uri[] selectedPlaylistUrls = new Uri[selectedVariantsCount]; + Format[] selectedPlaylistFormats = new Format[selectedVariantsCount]; + int[] selectedVariantIndices = new int[selectedVariantsCount]; + + int outIndex = 0; + for (IFrameVariant iFrameVariant : masterPlaylist.iFrameVariants) { + selectedPlaylistUrls[outIndex] = iFrameVariant.url; + selectedPlaylistFormats[outIndex] = iFrameVariant.format; + selectedVariantIndices[outIndex] = outIndex++; + } + + HlsSampleStreamWrapper sampleStreamWrapper = + buildSampleStreamWrapper( + C.TRACK_TYPE_VIDEO, + selectedPlaylistUrls, + selectedPlaylistFormats, + /* muxedAudioFormat= */ null, + /* muxedCaptionFormats= */ Collections.emptyList(), + overridingDrmInitData, + positionUs); + sampleStreamWrappers.add(sampleStreamWrapper); + + } + private void buildAndPrepareAudioSampleStreamWrappers( long positionUs, List audioRenditions, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java index 72f6a361d7..392c6f556b 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java @@ -207,7 +207,7 @@ public final class HlsMasterPlaylist extends HlsPlaylist { super(baseUri, tags, hasIndependentSegments); this.mediaPlaylistUrls = Collections.unmodifiableList( - getMediaPlaylistUrls(variants, videos, audios, subtitles, closedCaptions)); + getMediaPlaylistUrls(variants, iFrameVariants, videos, audios, subtitles, closedCaptions)); this.variants = Collections.unmodifiableList(variants); this.videos = Collections.unmodifiableList(videos); this.audios = Collections.unmodifiableList(audios); @@ -265,6 +265,7 @@ public final class HlsMasterPlaylist extends HlsPlaylist { private static List getMediaPlaylistUrls( List variants, + List iFrameVariants, List videos, List audios, List subtitles, @@ -276,6 +277,9 @@ public final class HlsMasterPlaylist extends HlsPlaylist { mediaPlaylistUrls.add(uri); } } + for (IFrameVariant iFrameVariant : iFrameVariants) { + mediaPlaylistUrls.add(iFrameVariant.url); + } addMediaPlaylistUrls(videos, mediaPlaylistUrls); addMediaPlaylistUrls(audios, mediaPlaylistUrls); addMediaPlaylistUrls(subtitles, mediaPlaylistUrls);