Start better documenting track selection
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=162601990
This commit is contained in:
parent
19087a7fa0
commit
33f5bd6aed
@ -20,6 +20,7 @@ import android.util.SparseArray;
|
|||||||
import android.util.SparseBooleanArray;
|
import android.util.SparseBooleanArray;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
import com.google.android.exoplayer2.ExoPlaybackException;
|
||||||
|
import com.google.android.exoplayer2.Renderer;
|
||||||
import com.google.android.exoplayer2.RendererCapabilities;
|
import com.google.android.exoplayer2.RendererCapabilities;
|
||||||
import com.google.android.exoplayer2.RendererConfiguration;
|
import com.google.android.exoplayer2.RendererConfiguration;
|
||||||
import com.google.android.exoplayer2.source.TrackGroup;
|
import com.google.android.exoplayer2.source.TrackGroup;
|
||||||
@ -31,7 +32,8 @@ import java.util.Map;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for {@link TrackSelector}s that first establish a mapping between {@link TrackGroup}s
|
* Base class for {@link TrackSelector}s that first establish a mapping between {@link TrackGroup}s
|
||||||
* and renderers, and then from that mapping create a {@link TrackSelection} for each renderer.
|
* and {@link Renderer}s, and then from that mapping create a {@link TrackSelection} for each
|
||||||
|
* renderer.
|
||||||
*/
|
*/
|
||||||
public abstract class MappingTrackSelector extends TrackSelector {
|
public abstract class MappingTrackSelector extends TrackSelector {
|
||||||
|
|
||||||
|
@ -16,19 +16,74 @@
|
|||||||
package com.google.android.exoplayer2.trackselection;
|
package com.google.android.exoplayer2.trackselection;
|
||||||
|
|
||||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
import com.google.android.exoplayer2.ExoPlaybackException;
|
||||||
|
import com.google.android.exoplayer2.ExoPlayer;
|
||||||
|
import com.google.android.exoplayer2.Renderer;
|
||||||
import com.google.android.exoplayer2.RendererCapabilities;
|
import com.google.android.exoplayer2.RendererCapabilities;
|
||||||
|
import com.google.android.exoplayer2.RendererConfiguration;
|
||||||
import com.google.android.exoplayer2.source.TrackGroupArray;
|
import com.google.android.exoplayer2.source.TrackGroupArray;
|
||||||
|
|
||||||
/** Selects tracks to be consumed by available renderers. */
|
/**
|
||||||
|
* The component of an {@link ExoPlayer} responsible for selecting tracks to be consumed by each of
|
||||||
|
* the player's {@link Renderer}s. The {@link DefaultTrackSelector} implementation should be
|
||||||
|
* suitable for most use cases.
|
||||||
|
*
|
||||||
|
* <h3>Interactions with the player</h3>
|
||||||
|
* The following interactions occur between the player and its track selector during playback.
|
||||||
|
* <p>
|
||||||
|
* <ul>
|
||||||
|
* <li>When the player is created it will initialize the track selector by calling
|
||||||
|
* {@link #init(InvalidationListener)}.</li>
|
||||||
|
* <li>When the player needs to make a track selection it will call
|
||||||
|
* {@link #selectTracks(RendererCapabilities[], TrackGroupArray)}. This typically occurs at the
|
||||||
|
* start of playback, when the player starts to buffer a new period of the media being played,
|
||||||
|
* and when the track selector invalidates its previous selections.</li>
|
||||||
|
* <li>The player may perform a track selection well in advance of the selected tracks becoming
|
||||||
|
* active, where active is defined to mean that the renderers are actually consuming media
|
||||||
|
* corresponding to the selection that was made. For example when playing media containing
|
||||||
|
* multiple periods, the track selection for a period is made when the player starts to buffer
|
||||||
|
* that period. Hence if the player's buffering policy is to maintain a 30 second buffer, the
|
||||||
|
* selection will occur approximately 30 seconds in advance of it becoming active. In fact the
|
||||||
|
* selection may never become active, for example if the user seeks to some other period of the
|
||||||
|
* media during the 30 second gap. The player indicates to the track selector when a selection
|
||||||
|
* it has previously made becomes active by calling {@link #onSelectionActivated(Object)}.</li>
|
||||||
|
* <li>If the track selector wishes to indicate to the player that selections it has previously
|
||||||
|
* made are invalid, it can do so by calling
|
||||||
|
* {@link InvalidationListener#onTrackSelectionsInvalidated()} on the
|
||||||
|
* {@link InvalidationListener} that was passed to {@link #init(InvalidationListener)}. A
|
||||||
|
* track selector may wish to do this if its configuration has changed, for example if it now
|
||||||
|
* wishes to prefer audio tracks in a particular language. This will trigger the player to make
|
||||||
|
* new track selections. Note that the player will have to re-buffer in the case that the new
|
||||||
|
* track selection for the currently playing period differs from the one that was invalidated.
|
||||||
|
* </li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <h3>Renderer configuration</h3>
|
||||||
|
* The {@link TrackSelectorResult} returned by
|
||||||
|
* {@link #selectTracks(RendererCapabilities[], TrackGroupArray)} contains not only
|
||||||
|
* {@link TrackSelection}s for each renderer, but also {@link RendererConfiguration}s defining
|
||||||
|
* configuration parameters that the renderers should apply when consuming the corresponding media.
|
||||||
|
* Whilst it may seem counter-intuitive for a track selector to also specify renderer configuration
|
||||||
|
* information, in practice the two are tightly bound together. It may only be possible to play a
|
||||||
|
* certain combination tracks if the renderers are configured in a particular way. Equally, it may
|
||||||
|
* only be possible to configure renderers in a particular way if certain tracks are selected. Hence
|
||||||
|
* it makes sense to determined the track selection and corresponding renderer configurations in a
|
||||||
|
* single step.
|
||||||
|
*
|
||||||
|
* <h3>Threading model</h3>
|
||||||
|
* All calls made by the player into the track selector are on the player's internal playback
|
||||||
|
* thread. The track selector may call {@link InvalidationListener#onTrackSelectionsInvalidated()}
|
||||||
|
* from any thread.
|
||||||
|
*/
|
||||||
public abstract class TrackSelector {
|
public abstract class TrackSelector {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notified when previous selections by a {@link TrackSelector} are no longer valid.
|
* Notified when selections previously made by a {@link TrackSelector} are no longer valid.
|
||||||
*/
|
*/
|
||||||
public interface InvalidationListener {
|
public interface InvalidationListener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by a {@link TrackSelector} when previous selections are no longer valid.
|
* Called by a {@link TrackSelector} to indicate that selections it has previously made are no
|
||||||
|
* longer valid. May be called from any thread.
|
||||||
*/
|
*/
|
||||||
void onTrackSelectionsInvalidated();
|
void onTrackSelectionsInvalidated();
|
||||||
|
|
||||||
@ -37,16 +92,17 @@ public abstract class TrackSelector {
|
|||||||
private InvalidationListener listener;
|
private InvalidationListener listener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the selector.
|
* Called by the player to initialize the selector.
|
||||||
*
|
*
|
||||||
* @param listener A listener for the selector.
|
* @param listener An invalidation listener that the selector can call to indicate that selections
|
||||||
|
* it has previously made are no longer valid.
|
||||||
*/
|
*/
|
||||||
public final void init(InvalidationListener listener) {
|
public final void init(InvalidationListener listener) {
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs a track selection for renderers.
|
* Called by the player to perform a track selection.
|
||||||
*
|
*
|
||||||
* @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks
|
* @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks
|
||||||
* are to be selected.
|
* are to be selected.
|
||||||
@ -58,15 +114,16 @@ public abstract class TrackSelector {
|
|||||||
TrackGroupArray trackGroups) throws ExoPlaybackException;
|
TrackGroupArray trackGroups) throws ExoPlaybackException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a {@link TrackSelectorResult} previously generated by
|
* Called by the player when a {@link TrackSelectorResult} previously generated by
|
||||||
* {@link #selectTracks(RendererCapabilities[], TrackGroupArray)} is activated.
|
* {@link #selectTracks(RendererCapabilities[], TrackGroupArray)} is activated.
|
||||||
*
|
*
|
||||||
* @param info The value of {@link TrackSelectorResult#info} in the activated result.
|
* @param info The value of {@link TrackSelectorResult#info} in the activated selection.
|
||||||
*/
|
*/
|
||||||
public abstract void onSelectionActivated(Object info);
|
public abstract void onSelectionActivated(Object info);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invalidates all previously generated track selections.
|
* Calls {@link InvalidationListener#onTrackSelectionsInvalidated()} to invalidate all previously
|
||||||
|
* generated track selections.
|
||||||
*/
|
*/
|
||||||
protected final void invalidate() {
|
protected final void invalidate() {
|
||||||
if (listener != null) {
|
if (listener != null) {
|
||||||
|
@ -25,11 +25,11 @@ import com.google.android.exoplayer2.util.Util;
|
|||||||
public final class TrackSelectorResult {
|
public final class TrackSelectorResult {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The groups provided to the {@link TrackSelector}.
|
* The track groups that were provided to the {@link TrackSelector}.
|
||||||
*/
|
*/
|
||||||
public final TrackGroupArray groups;
|
public final TrackGroupArray groups;
|
||||||
/**
|
/**
|
||||||
* A {@link TrackSelectionArray} containing the selection for each renderer.
|
* A {@link TrackSelectionArray} containing the track selection for each renderer.
|
||||||
*/
|
*/
|
||||||
public final TrackSelectionArray selections;
|
public final TrackSelectionArray selections;
|
||||||
/**
|
/**
|
||||||
@ -43,10 +43,10 @@ public final class TrackSelectorResult {
|
|||||||
public final RendererConfiguration[] rendererConfigurations;
|
public final RendererConfiguration[] rendererConfigurations;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param groups The groups provided to the {@link TrackSelector}.
|
* @param groups The track groups provided to the {@link TrackSelector}.
|
||||||
* @param selections A {@link TrackSelectionArray} containing the selection for each renderer.
|
* @param selections A {@link TrackSelectionArray} containing the selection for each renderer.
|
||||||
* @param info An opaque object that will be returned to
|
* @param info An opaque object that will be returned to
|
||||||
* {@link TrackSelector#onSelectionActivated(Object)} should the selections be activated.
|
* {@link TrackSelector#onSelectionActivated(Object)} should the selection be activated.
|
||||||
* @param rendererConfigurations A {@link RendererConfiguration} for each renderer, to be used
|
* @param rendererConfigurations A {@link RendererConfiguration} for each renderer, to be used
|
||||||
* with the selections.
|
* with the selections.
|
||||||
*/
|
*/
|
||||||
@ -62,7 +62,7 @@ public final class TrackSelectorResult {
|
|||||||
* Returns whether this result is equivalent to {@code other} for all renderers.
|
* Returns whether this result is equivalent to {@code other} for all renderers.
|
||||||
*
|
*
|
||||||
* @param other The other {@link TrackSelectorResult}. May be null, in which case {@code false}
|
* @param other The other {@link TrackSelectorResult}. May be null, in which case {@code false}
|
||||||
* will be returned in all cases.
|
* will be returned.
|
||||||
* @return Whether this result is equivalent to {@code other} for all renderers.
|
* @return Whether this result is equivalent to {@code other} for all renderers.
|
||||||
*/
|
*/
|
||||||
public boolean isEquivalent(TrackSelectorResult other) {
|
public boolean isEquivalent(TrackSelectorResult other) {
|
||||||
@ -83,9 +83,10 @@ public final class TrackSelectorResult {
|
|||||||
* renderer.
|
* renderer.
|
||||||
*
|
*
|
||||||
* @param other The other {@link TrackSelectorResult}. May be null, in which case {@code false}
|
* @param other The other {@link TrackSelectorResult}. May be null, in which case {@code false}
|
||||||
* will be returned in all cases.
|
* will be returned.
|
||||||
* @param index The renderer index to check for equivalence.
|
* @param index The renderer index to check for equivalence.
|
||||||
* @return Whether this result is equivalent to {@code other} for all renderers.
|
* @return Whether this result is equivalent to {@code other} for the renderer at the specified
|
||||||
|
* index.
|
||||||
*/
|
*/
|
||||||
public boolean isEquivalent(TrackSelectorResult other, int index) {
|
public boolean isEquivalent(TrackSelectorResult other, int index) {
|
||||||
if (other == null) {
|
if (other == null) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user