From 677fc291cf143641ea7c56f56a865216c0e9cb94 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Fri, 26 Jan 2018 03:37:55 -0800 Subject: [PATCH] Use long for HLS media sequences Issue:#3747 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=183366339 --- RELEASENOTES.md | 2 + .../source/chunk/ContainerMediaChunk.java | 2 +- .../exoplayer2/source/chunk/MediaChunk.java | 24 ++++++----- .../source/dash/DefaultDashChunkSource.java | 2 +- .../exoplayer2/source/hls/HlsChunkSource.java | 4 +- .../exoplayer2/source/hls/HlsMediaChunk.java | 43 +++++++++++++------ .../source/hls/playlist/HlsMediaPlaylist.java | 24 ++++++++--- .../hls/playlist/HlsPlaylistParser.java | 12 ++++-- .../hls/playlist/HlsPlaylistTracker.java | 6 ++- .../smoothstreaming/DefaultSsChunkSource.java | 2 +- .../exoplayer2/testutil/FakeChunkSource.java | 7 +-- 11 files changed, 85 insertions(+), 43 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index de60f33c02..01ddda93f8 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -67,6 +67,8 @@ ([#3653](https://github.com/google/ExoPlayer/issues/3653)). * Fix ID3 context reuse across segment format changes ([#3622](https://github.com/google/ExoPlayer/issues/3622)). + * Use long for media sequence numbers + ([#3747](https://github.com/google/ExoPlayer/issues/3747)) * New Cast extension: Simplifies toggling between local and Cast playbacks. * Audio: * Support TrueHD passthrough for rechunked samples in Matroska files diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java index cc39c88fd0..4daa4041fe 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java @@ -64,7 +64,7 @@ public class ContainerMediaChunk extends BaseMediaChunk { } @Override - public int getNextChunkIndex() { + public long getNextChunkIndex() { return chunkIndex + chunkCount; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java index 3a02884fff..d313a8cb81 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java @@ -26,10 +26,8 @@ import com.google.android.exoplayer2.util.Assertions; */ public abstract class MediaChunk extends Chunk { - /** - * The chunk index. - */ - public final int chunkIndex; + /** The chunk index. */ + public final long chunkIndex; /** * @param dataSource The source from which the data should be loaded. @@ -41,19 +39,23 @@ public abstract class MediaChunk extends Chunk { * @param endTimeUs The end time of the media contained by the chunk, in microseconds. * @param chunkIndex The index of the chunk. */ - public MediaChunk(DataSource dataSource, DataSpec dataSpec, Format trackFormat, - int trackSelectionReason, Object trackSelectionData, long startTimeUs, long endTimeUs, - int chunkIndex) { + public MediaChunk( + DataSource dataSource, + DataSpec dataSpec, + Format trackFormat, + int trackSelectionReason, + Object trackSelectionData, + long startTimeUs, + long endTimeUs, + long chunkIndex) { super(dataSource, dataSpec, C.DATA_TYPE_MEDIA, trackFormat, trackSelectionReason, trackSelectionData, startTimeUs, endTimeUs); Assertions.checkNotNull(trackFormat); this.chunkIndex = chunkIndex; } - /** - * Returns the next chunk index. - */ - public int getNextChunkIndex() { + /** Returns the next chunk index. */ + public long getNextChunkIndex() { return chunkIndex + 1; } diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java index b93338df35..beede59b8d 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java @@ -311,7 +311,7 @@ public class DefaultDashChunkSource implements DashChunkSource { segmentNum = Util.constrainValue(representationHolder.getSegmentNum(loadPositionUs), firstAvailableSegmentNum, lastAvailableSegmentNum); } else { - segmentNum = previous.getNextChunkIndex(); + segmentNum = (int) previous.getNextChunkIndex(); if (segmentNum < firstAvailableSegmentNum) { // This is before the first chunk in the current manifest. fatalError = new BehindLiveWindowException(); diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java index 2b1ece4eee..04f61810bc 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java @@ -253,7 +253,7 @@ import java.util.List; updateLiveEdgeTimeUs(mediaPlaylist); // Select the chunk. - int chunkMediaSequence; + long chunkMediaSequence; if (previous == null || switchingVariant) { long targetPositionUs = (previous == null || independentSegments) ? loadPositionUs : previous.startTimeUs; @@ -281,7 +281,7 @@ import java.util.List; return; } - int chunkIndex = chunkMediaSequence - mediaPlaylist.mediaSequence; + int chunkIndex = (int) (chunkMediaSequence - mediaPlaylist.mediaSequence); if (chunkIndex >= mediaPlaylist.segments.size()) { if (mediaPlaylist.hasEndTag) { out.endOfStream = true; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java index 5457f33867..4be758993d 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java @@ -83,8 +83,8 @@ import java.util.concurrent.atomic.AtomicInteger; private volatile boolean loadCompleted; /** - * @param extractorFactory A {@link HlsExtractorFactory} from which the HLS media chunk - * extractor is obtained. + * @param extractorFactory A {@link HlsExtractorFactory} from which the HLS media chunk extractor + * is obtained. * @param dataSource The source from which the data should be loaded. * @param dataSpec Defines the data to be loaded. * @param initDataSpec Defines the initialization data to be fed to new extractors. May be null. @@ -95,7 +95,7 @@ import java.util.concurrent.atomic.AtomicInteger; * @param trackSelectionData See {@link #trackSelectionData}. * @param startTimeUs The start time of the chunk in microseconds. * @param endTimeUs The end time of the chunk in microseconds. - * @param chunkIndex The media sequence number of the chunk. + * @param chunkMediaSequence The media sequence number of the chunk. * @param discontinuitySequenceNumber The discontinuity sequence number of the chunk. * @param isMasterTimestampSource True if the chunk can initialize the timestamp adjuster. * @param timestampAdjuster Adjuster corresponding to the provided discontinuity sequence number. @@ -106,15 +106,34 @@ import java.util.concurrent.atomic.AtomicInteger; * @param encryptionIv The AES initialization vector, or null if the segment is not fully * encrypted. */ - public HlsMediaChunk(HlsExtractorFactory extractorFactory, DataSource dataSource, - DataSpec dataSpec, DataSpec initDataSpec, HlsUrl hlsUrl, List muxedCaptionFormats, - int trackSelectionReason, Object trackSelectionData, long startTimeUs, long endTimeUs, - int chunkIndex, int discontinuitySequenceNumber, boolean isMasterTimestampSource, - TimestampAdjuster timestampAdjuster, HlsMediaChunk previousChunk, DrmInitData drmInitData, - byte[] fullSegmentEncryptionKey, byte[] encryptionIv) { - super(buildDataSource(dataSource, fullSegmentEncryptionKey, encryptionIv), dataSpec, - hlsUrl.format, trackSelectionReason, trackSelectionData, startTimeUs, endTimeUs, - chunkIndex); + public HlsMediaChunk( + HlsExtractorFactory extractorFactory, + DataSource dataSource, + DataSpec dataSpec, + DataSpec initDataSpec, + HlsUrl hlsUrl, + List muxedCaptionFormats, + int trackSelectionReason, + Object trackSelectionData, + long startTimeUs, + long endTimeUs, + long chunkMediaSequence, + int discontinuitySequenceNumber, + boolean isMasterTimestampSource, + TimestampAdjuster timestampAdjuster, + HlsMediaChunk previousChunk, + DrmInitData drmInitData, + byte[] fullSegmentEncryptionKey, + byte[] encryptionIv) { + super( + buildDataSource(dataSource, fullSegmentEncryptionKey, encryptionIv), + dataSpec, + hlsUrl.format, + trackSelectionReason, + trackSelectionData, + startTimeUs, + endTimeUs, + chunkMediaSequence); this.discontinuitySequenceNumber = discontinuitySequenceNumber; this.initDataSpec = initDataSpec; this.hlsUrl = hlsUrl; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java index 1f44607f98..77a4c9ed1d 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java @@ -139,7 +139,7 @@ public final class HlsMediaPlaylist extends HlsPlaylist { * The media sequence number of the first media segment in the playlist, as defined by * #EXT-X-MEDIA-SEQUENCE. */ - public final int mediaSequence; + public final long mediaSequence; /** * The compatibility version, as defined by #EXT-X-VERSION. */ @@ -196,11 +196,23 @@ public final class HlsMediaPlaylist extends HlsPlaylist { * @param initializationSegment See {@link #initializationSegment}. * @param segments See {@link #segments}. */ - public HlsMediaPlaylist(@PlaylistType int playlistType, String baseUri, List tags, - long startOffsetUs, long startTimeUs, boolean hasDiscontinuitySequence, - int discontinuitySequence, int mediaSequence, int version, long targetDurationUs, - boolean hasIndependentSegmentsTag, boolean hasEndTag, boolean hasProgramDateTime, - DrmInitData drmInitData, Segment initializationSegment, List segments) { + public HlsMediaPlaylist( + @PlaylistType int playlistType, + String baseUri, + List tags, + long startOffsetUs, + long startTimeUs, + boolean hasDiscontinuitySequence, + int discontinuitySequence, + long mediaSequence, + int version, + long targetDurationUs, + boolean hasIndependentSegmentsTag, + boolean hasEndTag, + boolean hasProgramDateTime, + DrmInitData drmInitData, + Segment initializationSegment, + List segments) { super(baseUri, tags); this.playlistType = playlistType; this.startTimeUs = startTimeUs; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index 100c4c78e6..4deddc1869 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -339,7 +339,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser oldSegments = oldPlaylist.segments; - return mediaSequenceOffset < oldSegments.size() ? oldSegments.get(mediaSequenceOffset) : null; + return mediaSequenceOffset < oldSegments.size() + ? oldSegments.get((int) mediaSequenceOffset) + : null; } /** diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java index 79014d6f4a..d0e5ed29af 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java @@ -183,7 +183,7 @@ public class DefaultSsChunkSource implements SsChunkSource { if (previous == null) { chunkIndex = streamElement.getChunkIndex(loadPositionUs); } else { - chunkIndex = previous.getNextChunkIndex() - currentManifestChunkOffset; + chunkIndex = (int) (previous.getNextChunkIndex() - currentManifestChunkOffset); if (chunkIndex < 0) { // This is before the first chunk in the current manifest. fatalError = new BehindLiveWindowException(); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeChunkSource.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeChunkSource.java index 6ff18e0b3d..9234287e92 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeChunkSource.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeChunkSource.java @@ -30,7 +30,6 @@ import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; - import java.io.IOException; import java.util.List; @@ -100,8 +99,10 @@ public final class FakeChunkSource implements ChunkSource { ChunkHolder out) { long bufferedDurationUs = loadPositionUs - playbackPositionUs; trackSelection.updateSelectedTrack(playbackPositionUs, bufferedDurationUs, C.TIME_UNSET); - int chunkIndex = previous == null ? dataSet.getChunkIndexByPosition(playbackPositionUs) - : previous.getNextChunkIndex(); + int chunkIndex = + previous == null + ? dataSet.getChunkIndexByPosition(playbackPositionUs) + : (int) previous.getNextChunkIndex(); if (chunkIndex >= dataSet.getChunkCount()) { out.endOfStream = true; } else {