diff options
Diffstat (limited to 'tuner/src/com/android/tv/tuner/exoplayer/SampleExtractor.java')
-rw-r--r-- | tuner/src/com/android/tv/tuner/exoplayer/SampleExtractor.java | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/tuner/src/com/android/tv/tuner/exoplayer/SampleExtractor.java b/tuner/src/com/android/tv/tuner/exoplayer/SampleExtractor.java new file mode 100644 index 00000000..256aea92 --- /dev/null +++ b/tuner/src/com/android/tv/tuner/exoplayer/SampleExtractor.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.tv.tuner.exoplayer; + +import android.os.Handler; +import com.google.android.exoplayer.MediaFormat; +import com.google.android.exoplayer.MediaFormatHolder; +import com.google.android.exoplayer.SampleHolder; +import com.google.android.exoplayer.SampleSource; +import com.google.android.exoplayer.TrackRenderer; +import java.io.IOException; +import java.util.List; + +/** + * Extractor for reading track metadata and samples stored in tracks. + * + * <p>Call {@link #prepare} until it returns {@code true}, then access track metadata via {@link + * #getTrackFormats} and {@link #getTrackMediaFormat}. + * + * <p>Pass indices of tracks to read from to {@link #selectTrack}. A track can later be deselected + * by calling {@link #deselectTrack}. It is safe to select/deselect tracks after reading sample data + * or seeking. Initially, all tracks are deselected. + * + * <p>Call {@link #release()} when the extractor is no longer needed to free resources. + */ +public interface SampleExtractor { + + /** + * If the extractor is currently having difficulty preparing or loading samples, then this + * method throws the underlying error. Otherwise does nothing. + * + * @throws IOException The underlying error. + */ + void maybeThrowError() throws IOException; + + /** + * Prepares the extractor for reading track metadata and samples. + * + * @return whether the source is ready; if {@code false}, this method must be called again. + * @throws IOException thrown if the source can't be read + */ + boolean prepare() throws IOException; + + /** Returns track information about all tracks that can be selected. */ + List<MediaFormat> getTrackFormats(); + + /** Selects the track at {@code index} for reading sample data. */ + void selectTrack(int index); + + /** Deselects the track at {@code index}, so no more samples will be read from that track. */ + void deselectTrack(int index); + + /** + * Returns an estimate of the position up to which data is buffered. + * + * <p>This method should not be called until after the extractor has been successfully prepared. + * + * @return an estimate of the absolute position in microseconds up to which data is buffered, or + * {@link TrackRenderer#END_OF_TRACK_US} if data is buffered to the end of the stream, or + * {@link TrackRenderer#UNKNOWN_TIME_US} if no estimate is available. + */ + long getBufferedPositionUs(); + + /** + * Seeks to the specified time in microseconds. + * + * <p>This method should not be called until after the extractor has been successfully prepared. + * + * @param positionUs the seek position in microseconds + */ + void seekTo(long positionUs); + + /** Stores the {@link MediaFormat} of {@code track}. */ + void getTrackMediaFormat(int track, MediaFormatHolder outMediaFormatHolder); + + /** + * Reads the next sample in the track at index {@code track} into {@code sampleHolder}, + * returning {@link SampleSource#SAMPLE_READ} if it is available. + * + * <p>Advances to the next sample if a sample was read. + * + * @param track the index of the track from which to read a sample + * @param sampleHolder the holder for read sample data, if {@link SampleSource#SAMPLE_READ} is + * returned + * @return {@link SampleSource#SAMPLE_READ} if a sample was read into {@code sampleHolder}, or + * {@link SampleSource#END_OF_STREAM} if the last samples in all tracks have been read, or + * {@link SampleSource#NOTHING_READ} if the sample cannot be read immediately as it is not + * loaded. + */ + int readSample(int track, SampleHolder sampleHolder); + + /** Releases resources associated with this extractor. */ + void release(); + + /** Indicates to the source that it should still be buffering data. */ + boolean continueBuffering(long positionUs); + + /** + * Sets OnCompletionListener for notifying the completion of SampleExtractor. + * + * @param listener the OnCompletionListener + * @param handler the {@link Handler} for {@link Handler#post(Runnable)} of OnCompletionListener + */ + void setOnCompletionListener(OnCompletionListener listener, Handler handler); + + /** The listener for SampleExtractor being completed. */ + interface OnCompletionListener { + + /** + * Called when sample extraction is completed. + * + * @param result {@code true} when the extractor is finished without an error, {@code false} + * otherwise (storage error, weak signal, being reached at EoS prematurely, etc.) + * @param lastExtractedPositionUs the last extracted position when extractor is completed + */ + void onCompletion(boolean result, long lastExtractedPositionUs); + } +} |