mirror of
https://github.com/androidx/media.git
synced 2025-05-12 01:59:50 +08:00
IFrame only exposed as a video track.Plays correctly
This commit is contained in:
parent
7b82a3c889
commit
f076a5ebd6
@ -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,
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user