IFrame only exposed as a video track.Plays correctly

This commit is contained in:
Steve Mayhew 2019-07-17 16:39:24 -07:00
parent 7b82a3c889
commit f076a5ebd6
2 changed files with 55 additions and 1 deletions

View File

@ -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<Rendition> audioRenditions = masterPlaylist.audios;
List<Rendition> 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<HlsSampleStreamWrapper> sampleStreamWrappers,
Map<String, DrmInitData> 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<Rendition> audioRenditions,

View File

@ -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<Uri> getMediaPlaylistUrls(
List<Variant> variants,
List<IFrameVariant> iFrameVariants,
List<Rendition> videos,
List<Rendition> audios,
List<Rendition> 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);