Remove HlsChunkSource from null-checking blacklist

PiperOrigin-RevId: 274789337
This commit is contained in:
ibaker 2019-10-15 14:12:30 +01:00 committed by Oliver Woodman
parent 0ba91811d1
commit fc95d07a94
2 changed files with 38 additions and 17 deletions

View File

@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.source.chunk; package com.google.android.exoplayer2.source.chunk;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
@ -44,8 +45,14 @@ public abstract class DataChunk extends Chunk {
* @param trackSelectionData See {@link #trackSelectionData}. * @param trackSelectionData See {@link #trackSelectionData}.
* @param data An optional recycled array that can be used as a holder for the data. * @param data An optional recycled array that can be used as a holder for the data.
*/ */
public DataChunk(DataSource dataSource, DataSpec dataSpec, int type, Format trackFormat, public DataChunk(
int trackSelectionReason, Object trackSelectionData, byte[] data) { DataSource dataSource,
DataSpec dataSpec,
int type,
Format trackFormat,
int trackSelectionReason,
@Nullable Object trackSelectionData,
byte[] data) {
super(dataSource, dataSpec, type, trackFormat, trackSelectionReason, trackSelectionData, super(dataSource, dataSpec, type, trackFormat, trackSelectionReason, trackSelectionData,
C.TIME_UNSET, C.TIME_UNSET); C.TIME_UNSET, C.TIME_UNSET);
this.data = data; this.data = data;

View File

@ -43,10 +43,10 @@ import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/** /** Source of Hls (possibly adaptive) chunks. */
* Source of Hls (possibly adaptive) chunks.
*/
/* package */ class HlsChunkSource { /* package */ class HlsChunkSource {
/** /**
@ -99,8 +99,8 @@ import java.util.List;
private boolean isTimestampMaster; private boolean isTimestampMaster;
private byte[] scratchSpace; private byte[] scratchSpace;
private IOException fatalError; @Nullable private IOException fatalError;
private Uri expectedPlaylistUrl; @Nullable private Uri expectedPlaylistUrl;
private boolean independentSegments; private boolean independentSegments;
// Note: The track group in the selection is typically *not* equal to trackGroup. This is due to // Note: The track group in the selection is typically *not* equal to trackGroup. This is due to
@ -135,7 +135,7 @@ import java.util.List;
HlsDataSourceFactory dataSourceFactory, HlsDataSourceFactory dataSourceFactory,
@Nullable TransferListener mediaTransferListener, @Nullable TransferListener mediaTransferListener,
TimestampAdjusterProvider timestampAdjusterProvider, TimestampAdjusterProvider timestampAdjusterProvider,
@Nullable List<Format> muxedCaptionFormats) { List<Format> muxedCaptionFormats) {
this.extractorFactory = extractorFactory; this.extractorFactory = extractorFactory;
this.playlistTracker = playlistTracker; this.playlistTracker = playlistTracker;
this.playlistUrls = playlistUrls; this.playlistUrls = playlistUrls;
@ -143,6 +143,7 @@ import java.util.List;
this.timestampAdjusterProvider = timestampAdjusterProvider; this.timestampAdjusterProvider = timestampAdjusterProvider;
this.muxedCaptionFormats = muxedCaptionFormats; this.muxedCaptionFormats = muxedCaptionFormats;
keyCache = new FullSegmentEncryptionKeyCache(); keyCache = new FullSegmentEncryptionKeyCache();
scratchSpace = Util.EMPTY_BYTE_ARRAY;
liveEdgeInPeriodTimeUs = C.TIME_UNSET; liveEdgeInPeriodTimeUs = C.TIME_UNSET;
mediaDataSource = dataSourceFactory.createDataSource(C.DATA_TYPE_MEDIA); mediaDataSource = dataSourceFactory.createDataSource(C.DATA_TYPE_MEDIA);
if (mediaTransferListener != null) { if (mediaTransferListener != null) {
@ -270,6 +271,8 @@ import java.util.List;
} }
HlsMediaPlaylist mediaPlaylist = HlsMediaPlaylist mediaPlaylist =
playlistTracker.getPlaylistSnapshot(selectedPlaylistUrl, /* isForPlayback= */ true); playlistTracker.getPlaylistSnapshot(selectedPlaylistUrl, /* isForPlayback= */ true);
// playlistTracker snapshot is valid (checked by if() above), so mediaPlaylist must be non-null.
Assertions.checkNotNull(mediaPlaylist);
independentSegments = mediaPlaylist.hasIndependentSegments; independentSegments = mediaPlaylist.hasIndependentSegments;
updateLiveEdgeTimeUs(mediaPlaylist); updateLiveEdgeTimeUs(mediaPlaylist);
@ -285,8 +288,11 @@ import java.util.List;
// behind the live window. // behind the live window.
selectedTrackIndex = oldTrackIndex; selectedTrackIndex = oldTrackIndex;
selectedPlaylistUrl = playlistUrls[selectedTrackIndex]; selectedPlaylistUrl = playlistUrls[selectedTrackIndex];
mediaPlaylist = mediaPlaylist =
playlistTracker.getPlaylistSnapshot(selectedPlaylistUrl, /* isForPlayback= */ true); playlistTracker.getPlaylistSnapshot(selectedPlaylistUrl, /* isForPlayback= */ true);
// playlistTracker snapshot is valid (checked by if() above), so mediaPlaylist must be
// non-null.
Assertions.checkNotNull(mediaPlaylist);
startOfPlaylistInPeriodUs = startOfPlaylistInPeriodUs =
mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs(); mediaPlaylist.startTimeUs - playlistTracker.getInitialStartTimeUs();
chunkMediaSequence = previous.getNextChunkIndex(); chunkMediaSequence = previous.getNextChunkIndex();
@ -361,7 +367,8 @@ import java.util.List;
if (chunk instanceof EncryptionKeyChunk) { if (chunk instanceof EncryptionKeyChunk) {
EncryptionKeyChunk encryptionKeyChunk = (EncryptionKeyChunk) chunk; EncryptionKeyChunk encryptionKeyChunk = (EncryptionKeyChunk) chunk;
scratchSpace = encryptionKeyChunk.getDataHolder(); scratchSpace = encryptionKeyChunk.getDataHolder();
keyCache.put(encryptionKeyChunk.dataSpec.uri, encryptionKeyChunk.getResult()); keyCache.put(
encryptionKeyChunk.dataSpec.uri, Assertions.checkNotNull(encryptionKeyChunk.getResult()));
} }
} }
@ -427,6 +434,8 @@ import java.util.List;
} }
HlsMediaPlaylist playlist = HlsMediaPlaylist playlist =
playlistTracker.getPlaylistSnapshot(playlistUrl, /* isForPlayback= */ false); playlistTracker.getPlaylistSnapshot(playlistUrl, /* isForPlayback= */ false);
// Playlist snapshot is valid (checked by if() above) so playlist must be non-null.
Assertions.checkNotNull(playlist);
long startOfPlaylistInPeriodUs = long startOfPlaylistInPeriodUs =
playlist.startTimeUs - playlistTracker.getInitialStartTimeUs(); playlist.startTimeUs - playlistTracker.getInitialStartTimeUs();
boolean switchingTrack = trackIndex != oldTrackIndex; boolean switchingTrack = trackIndex != oldTrackIndex;
@ -504,11 +513,13 @@ import java.util.List;
if (keyUri == null) { if (keyUri == null) {
return null; return null;
} }
if (keyCache.containsUri(keyUri)) {
// The key is present in the key cache. We re-insert it to prevent it from being evicted by byte[] encryptionKey = keyCache.remove(keyUri);
if (encryptionKey != null) {
// The key was present in the key cache. We re-insert it to prevent it from being evicted by
// the following key addition. Note that removal of the key is necessary to affect the // the following key addition. Note that removal of the key is necessary to affect the
// eviction order. // eviction order.
keyCache.put(keyUri, keyCache.remove(keyUri)); keyCache.put(keyUri, encryptionKey);
return null; return null;
} }
DataSpec dataSpec = new DataSpec(keyUri, 0, C.LENGTH_UNSET, null, DataSpec.FLAG_ALLOW_GZIP); DataSpec dataSpec = new DataSpec(keyUri, 0, C.LENGTH_UNSET, null, DataSpec.FLAG_ALLOW_GZIP);
@ -576,6 +587,7 @@ import java.util.List;
} }
@Override @Override
@Nullable
public Object getSelectionData() { public Object getSelectionData() {
return null; return null;
} }
@ -584,14 +596,14 @@ import java.util.List;
private static final class EncryptionKeyChunk extends DataChunk { private static final class EncryptionKeyChunk extends DataChunk {
private byte[] result; private byte @MonotonicNonNull [] result;
public EncryptionKeyChunk( public EncryptionKeyChunk(
DataSource dataSource, DataSource dataSource,
DataSpec dataSpec, DataSpec dataSpec,
Format trackFormat, Format trackFormat,
int trackSelectionReason, int trackSelectionReason,
Object trackSelectionData, @Nullable Object trackSelectionData,
byte[] scratchSpace) { byte[] scratchSpace) {
super(dataSource, dataSpec, C.DATA_TYPE_DRM, trackFormat, trackSelectionReason, super(dataSource, dataSpec, C.DATA_TYPE_DRM, trackFormat, trackSelectionReason,
trackSelectionData, scratchSpace); trackSelectionData, scratchSpace);
@ -602,6 +614,8 @@ import java.util.List;
result = Arrays.copyOf(data, limit); result = Arrays.copyOf(data, limit);
} }
/** Return the result of this chunk, or null if loading is not complete. */
@Nullable
public byte[] getResult() { public byte[] getResult() {
return result; return result;
} }
@ -670,7 +684,7 @@ import java.util.List;
/* loadFactor= */ 1, /* loadFactor= */ 1,
/* accessOrder= */ false) { /* accessOrder= */ false) {
@Override @Override
protected boolean removeEldestEntry(Entry<Uri, byte[]> eldest) { protected boolean removeEldestEntry(Map.Entry<Uri, byte[]> eldest) {
return size() > KEY_CACHE_SIZE; return size() > KEY_CACHE_SIZE;
} }
}; };