/*
* Copyright 2020 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 androidx.media3.exoplayer.source.chunk;
import androidx.annotation.Nullable;
import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.exoplayer.analytics.PlayerId;
import androidx.media3.extractor.ChunkIndex;
import androidx.media3.extractor.ExtractorInput;
import androidx.media3.extractor.TrackOutput;
import java.io.IOException;
import java.util.List;
/**
* Extracts samples and track {@link Format Formats} from chunks.
*
* <p>The {@link TrackOutputProvider} passed to {@link #init} provides the {@link TrackOutput
* TrackOutputs} that receive the extracted data.
*/
@UnstableApi
public interface ChunkExtractor {
/** Creates {@link ChunkExtractor} instances. */
interface Factory {
/**
* Returns a new {@link ChunkExtractor} instance.
*
* @param primaryTrackType The {@link C.TrackType type} of the primary track.
* @param representationFormat The format of the representation to extract from.
* @param enableEventMessageTrack Whether to enable the event message track.
* @param closedCaptionFormats The {@link Format Formats} of the Closed-Caption tracks.
* @param playerEmsgTrackOutput The {@link TrackOutput} for extracted EMSG messages, or null.
* @param playerId The {@link PlayerId} of the player using this chunk extractor.
* @return A new {@link ChunkExtractor} instance, or null if not applicable.
*/
@Nullable
ChunkExtractor createProgressiveMediaExtractor(
@C.TrackType int primaryTrackType,
Format representationFormat,
boolean enableEventMessageTrack,
List<Format> closedCaptionFormats,
@Nullable TrackOutput playerEmsgTrackOutput,
PlayerId playerId);
}
/** Provides {@link TrackOutput} instances to be written to during extraction. */
interface TrackOutputProvider {
/**
* Called to get the {@link TrackOutput} for a specific track.
*
* <p>The same {@link TrackOutput} is returned if multiple calls are made with the same {@code
* id}.
*
* @param id A track identifier.
* @param type The {@link C.TrackType type} of the track.
* @return The {@link TrackOutput} for the given track identifier.
*/
TrackOutput track(int id, @C.TrackType int type);
}
/**
* Returns the {@link ChunkIndex} most recently obtained from the chunks, or null if a {@link
* ChunkIndex} has not been obtained.
*/
@Nullable
ChunkIndex getChunkIndex();
/**
* Returns the sample {@link Format}s for the tracks identified by the extractor, or null if the
* extractor has not finished identifying tracks.
*/
@Nullable
Format[] getSampleFormats();
/**
* Initializes the wrapper to output to {@link TrackOutput}s provided by the specified {@link
* TrackOutputProvider}, and configures the extractor to receive data from a new chunk.
*
* @param trackOutputProvider The provider of {@link TrackOutput}s that will receive sample data.
* @param startTimeUs The start position in the new chunk, or {@link C#TIME_UNSET} to output
* samples from the start of the chunk.
* @param endTimeUs The end position in the new chunk, or {@link C#TIME_UNSET} to output samples
* to the end of the chunk.
*/
void init(@Nullable TrackOutputProvider trackOutputProvider, long startTimeUs, long endTimeUs);
/** Releases any held resources. */
void release();
/**
* Reads from the given {@link ExtractorInput}.
*
* @param input The input to read from.
* @return Whether there is any data left to extract. Returns false if the end of input has been
* reached.
* @throws IOException If an error occurred reading from or parsing the input.
*/
boolean read(ExtractorInput input) throws IOException;
}