public class ChunkSampleStream<T extends ChunkSource> extends java.lang.Object implements SampleStream, SequenceableLoader, Loader.Callback<Chunk>
SampleStream that loads media in Chunks, obtained from a ChunkSource.
May also be configured to expose additional embedded SampleStreams.| Modifier and Type | Class and Description |
|---|---|
class |
ChunkSampleStream.EmbeddedSampleStream
A
SampleStream embedded in a ChunkSampleStream. |
SequenceableLoader.Callback<T extends SequenceableLoader>| Constructor and Description |
|---|
ChunkSampleStream(int primaryTrackType,
int[] embeddedTrackTypes,
T chunkSource,
SequenceableLoader.Callback<ChunkSampleStream<T>> callback,
Allocator allocator,
long positionUs,
int minLoadableRetryCount,
AdaptiveMediaSourceEventListener.EventDispatcher eventDispatcher) |
| Modifier and Type | Method and Description |
|---|---|
boolean |
continueLoading(long positionUs)
Attempts to continue loading.
|
void |
discardUnselectedEmbeddedTracksTo(long positionUs)
Discards buffered media for embedded tracks that are not currently selected, up to the
specified position.
|
long |
getBufferedPositionUs()
Returns an estimate of the position up to which data is buffered.
|
T |
getChunkSource()
Returns the
ChunkSource used by this stream. |
long |
getNextLoadPositionUs()
Returns the next load time, or
C.TIME_END_OF_SOURCE if loading has finished. |
boolean |
isReady()
Returns whether data is available to be read.
|
void |
maybeThrowError()
Throws an error that's preventing data from being read.
|
void |
onLoadCanceled(Chunk loadable,
long elapsedRealtimeMs,
long loadDurationMs,
boolean released)
Called when a load has been canceled.
|
void |
onLoadCompleted(Chunk loadable,
long elapsedRealtimeMs,
long loadDurationMs)
Called when a load has completed.
|
int |
onLoadError(Chunk loadable,
long elapsedRealtimeMs,
long loadDurationMs,
java.io.IOException error)
Called when a load encounters an error.
|
int |
readData(FormatHolder formatHolder,
DecoderInputBuffer buffer,
boolean formatRequired)
Attempts to read from the stream.
|
void |
release()
Releases the stream.
|
void |
seekToUs(long positionUs)
Seeks to the specified position in microseconds.
|
ChunkSampleStream.EmbeddedSampleStream |
selectEmbeddedTrack(long positionUs,
int trackType)
Selects the embedded track, returning a new
ChunkSampleStream.EmbeddedSampleStream from which the track's
samples can be consumed. |
void |
skipData(long positionUs)
Attempts to skip to the keyframe before the specified position, or to the end of the stream if
positionUs is beyond it. |
public ChunkSampleStream(int primaryTrackType,
int[] embeddedTrackTypes,
T chunkSource,
SequenceableLoader.Callback<ChunkSampleStream<T>> callback,
Allocator allocator,
long positionUs,
int minLoadableRetryCount,
AdaptiveMediaSourceEventListener.EventDispatcher eventDispatcher)
primaryTrackType - The type of the primary track. One of the C
TRACK_TYPE_* constants.embeddedTrackTypes - The types of any embedded tracks, or null.chunkSource - A ChunkSource from which chunks to load are obtained.callback - An Callback for the stream.allocator - An Allocator from which allocations can be obtained.positionUs - The position from which to start loading media.minLoadableRetryCount - The minimum number of times that the source should retry a load
before propagating an error.eventDispatcher - A dispatcher to notify of events.public void discardUnselectedEmbeddedTracksTo(long positionUs)
positionUs - The position to discard up to, in microseconds.public ChunkSampleStream.EmbeddedSampleStream selectEmbeddedTrack(long positionUs, int trackType)
ChunkSampleStream.EmbeddedSampleStream from which the track's
samples can be consumed. ChunkSampleStream.EmbeddedSampleStream.release() must be called on the returned
stream when the track is no longer required, and before calling this method again to obtain
another stream for the same track.positionUs - The current playback position in microseconds.trackType - The type of the embedded track to enable.ChunkSampleStream.EmbeddedSampleStream for the embedded track.public T getChunkSource()
ChunkSource used by this stream.public long getBufferedPositionUs()
C.TIME_END_OF_SOURCE if the track is fully buffered.public void seekToUs(long positionUs)
positionUs - The seek position in microseconds.public void release()
This method should be called when the stream is no longer required.
public boolean isReady()
SampleStream
Note: If the stream has ended then a buffer with the end of stream flag can always be read from
SampleStream.readData(FormatHolder, DecoderInputBuffer, boolean). Hence an ended stream is always
ready.
isReady in interface SampleStreampublic void maybeThrowError()
throws java.io.IOException
SampleStreammaybeThrowError in interface SampleStreamjava.io.IOException - The underlying error.public int readData(FormatHolder formatHolder, DecoderInputBuffer buffer, boolean formatRequired)
SampleStream
If the stream has ended then C.BUFFER_FLAG_END_OF_STREAM flag is set on buffer
and C.RESULT_BUFFER_READ is returned. Else if no data is available then
C.RESULT_NOTHING_READ is returned. Else if the format of the media is changing or if
formatRequired is set then formatHolder is populated and
C.RESULT_FORMAT_READ is returned. Else buffer is populated and
C.RESULT_BUFFER_READ is returned.
readData in interface SampleStreamformatHolder - A FormatHolder to populate in the case of reading a format.buffer - A DecoderInputBuffer to populate in the case of reading a sample or the
end of the stream. If the end of the stream has been reached, the
C.BUFFER_FLAG_END_OF_STREAM flag will be set on the buffer.formatRequired - Whether the caller requires that the format of the stream be read even if
it's not changing. A sample will never be read if set to true, however it is still possible
for the end of stream or nothing to be read.C.RESULT_NOTHING_READ, C.RESULT_FORMAT_READ or
C.RESULT_BUFFER_READ.public void skipData(long positionUs)
SampleStreampositionUs is beyond it.skipData in interface SampleStreampositionUs - The specified time.public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs)
Loader.Callback
Note: There is guaranteed to be a memory barrier between Loader.Loadable.load() exiting and
this callback being called.
onLoadCompleted in interface Loader.Callback<Chunk>loadable - The loadable whose load has completed.elapsedRealtimeMs - SystemClock.elapsedRealtime() when the load ended.loadDurationMs - The duration of the load.public void onLoadCanceled(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released)
Loader.Callback
Note: If the Loader has not been released then there is guaranteed to be a memory
barrier between Loader.Loadable.load() exiting and this callback being called. If the
Loader has been released then this callback may be called before
Loader.Loadable.load() exits.
onLoadCanceled in interface Loader.Callback<Chunk>loadable - The loadable whose load has been canceled.elapsedRealtimeMs - SystemClock.elapsedRealtime() when the load was canceled.loadDurationMs - The duration of the load up to the point at which it was canceled.released - True if the load was canceled because the Loader was released. False
otherwise.public int onLoadError(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, java.io.IOException error)
Loader.Callback
Note: There is guaranteed to be a memory barrier between Loader.Loadable.load() exiting and
this callback being called.
onLoadError in interface Loader.Callback<Chunk>loadable - The loadable whose load has encountered an error.elapsedRealtimeMs - SystemClock.elapsedRealtime() when the error occurred.loadDurationMs - The duration of the load up to the point at which the error occurred.error - The load error.Loader.RETRY,
Loader.RETRY_RESET_ERROR_COUNT, Loader.DONT_RETRY and
Loader.DONT_RETRY_FATAL.public boolean continueLoading(long positionUs)
SequenceableLoadercontinueLoading in interface SequenceableLoaderpositionUs - The current playback position.SequenceableLoader.getNextLoadPositionUs() will return
a different value than prior to the call. False otherwise.public long getNextLoadPositionUs()
SequenceableLoaderC.TIME_END_OF_SOURCE if loading has finished.getNextLoadPositionUs in interface SequenceableLoader