Merge branch 'dev-v2' into rtsp-socket-factory

This commit is contained in:
claincly 2021-11-24 11:21:34 +00:00 committed by GitHub
commit e158f9ab0e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
120 changed files with 1931 additions and 1027 deletions

View file

@ -2,7 +2,17 @@
### dev-v2 (not yet released) ### dev-v2 (not yet released)
### 2.16.1 (2021-11-11) * DRM:
* Remove `playbackLooper` from `DrmSessionManager.(pre)acquireSession`.
When a `DrmSessionManager` is used by an app in a custom `MediaSource`,
the `playbackLooper` needs to be passed to `DrmSessionManager.setPlayer`
instead.
* IMA:
* Add a method to `AdPlaybackState` to allow resetting an ad group so that
it can be played again
([#9615](https://github.com/google/ExoPlayer/issues/9615)).
### 2.16.1 (2021-11-18)
* Core Library: * Core Library:
* Fix track selection issue where overriding one track group did not * Fix track selection issue where overriding one track group did not
@ -10,18 +20,26 @@
([#9675](https://github.com/google/ExoPlayer/issues/9675)). ([#9675](https://github.com/google/ExoPlayer/issues/9675)).
* Fix track selection issue where a mixture of non-empty and empty track * Fix track selection issue where a mixture of non-empty and empty track
overrides is not applied correctly overrides is not applied correctly
([#9649](https://github.com/google/ExoPlayer/issues/9649). ([#9649](https://github.com/google/ExoPlayer/issues/9649)).
* Add protected method `DefaultRenderersFactory.getCodecAdapterFactory()` * Add protected method `DefaultRenderersFactory.getCodecAdapterFactory()`
so that subclasses of `DefaultRenderersFactory` that override so that subclasses of `DefaultRenderersFactory` that override
`buildVideoRenderers()` or `buildAudioRenderers()` can access the codec `buildVideoRenderers()` or `buildAudioRenderers()` can access the codec
adapter factory and pass it to `MediaCodecRenderer` instances they adapter factory and pass it to `MediaCodecRenderer` instances they
create. create.
* Propagate ICY header fields `name` and `genre` to
`MediaMetadata.station` and `MediaMetadata.genre` respectively so that
they reach the app via `Player.Listener.onMediaMetadataChanged()`
([#9677](https://github.com/google/ExoPlayer/issues/9677)).
* Remove null keys from `DefaultHttpDataSource#getResponseHeaders`.
* Extractors: * Extractors:
* WAV: Add support for RF64 streams * WAV: Add support for RF64 streams
([#9543](https://github.com/google/ExoPlayer/issues/9543). ([#9543](https://github.com/google/ExoPlayer/issues/9543)).
* DASH: * DASH:
* Add parsed essential and supplemental properties to the `Representation` * Add parsed essential and supplemental properties to the `Representation`
([#9579](https://github.com/google/ExoPlayer/issues/9579)). ([#9579](https://github.com/google/ExoPlayer/issues/9579)).
* HLS:
* Correctly populate `Format.label` for audio only HLS streams
([#9608](https://github.com/google/ExoPlayer/issues/9608)).
* RTSP * RTSP
* Provide a client API to override the `SocketFactory` used for any server * Provide a client API to override the `SocketFactory` used for any server
connection ([#9606](https://github.com/google/ExoPlayer/pull/9606)). connection ([#9606](https://github.com/google/ExoPlayer/pull/9606)).

View file

@ -38,8 +38,7 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.StyledPlayerView;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.google.android.gms.cast.framework.CastButtonFactory; import com.google.android.gms.cast.framework.CastButtonFactory;
@ -53,8 +52,7 @@ import com.google.android.gms.dynamite.DynamiteModule;
public class MainActivity extends AppCompatActivity public class MainActivity extends AppCompatActivity
implements OnClickListener, PlayerManager.Listener { implements OnClickListener, PlayerManager.Listener {
private PlayerView localPlayerView; private StyledPlayerView playerView;
private PlayerControlView castControlView;
private PlayerManager playerManager; private PlayerManager playerManager;
private RecyclerView mediaQueueList; private RecyclerView mediaQueueList;
private MediaQueueListAdapter mediaQueueListAdapter; private MediaQueueListAdapter mediaQueueListAdapter;
@ -83,10 +81,8 @@ public class MainActivity extends AppCompatActivity
setContentView(R.layout.main_activity); setContentView(R.layout.main_activity);
localPlayerView = findViewById(R.id.local_player_view); playerView = findViewById(R.id.player_view);
localPlayerView.requestFocus(); playerView.requestFocus();
castControlView = findViewById(R.id.cast_control_view);
mediaQueueList = findViewById(R.id.sample_list); mediaQueueList = findViewById(R.id.sample_list);
ItemTouchHelper helper = new ItemTouchHelper(new RecyclerViewCallback()); ItemTouchHelper helper = new ItemTouchHelper(new RecyclerViewCallback());
@ -114,12 +110,7 @@ public class MainActivity extends AppCompatActivity
return; return;
} }
playerManager = playerManager =
new PlayerManager( new PlayerManager(/* listener= */ this, this, playerView, /* context= */ castContext);
/* listener= */ this,
localPlayerView,
castControlView,
/* context= */ this,
castContext);
mediaQueueList.setAdapter(mediaQueueListAdapter); mediaQueueList.setAdapter(mediaQueueListAdapter);
} }

View file

@ -17,7 +17,7 @@ package com.google.android.exoplayer2.castdemo;
import android.content.Context; import android.content.Context;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import androidx.core.content.res.ResourcesCompat;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
@ -28,8 +28,9 @@ import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.TracksInfo; import com.google.android.exoplayer2.TracksInfo;
import com.google.android.exoplayer2.ext.cast.CastPlayer; import com.google.android.exoplayer2.ext.cast.CastPlayer;
import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener; import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener;
import com.google.android.exoplayer2.ui.PlayerControlView;
import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.ui.StyledPlayerControlView;
import com.google.android.exoplayer2.ui.StyledPlayerView;
import com.google.android.gms.cast.framework.CastContext; import com.google.android.gms.cast.framework.CastContext;
import java.util.ArrayList; import java.util.ArrayList;
@ -50,8 +51,8 @@ import java.util.ArrayList;
void onUnsupportedTrack(int trackType); void onUnsupportedTrack(int trackType);
} }
private final PlayerView localPlayerView; private final Context context;
private final PlayerControlView castControlView; private final StyledPlayerView playerView;
private final Player localPlayer; private final Player localPlayer;
private final CastPlayer castPlayer; private final CastPlayer castPlayer;
private final ArrayList<MediaItem> mediaQueue; private final ArrayList<MediaItem> mediaQueue;
@ -64,32 +65,25 @@ import java.util.ArrayList;
/** /**
* Creates a new manager for {@link ExoPlayer} and {@link CastPlayer}. * Creates a new manager for {@link ExoPlayer} and {@link CastPlayer}.
* *
* @param listener A {@link Listener} for queue position changes.
* @param localPlayerView The {@link PlayerView} for local playback.
* @param castControlView The {@link PlayerControlView} to control remote playback.
* @param context A {@link Context}. * @param context A {@link Context}.
* @param listener A {@link Listener} for queue position changes.
* @param playerView The {@link PlayerView} for playback.
* @param castContext The {@link CastContext}. * @param castContext The {@link CastContext}.
*/ */
public PlayerManager( public PlayerManager(
Listener listener, Context context, Listener listener, StyledPlayerView playerView, CastContext castContext) {
PlayerView localPlayerView, this.context = context;
PlayerControlView castControlView,
Context context,
CastContext castContext) {
this.listener = listener; this.listener = listener;
this.localPlayerView = localPlayerView; this.playerView = playerView;
this.castControlView = castControlView;
mediaQueue = new ArrayList<>(); mediaQueue = new ArrayList<>();
currentItemIndex = C.INDEX_UNSET; currentItemIndex = C.INDEX_UNSET;
localPlayer = new ExoPlayer.Builder(context).build(); localPlayer = new ExoPlayer.Builder(context).build();
localPlayer.addListener(this); localPlayer.addListener(this);
localPlayerView.setPlayer(localPlayer);
castPlayer = new CastPlayer(castContext); castPlayer = new CastPlayer(castContext);
castPlayer.addListener(this); castPlayer.addListener(this);
castPlayer.setSessionAvailabilityListener(this); castPlayer.setSessionAvailabilityListener(this);
castControlView.setPlayer(castPlayer);
setCurrentPlayer(castPlayer.isCastSessionAvailable() ? castPlayer : localPlayer); setCurrentPlayer(castPlayer.isCastSessionAvailable() ? castPlayer : localPlayer);
} }
@ -192,11 +186,7 @@ import java.util.ArrayList;
* @return Whether the event was handled by the target view. * @return Whether the event was handled by the target view.
*/ */
public boolean dispatchKeyEvent(KeyEvent event) { public boolean dispatchKeyEvent(KeyEvent event) {
if (currentPlayer == localPlayer) { return playerView.dispatchKeyEvent(event);
return localPlayerView.dispatchKeyEvent(event);
} else /* currentPlayer == castPlayer */ {
return castControlView.dispatchKeyEvent(event);
}
} }
/** Releases the manager and the players that it holds. */ /** Releases the manager and the players that it holds. */
@ -205,7 +195,7 @@ import java.util.ArrayList;
mediaQueue.clear(); mediaQueue.clear();
castPlayer.setSessionAvailabilityListener(null); castPlayer.setSessionAvailabilityListener(null);
castPlayer.release(); castPlayer.release();
localPlayerView.setPlayer(null); playerView.setPlayer(null);
localPlayer.release(); localPlayer.release();
} }
@ -270,13 +260,19 @@ import java.util.ArrayList;
return; return;
} }
// View management. playerView.setPlayer(currentPlayer);
if (currentPlayer == localPlayer) { playerView.setControllerHideOnTouch(currentPlayer == localPlayer);
localPlayerView.setVisibility(View.VISIBLE); if (currentPlayer == castPlayer) {
castControlView.hide(); playerView.setControllerShowTimeoutMs(0);
} else /* currentPlayer == castPlayer */ { playerView.showController();
localPlayerView.setVisibility(View.GONE); playerView.setDefaultArtwork(
castControlView.show(); ResourcesCompat.getDrawable(
context.getResources(),
R.drawable.ic_baseline_cast_connected_400,
/* theme= */ null));
} else { // currentPlayer == localPlayer
playerView.setControllerShowTimeoutMs(StyledPlayerControlView.DEFAULT_SHOW_TIMEOUT_MS);
playerView.setDefaultArtwork(null);
} }
// Player state management. // Player state management.

View file

@ -0,0 +1,20 @@
<!--
~ Copyright 2021 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
~
~ https://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.
-->
<vector android:height="400dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="400dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M1,18v3h3c0,-1.66 -1.34,-3 -3,-3zM1,14v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM19,7L5,7v1.63c3.96,1.28 7.09,4.41 8.37,8.37L19,17L19,7zM1,10v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.93,-11 -11,-11zM21,3L3,3c-1.1,0 -2,0.9 -2,2v3h2L3,5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2z"/>
</vector>

View file

@ -20,7 +20,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:keepScreenOn="true"> android:keepScreenOn="true">
<com.google.android.exoplayer2.ui.PlayerView android:id="@+id/local_player_view" <com.google.android.exoplayer2.ui.StyledPlayerView android:id="@+id/player_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1" android:layout_weight="1"
@ -50,11 +50,4 @@
</RelativeLayout> </RelativeLayout>
<com.google.android.exoplayer2.ui.PlayerControlView android:id="@+id/cast_control_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:repeat_toggle_modes="all|one"
app:show_timeout="-1"/>
</LinearLayout> </LinearLayout>

View file

@ -88,6 +88,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
} catch (IOException e) { } catch (IOException e) {
throw new IllegalStateException(e); throw new IllegalStateException(e);
} }
program.use();
GlUtil.Attribute[] attributes = program.getAttributes(); GlUtil.Attribute[] attributes = program.getAttributes();
for (GlUtil.Attribute attribute : attributes) { for (GlUtil.Attribute attribute : attributes) {
if (attribute.name.equals("a_position")) { if (attribute.name.equals("a_position")) {
@ -142,7 +143,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
// Run the shader program. // Run the shader program.
GlUtil.Uniform[] uniforms = checkNotNull(this.uniforms); GlUtil.Uniform[] uniforms = checkNotNull(this.uniforms);
GlUtil.Attribute[] attributes = checkNotNull(this.attributes); GlUtil.Attribute[] attributes = checkNotNull(this.attributes);
checkNotNull(program).use();
for (GlUtil.Uniform uniform : uniforms) { for (GlUtil.Uniform uniform : uniforms) {
switch (uniform.name) { switch (uniform.name) {
case "tex_sampler_0": case "tex_sampler_0":

View file

@ -34,7 +34,7 @@ import com.google.android.exoplayer2.drm.HttpMediaDrmCallback;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource;
import com.google.android.exoplayer2.ui.PlayerView; import com.google.android.exoplayer2.ui.StyledPlayerView;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.upstream.DefaultDataSource;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.DefaultHttpDataSource;
@ -61,7 +61,7 @@ public final class MainActivity extends Activity {
private static final String DRM_SCHEME_EXTRA = "drm_scheme"; private static final String DRM_SCHEME_EXTRA = "drm_scheme";
private static final String DRM_LICENSE_URL_EXTRA = "drm_license_url"; private static final String DRM_LICENSE_URL_EXTRA = "drm_license_url";
@Nullable private PlayerView playerView; @Nullable private StyledPlayerView playerView;
@Nullable private VideoProcessingGLSurfaceView videoProcessingGLSurfaceView; @Nullable private VideoProcessingGLSurfaceView videoProcessingGLSurfaceView;
@Nullable private ExoPlayer player; @Nullable private ExoPlayer player;

View file

@ -20,7 +20,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:keepScreenOn="true"> android:keepScreenOn="true">
<com.google.android.exoplayer2.ui.PlayerView <com.google.android.exoplayer2.ui.StyledPlayerView
android:id="@+id/player_view" android:id="@+id/player_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View file

@ -6820,7 +6820,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<tr id="i1101" class="rowColor"> <tr id="i1101" class="rowColor">
<td class="colFirst"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></td> <td class="colFirst"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></td>
<th class="colLast" scope="row"> <th class="colLast" scope="row">
<div class="block">Forces the selection of <a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackIndexes"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndexes</code></a> for a <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div> <div class="block">Forces the selection of <a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackIndices"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndices</code></a> for a <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div>
</th> </th>
</tr> </tr>
<tr id="i1102" class="altColor"> <tr id="i1102" class="altColor">

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10}; var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -368,12 +368,20 @@ implements <a href="RenderersFactory.html" title="interface in com.google.androi
</tr> </tr>
<tr id="i8" class="altColor"> <tr id="i8" class="altColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#experimentalSetImmediateCodecStartAfterFlushEnabled(boolean)">experimentalSetImmediateCodecStartAfterFlushEnabled</a></span>&#8203;(boolean&nbsp;enabled)</code></th>
<td class="colLast">
<div class="block">Enable calling <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink"><code>MediaCodec.start()</code></a> immediately after <a href="https://developer.android.com/reference/android/media/MediaCodec.html?is-external=true#flush()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.flush()</code></a> on the
playback thread, when operating the codec in asynchronous mode.</div>
</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)">experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled</a></span>&#8203;(boolean&nbsp;enabled)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)">experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled</a></span>&#8203;(boolean&nbsp;enabled)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Enable synchronizing codec interactions with asynchronous buffer queueing.</div> <div class="block">Enable synchronizing codec interactions with asynchronous buffer queueing.</div>
</td> </td>
</tr> </tr>
<tr id="i9" class="rowColor"> <tr id="i10" class="altColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#forceDisableMediaCodecAsynchronousQueueing()">forceDisableMediaCodecAsynchronousQueueing</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#forceDisableMediaCodecAsynchronousQueueing()">forceDisableMediaCodecAsynchronousQueueing</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
@ -381,7 +389,7 @@ implements <a href="RenderersFactory.html" title="interface in com.google.androi
operating their <a href="https://developer.android.com/reference/android/media/MediaCodec.html" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec</code></a> in asynchronous mode and perform asynchronous queueing.</div> operating their <a href="https://developer.android.com/reference/android/media/MediaCodec.html" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec</code></a> in asynchronous mode and perform asynchronous queueing.</div>
</td> </td>
</tr> </tr>
<tr id="i10" class="altColor"> <tr id="i11" class="rowColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#forceEnableMediaCodecAsynchronousQueueing()">forceEnableMediaCodecAsynchronousQueueing</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#forceEnableMediaCodecAsynchronousQueueing()">forceEnableMediaCodecAsynchronousQueueing</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
@ -389,7 +397,14 @@ implements <a href="RenderersFactory.html" title="interface in com.google.androi
operate their <a href="https://developer.android.com/reference/android/media/MediaCodec.html" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec</code></a> in asynchronous mode and perform asynchronous queueing.</div> operate their <a href="https://developer.android.com/reference/android/media/MediaCodec.html" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec</code></a> in asynchronous mode and perform asynchronous queueing.</div>
</td> </td>
</tr> </tr>
<tr id="i11" class="rowColor"> <tr id="i12" class="altColor">
<td class="colFirst"><code>protected <a href="mediacodec/MediaCodecAdapter.Factory.html" title="interface in com.google.android.exoplayer2.mediacodec">MediaCodecAdapter.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getCodecAdapterFactory()">getCodecAdapterFactory</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the <a href="mediacodec/MediaCodecAdapter.Factory.html" title="interface in com.google.android.exoplayer2.mediacodec"><code>MediaCodecAdapter.Factory</code></a> that will be used when creating <a href="mediacodec/MediaCodecRenderer.html" title="class in com.google.android.exoplayer2.mediacodec"><code>MediaCodecRenderer</code></a> instances.</div>
</td>
</tr>
<tr id="i13" class="rowColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setAllowedVideoJoiningTimeMs(long)">setAllowedVideoJoiningTimeMs</a></span>&#8203;(long&nbsp;allowedVideoJoiningTimeMs)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setAllowedVideoJoiningTimeMs(long)">setAllowedVideoJoiningTimeMs</a></span>&#8203;(long&nbsp;allowedVideoJoiningTimeMs)</code></th>
<td class="colLast"> <td class="colLast">
@ -397,21 +412,21 @@ implements <a href="RenderersFactory.html" title="interface in com.google.androi
playback.</div> playback.</div>
</td> </td>
</tr> </tr>
<tr id="i12" class="altColor"> <tr id="i14" class="altColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableAudioFloatOutput(boolean)">setEnableAudioFloatOutput</a></span>&#8203;(boolean&nbsp;enableFloatOutput)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableAudioFloatOutput(boolean)">setEnableAudioFloatOutput</a></span>&#8203;(boolean&nbsp;enableFloatOutput)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets whether floating point audio should be output when possible.</div> <div class="block">Sets whether floating point audio should be output when possible.</div>
</td> </td>
</tr> </tr>
<tr id="i13" class="rowColor"> <tr id="i15" class="rowColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableAudioOffload(boolean)">setEnableAudioOffload</a></span>&#8203;(boolean&nbsp;enableOffload)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableAudioOffload(boolean)">setEnableAudioOffload</a></span>&#8203;(boolean&nbsp;enableOffload)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets whether audio should be played using the offload path.</div> <div class="block">Sets whether audio should be played using the offload path.</div>
</td> </td>
</tr> </tr>
<tr id="i14" class="altColor"> <tr id="i16" class="altColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableAudioTrackPlaybackParams(boolean)">setEnableAudioTrackPlaybackParams</a></span>&#8203;(boolean&nbsp;enableAudioTrackPlaybackParams)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableAudioTrackPlaybackParams(boolean)">setEnableAudioTrackPlaybackParams</a></span>&#8203;(boolean&nbsp;enableAudioTrackPlaybackParams)</code></th>
<td class="colLast"> <td class="colLast">
@ -419,14 +434,14 @@ implements <a href="RenderersFactory.html" title="interface in com.google.androi
23, rather than using application-level audio speed adjustment.</div> 23, rather than using application-level audio speed adjustment.</div>
</td> </td>
</tr> </tr>
<tr id="i15" class="rowColor"> <tr id="i17" class="rowColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableDecoderFallback(boolean)">setEnableDecoderFallback</a></span>&#8203;(boolean&nbsp;enableDecoderFallback)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableDecoderFallback(boolean)">setEnableDecoderFallback</a></span>&#8203;(boolean&nbsp;enableDecoderFallback)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets whether to enable fallback to lower-priority decoders if decoder initialization fails.</div> <div class="block">Sets whether to enable fallback to lower-priority decoders if decoder initialization fails.</div>
</td> </td>
</tr> </tr>
<tr id="i16" class="altColor"> <tr id="i18" class="altColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setExtensionRendererMode(int)">setExtensionRendererMode</a></span>&#8203;(int&nbsp;extensionRendererMode)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setExtensionRendererMode(int)">setExtensionRendererMode</a></span>&#8203;(int&nbsp;extensionRendererMode)</code></th>
<td class="colLast"> <td class="colLast">
@ -434,7 +449,7 @@ implements <a href="RenderersFactory.html" title="interface in com.google.androi
used.</div> used.</div>
</td> </td>
</tr> </tr>
<tr id="i17" class="rowColor"> <tr id="i19" class="rowColor">
<td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td> <td class="colFirst"><code><a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setMediaCodecSelector(com.google.android.exoplayer2.mediacodec.MediaCodecSelector)">setMediaCodecSelector</a></span>&#8203;(<a href="mediacodec/MediaCodecSelector.html" title="interface in com.google.android.exoplayer2.mediacodec">MediaCodecSelector</a>&nbsp;mediaCodecSelector)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setMediaCodecSelector(com.google.android.exoplayer2.mediacodec.MediaCodecSelector)">setMediaCodecSelector</a></span>&#8203;(<a href="mediacodec/MediaCodecSelector.html" title="interface in com.google.android.exoplayer2.mediacodec">MediaCodecSelector</a>&nbsp;mediaCodecSelector)</code></th>
<td class="colLast"> <td class="colLast">
@ -680,6 +695,28 @@ public&nbsp;DefaultRenderersFactory&#8203;(<a href="https://developer.android.co
</dl> </dl>
</li> </li>
</ul> </ul>
<a id="experimentalSetImmediateCodecStartAfterFlushEnabled(boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>experimentalSetImmediateCodecStartAfterFlushEnabled</h4>
<pre class="methodSignature">public&nbsp;<a href="DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a>&nbsp;experimentalSetImmediateCodecStartAfterFlushEnabled&#8203;(boolean&nbsp;enabled)</pre>
<div class="block">Enable calling <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink"><code>MediaCodec.start()</code></a> immediately after <a href="https://developer.android.com/reference/android/media/MediaCodec.html?is-external=true#flush()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.flush()</code></a> on the
playback thread, when operating the codec in asynchronous mode. If disabled, <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.start()</code></a> will be called by the callback thread after pending callbacks are handled.
<p>By default, this feature is disabled.
<p>This method is experimental, and will be renamed or removed in a future release.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>enabled</code> - Whether <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.start()</code></a> will be called on the playback thread
immediately after <a href="https://developer.android.com/reference/android/media/MediaCodec.html#flush()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.flush()</code></a>.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>This factory, for convenience.</dd>
</dl>
</li>
</ul>
<a id="setEnableDecoderFallback(boolean)"> <a id="setEnableDecoderFallback(boolean)">
<!-- --> <!-- -->
</a> </a>
@ -988,7 +1025,7 @@ public&nbsp;DefaultRenderersFactory&#8203;(<a href="https://developer.android.co
<a id="buildAudioSink(android.content.Context,boolean,boolean,boolean)"> <a id="buildAudioSink(android.content.Context,boolean,boolean,boolean)">
<!-- --> <!-- -->
</a> </a>
<ul class="blockListLast"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>buildAudioSink</h4> <h4>buildAudioSink</h4>
<pre class="methodSignature">@Nullable <pre class="methodSignature">@Nullable
@ -1010,6 +1047,16 @@ protected&nbsp;<a href="audio/AudioSink.html" title="interface in com.google.and
</dl> </dl>
</li> </li>
</ul> </ul>
<a id="getCodecAdapterFactory()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>getCodecAdapterFactory</h4>
<pre class="methodSignature">protected&nbsp;<a href="mediacodec/MediaCodecAdapter.Factory.html" title="interface in com.google.android.exoplayer2.mediacodec">MediaCodecAdapter.Factory</a>&nbsp;getCodecAdapterFactory()</pre>
<div class="block">Returns the <a href="mediacodec/MediaCodecAdapter.Factory.html" title="interface in com.google.android.exoplayer2.mediacodec"><code>MediaCodecAdapter.Factory</code></a> that will be used when creating <a href="mediacodec/MediaCodecRenderer.html" title="class in com.google.android.exoplayer2.mediacodec"><code>MediaCodecRenderer</code></a> instances.</div>
</li>
</ul>
</li> </li>
</ul> </ul>
</section> </section>

View file

@ -896,7 +896,8 @@ extends <a href="Player.html" title="interface in com.google.android.exoplayer2"
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>getPlayerError</h4> <h4>getPlayerError</h4>
<pre class="methodSignature"><a href="ExoPlaybackException.html" title="class in com.google.android.exoplayer2">ExoPlaybackException</a>&nbsp;getPlayerError()</pre> <pre class="methodSignature">@Nullable
<a href="ExoPlaybackException.html" title="class in com.google.android.exoplayer2">ExoPlaybackException</a>&nbsp;getPlayerError()</pre>
<div class="block">Equivalent to <a href="Player.html#getPlayerError()"><code>Player.getPlayerError()</code></a>, except the exception is guaranteed to be an <div class="block">Equivalent to <a href="Player.html#getPlayerError()"><code>Player.getPlayerError()</code></a>, except the exception is guaranteed to be an
<a href="ExoPlaybackException.html" title="class in com.google.android.exoplayer2"><code>ExoPlaybackException</code></a>.</div> <a href="ExoPlaybackException.html" title="class in com.google.android.exoplayer2"><code>ExoPlaybackException</code></a>.</div>
<dl> <dl>

View file

@ -1113,7 +1113,7 @@ implements <a href="Player.html" title="interface in com.google.android.exoplaye
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Stops playback without resetting the player.</div> <div class="block">Stops playback without resetting the playlist.</div>
</td> </td>
</tr> </tr>
<tr id="i123" class="rowColor"> <tr id="i123" class="rowColor">
@ -1595,7 +1595,10 @@ public&nbsp;void&nbsp;addListener&#8203;(<a href="Player.Listener.html" title="i
<h4>prepare</h4> <h4>prepare</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;prepare()</pre> <pre class="methodSignature">public&nbsp;void&nbsp;prepare()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="Player.html#prepare()">Player</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="Player.html#prepare()">Player</a></code></span></div>
<div class="block">Prepares the player.</div> <div class="block">Prepares the player.
<p>This will move the player out of <a href="Player.html#STATE_IDLE"><code>idle state</code></a> and the player will start
loading media and acquire resources needed for playback.</div>
<dl> <dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt> <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="Player.html#prepare()">prepare</a></code>&nbsp;in interface&nbsp;<code><a href="Player.html" title="interface in com.google.android.exoplayer2">Player</a></code></dd> <dd><code><a href="Player.html#prepare()">prepare</a></code>&nbsp;in interface&nbsp;<code><a href="Player.html" title="interface in com.google.android.exoplayer2">Player</a></code></dd>
@ -2337,12 +2340,13 @@ public&nbsp;void&nbsp;seekToNextWindow()</pre>
<h4>stop</h4> <h4>stop</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;stop()</pre> <pre class="methodSignature">public&nbsp;void&nbsp;stop()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="Player.html#stop()">Player</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="Player.html#stop()">Player</a></code></span></div>
<div class="block">Stops playback without resetting the player. Use <a href="Player.html#pause()"><code>Player.pause()</code></a> rather than this method if <div class="block">Stops playback without resetting the playlist. Use <a href="Player.html#pause()"><code>Player.pause()</code></a> rather than this method if
the intention is to pause playback. the intention is to pause playback.
<p>Calling this method will cause the playback state to transition to <a href="Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a>. The <p>Calling this method will cause the playback state to transition to <a href="Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a> and
player instance can still be used, and <a href="Player.html#release()"><code>Player.release()</code></a> must still be called on the player if the player will release the loaded media and resources required for playback. The player
it's no longer required. instance can still be used by calling <a href="Player.html#prepare()"><code>Player.prepare()</code></a> again, and <a href="Player.html#release()"><code>Player.release()</code></a> must
still be called on the player if it's no longer required.
<p>Calling this method does not clear the playlist, reset the playback position or the playback <p>Calling this method does not clear the playlist, reset the playback position or the playback
error.</div> error.</div>

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":42,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":42}; var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":42,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":42};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -387,54 +387,61 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
</tr> </tr>
<tr id="i29" class="rowColor"> <tr id="i29" class="rowColor">
<td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td> <td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setStation(java.lang.CharSequence)">setStation</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a>&nbsp;station)</code></th>
<td class="colLast">
<div class="block">Sets the name of the station streaming the media.</div>
</td>
</tr>
<tr id="i30" class="altColor">
<td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setSubtitle(java.lang.CharSequence)">setSubtitle</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a>&nbsp;subtitle)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setSubtitle(java.lang.CharSequence)">setSubtitle</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a>&nbsp;subtitle)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the subtitle.</div> <div class="block">Sets the subtitle.</div>
</td> </td>
</tr> </tr>
<tr id="i30" class="altColor"> <tr id="i31" class="rowColor">
<td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td> <td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setTitle(java.lang.CharSequence)">setTitle</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a>&nbsp;title)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setTitle(java.lang.CharSequence)">setTitle</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a>&nbsp;title)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the title.</div> <div class="block">Sets the title.</div>
</td> </td>
</tr> </tr>
<tr id="i31" class="rowColor"> <tr id="i32" class="altColor">
<td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td> <td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setTotalDiscCount(java.lang.Integer)">setTotalDiscCount</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&nbsp;totalDiscCount)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setTotalDiscCount(java.lang.Integer)">setTotalDiscCount</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&nbsp;totalDiscCount)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the total number of discs.</div> <div class="block">Sets the total number of discs.</div>
</td> </td>
</tr> </tr>
<tr id="i32" class="altColor"> <tr id="i33" class="rowColor">
<td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td> <td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setTotalTrackCount(java.lang.Integer)">setTotalTrackCount</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&nbsp;totalTrackCount)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setTotalTrackCount(java.lang.Integer)">setTotalTrackCount</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&nbsp;totalTrackCount)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the total number of tracks.</div> <div class="block">Sets the total number of tracks.</div>
</td> </td>
</tr> </tr>
<tr id="i33" class="rowColor"> <tr id="i34" class="altColor">
<td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td> <td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setTrackNumber(java.lang.Integer)">setTrackNumber</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&nbsp;trackNumber)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setTrackNumber(java.lang.Integer)">setTrackNumber</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&nbsp;trackNumber)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the track number.</div> <div class="block">Sets the track number.</div>
</td> </td>
</tr> </tr>
<tr id="i34" class="altColor"> <tr id="i35" class="rowColor">
<td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td> <td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setUserRating(com.google.android.exoplayer2.Rating)">setUserRating</a></span>&#8203;(<a href="Rating.html" title="class in com.google.android.exoplayer2">Rating</a>&nbsp;userRating)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setUserRating(com.google.android.exoplayer2.Rating)">setUserRating</a></span>&#8203;(<a href="Rating.html" title="class in com.google.android.exoplayer2">Rating</a>&nbsp;userRating)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the user <a href="Rating.html" title="class in com.google.android.exoplayer2"><code>Rating</code></a>.</div> <div class="block">Sets the user <a href="Rating.html" title="class in com.google.android.exoplayer2"><code>Rating</code></a>.</div>
</td> </td>
</tr> </tr>
<tr id="i35" class="rowColor"> <tr id="i36" class="altColor">
<td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td> <td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setWriter(java.lang.CharSequence)">setWriter</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a>&nbsp;writer)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setWriter(java.lang.CharSequence)">setWriter</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a>&nbsp;writer)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the writer.</div> <div class="block">Sets the writer.</div>
</td> </td>
</tr> </tr>
<tr id="i36" class="altColor"> <tr id="i37" class="rowColor">
<td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td> <td class="colFirst"><code><a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setYear(java.lang.Integer)">setYear</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&nbsp;year)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setYear(java.lang.Integer)">setYear</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&nbsp;year)</code></th>
<td class="colLast"> <td class="colLast">
@ -861,6 +868,17 @@ public&nbsp;<a href="MediaMetadata.Builder.html" title="class in com.google.andr
<div class="block">Sets the compilation.</div> <div class="block">Sets the compilation.</div>
</li> </li>
</ul> </ul>
<a id="setStation(java.lang.CharSequence)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setStation</h4>
<pre class="methodSignature">public&nbsp;<a href="MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a>&nbsp;setStation&#8203;(@Nullable
<a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a>&nbsp;station)</pre>
<div class="block">Sets the name of the station streaming the media.</div>
</li>
</ul>
<a id="setExtras(android.os.Bundle)"> <a id="setExtras(android.os.Bundle)">
<!-- --> <!-- -->
</a> </a>

View file

@ -548,54 +548,61 @@ implements <a href="Bundleable.html" title="interface in com.google.android.exop
</tr> </tr>
<tr class="rowColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a></code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#station">station</a></span></code></th>
<td class="colLast">
<div class="block">Optional name of the station streaming the media.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#subtitle">subtitle</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#subtitle">subtitle</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Optional subtitle.</div> <div class="block">Optional subtitle.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a></code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#title">title</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#title">title</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Optional title.</div> <div class="block">Optional title.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a></code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#totalDiscCount">totalDiscCount</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#totalDiscCount">totalDiscCount</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Optional total number of discs.</div> <div class="block">Optional total number of discs.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a></code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#totalTrackCount">totalTrackCount</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#totalTrackCount">totalTrackCount</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Optional total number of tracks.</div> <div class="block">Optional total number of tracks.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a></code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#trackNumber">trackNumber</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#trackNumber">trackNumber</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Optional track number.</div> <div class="block">Optional track number.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="Rating.html" title="class in com.google.android.exoplayer2">Rating</a></code></td> <td class="colFirst"><code><a href="Rating.html" title="class in com.google.android.exoplayer2">Rating</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#userRating">userRating</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#userRating">userRating</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Optional user <a href="Rating.html" title="class in com.google.android.exoplayer2"><code>Rating</code></a>.</div> <div class="block">Optional user <a href="Rating.html" title="class in com.google.android.exoplayer2"><code>Rating</code></a>.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a></code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#writer">writer</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#writer">writer</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Optional writer.</div> <div class="block">Optional writer.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a></code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#year">year</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#year">year</a></span></code></th>
<td class="colLast"> <td class="colLast">
@ -1421,6 +1428,17 @@ public final&nbsp;<a href="https://developer.android.com/reference/java/lang/Cha
<div class="block">Optional compilation.</div> <div class="block">Optional compilation.</div>
</li> </li>
</ul> </ul>
<a id="station">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>station</h4>
<pre>@Nullable
public final&nbsp;<a href="https://developer.android.com/reference/java/lang/CharSequence.html" title="class or interface in java.lang" class="externalLink" target="_top">CharSequence</a> station</pre>
<div class="block">Optional name of the station streaming the media.</div>
</li>
</ul>
<a id="extras"> <a id="extras">
<!-- --> <!-- -->
</a> </a>

View file

@ -837,7 +837,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<td class="colFirst"><code>static int</code></td> <td class="colFirst"><code>static int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#STATE_IDLE">STATE_IDLE</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#STATE_IDLE">STATE_IDLE</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">The player is idle, and must be <a href="#prepare()"><code>prepared</code></a> before it will play the media.</div> <div class="block">The player is idle, meaning it holds only limited resources.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="altColor">
@ -1141,7 +1141,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getCurrentWindowIndex()">getCurrentWindowIndex</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getCurrentWindowIndex()">getCurrentWindowIndex</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
<div class="block"><span class="deprecatedLabel">Deprecated.</span> <div class="block"><span class="deprecatedLabel">Deprecated.</span>
<div class="deprecationComment">Use <a href="#getCurrentMediaItem()"><code>getCurrentMediaItem()</code></a> instead.</div> <div class="deprecationComment">Use <a href="#getCurrentMediaItemIndex()"><code>getCurrentMediaItemIndex()</code></a> instead.</div>
</div> </div>
</td> </td>
</tr> </tr>
@ -1803,7 +1803,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Stops playback without resetting the player.</div> <div class="block">Stops playback without resetting the playlist.</div>
</td> </td>
</tr> </tr>
<tr id="i122" class="altColor"> <tr id="i122" class="altColor">
@ -1840,7 +1840,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<li class="blockList"> <li class="blockList">
<h4>STATE_IDLE</h4> <h4>STATE_IDLE</h4>
<pre>static final&nbsp;int STATE_IDLE</pre> <pre>static final&nbsp;int STATE_IDLE</pre>
<div class="block">The player is idle, and must be <a href="#prepare()"><code>prepared</code></a> before it will play the media.</div> <div class="block">The player is idle, meaning it holds only limited resources. The player must be <a href="#prepare()"><code>prepared</code></a> before it will play the media.</div>
<dl> <dl>
<dt><span class="seeLabel">See Also:</span></dt> <dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../constant-values.html#com.google.android.exoplayer2.Player.STATE_IDLE">Constant Field Values</a></dd> <dd><a href="../../../../constant-values.html#com.google.android.exoplayer2.Player.STATE_IDLE">Constant Field Values</a></dd>
@ -3371,7 +3371,10 @@ static final&nbsp;int COMMAND_SEEK_TO_WINDOW</pre>
<li class="blockList"> <li class="blockList">
<h4>prepare</h4> <h4>prepare</h4>
<pre class="methodSignature">void&nbsp;prepare()</pre> <pre class="methodSignature">void&nbsp;prepare()</pre>
<div class="block">Prepares the player.</div> <div class="block">Prepares the player.
<p>This will move the player out of <a href="#STATE_IDLE"><code>idle state</code></a> and the player will start
loading media and acquire resources needed for playback.</div>
</li> </li>
</ul> </ul>
<a id="getPlaybackState()"> <a id="getPlaybackState()">
@ -3987,12 +3990,13 @@ void&nbsp;seekToNextWindow()</pre>
<li class="blockList"> <li class="blockList">
<h4>stop</h4> <h4>stop</h4>
<pre class="methodSignature">void&nbsp;stop()</pre> <pre class="methodSignature">void&nbsp;stop()</pre>
<div class="block">Stops playback without resetting the player. Use <a href="#pause()"><code>pause()</code></a> rather than this method if <div class="block">Stops playback without resetting the playlist. Use <a href="#pause()"><code>pause()</code></a> rather than this method if
the intention is to pause playback. the intention is to pause playback.
<p>Calling this method will cause the playback state to transition to <a href="#STATE_IDLE"><code>STATE_IDLE</code></a>. The <p>Calling this method will cause the playback state to transition to <a href="#STATE_IDLE"><code>STATE_IDLE</code></a> and
player instance can still be used, and <a href="#release()"><code>release()</code></a> must still be called on the player if the player will release the loaded media and resources required for playback. The player
it's no longer required. instance can still be used by calling <a href="#prepare()"><code>prepare()</code></a> again, and <a href="#release()"><code>release()</code></a> must
still be called on the player if it's no longer required.
<p>Calling this method does not clear the playlist, reset the playback position or the playback <p>Calling this method does not clear the playlist, reset the playback position or the playback
error.</div> error.</div>
@ -4196,7 +4200,7 @@ void&nbsp;stop&#8203;(boolean&nbsp;reset)</pre>
<pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a> <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
int&nbsp;getCurrentWindowIndex()</pre> int&nbsp;getCurrentWindowIndex()</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
<div class="deprecationComment">Use <a href="#getCurrentMediaItem()"><code>getCurrentMediaItem()</code></a> instead.</div> <div class="deprecationComment">Use <a href="#getCurrentMediaItemIndex()"><code>getCurrentMediaItemIndex()</code></a> instead.</div>
</div> </div>
</li> </li>
</ul> </ul>

View file

@ -1374,7 +1374,7 @@ implements <a href="ExoPlayer.html" title="interface in com.google.android.exopl
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
<div class="block"><span class="deprecatedLabel">Deprecated.</span></div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block">Stops playback without resetting the player.</div> <div class="block">Stops playback without resetting the playlist.</div>
</td> </td>
</tr> </tr>
<tr id="i131" class="rowColor"> <tr id="i131" class="rowColor">
@ -2700,7 +2700,10 @@ public&nbsp;void&nbsp;retry()</pre>
<pre class="methodSignature">public&nbsp;void&nbsp;prepare()</pre> <pre class="methodSignature">public&nbsp;void&nbsp;prepare()</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="Player.html#prepare()">Player</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="Player.html#prepare()">Player</a></code></span></div>
<div class="block">Prepares the player.</div> <div class="block">Prepares the player.
<p>This will move the player out of <a href="Player.html#STATE_IDLE"><code>idle state</code></a> and the player will start
loading media and acquire resources needed for playback.</div>
<dl> <dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt> <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="Player.html#prepare()">prepare</a></code>&nbsp;in interface&nbsp;<code><a href="Player.html" title="interface in com.google.android.exoplayer2">Player</a></code></dd> <dd><code><a href="Player.html#prepare()">prepare</a></code>&nbsp;in interface&nbsp;<code><a href="Player.html" title="interface in com.google.android.exoplayer2">Player</a></code></dd>
@ -3457,12 +3460,13 @@ public&nbsp;@com.google.android.exoplayer2.Player.RepeatMode int&nbsp;getRepeatM
<pre class="methodSignature">public&nbsp;void&nbsp;stop()</pre> <pre class="methodSignature">public&nbsp;void&nbsp;stop()</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="Player.html#stop()">Player</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="Player.html#stop()">Player</a></code></span></div>
<div class="block">Stops playback without resetting the player. Use <a href="Player.html#pause()"><code>Player.pause()</code></a> rather than this method if <div class="block">Stops playback without resetting the playlist. Use <a href="Player.html#pause()"><code>Player.pause()</code></a> rather than this method if
the intention is to pause playback. the intention is to pause playback.
<p>Calling this method will cause the playback state to transition to <a href="Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a>. The <p>Calling this method will cause the playback state to transition to <a href="Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a> and
player instance can still be used, and <a href="Player.html#release()"><code>Player.release()</code></a> must still be called on the player if the player will release the loaded media and resources required for playback. The player
it's no longer required. instance can still be used by calling <a href="Player.html#prepare()"><code>Player.prepare()</code></a> again, and <a href="Player.html#release()"><code>Player.release()</code></a> must
still be called on the player if it's no longer required.
<p>Calling this method does not clear the playlist, reset the playback position or the playback <p>Calling this method does not clear the playlist, reset the playback position or the playback
error.</div> error.</div>

View file

@ -161,11 +161,25 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
</tr> </tr>
<tr class="rowColor"> <tr class="rowColor">
<td class="colFirst"><code>static int</code></td> <td class="colFirst"><code>static int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#DS64_FOURCC">DS64_FOURCC</a></span></code></th>
<td class="colLast">
<div class="block">Four character code for "ds64".</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#FMT_FOURCC">FMT_FOURCC</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#FMT_FOURCC">FMT_FOURCC</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Four character code for "fmt ".</div> <div class="block">Four character code for "fmt ".</div>
</td> </td>
</tr> </tr>
<tr class="rowColor">
<td class="colFirst"><code>static int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#RF64_FOURCC">RF64_FOURCC</a></span></code></th>
<td class="colLast">
<div class="block">Four character code for "RF64".</div>
</td>
</tr>
<tr class="altColor"> <tr class="altColor">
<td class="colFirst"><code>static int</code></td> <td class="colFirst"><code>static int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#RIFF_FOURCC">RIFF_FOURCC</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#RIFF_FOURCC">RIFF_FOURCC</a></span></code></th>
@ -335,6 +349,34 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
</dl> </dl>
</li> </li>
</ul> </ul>
<a id="RF64_FOURCC">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>RF64_FOURCC</h4>
<pre>public static final&nbsp;int RF64_FOURCC</pre>
<div class="block">Four character code for "RF64".</div>
<dl>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../../constant-values.html#com.google.android.exoplayer2.audio.WavUtil.RF64_FOURCC">Constant Field Values</a></dd>
</dl>
</li>
</ul>
<a id="DS64_FOURCC">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>DS64_FOURCC</h4>
<pre>public static final&nbsp;int DS64_FOURCC</pre>
<div class="block">Four character code for "ds64".</div>
<dl>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../../../../constant-values.html#com.google.android.exoplayer2.audio.WavUtil.DS64_FOURCC">Constant Field Values</a></dd>
</dl>
</li>
</ul>
<a id="TYPE_PCM"> <a id="TYPE_PCM">
<!-- --> <!-- -->
</a> </a>

View file

@ -807,7 +807,7 @@ extends <a href="../../BasePlayer.html" title="class in com.google.android.exopl
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Stops playback without resetting the player.</div> <div class="block">Stops playback without resetting the playlist.</div>
</td> </td>
</tr> </tr>
<tr id="i74" class="altColor"> <tr id="i74" class="altColor">
@ -1219,7 +1219,10 @@ public&nbsp;void&nbsp;removeListener&#8203;(<a href="../../Player.EventListener.
<h4>prepare</h4> <h4>prepare</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;prepare()</pre> <pre class="methodSignature">public&nbsp;void&nbsp;prepare()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../Player.html#prepare()">Player</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../Player.html#prepare()">Player</a></code></span></div>
<div class="block">Prepares the player.</div> <div class="block">Prepares the player.
<p>This will move the player out of <a href="../../Player.html#STATE_IDLE"><code>idle state</code></a> and the player will start
loading media and acquire resources needed for playback.</div>
</li> </li>
</ul> </ul>
<a id="getPlaybackState()"> <a id="getPlaybackState()">
@ -1408,12 +1411,13 @@ public&nbsp;<a href="../../PlaybackException.html" title="class in com.google.an
<h4>stop</h4> <h4>stop</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;stop()</pre> <pre class="methodSignature">public&nbsp;void&nbsp;stop()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../Player.html#stop()">Player</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../Player.html#stop()">Player</a></code></span></div>
<div class="block">Stops playback without resetting the player. Use <a href="../../Player.html#pause()"><code>Player.pause()</code></a> rather than this method if <div class="block">Stops playback without resetting the playlist. Use <a href="../../Player.html#pause()"><code>Player.pause()</code></a> rather than this method if
the intention is to pause playback. the intention is to pause playback.
<p>Calling this method will cause the playback state to transition to <a href="../../Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a>. The <p>Calling this method will cause the playback state to transition to <a href="../../Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a> and
player instance can still be used, and <a href="../../Player.html#release()"><code>Player.release()</code></a> must still be called on the player if the player will release the loaded media and resources required for playback. The player
it's no longer required. instance can still be used by calling <a href="../../Player.html#prepare()"><code>Player.prepare()</code></a> again, and <a href="../../Player.html#release()"><code>Player.release()</code></a> must
still be called on the player if it's no longer required.
<p>Calling this method does not clear the playlist, reset the playback position or the playback <p>Calling this method does not clear the playlist, reset the playback position or the playback
error.</div> error.</div>

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10}; var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -210,19 +210,27 @@ implements <a href="MediaCodecAdapter.Factory.html" title="interface in com.goog
</tr> </tr>
<tr id="i1" class="rowColor"> <tr id="i1" class="rowColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#experimentalSetImmediateCodecStartAfterFlushEnabled(boolean)">experimentalSetImmediateCodecStartAfterFlushEnabled</a></span>&#8203;(boolean&nbsp;enabled)</code></th>
<td class="colLast">
<div class="block">Enable calling <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink"><code>MediaCodec.start()</code></a> immediately after <a href="https://developer.android.com/reference/android/media/MediaCodec.html?is-external=true#flush()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.flush()</code></a> on the
playback thread, when operating the codec in asynchronous mode.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)">experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled</a></span>&#8203;(boolean&nbsp;enabled)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(boolean)">experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled</a></span>&#8203;(boolean&nbsp;enabled)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Enable synchronizing codec interactions with asynchronous buffer queueing.</div> <div class="block">Enable synchronizing codec interactions with asynchronous buffer queueing.</div>
</td> </td>
</tr> </tr>
<tr id="i2" class="altColor"> <tr id="i3" class="rowColor">
<td class="colFirst"><code><a href="DefaultMediaCodecAdapterFactory.html" title="class in com.google.android.exoplayer2.mediacodec">DefaultMediaCodecAdapterFactory</a></code></td> <td class="colFirst"><code><a href="DefaultMediaCodecAdapterFactory.html" title="class in com.google.android.exoplayer2.mediacodec">DefaultMediaCodecAdapterFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#forceDisableAsynchronous()">forceDisableAsynchronous</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#forceDisableAsynchronous()">forceDisableAsynchronous</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Forces the factory to always create <a href="SynchronousMediaCodecAdapter.html" title="class in com.google.android.exoplayer2.mediacodec"><code>SynchronousMediaCodecAdapter</code></a> instances.</div> <div class="block">Forces the factory to always create <a href="SynchronousMediaCodecAdapter.html" title="class in com.google.android.exoplayer2.mediacodec"><code>SynchronousMediaCodecAdapter</code></a> instances.</div>
</td> </td>
</tr> </tr>
<tr id="i3" class="rowColor"> <tr id="i4" class="altColor">
<td class="colFirst"><code><a href="DefaultMediaCodecAdapterFactory.html" title="class in com.google.android.exoplayer2.mediacodec">DefaultMediaCodecAdapterFactory</a></code></td> <td class="colFirst"><code><a href="DefaultMediaCodecAdapterFactory.html" title="class in com.google.android.exoplayer2.mediacodec">DefaultMediaCodecAdapterFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#forceEnableAsynchronous()">forceEnableAsynchronous</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#forceEnableAsynchronous()">forceEnableAsynchronous</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
@ -320,6 +328,26 @@ implements <a href="MediaCodecAdapter.Factory.html" title="interface in com.goog
</dl> </dl>
</li> </li>
</ul> </ul>
<a id="experimentalSetImmediateCodecStartAfterFlushEnabled(boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>experimentalSetImmediateCodecStartAfterFlushEnabled</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;experimentalSetImmediateCodecStartAfterFlushEnabled&#8203;(boolean&nbsp;enabled)</pre>
<div class="block">Enable calling <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink"><code>MediaCodec.start()</code></a> immediately after <a href="https://developer.android.com/reference/android/media/MediaCodec.html?is-external=true#flush()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.flush()</code></a> on the
playback thread, when operating the codec in asynchronous mode. If disabled, <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.start()</code></a> will be called by the callback thread after pending callbacks are handled.
<p>By default, this feature is enabled.
<p>This method is experimental, and will be renamed or removed in a future release.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>enabled</code> - Whether <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.start()</code></a> will be called on the playback thread
immediately after <a href="https://developer.android.com/reference/android/media/MediaCodec.html#flush()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.flush()</code></a>.</dd>
</dl>
</li>
</ul>
<a id="createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)"> <a id="createAdapter(com.google.android.exoplayer2.mediacodec.MediaCodecAdapter.Configuration)">
<!-- --> <!-- -->
</a> </a>

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10}; var data = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":10,"i6":10};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -308,11 +308,18 @@ implements <a href="../Metadata.Entry.html" title="interface in com.google.andro
</td> </td>
</tr> </tr>
<tr id="i4" class="altColor"> <tr id="i4" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata</a></span>&#8203;(<a href="../../MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a>&nbsp;builder)</code></th>
<td class="colLast">
<div class="block">Updates the <a href="../../MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2"><code>MediaMetadata.Builder</code></a> with the type specific values stored in this Entry.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a></code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#toString()">toString</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#toString()">toString</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i5" class="rowColor"> <tr id="i6" class="altColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#writeToParcel(android.os.Parcel,int)">writeToParcel</a></span>&#8203;(<a href="https://developer.android.com/reference/android/os/Parcel.html" title="class or interface in android.os" class="externalLink" target="_top">Parcel</a>&nbsp;dest, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#writeToParcel(android.os.Parcel,int)">writeToParcel</a></span>&#8203;(<a href="https://developer.android.com/reference/android/os/Parcel.html" title="class or interface in android.os" class="externalLink" target="_top">Parcel</a>&nbsp;dest,
int&nbsp;flags)</code></th> int&nbsp;flags)</code></th>
@ -331,7 +338,7 @@ implements <a href="../Metadata.Entry.html" title="interface in com.google.andro
<!-- --> <!-- -->
</a> </a>
<h3>Methods inherited from interface&nbsp;com.google.android.exoplayer2.metadata.<a href="../Metadata.Entry.html" title="interface in com.google.android.exoplayer2.metadata">Metadata.Entry</a></h3> <h3>Methods inherited from interface&nbsp;com.google.android.exoplayer2.metadata.<a href="../Metadata.Entry.html" title="interface in com.google.android.exoplayer2.metadata">Metadata.Entry</a></h3>
<code><a href="../Metadata.Entry.html#getWrappedMetadataBytes()">getWrappedMetadataBytes</a>, <a href="../Metadata.Entry.html#getWrappedMetadataFormat()">getWrappedMetadataFormat</a>, <a href="../Metadata.Entry.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata</a></code></li> <code><a href="../Metadata.Entry.html#getWrappedMetadataBytes()">getWrappedMetadataBytes</a>, <a href="../Metadata.Entry.html#getWrappedMetadataFormat()">getWrappedMetadataFormat</a></code></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -513,6 +520,26 @@ public static&nbsp;<a href="IcyHeaders.html" title="class in com.google.android.
</dl> </dl>
</li> </li>
</ul> </ul>
<a id="populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>populateMediaMetadata</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;populateMediaMetadata&#8203;(<a href="../../MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a>&nbsp;builder)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Metadata.Entry.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">Metadata.Entry</a></code></span></div>
<div class="block">Updates the <a href="../../MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2"><code>MediaMetadata.Builder</code></a> with the type specific values stored in this Entry.
<p>The order of the <a href="../Metadata.Entry.html" title="interface in com.google.android.exoplayer2.metadata"><code>Metadata.Entry</code></a> objects in the <a href="../Metadata.html" title="class in com.google.android.exoplayer2.metadata"><code>Metadata</code></a> matters. If two <a href="../Metadata.Entry.html" title="interface in com.google.android.exoplayer2.metadata"><code>Metadata.Entry</code></a> entries attempt to populate the same <a href="../../MediaMetadata.html" title="class in com.google.android.exoplayer2"><code>MediaMetadata</code></a> field, then the last one in
the list is used.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../Metadata.Entry.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata</a></code>&nbsp;in interface&nbsp;<code><a href="../Metadata.Entry.html" title="interface in com.google.android.exoplayer2.metadata">Metadata.Entry</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>builder</code> - The builder to be updated.</dd>
</dl>
</li>
</ul>
<a id="equals(java.lang.Object)"> <a id="equals(java.lang.Object)">
<!-- --> <!-- -->
</a> </a>

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":42}; var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":42,"i6":42,"i7":10,"i8":42,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":42};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -310,14 +310,14 @@ implements <a href="MediaSourceFactory.html" title="interface in com.google.andr
<td class="colFirst"><code><a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></code></td> <td class="colFirst"><code><a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i6" class="altColor"> <tr id="i6" class="altColor">
<td class="colFirst"><code><a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></code></td> <td class="colFirst"><code><a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i7" class="rowColor"> <tr id="i7" class="rowColor">
@ -332,7 +332,7 @@ implements <a href="MediaSourceFactory.html" title="interface in com.google.andr
<td class="colFirst"><code><a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></code></td> <td class="colFirst"><code><a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the optional user agent to be used for DRM requests.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i9" class="rowColor"> <tr id="i9" class="rowColor">
@ -634,8 +634,10 @@ implements <a href="MediaSourceFactory.html" title="interface in com.google.andr
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmHttpDataSourceFactory</h4> <h4>setDrmHttpDataSourceFactory</h4>
<pre class="methodSignature">public&nbsp;<a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable
<a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre> <a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP. <div class="block">Sets the <a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.
@ -656,8 +658,10 @@ implements <a href="MediaSourceFactory.html" title="interface in com.google.andr
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmUserAgent</h4> <h4>setDrmUserAgent</h4>
<pre class="methodSignature">public&nbsp;<a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre> <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the optional user agent to be used for DRM requests. <div class="block">Sets the optional user agent to be used for DRM requests.
@ -687,8 +691,10 @@ implements <a href="MediaSourceFactory.html" title="interface in com.google.andr
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmSessionManager</h4> <h4>setDrmSessionManager</h4>
<pre class="methodSignature">public&nbsp;<a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable
<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre> <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>. <div class="block">Sets the <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":42,"i5":10,"i6":10,"i7":10,"i8":10,"i9":42,"i10":10,"i11":42}; var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":42,"i5":42,"i6":42,"i7":10,"i8":42,"i9":42,"i10":10,"i11":42};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -261,14 +261,14 @@ implements <a href="MediaSourceFactory.html" title="interface in com.google.andr
<td class="colFirst"><code><a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i6" class="altColor"> <tr id="i6" class="altColor">
<td class="colFirst"><code><a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i7" class="rowColor"> <tr id="i7" class="rowColor">
@ -283,7 +283,7 @@ implements <a href="MediaSourceFactory.html" title="interface in com.google.andr
<td class="colFirst"><code><a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the optional user agent to be used for DRM requests.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i9" class="rowColor"> <tr id="i9" class="rowColor">
@ -512,8 +512,10 @@ public&nbsp;<a href="ProgressiveMediaSource.Factory.html" title="class in com.go
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmSessionManager</h4> <h4>setDrmSessionManager</h4>
<pre class="methodSignature">public&nbsp;<a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable
<a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre> <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>. <div class="block">Sets the <a href="../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.
@ -535,8 +537,10 @@ public&nbsp;<a href="ProgressiveMediaSource.Factory.html" title="class in com.go
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmHttpDataSourceFactory</h4> <h4>setDrmHttpDataSourceFactory</h4>
<pre class="methodSignature">public&nbsp;<a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable
<a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre> <a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP. <div class="block">Sets the <a href="../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.
@ -557,8 +561,10 @@ public&nbsp;<a href="ProgressiveMediaSource.Factory.html" title="class in com.go
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmUserAgent</h4> <h4>setDrmUserAgent</h4>
<pre class="methodSignature">public&nbsp;<a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre> <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the optional user agent to be used for DRM requests. <div class="block">Sets the optional user agent to be used for DRM requests.

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":42,"i12":10,"i13":10,"i14":42,"i15":42}; var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":42,"i7":42,"i8":10,"i9":42,"i10":10,"i11":42,"i12":10,"i13":10,"i14":42,"i15":42};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -261,14 +261,14 @@ implements <a href="../MediaSourceFactory.html" title="interface in com.google.a
<td class="colFirst"><code><a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i7" class="rowColor"> <tr id="i7" class="rowColor">
<td class="colFirst"><code><a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i8" class="altColor"> <tr id="i8" class="altColor">
@ -283,7 +283,7 @@ implements <a href="../MediaSourceFactory.html" title="interface in com.google.a
<td class="colFirst"><code><a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the optional user agent to be used for DRM requests.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i10" class="altColor"> <tr id="i10" class="altColor">
@ -472,8 +472,10 @@ public&nbsp;<a href="DashMediaSource.Factory.html" title="class in com.google.an
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmSessionManager</h4> <h4>setDrmSessionManager</h4>
<pre class="methodSignature">public&nbsp;<a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable
<a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre> <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>. <div class="block">Sets the <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.
@ -495,8 +497,10 @@ public&nbsp;<a href="DashMediaSource.Factory.html" title="class in com.google.an
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmHttpDataSourceFactory</h4> <h4>setDrmHttpDataSourceFactory</h4>
<pre class="methodSignature">public&nbsp;<a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable
<a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre> <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP. <div class="block">Sets the <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.
@ -517,8 +521,10 @@ public&nbsp;<a href="DashMediaSource.Factory.html" title="class in com.google.an
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmUserAgent</h4> <h4>setDrmUserAgent</h4>
<pre class="methodSignature">public&nbsp;<a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre> <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the optional user agent to be used for DRM requests. <div class="block">Sets the optional user agent to be used for DRM requests.

View file

@ -166,25 +166,35 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr class="rowColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#essentialProperties">essentialProperties</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a></code></td> <td class="colFirst"><code><a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#format">format</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#format">format</a></span></code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;</code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#inbandEventStreams">inbandEventStreams</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#inbandEventStreams">inbandEventStreams</a></span></code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<td class="colFirst"><code>long</code></td> <td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#revisionId">revisionId</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#revisionId">revisionId</a></span></code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a></code></td> <td class="colFirst"><code><a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#segmentBase">segmentBase</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#segmentBase">segmentBase</a></span></code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr class="altColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#supplementalProperties">supplementalProperties</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
</table> </table>
</li> </li>
</ul> </ul>
@ -203,12 +213,14 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
<th class="colLast" scope="col">Description</th> <th class="colLast" scope="col">Description</th>
</tr> </tr>
<tr class="altColor"> <tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,long)">RepresentationInfo</a></span>&#8203;(<a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format, <th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,java.util.List,java.util.List,long)">RepresentationInfo</a></span>&#8203;(<a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls, <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls,
<a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a>&nbsp;segmentBase, <a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a>&nbsp;segmentBase,
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;drmSchemeType, <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;drmSchemeType,
<a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="../../../drm/DrmInitData.SchemeData.html" title="class in com.google.android.exoplayer2.drm" target="_top">DrmInitData.SchemeData</a>&gt;&nbsp;drmSchemeDatas, <a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="../../../drm/DrmInitData.SchemeData.html" title="class in com.google.android.exoplayer2.drm" target="_top">DrmInitData.SchemeData</a>&gt;&nbsp;drmSchemeDatas,
<a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams, <a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;essentialProperties,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;supplementalProperties,
long&nbsp;revisionId)</code></th> long&nbsp;revisionId)</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
@ -304,12 +316,30 @@ public final&nbsp;<a href="https://developer.android.com/reference/java/lang/Str
<a id="revisionId"> <a id="revisionId">
<!-- --> <!-- -->
</a> </a>
<ul class="blockListLast"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>revisionId</h4> <h4>revisionId</h4>
<pre>public final&nbsp;long revisionId</pre> <pre>public final&nbsp;long revisionId</pre>
</li> </li>
</ul> </ul>
<a id="essentialProperties">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>essentialProperties</h4>
<pre>public final&nbsp;<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt; essentialProperties</pre>
</li>
</ul>
<a id="supplementalProperties">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>supplementalProperties</h4>
<pre>public final&nbsp;<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt; supplementalProperties</pre>
</li>
</ul>
</li> </li>
</ul> </ul>
</section> </section>
@ -320,7 +350,7 @@ public final&nbsp;<a href="https://developer.android.com/reference/java/lang/Str
<!-- --> <!-- -->
</a> </a>
<h3>Constructor Detail</h3> <h3>Constructor Detail</h3>
<a id="&lt;init&gt;(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,long)"> <a id="&lt;init&gt;(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,java.util.List,java.util.List,long)">
<!-- --> <!-- -->
</a> </a>
<ul class="blockListLast"> <ul class="blockListLast">
@ -333,6 +363,8 @@ public final&nbsp;<a href="https://developer.android.com/reference/java/lang/Str
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;drmSchemeType, <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;drmSchemeType,
<a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="../../../drm/DrmInitData.SchemeData.html" title="class in com.google.android.exoplayer2.drm" target="_top">DrmInitData.SchemeData</a>&gt;&nbsp;drmSchemeDatas, <a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="../../../drm/DrmInitData.SchemeData.html" title="class in com.google.android.exoplayer2.drm" target="_top">DrmInitData.SchemeData</a>&gt;&nbsp;drmSchemeDatas,
<a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams, <a href="https://developer.android.com/reference/java/util/ArrayList.html" title="class or interface in java.util" class="externalLink">ArrayList</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;essentialProperties,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;supplementalProperties,
long&nbsp;revisionId)</pre> long&nbsp;revisionId)</pre>
</li> </li>
</ul> </ul>

View file

@ -181,7 +181,7 @@ implements <a href="../DashSegmentIndex.html" title="interface in com.google.and
<!-- --> <!-- -->
</a> </a>
<h3>Fields inherited from class&nbsp;com.google.android.exoplayer2.source.dash.manifest.<a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></h3> <h3>Fields inherited from class&nbsp;com.google.android.exoplayer2.source.dash.manifest.<a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></h3>
<code><a href="Representation.html#baseUrls">baseUrls</a>, <a href="Representation.html#format">format</a>, <a href="Representation.html#inbandEventStreams">inbandEventStreams</a>, <a href="Representation.html#presentationTimeOffsetUs">presentationTimeOffsetUs</a>, <a href="Representation.html#REVISION_ID_DEFAULT">REVISION_ID_DEFAULT</a>, <a href="Representation.html#revisionId">revisionId</a></code></li> <code><a href="Representation.html#baseUrls">baseUrls</a>, <a href="Representation.html#essentialProperties">essentialProperties</a>, <a href="Representation.html#format">format</a>, <a href="Representation.html#inbandEventStreams">inbandEventStreams</a>, <a href="Representation.html#presentationTimeOffsetUs">presentationTimeOffsetUs</a>, <a href="Representation.html#REVISION_ID_DEFAULT">REVISION_ID_DEFAULT</a>, <a href="Representation.html#revisionId">revisionId</a>, <a href="Representation.html#supplementalProperties">supplementalProperties</a></code></li>
</ul> </ul>
<ul class="blockList"> <ul class="blockList">
<li class="blockList"><a id="fields.inherited.from.class.com.google.android.exoplayer2.source.dash.DashSegmentIndex"> <li class="blockList"><a id="fields.inherited.from.class.com.google.android.exoplayer2.source.dash.DashSegmentIndex">
@ -207,11 +207,13 @@ implements <a href="../DashSegmentIndex.html" title="interface in com.google.and
<th class="colLast" scope="col">Description</th> <th class="colLast" scope="col">Description</th>
</tr> </tr>
<tr class="altColor"> <tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List)">MultiSegmentRepresentation</a></span>&#8203;(long&nbsp;revisionId, <th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List,java.util.List,java.util.List)">MultiSegmentRepresentation</a></span>&#8203;(long&nbsp;revisionId,
<a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format, <a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls, <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls,
<a href="SegmentBase.MultiSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.MultiSegmentBase</a>&nbsp;segmentBase, <a href="SegmentBase.MultiSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.MultiSegmentBase</a>&nbsp;segmentBase,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams)</code></th> <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;essentialProperties,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;supplementalProperties)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Creates the multi-segment Representation.</div> <div class="block">Creates the multi-segment Representation.</div>
</td> </td>
@ -338,7 +340,7 @@ implements <a href="../DashSegmentIndex.html" title="interface in com.google.and
<!-- --> <!-- -->
</a> </a>
<h3>Methods inherited from class&nbsp;com.google.android.exoplayer2.source.dash.manifest.<a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></h3> <h3>Methods inherited from class&nbsp;com.google.android.exoplayer2.source.dash.manifest.<a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></h3>
<code><a href="Representation.html#getInitializationUri()">getInitializationUri</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)">newInstance</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)">newInstance</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)">newInstance</a></code></li> <code><a href="Representation.html#getInitializationUri()">getInitializationUri</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)">newInstance</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.util.List,java.util.List,java.lang.String)">newInstance</a></code></li>
</ul> </ul>
<ul class="blockList"> <ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object"> <li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
@ -363,7 +365,7 @@ implements <a href="../DashSegmentIndex.html" title="interface in com.google.and
<!-- --> <!-- -->
</a> </a>
<h3>Constructor Detail</h3> <h3>Constructor Detail</h3>
<a id="&lt;init&gt;(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List)"> <a id="&lt;init&gt;(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List,java.util.List,java.util.List)">
<!-- --> <!-- -->
</a> </a>
<ul class="blockListLast"> <ul class="blockListLast">
@ -374,7 +376,9 @@ implements <a href="../DashSegmentIndex.html" title="interface in com.google.and
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls, <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls,
<a href="SegmentBase.MultiSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.MultiSegmentBase</a>&nbsp;segmentBase, <a href="SegmentBase.MultiSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.MultiSegmentBase</a>&nbsp;segmentBase,
@Nullable @Nullable
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams)</pre> <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;essentialProperties,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;supplementalProperties)</pre>
<div class="block">Creates the multi-segment Representation.</div> <div class="block">Creates the multi-segment Representation.</div>
<dl> <dl>
<dt><span class="paramLabel">Parameters:</span></dt> <dt><span class="paramLabel">Parameters:</span></dt>
@ -383,6 +387,8 @@ implements <a href="../DashSegmentIndex.html" title="interface in com.google.and
<dd><code>baseUrls</code> - The base URLs of the representation.</dd> <dd><code>baseUrls</code> - The base URLs of the representation.</dd>
<dd><code>segmentBase</code> - The segment base underlying the representation.</dd> <dd><code>segmentBase</code> - The segment base underlying the representation.</dd>
<dd><code>inbandEventStreams</code> - The in-band event streams in the representation. May be null.</dd> <dd><code>inbandEventStreams</code> - The in-band event streams in the representation. May be null.</dd>
<dd><code>essentialProperties</code> - Essential properties in the representation. May be empty.</dd>
<dd><code>supplementalProperties</code> - Supplemental properties in the representation. May be empty.</dd>
</dl> </dl>
</li> </li>
</ul> </ul>

View file

@ -198,7 +198,7 @@ extends <a href="Representation.html" title="class in com.google.android.exoplay
<!-- --> <!-- -->
</a> </a>
<h3>Fields inherited from class&nbsp;com.google.android.exoplayer2.source.dash.manifest.<a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></h3> <h3>Fields inherited from class&nbsp;com.google.android.exoplayer2.source.dash.manifest.<a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></h3>
<code><a href="Representation.html#baseUrls">baseUrls</a>, <a href="Representation.html#format">format</a>, <a href="Representation.html#inbandEventStreams">inbandEventStreams</a>, <a href="Representation.html#presentationTimeOffsetUs">presentationTimeOffsetUs</a>, <a href="Representation.html#REVISION_ID_DEFAULT">REVISION_ID_DEFAULT</a>, <a href="Representation.html#revisionId">revisionId</a></code></li> <code><a href="Representation.html#baseUrls">baseUrls</a>, <a href="Representation.html#essentialProperties">essentialProperties</a>, <a href="Representation.html#format">format</a>, <a href="Representation.html#inbandEventStreams">inbandEventStreams</a>, <a href="Representation.html#presentationTimeOffsetUs">presentationTimeOffsetUs</a>, <a href="Representation.html#REVISION_ID_DEFAULT">REVISION_ID_DEFAULT</a>, <a href="Representation.html#revisionId">revisionId</a>, <a href="Representation.html#supplementalProperties">supplementalProperties</a></code></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -217,11 +217,13 @@ extends <a href="Representation.html" title="class in com.google.android.exoplay
<th class="colLast" scope="col">Description</th> <th class="colLast" scope="col">Description</th>
</tr> </tr>
<tr class="altColor"> <tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.lang.String,long)">SingleSegmentRepresentation</a></span>&#8203;(long&nbsp;revisionId, <th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.util.List,java.util.List,java.lang.String,long)">SingleSegmentRepresentation</a></span>&#8203;(long&nbsp;revisionId,
<a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format, <a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls, <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls,
<a href="SegmentBase.SingleSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.SingleSegmentBase</a>&nbsp;segmentBase, <a href="SegmentBase.SingleSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.SingleSegmentBase</a>&nbsp;segmentBase,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams, <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;essentialProperties,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;supplementalProperties,
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;cacheKey, <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;cacheKey,
long&nbsp;contentLength)</code></th> long&nbsp;contentLength)</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
@ -286,7 +288,7 @@ extends <a href="Representation.html" title="class in com.google.android.exoplay
<!-- --> <!-- -->
</a> </a>
<h3>Methods inherited from class&nbsp;com.google.android.exoplayer2.source.dash.manifest.<a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></h3> <h3>Methods inherited from class&nbsp;com.google.android.exoplayer2.source.dash.manifest.<a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></h3>
<code><a href="Representation.html#getInitializationUri()">getInitializationUri</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)">newInstance</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)">newInstance</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)">newInstance</a></code></li> <code><a href="Representation.html#getInitializationUri()">getInitializationUri</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase)">newInstance</a>, <a href="Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.util.List,java.util.List,java.lang.String)">newInstance</a></code></li>
</ul> </ul>
<ul class="blockList"> <ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object"> <li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
@ -341,7 +343,7 @@ extends <a href="Representation.html" title="class in com.google.android.exoplay
<!-- --> <!-- -->
</a> </a>
<h3>Constructor Detail</h3> <h3>Constructor Detail</h3>
<a id="&lt;init&gt;(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.lang.String,long)"> <a id="&lt;init&gt;(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.util.List,java.util.List,java.lang.String,long)">
<!-- --> <!-- -->
</a> </a>
<ul class="blockListLast"> <ul class="blockListLast">
@ -353,6 +355,8 @@ extends <a href="Representation.html" title="class in com.google.android.exoplay
<a href="SegmentBase.SingleSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.SingleSegmentBase</a>&nbsp;segmentBase, <a href="SegmentBase.SingleSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.SingleSegmentBase</a>&nbsp;segmentBase,
@Nullable @Nullable
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams, <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;essentialProperties,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;supplementalProperties,
@Nullable @Nullable
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;cacheKey, <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;cacheKey,
long&nbsp;contentLength)</pre> long&nbsp;contentLength)</pre>
@ -363,6 +367,8 @@ extends <a href="Representation.html" title="class in com.google.android.exoplay
<dd><code>baseUrls</code> - The base urls of the representation.</dd> <dd><code>baseUrls</code> - The base urls of the representation.</dd>
<dd><code>segmentBase</code> - The segment base underlying the representation.</dd> <dd><code>segmentBase</code> - The segment base underlying the representation.</dd>
<dd><code>inbandEventStreams</code> - The in-band event streams in the representation. May be null.</dd> <dd><code>inbandEventStreams</code> - The in-band event streams in the representation. May be null.</dd>
<dd><code>essentialProperties</code> - Essential properties in the representation. May be empty.</dd>
<dd><code>supplementalProperties</code> - Supplemental properties in the representation. May be empty.</dd>
<dd><code>cacheKey</code> - An optional key to be returned from <a href="#getCacheKey()"><code>getCacheKey()</code></a>, or null.</dd> <dd><code>cacheKey</code> - An optional key to be returned from <a href="#getCacheKey()"><code>getCacheKey()</code></a>, or null.</dd>
<dd><code>contentLength</code> - The content length, or <a href="../../../C.html#LENGTH_UNSET"><code>C.LENGTH_UNSET</code></a> if unknown.</dd> <dd><code>contentLength</code> - The content length, or <a href="../../../C.html#LENGTH_UNSET"><code>C.LENGTH_UNSET</code></a> if unknown.</dd>
</dl> </dl>

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":6,"i1":6,"i2":6,"i3":10,"i4":9,"i5":9,"i6":9}; var data = {"i0":6,"i1":6,"i2":6,"i3":10,"i4":9,"i5":9};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -196,40 +196,54 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#essentialProperties">essentialProperties</a></span></code></th>
<td class="colLast">
<div class="block">Essential properties in the representation.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a></code></td> <td class="colFirst"><code><a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#format">format</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#format">format</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">The format of the representation.</div> <div class="block">The format of the representation.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;</code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#inbandEventStreams">inbandEventStreams</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#inbandEventStreams">inbandEventStreams</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">The in-band event streams in the representation.</div> <div class="block">The in-band event streams in the representation.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<td class="colFirst"><code>long</code></td> <td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#presentationTimeOffsetUs">presentationTimeOffsetUs</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#presentationTimeOffsetUs">presentationTimeOffsetUs</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">The offset of the presentation timestamps in the media stream relative to media time.</div> <div class="block">The offset of the presentation timestamps in the media stream relative to media time.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<td class="colFirst"><code>static long</code></td> <td class="colFirst"><code>static long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#REVISION_ID_DEFAULT">REVISION_ID_DEFAULT</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#REVISION_ID_DEFAULT">REVISION_ID_DEFAULT</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">A default value for <a href="#revisionId"><code>revisionId</code></a>.</div> <div class="block">A default value for <a href="#revisionId"><code>revisionId</code></a>.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<td class="colFirst"><code>long</code></td> <td class="colFirst"><code>long</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#revisionId">revisionId</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#revisionId">revisionId</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Identifies the revision of the media contained within the representation.</div> <div class="block">Identifies the revision of the media contained within the representation.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#supplementalProperties">supplementalProperties</a></span></code></th>
<td class="colLast">
<div class="block">Supplemental properties in the adaptation set.</div>
</td>
</tr>
</table> </table>
</li> </li>
</ul> </ul>
@ -290,22 +304,13 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
</tr> </tr>
<tr id="i5" class="rowColor"> <tr id="i5" class="rowColor">
<td class="colFirst"><code>static <a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></code></td> <td class="colFirst"><code>static <a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)">newInstance</a></span>&#8203;(long&nbsp;revisionId, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.util.List,java.util.List,java.lang.String)">newInstance</a></span>&#8203;(long&nbsp;revisionId,
<a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls,
<a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a>&nbsp;segmentBase,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams)</code></th>
<td class="colLast">
<div class="block">Constructs a new instance.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>static <a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)">newInstance</a></span>&#8203;(long&nbsp;revisionId,
<a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format, <a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls, <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls,
<a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a>&nbsp;segmentBase, <a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a>&nbsp;segmentBase,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams, <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;essentialProperties,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;supplementalProperties,
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;cacheKey)</code></th> <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;cacheKey)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Constructs a new instance.</div> <div class="block">Constructs a new instance.</div>
@ -395,13 +400,33 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
<a id="inbandEventStreams"> <a id="inbandEventStreams">
<!-- --> <!-- -->
</a> </a>
<ul class="blockListLast"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>inbandEventStreams</h4> <h4>inbandEventStreams</h4>
<pre>public final&nbsp;<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt; inbandEventStreams</pre> <pre>public final&nbsp;<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt; inbandEventStreams</pre>
<div class="block">The in-band event streams in the representation. May be empty.</div> <div class="block">The in-band event streams in the representation. May be empty.</div>
</li> </li>
</ul> </ul>
<a id="essentialProperties">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>essentialProperties</h4>
<pre>public final&nbsp;<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt; essentialProperties</pre>
<div class="block">Essential properties in the representation. May be empty.</div>
</li>
</ul>
<a id="supplementalProperties">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>supplementalProperties</h4>
<pre>public final&nbsp;<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt; supplementalProperties</pre>
<div class="block">Supplemental properties in the adaptation set. May be empty.</div>
</li>
</ul>
</li> </li>
</ul> </ul>
</section> </section>
@ -434,32 +459,7 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
</dl> </dl>
</li> </li>
</ul> </ul>
<a id="newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)"> <a id="newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.util.List,java.util.List,java.lang.String)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>newInstance</h4>
<pre class="methodSignature">public static&nbsp;<a href="Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a>&nbsp;newInstance&#8203;(long&nbsp;revisionId,
<a href="../../../Format.html" title="class in com.google.android.exoplayer2">Format</a>&nbsp;format,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="BaseUrl.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">BaseUrl</a>&gt;&nbsp;baseUrls,
<a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a>&nbsp;segmentBase,
@Nullable
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams)</pre>
<div class="block">Constructs a new instance.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>revisionId</code> - Identifies the revision of the content.</dd>
<dd><code>format</code> - The format of the representation.</dd>
<dd><code>baseUrls</code> - The list of base URLs of the representation.</dd>
<dd><code>segmentBase</code> - A segment base element for the representation.</dd>
<dd><code>inbandEventStreams</code> - The in-band event streams in the representation. May be null.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>The constructed instance.</dd>
</dl>
</li>
</ul>
<a id="newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)">
<!-- --> <!-- -->
</a> </a>
<ul class="blockList"> <ul class="blockList">
@ -471,6 +471,8 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
<a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a>&nbsp;segmentBase, <a href="SegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase</a>&nbsp;segmentBase,
@Nullable @Nullable
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams, <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;inbandEventStreams,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;essentialProperties,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="Descriptor.html" title="class in com.google.android.exoplayer2.source.dash.manifest" target="_top">Descriptor</a>&gt;&nbsp;supplementalProperties,
@Nullable @Nullable
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;cacheKey)</pre> <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;cacheKey)</pre>
<div class="block">Constructs a new instance.</div> <div class="block">Constructs a new instance.</div>
@ -481,6 +483,8 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
<dd><code>baseUrls</code> - The list of base URLs of the representation.</dd> <dd><code>baseUrls</code> - The list of base URLs of the representation.</dd>
<dd><code>segmentBase</code> - A segment base element for the representation.</dd> <dd><code>segmentBase</code> - A segment base element for the representation.</dd>
<dd><code>inbandEventStreams</code> - The in-band event streams in the representation. May be null.</dd> <dd><code>inbandEventStreams</code> - The in-band event streams in the representation. May be null.</dd>
<dd><code>essentialProperties</code> - Essential properties in the representation. May be empty.</dd>
<dd><code>supplementalProperties</code> - Supplemental properties in the representation. May be empty.</dd>
<dd><code>cacheKey</code> - An optional key to be returned from <a href="#getCacheKey()"><code>getCacheKey()</code></a>, or null. This <dd><code>cacheKey</code> - An optional key to be returned from <a href="#getCacheKey()"><code>getCacheKey()</code></a>, or null. This
parameter is ignored if <code>segmentBase</code> consists of multiple segments.</dd> parameter is ignored if <code>segmentBase</code> consists of multiple segments.</dd>
<dt><span class="returnLabel">Returns:</span></dt> <dt><span class="returnLabel">Returns:</span></dt>

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":42,"i15":42,"i16":10}; var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":10,"i5":42,"i6":42,"i7":10,"i8":42,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":42,"i15":42,"i16":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -250,14 +250,14 @@ implements <a href="../MediaSourceFactory.html" title="interface in com.google.a
<td class="colFirst"><code><a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i6" class="altColor"> <tr id="i6" class="altColor">
<td class="colFirst"><code><a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i7" class="rowColor"> <tr id="i7" class="rowColor">
@ -272,7 +272,7 @@ implements <a href="../MediaSourceFactory.html" title="interface in com.google.a
<td class="colFirst"><code><a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the optional user agent to be used for DRM requests.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i9" class="rowColor"> <tr id="i9" class="rowColor">
@ -601,8 +601,10 @@ public&nbsp;<a href="HlsMediaSource.Factory.html" title="class in com.google.and
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmSessionManager</h4> <h4>setDrmSessionManager</h4>
<pre class="methodSignature">public&nbsp;<a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable
<a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre> <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>. <div class="block">Sets the <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.
@ -624,8 +626,10 @@ public&nbsp;<a href="HlsMediaSource.Factory.html" title="class in com.google.and
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmHttpDataSourceFactory</h4> <h4>setDrmHttpDataSourceFactory</h4>
<pre class="methodSignature">public&nbsp;<a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable
<a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre> <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP. <div class="block">Sets the <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.
@ -646,8 +650,10 @@ public&nbsp;<a href="HlsMediaSource.Factory.html" title="class in com.google.and
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmUserAgent</h4> <h4>setDrmUserAgent</h4>
<pre class="methodSignature">public&nbsp;<a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre> <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the optional user agent to be used for DRM requests. <div class="block">Sets the optional user agent to be used for DRM requests.

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":42,"i14":42}; var data = {"i0":42,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":42,"i7":42,"i8":10,"i9":42,"i10":10,"i11":10,"i12":10,"i13":42,"i14":42};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -261,14 +261,14 @@ implements <a href="../MediaSourceFactory.html" title="interface in com.google.a
<td class="colFirst"><code><a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory</a></span>&#8203;(<a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i7" class="rowColor"> <tr id="i7" class="rowColor">
<td class="colFirst"><code><a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager</a></span>&#8203;(<a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i8" class="altColor"> <tr id="i8" class="altColor">
@ -283,7 +283,7 @@ implements <a href="../MediaSourceFactory.html" title="interface in com.google.a
<td class="colFirst"><code><a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></code></td> <td class="colFirst"><code><a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setDrmUserAgent(java.lang.String)">setDrmUserAgent</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Sets the optional user agent to be used for DRM requests.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
</td> </td>
</tr> </tr>
<tr id="i10" class="altColor"> <tr id="i10" class="altColor">
@ -515,8 +515,10 @@ public&nbsp;<a href="SsMediaSource.Factory.html" title="class in com.google.andr
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmSessionManager</h4> <h4>setDrmSessionManager</h4>
<pre class="methodSignature">public&nbsp;<a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a>&nbsp;setDrmSessionManager&#8203;(@Nullable
<a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre> <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm">DrmSessionManager</a>&nbsp;drmSessionManager)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>. <div class="block">Sets the <a href="../../drm/DrmSessionManager.html" title="interface in com.google.android.exoplayer2.drm"><code>DrmSessionManager</code></a> to use for all media items regardless of their <a href="../../MediaItem.DrmConfiguration.html" title="class in com.google.android.exoplayer2"><code>MediaItem.DrmConfiguration</code></a>.
@ -538,8 +540,10 @@ public&nbsp;<a href="SsMediaSource.Factory.html" title="class in com.google.andr
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmHttpDataSourceFactory</h4> <h4>setDrmHttpDataSourceFactory</h4>
<pre class="methodSignature">public&nbsp;<a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a>&nbsp;setDrmHttpDataSourceFactory&#8203;(@Nullable
<a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre> <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream">HttpDataSource.Factory</a>&nbsp;drmHttpDataSourceFactory)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP. <div class="block">Sets the <a href="../../upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="../../drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> to execute key and provisioning requests over HTTP.
@ -560,8 +564,10 @@ public&nbsp;<a href="SsMediaSource.Factory.html" title="class in com.google.andr
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>setDrmUserAgent</h4> <h4>setDrmUserAgent</h4>
<pre class="methodSignature">public&nbsp;<a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public&nbsp;<a href="SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a>&nbsp;setDrmUserAgent&#8203;(@Nullable
<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre> <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;userAgent)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">MediaSourceFactory</a></code></span></div>
<div class="block">Sets the optional user agent to be used for DRM requests. <div class="block">Sets the optional user agent to be used for DRM requests.

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":6,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":6,"i9":10,"i10":10,"i11":6,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10}; var data = {"i0":6,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":6,"i9":10,"i10":10,"i11":10,"i12":10,"i13":6,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -289,22 +289,32 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
</tr> </tr>
<tr id="i9" class="rowColor"> <tr id="i9" class="rowColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getResponseHeaders_isEmptyWhileNotOpen()">getResponseHeaders_isEmptyWhileNotOpen</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getResponseHeaders_caseInsensitive()">getResponseHeaders_caseInsensitive</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i10" class="altColor"> <tr id="i10" class="altColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()">getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getResponseHeaders_isEmptyWhileNotOpen()">getResponseHeaders_isEmptyWhileNotOpen</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i11" class="rowColor"> <tr id="i11" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getResponseHeaders_noNullKeysOrValues()">getResponseHeaders_noNullKeysOrValues</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i12" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()">getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i13" class="rowColor">
<td class="colFirst"><code>protected abstract <a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="DataSourceContractTest.TestResource.html" title="class in com.google.android.exoplayer2.testutil">DataSourceContractTest.TestResource</a>&gt;</code></td> <td class="colFirst"><code>protected abstract <a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="DataSourceContractTest.TestResource.html" title="class in com.google.android.exoplayer2.testutil">DataSourceContractTest.TestResource</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getTestResources()">getTestResources</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getTestResources()">getTestResources</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Returns <a href="DataSourceContractTest.TestResource.html" title="class in com.google.android.exoplayer2.testutil"><code>DataSourceContractTest.TestResource</code></a> instances.</div> <div class="block">Returns <a href="DataSourceContractTest.TestResource.html" title="class in com.google.android.exoplayer2.testutil"><code>DataSourceContractTest.TestResource</code></a> instances.</div>
</td> </td>
</tr> </tr>
<tr id="i12" class="altColor"> <tr id="i14" class="altColor">
<td class="colFirst"><code>protected <a href="../upstream/DataSource.html" title="interface in com.google.android.exoplayer2.upstream">DataSource</a></code></td> <td class="colFirst"><code>protected <a href="../upstream/DataSource.html" title="interface in com.google.android.exoplayer2.upstream">DataSource</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getTransferListenerDataSource()">getTransferListenerDataSource</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getTransferListenerDataSource()">getTransferListenerDataSource</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
@ -312,37 +322,37 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
for the <a href="../upstream/DataSource.html" title="interface in com.google.android.exoplayer2.upstream"><code>DataSource</code></a> most recently created by <a href="#createDataSource()"><code>createDataSource()</code></a>.</div> for the <a href="../upstream/DataSource.html" title="interface in com.google.android.exoplayer2.upstream"><code>DataSource</code></a> most recently created by <a href="#createDataSource()"><code>createDataSource()</code></a>.</div>
</td> </td>
</tr> </tr>
<tr id="i13" class="rowColor"> <tr id="i15" class="rowColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getUri_resourceNotFound_returnsNullIfNotOpened()">getUri_resourceNotFound_returnsNullIfNotOpened</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getUri_resourceNotFound_returnsNullIfNotOpened()">getUri_resourceNotFound_returnsNullIfNotOpened</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i14" class="altColor"> <tr id="i16" class="altColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getUri_returnsNonNullValueOnlyWhileOpen()">getUri_returnsNonNullValueOnlyWhileOpen</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getUri_returnsNonNullValueOnlyWhileOpen()">getUri_returnsNonNullValueOnlyWhileOpen</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i15" class="rowColor"> <tr id="i17" class="rowColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#resourceNotFound()">resourceNotFound</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#resourceNotFound()">resourceNotFound</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i16" class="altColor"> <tr id="i18" class="altColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#resourceNotFound_transferListenerCallbacks()">resourceNotFound_transferListenerCallbacks</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#resourceNotFound_transferListenerCallbacks()">resourceNotFound_transferListenerCallbacks</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i17" class="rowColor"> <tr id="i19" class="rowColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#transferListenerCallbacks()">transferListenerCallbacks</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#transferListenerCallbacks()">transferListenerCallbacks</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i18" class="altColor"> <tr id="i20" class="altColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#unboundedDataSpec_readUntilEnd()">unboundedDataSpec_readUntilEnd</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#unboundedDataSpec_readUntilEnd()">unboundedDataSpec_readUntilEnd</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i19" class="rowColor"> <tr id="i21" class="rowColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#unboundedDataSpecWithGzipFlag_readUntilEnd()">unboundedDataSpecWithGzipFlag_readUntilEnd</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#unboundedDataSpecWithGzipFlag_readUntilEnd()">unboundedDataSpecWithGzipFlag_readUntilEnd</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
@ -350,7 +360,7 @@ extends <a href="https://developer.android.com/reference/java/lang/Object.html"
implementations, or correctly handled (i.e.</div> implementations, or correctly handled (i.e.</div>
</td> </td>
</tr> </tr>
<tr id="i20" class="altColor"> <tr id="i22" class="altColor">
<td class="colFirst"><code>protected boolean</code></td> <td class="colFirst"><code>protected boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#unboundedReadsAreIndefinite()">unboundedReadsAreIndefinite</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#unboundedReadsAreIndefinite()">unboundedReadsAreIndefinite</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
@ -688,6 +698,34 @@ protected&nbsp;<a href="../upstream/DataSource.html" title="interface in com.goo
</dl> </dl>
</li> </li>
</ul> </ul>
<a id="getResponseHeaders_noNullKeysOrValues()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getResponseHeaders_noNullKeysOrValues</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;getResponseHeaders_noNullKeysOrValues()
throws <a href="https://developer.android.com/reference/java/lang/Exception.html" title="class or interface in java.lang" class="externalLink" target="_top">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="https://developer.android.com/reference/java/lang/Exception.html" title="class or interface in java.lang" class="externalLink" target="_top">Exception</a></code></dd>
</dl>
</li>
</ul>
<a id="getResponseHeaders_caseInsensitive()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getResponseHeaders_caseInsensitive</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;getResponseHeaders_caseInsensitive()
throws <a href="https://developer.android.com/reference/java/lang/Exception.html" title="class or interface in java.lang" class="externalLink" target="_top">Exception</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="https://developer.android.com/reference/java/lang/Exception.html" title="class or interface in java.lang" class="externalLink" target="_top">Exception</a></code></dd>
</dl>
</li>
</ul>
<a id="getResponseHeaders_isEmptyWhileNotOpen()"> <a id="getResponseHeaders_isEmptyWhileNotOpen()">
<!-- --> <!-- -->
</a> </a>

View file

@ -248,7 +248,7 @@ extends <a href="../trackselection/DefaultTrackSelector.html" title="class in co
<!-- --> <!-- -->
</a> </a>
<h3>Methods inherited from class&nbsp;com.google.android.exoplayer2.trackselection.<a href="../trackselection/DefaultTrackSelector.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector</a></h3> <h3>Methods inherited from class&nbsp;com.google.android.exoplayer2.trackselection.<a href="../trackselection/DefaultTrackSelector.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector</a></h3>
<code><a href="../trackselection/DefaultTrackSelector.html#buildUponParameters()">buildUponParameters</a>, <a href="../trackselection/DefaultTrackSelector.html#getFormatLanguageScore(com.google.android.exoplayer2.Format,java.lang.String,boolean)">getFormatLanguageScore</a>, <a href="../trackselection/DefaultTrackSelector.html#getParameters()">getParameters</a>, <a href="../trackselection/DefaultTrackSelector.html#isSetParametersSupported()">isSetParametersSupported</a>, <a href="../trackselection/DefaultTrackSelector.html#isSupported(int,boolean)">isSupported</a>, <a href="../trackselection/DefaultTrackSelector.html#maybeApplyOverride(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)">maybeApplyOverride</a>, <a href="../trackselection/DefaultTrackSelector.html#normalizeUndeterminedLanguageToNull(java.lang.String)">normalizeUndeterminedLanguageToNull</a>, <a href="../trackselection/DefaultTrackSelector.html#selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)">selectAudioTrack</a>, <a href="../trackselection/DefaultTrackSelector.html#selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)">selectOtherTrack</a>, <a href="../trackselection/DefaultTrackSelector.html#selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)">selectTextTrack</a>, <a href="../trackselection/DefaultTrackSelector.html#selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int%5B%5D%5B%5D%5B%5D,int%5B%5D,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)">selectTracks</a>, <a href="../trackselection/DefaultTrackSelector.html#selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)">selectVideoTrack</a>, <a href="../trackselection/DefaultTrackSelector.html#setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)">setParameters</a>, <a href="../trackselection/DefaultTrackSelector.html#setParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)">setParameters</a></code></li> <code><a href="../trackselection/DefaultTrackSelector.html#buildUponParameters()">buildUponParameters</a>, <a href="../trackselection/DefaultTrackSelector.html#getFormatLanguageScore(com.google.android.exoplayer2.Format,java.lang.String,boolean)">getFormatLanguageScore</a>, <a href="../trackselection/DefaultTrackSelector.html#getParameters()">getParameters</a>, <a href="../trackselection/DefaultTrackSelector.html#isSetParametersSupported()">isSetParametersSupported</a>, <a href="../trackselection/DefaultTrackSelector.html#isSupported(int,boolean)">isSupported</a>, <a href="../trackselection/DefaultTrackSelector.html#normalizeUndeterminedLanguageToNull(java.lang.String)">normalizeUndeterminedLanguageToNull</a>, <a href="../trackselection/DefaultTrackSelector.html#selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)">selectAudioTrack</a>, <a href="../trackselection/DefaultTrackSelector.html#selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)">selectOtherTrack</a>, <a href="../trackselection/DefaultTrackSelector.html#selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)">selectTextTrack</a>, <a href="../trackselection/DefaultTrackSelector.html#selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int%5B%5D%5B%5D%5B%5D,int%5B%5D,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)">selectTracks</a>, <a href="../trackselection/DefaultTrackSelector.html#selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)">selectVideoTrack</a>, <a href="../trackselection/DefaultTrackSelector.html#setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)">setParameters</a>, <a href="../trackselection/DefaultTrackSelector.html#setParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)">setParameters</a></code></li>
</ul> </ul>
<ul class="blockList"> <ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.com.google.android.exoplayer2.trackselection.MappingTrackSelector"> <li class="blockList"><a id="methods.inherited.from.class.com.google.android.exoplayer2.trackselection.MappingTrackSelector">

View file

@ -730,7 +730,7 @@ extends <a href="../BasePlayer.html" title="class in com.google.android.exoplaye
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#stop()">stop</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Stops playback without resetting the player.</div> <div class="block">Stops playback without resetting the playlist.</div>
</td> </td>
</tr> </tr>
<tr id="i69" class="rowColor"> <tr id="i69" class="rowColor">
@ -902,7 +902,10 @@ public&nbsp;@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int&
<h4>prepare</h4> <h4>prepare</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;prepare()</pre> <pre class="methodSignature">public&nbsp;void&nbsp;prepare()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.html#prepare()">Player</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.html#prepare()">Player</a></code></span></div>
<div class="block">Prepares the player.</div> <div class="block">Prepares the player.
<p>This will move the player out of <a href="../Player.html#STATE_IDLE"><code>idle state</code></a> and the player will start
loading media and acquire resources needed for playback.</div>
</li> </li>
</ul> </ul>
<a id="setMediaItems(java.util.List,boolean)"> <a id="setMediaItems(java.util.List,boolean)">
@ -1254,12 +1257,13 @@ public&nbsp;@com.google.android.exoplayer2.Player.PlaybackSuppressionReason int&
<h4>stop</h4> <h4>stop</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;stop()</pre> <pre class="methodSignature">public&nbsp;void&nbsp;stop()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.html#stop()">Player</a></code></span></div> <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../Player.html#stop()">Player</a></code></span></div>
<div class="block">Stops playback without resetting the player. Use <a href="../Player.html#pause()"><code>Player.pause()</code></a> rather than this method if <div class="block">Stops playback without resetting the playlist. Use <a href="../Player.html#pause()"><code>Player.pause()</code></a> rather than this method if
the intention is to pause playback. the intention is to pause playback.
<p>Calling this method will cause the playback state to transition to <a href="../Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a>. The <p>Calling this method will cause the playback state to transition to <a href="../Player.html#STATE_IDLE"><code>Player.STATE_IDLE</code></a> and
player instance can still be used, and <a href="../Player.html#release()"><code>Player.release()</code></a> must still be called on the player if the player will release the loaded media and resources required for playback. The player
it's no longer required. instance can still be used by calling <a href="../Player.html#prepare()"><code>Player.prepare()</code></a> again, and <a href="../Player.html#release()"><code>Player.release()</code></a> must
still be called on the player if it's no longer required.
<p>Calling this method does not clear the playlist, reset the playback position or the playback <p>Calling this method does not clear the playlist, reset the playback position or the playback
error.</div> error.</div>

View file

@ -25,8 +25,8 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":10,"i1":10,"i2":9,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10}; var data = {"i0":10,"i1":10,"i2":9,"i3":10,"i4":42,"i5":10,"i6":42,"i7":10};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
var tableTab = "tableTab"; var tableTab = "tableTab";
@ -310,7 +310,7 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
</a> </a>
<h3>Method Summary</h3> <h3>Method Summary</h3>
<table class="memberSummary"> <table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption> <caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t6" class="tableTab"><span><a href="javascript:show(32);">Deprecated Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr> <tr>
<th class="colFirst" scope="col">Modifier and Type</th> <th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th> <th class="colSecond" scope="col">Method</th>
@ -347,7 +347,9 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">getSelectionOverride</a></span>&#8203;(int&nbsp;rendererIndex, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">getSelectionOverride</a></span>&#8203;(int&nbsp;rendererIndex,
<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups)</code></th> <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Returns the override for the specified renderer and <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a>.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span>
<div class="deprecationComment">Only works to retrieve the overrides set with the deprecated <a href="DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"><code>DefaultTrackSelector.ParametersBuilder.setSelectionOverride(int, TrackGroupArray, SelectionOverride)</code></a>.</div>
</div>
</td> </td>
</tr> </tr>
<tr id="i5" class="rowColor"> <tr id="i5" class="rowColor">
@ -360,7 +362,9 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">hasSelectionOverride</a></span>&#8203;(int&nbsp;rendererIndex, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">hasSelectionOverride</a></span>&#8203;(int&nbsp;rendererIndex,
<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups)</code></th> <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Returns whether there is an override for the specified renderer and <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a>.</div> <div class="block"><span class="deprecatedLabel">Deprecated.</span>
<div class="deprecationComment">Only works to retrieve the overrides set with the deprecated <a href="DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"><code>DefaultTrackSelector.ParametersBuilder.setSelectionOverride(int, TrackGroupArray, SelectionOverride)</code></a>.</div>
</div>
</td> </td>
</tr> </tr>
<tr id="i7" class="rowColor"> <tr id="i7" class="rowColor">
@ -610,8 +614,13 @@ public final&nbsp;@com.google.android.exoplayer2.C.SelectionFlags int disabledTe
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>hasSelectionOverride</h4> <h4>hasSelectionOverride</h4>
<pre class="methodSignature">public final&nbsp;boolean&nbsp;hasSelectionOverride&#8203;(int&nbsp;rendererIndex, <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
public final&nbsp;boolean&nbsp;hasSelectionOverride&#8203;(int&nbsp;rendererIndex,
<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups)</pre> <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
<div class="deprecationComment">Only works to retrieve the overrides set with the deprecated <a href="DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"><code>DefaultTrackSelector.ParametersBuilder.setSelectionOverride(int, TrackGroupArray, SelectionOverride)</code></a>. Use
<a href="TrackSelectionParameters.html#trackSelectionOverrides"><code>TrackSelectionParameters.trackSelectionOverrides</code></a> instead.</div>
</div>
<div class="block">Returns whether there is an override for the specified renderer and <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a>.</div> <div class="block">Returns whether there is an override for the specified renderer and <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a>.</div>
<dl> <dl>
<dt><span class="paramLabel">Parameters:</span></dt> <dt><span class="paramLabel">Parameters:</span></dt>
@ -628,9 +637,14 @@ public final&nbsp;@com.google.android.exoplayer2.C.SelectionFlags int disabledTe
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>getSelectionOverride</h4> <h4>getSelectionOverride</h4>
<pre class="methodSignature">@Nullable <pre class="methodSignature"><a href="https://developer.android.com/reference/java/lang/Deprecated.html" title="class or interface in java.lang" class="externalLink" target="_top">@Deprecated</a>
@Nullable
public final&nbsp;<a href="DefaultTrackSelector.SelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.SelectionOverride</a>&nbsp;getSelectionOverride&#8203;(int&nbsp;rendererIndex, public final&nbsp;<a href="DefaultTrackSelector.SelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.SelectionOverride</a>&nbsp;getSelectionOverride&#8203;(int&nbsp;rendererIndex,
<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups)</pre> <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups)</pre>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
<div class="deprecationComment">Only works to retrieve the overrides set with the deprecated <a href="DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"><code>DefaultTrackSelector.ParametersBuilder.setSelectionOverride(int, TrackGroupArray, SelectionOverride)</code></a>. Use
<a href="TrackSelectionParameters.html#trackSelectionOverrides"><code>TrackSelectionParameters.trackSelectionOverrides</code></a> instead.</div>
</div>
<div class="block">Returns the override for the specified renderer and <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a>.</div> <div class="block">Returns the override for the specified renderer and <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a>.</div>
<dl> <dl>
<dt><span class="paramLabel">Parameters:</span></dt> <dt><span class="paramLabel">Parameters:</span></dt>

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":10,"i1":9,"i2":10,"i3":10,"i4":9,"i5":10,"i6":9,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10}; var data = {"i0":10,"i1":9,"i2":10,"i3":10,"i4":9,"i5":9,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -145,111 +145,34 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<hr> <hr>
<pre>public class <span class="typeNameLabel">DefaultTrackSelector</span> <pre>public class <span class="typeNameLabel">DefaultTrackSelector</span>
extends <a href="MappingTrackSelector.html" title="class in com.google.android.exoplayer2.trackselection">MappingTrackSelector</a></pre> extends <a href="MappingTrackSelector.html" title="class in com.google.android.exoplayer2.trackselection">MappingTrackSelector</a></pre>
<div class="block">A default <a href="TrackSelector.html" title="class in com.google.android.exoplayer2.trackselection"><code>TrackSelector</code></a> suitable for most use cases. Track selections are made according <div class="block">A default <a href="TrackSelector.html" title="class in com.google.android.exoplayer2.trackselection"><code>TrackSelector</code></a> suitable for most use cases.
to configurable <a href="DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection"><code>DefaultTrackSelector.Parameters</code></a>, which can be set by calling <a href="../Player.html#setTrackSelectionParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)"><code>Player.setTrackSelectionParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)</code></a>.
<h2>Modifying parameters</h2> <h2>Modifying parameters</h2>
To modify only some aspects of the parameters currently used by a selector, it's possible to Track selection parameters should be modified by obtaining a <a href="TrackSelectionParameters.Builder.html" title="class in com.google.android.exoplayer2.trackselection"><code>TrackSelectionParameters.Builder</code></a> initialized with the current <a href="TrackSelectionParameters.html" title="class in com.google.android.exoplayer2.trackselection"><code>TrackSelectionParameters</code></a>
obtain a <a href="DefaultTrackSelector.ParametersBuilder.html" title="class in com.google.android.exoplayer2.trackselection"><code>DefaultTrackSelector.ParametersBuilder</code></a> initialized with the current <a href="DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection"><code>DefaultTrackSelector.Parameters</code></a>. The desired from the player. The desired modifications can be made on the builder, and the resulting <a href="TrackSelectionParameters.html" title="class in com.google.android.exoplayer2.trackselection"><code>TrackSelectionParameters</code></a> can then be built and set on the player:
modifications can be made on the builder, and the resulting <a href="DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection"><code>DefaultTrackSelector.Parameters</code></a> can then be built
and set on the selector. For example the following code modifies the parameters to restrict video
track selections to SD, and to select a German audio track if there is one:
<pre><code>
// Build on the current parameters.
TrackSelectionParameters currentParameters = player.getTrackSelectionParameters();
// Build the resulting parameters.
TrackSelectionParameters newParameters = currentParameters
.buildUpon()
.setMaxVideoSizeSd()
.setPreferredAudioLanguage("deu")
.build();
// Set the new parameters.
player.setTrackSelectionParameters(newParameters);
</code></pre>
Convenience methods and chaining allow this to be written more concisely as:
<pre><code> <pre><code>
player.setTrackSelectionParameters( player.setTrackSelectionParameters(
player.getTrackSelectionParameters() player.getTrackSelectionParameters()
.buildUpon() .buildUpon()
.setMaxVideoSizeSd() .setMaxVideoSizeSd()
.setPreferredAudioLanguage("deu") .setPreferredAudioLanguage("de")
.build()); .build());
</code></pre> </code></pre>
Selection <a href="DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection"><code>DefaultTrackSelector.Parameters</code></a> support many different options, some of which are described below. Some specialized parameters are only available in the extended <a href="DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection"><code>DefaultTrackSelector.Parameters</code></a> class, which
can be retrieved and modified in a similar way in this track selector:
<h2>Selecting specific tracks</h2>
Track selection overrides can be used to select specific tracks. To specify an override for a
renderer, it's first necessary to obtain the tracks that have been mapped to it:
<pre><code> <pre><code>
MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); defaultTrackSelector.setParameters(
TrackGroupArray rendererTrackGroups = mappedTrackInfo == null ? null defaultTrackSelector.getParameters()
: mappedTrackInfo.getTrackGroups(rendererIndex);
</code></pre>
If <code>rendererTrackGroups</code> is null then there aren't any currently mapped tracks, and so
setting an override isn't possible. Note that a <a href="../Player.Listener.html" title="interface in com.google.android.exoplayer2"><code>Player.Listener</code></a> registered on the player
can be used to determine when the current tracks (and therefore the mapping) changes. If <code>
rendererTrackGroups</code> is non-null then an override can be set. The next step is to query the
properties of the available tracks to determine the <code>groupIndex</code> and the <code>
trackIndices</code> within the group it that should be selected. The override can then be specified
using <a href="DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"><code>DefaultTrackSelector.ParametersBuilder.setSelectionOverride(int, com.google.android.exoplayer2.source.TrackGroupArray, com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)</code></a>:
<pre><code>
SelectionOverride selectionOverride = new SelectionOverride(groupIndex, trackIndices);
player.setTrackSelectionParameters(
((Parameters)player.getTrackSelectionParameters())
.buildUpon() .buildUpon()
.setSelectionOverride(rendererIndex, rendererTrackGroups, selectionOverride) .setTunnelingEnabled(true)
.build()); .build());
</code></pre>
<h2>Constraint based track selection</h2> </code></pre></div>
Whilst track selection overrides make it possible to select specific tracks, the recommended way
of controlling which tracks are selected is by specifying constraints. For example consider the
case of wanting to restrict video track selections to SD, and preferring German audio tracks.
Track selection overrides could be used to select specific tracks meeting these criteria, however
a simpler and more flexible approach is to specify these constraints directly:
<pre><code>
player.setTrackSelectionParameters(
player.getTrackSelectionParameters()
.buildUpon()
.setMaxVideoSizeSd()
.setPreferredAudioLanguage("deu")
.build());
</code></pre>
There are several benefits to using constraint based track selection instead of specific track
overrides:
<ul>
<li>You can specify constraints before knowing what tracks the media provides. This can
simplify track selection code (e.g. you don't have to listen for changes in the available
tracks before configuring the selector).
<li>Constraints can be applied consistently across all periods in a complex piece of media,
even if those periods contain different tracks. In contrast, a specific track override is
only applied to periods whose tracks match those for which the override was set.
</ul>
<h2>Disabling renderers</h2>
Renderers can be disabled using <a href="DefaultTrackSelector.ParametersBuilder.html#setRendererDisabled(int,boolean)"><code>DefaultTrackSelector.ParametersBuilder.setRendererDisabled(int, boolean)</code></a>. Disabling a
renderer differs from setting a <code>null</code> override because the renderer is disabled
unconditionally, whereas a <code>null</code> override is applied only when the track groups available
to the renderer match the <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a> for which it was specified.
<h2>Tunneling</h2>
Tunneled playback can be enabled in cases where the combination of renderers and selected tracks
supports it. This can be done by using <a href="DefaultTrackSelector.ParametersBuilder.html#setTunnelingEnabled(boolean)"><code>DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(boolean)</code></a>.</div>
</li> </li>
</ul> </ul>
</div> </div>
@ -438,24 +361,13 @@ extends <a href="MappingTrackSelector.html" title="class in com.google.android.e
</td> </td>
</tr> </tr>
<tr id="i5" class="rowColor"> <tr id="i5" class="rowColor">
<td class="colFirst"><code>protected @NullableType <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#maybeApplyOverride(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)">maybeApplyOverride</a></span>&#8203;(<a href="MappingTrackSelector.MappedTrackInfo.html" title="class in com.google.android.exoplayer2.trackselection">MappingTrackSelector.MappedTrackInfo</a>&nbsp;mappedTrackInfo,
<a href="DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.Parameters</a>&nbsp;params,
int&nbsp;rendererIndex,
@NullableType <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a>&nbsp;currentDefinition)</code></th>
<td class="colLast">
<div class="block">Returns the <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection.Definition</code></a> of a renderer after applying selection
overriding and renderer disabling.</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>protected static <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a></code></td> <td class="colFirst"><code>protected static <a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#normalizeUndeterminedLanguageToNull(java.lang.String)">normalizeUndeterminedLanguageToNull</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;language)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#normalizeUndeterminedLanguageToNull(java.lang.String)">normalizeUndeterminedLanguageToNull</a></span>&#8203;(<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a>&nbsp;language)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Normalizes the input string to null if it does not define a language, or returns it otherwise.</div> <div class="block">Normalizes the input string to null if it does not define a language, or returns it otherwise.</div>
</td> </td>
</tr> </tr>
<tr id="i7" class="rowColor"> <tr id="i6" class="altColor">
<td class="colFirst"><code>protected @NullableType <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a>[]</code></td> <td class="colFirst"><code>protected @NullableType <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a>[]</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int%5B%5D%5B%5D%5B%5D,int%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)">selectAllTracks</a></span>&#8203;(<a href="MappingTrackSelector.MappedTrackInfo.html" title="class in com.google.android.exoplayer2.trackselection">MappingTrackSelector.MappedTrackInfo</a>&nbsp;mappedTrackInfo, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int%5B%5D%5B%5D%5B%5D,int%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)">selectAllTracks</a></span>&#8203;(<a href="MappingTrackSelector.MappedTrackInfo.html" title="class in com.google.android.exoplayer2.trackselection">MappingTrackSelector.MappedTrackInfo</a>&nbsp;mappedTrackInfo,
int[][][]&nbsp;rendererFormatSupports, int[][][]&nbsp;rendererFormatSupports,
@ -467,7 +379,7 @@ extends <a href="MappingTrackSelector.html" title="class in com.google.android.e
applied.</div> applied.</div>
</td> </td>
</tr> </tr>
<tr id="i8" class="altColor"> <tr id="i7" class="rowColor">
<td class="colFirst"><code>protected <a href="https://developer.android.com/reference/android/util/Pair.html" title="class or interface in android.util" class="externalLink">Pair</a>&lt;<a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a>,&#8203;<a href="DefaultTrackSelector.AudioTrackScore.html" title="class in com.google.android.exoplayer2.trackselection" target="_top">DefaultTrackSelector.AudioTrackScore</a>&gt;</code></td> <td class="colFirst"><code>protected <a href="https://developer.android.com/reference/android/util/Pair.html" title="class or interface in android.util" class="externalLink">Pair</a>&lt;<a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a>,&#8203;<a href="DefaultTrackSelector.AudioTrackScore.html" title="class in com.google.android.exoplayer2.trackselection" target="_top">DefaultTrackSelector.AudioTrackScore</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)">selectAudioTrack</a></span>&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectAudioTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)">selectAudioTrack</a></span>&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups,
int[][]&nbsp;formatSupport, int[][]&nbsp;formatSupport,
@ -479,7 +391,7 @@ extends <a href="MappingTrackSelector.html" title="class in com.google.android.e
<a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection</code></a> for an audio renderer.</div> <a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection</code></a> for an audio renderer.</div>
</td> </td>
</tr> </tr>
<tr id="i9" class="rowColor"> <tr id="i8" class="altColor">
<td class="colFirst"><code>protected <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a></code></td> <td class="colFirst"><code>protected <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)">selectOtherTrack</a></span>&#8203;(int&nbsp;trackType, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectOtherTrack(int,com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)">selectOtherTrack</a></span>&#8203;(int&nbsp;trackType,
<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups, <a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups,
@ -490,7 +402,7 @@ extends <a href="MappingTrackSelector.html" title="class in com.google.android.e
<a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection</code></a> for a renderer whose type is neither video, audio or text.</div> <a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection</code></a> for a renderer whose type is neither video, audio or text.</div>
</td> </td>
</tr> </tr>
<tr id="i10" class="altColor"> <tr id="i9" class="rowColor">
<td class="colFirst"><code>protected <a href="https://developer.android.com/reference/android/util/Pair.html" title="class or interface in android.util" class="externalLink">Pair</a>&lt;<a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a>,&#8203;<a href="DefaultTrackSelector.TextTrackScore.html" title="class in com.google.android.exoplayer2.trackselection" target="_top">DefaultTrackSelector.TextTrackScore</a>&gt;</code></td> <td class="colFirst"><code>protected <a href="https://developer.android.com/reference/android/util/Pair.html" title="class or interface in android.util" class="externalLink">Pair</a>&lt;<a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a>,&#8203;<a href="DefaultTrackSelector.TextTrackScore.html" title="class in com.google.android.exoplayer2.trackselection" target="_top">DefaultTrackSelector.TextTrackScore</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)">selectTextTrack</a></span>&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectTextTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,java.lang.String)">selectTextTrack</a></span>&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups,
int[][]&nbsp;formatSupport, int[][]&nbsp;formatSupport,
@ -501,7 +413,7 @@ extends <a href="MappingTrackSelector.html" title="class in com.google.android.e
<a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection</code></a> for a text renderer.</div> <a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection</code></a> for a text renderer.</div>
</td> </td>
</tr> </tr>
<tr id="i11" class="rowColor"> <tr id="i10" class="altColor">
<td class="colFirst"><code>protected <a href="https://developer.android.com/reference/android/util/Pair.html" title="class or interface in android.util" class="externalLink">Pair</a>&lt;@NullableType <a href="../RendererConfiguration.html" title="class in com.google.android.exoplayer2">RendererConfiguration</a>[],&#8203;@NullableType <a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection" target="_top">ExoTrackSelection</a>[]&gt;</code></td> <td class="colFirst"><code>protected <a href="https://developer.android.com/reference/android/util/Pair.html" title="class or interface in android.util" class="externalLink">Pair</a>&lt;@NullableType <a href="../RendererConfiguration.html" title="class in com.google.android.exoplayer2">RendererConfiguration</a>[],&#8203;@NullableType <a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection" target="_top">ExoTrackSelection</a>[]&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int%5B%5D%5B%5D%5B%5D,int%5B%5D,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)">selectTracks</a></span>&#8203;(<a href="MappingTrackSelector.MappedTrackInfo.html" title="class in com.google.android.exoplayer2.trackselection">MappingTrackSelector.MappedTrackInfo</a>&nbsp;mappedTrackInfo, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int%5B%5D%5B%5D%5B%5D,int%5B%5D,com.google.android.exoplayer2.source.MediaSource.MediaPeriodId,com.google.android.exoplayer2.Timeline)">selectTracks</a></span>&#8203;(<a href="MappingTrackSelector.MappedTrackInfo.html" title="class in com.google.android.exoplayer2.trackselection">MappingTrackSelector.MappedTrackInfo</a>&nbsp;mappedTrackInfo,
int[][][]&nbsp;rendererFormatSupports, int[][][]&nbsp;rendererFormatSupports,
@ -512,7 +424,7 @@ extends <a href="MappingTrackSelector.html" title="class in com.google.android.e
<div class="block">Given mapped track information, returns a track selection and configuration for each renderer.</div> <div class="block">Given mapped track information, returns a track selection and configuration for each renderer.</div>
</td> </td>
</tr> </tr>
<tr id="i12" class="altColor"> <tr id="i11" class="rowColor">
<td class="colFirst"><code>protected <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a></code></td> <td class="colFirst"><code>protected <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)">selectVideoTrack</a></span>&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups, <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#selectVideoTrack(com.google.android.exoplayer2.source.TrackGroupArray,int%5B%5D%5B%5D,int,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,boolean)">selectVideoTrack</a></span>&#8203;(<a href="../source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source">TrackGroupArray</a>&nbsp;groups,
int[][]&nbsp;formatSupport, int[][]&nbsp;formatSupport,
@ -524,14 +436,14 @@ extends <a href="MappingTrackSelector.html" title="class in com.google.android.e
<a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection</code></a> for a video renderer.</div> <a href="ExoTrackSelection.html" title="interface in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection</code></a> for a video renderer.</div>
</td> </td>
</tr> </tr>
<tr id="i13" class="rowColor"> <tr id="i12" class="altColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)">setParameters</a></span>&#8203;(<a href="DefaultTrackSelector.ParametersBuilder.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.ParametersBuilder</a>&nbsp;parametersBuilder)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setParameters(com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder)">setParameters</a></span>&#8203;(<a href="DefaultTrackSelector.ParametersBuilder.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.ParametersBuilder</a>&nbsp;parametersBuilder)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Atomically sets the provided parameters for track selection.</div> <div class="block">Atomically sets the provided parameters for track selection.</div>
</td> </td>
</tr> </tr>
<tr id="i14" class="altColor"> <tr id="i13" class="rowColor">
<td class="colFirst"><code>void</code></td> <td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)">setParameters</a></span>&#8203;(<a href="TrackSelectionParameters.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionParameters</a>&nbsp;parameters)</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setParameters(com.google.android.exoplayer2.trackselection.TrackSelectionParameters)">setParameters</a></span>&#8203;(<a href="TrackSelectionParameters.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionParameters</a>&nbsp;parameters)</code></th>
<td class="colLast"> <td class="colLast">
@ -767,20 +679,6 @@ public&nbsp;DefaultTrackSelector&#8203;(<a href="ExoTrackSelection.Factory.html"
</dl> </dl>
</li> </li>
</ul> </ul>
<a id="maybeApplyOverride(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>maybeApplyOverride</h4>
<pre class="methodSignature">protected&nbsp;@NullableType <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a>&nbsp;maybeApplyOverride&#8203;(<a href="MappingTrackSelector.MappedTrackInfo.html" title="class in com.google.android.exoplayer2.trackselection">MappingTrackSelector.MappedTrackInfo</a>&nbsp;mappedTrackInfo,
<a href="DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.Parameters</a>&nbsp;params,
int&nbsp;rendererIndex,
@NullableType <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection">ExoTrackSelection.Definition</a>&nbsp;currentDefinition)</pre>
<div class="block">Returns the <a href="ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection.Definition</code></a> of a renderer after applying selection
overriding and renderer disabling.</div>
</li>
</ul>
<a id="selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)"> <a id="selectAllTracks(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,int[][][],int[],com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters)">
<!-- --> <!-- -->
</a> </a>

View file

@ -25,7 +25,7 @@
catch(err) { catch(err) {
} }
//--> //-->
var data = {"i0":10,"i1":10,"i2":10}; var data = {"i0":10,"i1":10,"i2":10,"i3":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor"; var altColor = "altColor";
var rowColor = "rowColor"; var rowColor = "rowColor";
@ -140,16 +140,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<pre>public static final class <span class="typeNameLabel">TrackSelectionOverrides.TrackSelectionOverride</span> <pre>public static final class <span class="typeNameLabel">TrackSelectionOverrides.TrackSelectionOverride</span>
extends <a href="https://developer.android.com/reference/java/lang/Object.html" title="class or interface in java.lang" class="externalLink" target="_top">Object</a> extends <a href="https://developer.android.com/reference/java/lang/Object.html" title="class or interface in java.lang" class="externalLink" target="_top">Object</a>
implements <a href="../Bundleable.html" title="interface in com.google.android.exoplayer2">Bundleable</a></pre> implements <a href="../Bundleable.html" title="interface in com.google.android.exoplayer2">Bundleable</a></pre>
<div class="block">Forces the selection of <a href="#trackIndexes"><code>trackIndexes</code></a> for a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>. <div class="block">Forces the selection of <a href="#trackIndices"><code>trackIndices</code></a> for a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.
<p>If multiple {link #tracks} are overridden, as many as possible will be selected depending on <p>If multiple tracks in <a href="#trackGroup"><code>trackGroup</code></a> are overridden, as many as possible will be
the player capabilities. selected depending on the player capabilities.
<p>If a <a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection"><code>TrackSelectionOverrides.TrackSelectionOverride</code></a> has no tracks (<code>tracks.isEmpty()</code>), no tracks will <p>If <a href="#trackIndices"><code>trackIndices</code></a> is empty, no tracks from <a href="#trackGroup"><code>trackGroup</code></a> will be played. This
be played. This is similar to <a href="TrackSelectionParameters.html#disabledTrackTypes"><code>TrackSelectionParameters.disabledTrackTypes</code></a>, except it is similar to <a href="TrackSelectionParameters.html#disabledTrackTypes"><code>TrackSelectionParameters.disabledTrackTypes</code></a>, except it will only affect
will only affect the playback of the associated <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>. For example, if the only the playback of the associated <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>. For example, if the only <a href="../C.html#TRACK_TYPE_VIDEO"><code>C.TRACK_TYPE_VIDEO</code></a> <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> is associated with no tracks, no video will play until
<a href="../C.html#TRACK_TYPE_VIDEO"><code>C.TRACK_TYPE_VIDEO</code></a> <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> is associated with no tracks, no video will play the next video starts.</div>
until the next video starts.</div>
</li> </li>
</ul> </ul>
</div> </div>
@ -198,14 +197,14 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
<td class="colFirst"><code><a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source">TrackGroup</a></code></td> <td class="colFirst"><code><a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source">TrackGroup</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#trackGroup">trackGroup</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#trackGroup">trackGroup</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">The <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> whose <a href="#trackIndexes"><code>trackIndexes</code></a> are forced to be selected.</div> <div class="block">The <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> whose <a href="#trackIndices"><code>trackIndices</code></a> are forced to be selected.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="altColor">
<td class="colFirst"><code><a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&gt;</code></td> <td class="colFirst"><code><a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#trackIndexes">trackIndexes</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#trackIndices">trackIndices</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">The index of tracks in a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> to be selected.</div> <div class="block">The indices of tracks in a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> to be selected.</div>
</td> </td>
</tr> </tr>
</table> </table>
@ -233,9 +232,9 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
</tr> </tr>
<tr class="rowColor"> <tr class="rowColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,java.util.List)">TrackSelectionOverride</a></span>&#8203;(<a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source">TrackGroup</a>&nbsp;trackGroup, <th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,java.util.List)">TrackSelectionOverride</a></span>&#8203;(<a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source">TrackGroup</a>&nbsp;trackGroup,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="https://developer.android.com/reference/java/lang/Integer.html?is-external=true" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&gt;&nbsp;trackIndexes)</code></th> <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="https://developer.android.com/reference/java/lang/Integer.html?is-external=true" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&gt;&nbsp;trackIndices)</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Constructs an instance to force <code>trackIndexes</code> in <code>trackGroup</code> to be selected.</div> <div class="block">Constructs an instance to force <code>trackIndices</code> in <code>trackGroup</code> to be selected.</div>
</td> </td>
</tr> </tr>
</table> </table>
@ -262,11 +261,18 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i1" class="rowColor"> <tr id="i1" class="rowColor">
<td class="colFirst"><code>@com.google.android.exoplayer2.C.TrackType int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getTrackType()">getTrackType</a></span>()</code></th>
<td class="colLast">
<div class="block">Returns the <a href="../C.TrackType.html" title="annotation in com.google.android.exoplayer2"><code>C.TrackType</code></a> of the overriden track group.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>int</code></td> <td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#hashCode()">hashCode</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#hashCode()">hashCode</a></span>()</code></th>
<td class="colLast">&nbsp;</td> <td class="colLast">&nbsp;</td>
</tr> </tr>
<tr id="i2" class="altColor"> <tr id="i3" class="rowColor">
<td class="colFirst"><code><a href="https://developer.android.com/reference/android/os/Bundle.html" title="class or interface in android.os" class="externalLink" target="_top">Bundle</a></code></td> <td class="colFirst"><code><a href="https://developer.android.com/reference/android/os/Bundle.html" title="class or interface in android.os" class="externalLink" target="_top">Bundle</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#toBundle()">toBundle</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#toBundle()">toBundle</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
@ -304,17 +310,17 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
<li class="blockList"> <li class="blockList">
<h4>trackGroup</h4> <h4>trackGroup</h4>
<pre>public final&nbsp;<a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source">TrackGroup</a> trackGroup</pre> <pre>public final&nbsp;<a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source">TrackGroup</a> trackGroup</pre>
<div class="block">The <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> whose <a href="#trackIndexes"><code>trackIndexes</code></a> are forced to be selected.</div> <div class="block">The <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> whose <a href="#trackIndices"><code>trackIndices</code></a> are forced to be selected.</div>
</li> </li>
</ul> </ul>
<a id="trackIndexes"> <a id="trackIndices">
<!-- --> <!-- -->
</a> </a>
<ul class="blockList"> <ul class="blockList">
<li class="blockList"> <li class="blockList">
<h4>trackIndexes</h4> <h4>trackIndices</h4>
<pre>public final&nbsp;<a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&gt; trackIndexes</pre> <pre>public final&nbsp;<a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="https://developer.android.com/reference/java/lang/Integer.html" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&gt; trackIndices</pre>
<div class="block">The index of tracks in a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> to be selected.</div> <div class="block">The indices of tracks in a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> to be selected.</div>
</li> </li>
</ul> </ul>
<a id="CREATOR"> <a id="CREATOR">
@ -354,12 +360,12 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
<li class="blockList"> <li class="blockList">
<h4>TrackSelectionOverride</h4> <h4>TrackSelectionOverride</h4>
<pre>public&nbsp;TrackSelectionOverride&#8203;(<a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source">TrackGroup</a>&nbsp;trackGroup, <pre>public&nbsp;TrackSelectionOverride&#8203;(<a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source">TrackGroup</a>&nbsp;trackGroup,
<a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="https://developer.android.com/reference/java/lang/Integer.html?is-external=true" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&gt;&nbsp;trackIndexes)</pre> <a href="https://developer.android.com/reference/java/util/List.html" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="https://developer.android.com/reference/java/lang/Integer.html?is-external=true" title="class or interface in java.lang" class="externalLink" target="_top">Integer</a>&gt;&nbsp;trackIndices)</pre>
<div class="block">Constructs an instance to force <code>trackIndexes</code> in <code>trackGroup</code> to be selected.</div> <div class="block">Constructs an instance to force <code>trackIndices</code> in <code>trackGroup</code> to be selected.</div>
<dl> <dl>
<dt><span class="paramLabel">Parameters:</span></dt> <dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>trackGroup</code> - The <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> for which to override the track selection.</dd> <dd><code>trackGroup</code> - The <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> for which to override the track selection.</dd>
<dd><code>trackIndexes</code> - The indexes of the tracks in the <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> to select.</dd> <dd><code>trackIndices</code> - The indices of the tracks in the <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> to select.</dd>
</dl> </dl>
</li> </li>
</ul> </ul>
@ -400,6 +406,16 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
</dl> </dl>
</li> </li>
</ul> </ul>
<a id="getTrackType()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getTrackType</h4>
<pre class="methodSignature">public&nbsp;@com.google.android.exoplayer2.C.TrackType int&nbsp;getTrackType()</pre>
<div class="block">Returns the <a href="../C.TrackType.html" title="annotation in com.google.android.exoplayer2"><code>C.TrackType</code></a> of the overriden track group.</div>
</li>
</ul>
<a id="toBundle()"> <a id="toBundle()">
<!-- --> <!-- -->
</a> </a>

View file

@ -184,7 +184,7 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
<td class="colFirst"><code>static class&nbsp;</code></td> <td class="colFirst"><code>static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></span></code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></span></code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Forces the selection of <a href="TrackSelectionOverrides.TrackSelectionOverride.html#trackIndexes"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndexes</code></a> for a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div> <div class="block">Forces the selection of <a href="TrackSelectionOverrides.TrackSelectionOverride.html#trackIndices"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndices</code></a> for a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div>
</td> </td>
</tr> </tr>
</table> </table>
@ -248,7 +248,7 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
<td class="colFirst"><code><a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a>&gt;</code></td> <td class="colFirst"><code><a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#asList()">asList</a></span>()</code></th> <th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#asList()">asList</a></span>()</code></th>
<td class="colLast"> <td class="colLast">
<div class="block">Returns all <a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection"><code>TrackSelectionOverrides.TrackSelectionOverride</code></a> contained.</div> <div class="block">Returns a list of the <a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection"><code>overrides</code></a>.</div>
</td> </td>
</tr> </tr>
<tr id="i1" class="rowColor"> <tr id="i1" class="rowColor">
@ -354,7 +354,7 @@ implements <a href="../Bundleable.html" title="interface in com.google.android.e
<li class="blockList"> <li class="blockList">
<h4>asList</h4> <h4>asList</h4>
<pre class="methodSignature">public&nbsp;<a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a>&gt;&nbsp;asList()</pre> <pre class="methodSignature">public&nbsp;<a href="https://guava.dev/releases/27.1-android/api/docs/com/google/common/collect/ImmutableList.html?is-external=true" title="class or interface in com.google.common.collect" class="externalLink">ImmutableList</a>&lt;<a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a>&gt;&nbsp;asList()</pre>
<div class="block">Returns all <a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection"><code>TrackSelectionOverrides.TrackSelectionOverride</code></a> contained.</div> <div class="block">Returns a list of the <a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection"><code>overrides</code></a>.</div>
</li> </li>
</ul> </ul>
<a id="getOverride(com.google.android.exoplayer2.source.TrackGroup)"> <a id="getOverride(com.google.android.exoplayer2.source.TrackGroup)">

View file

@ -277,7 +277,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<tr class="rowColor"> <tr class="rowColor">
<th class="colFirst" scope="row"><a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></th> <th class="colFirst" scope="row"><a href="TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></th>
<td class="colLast"> <td class="colLast">
<div class="block">Forces the selection of <a href="TrackSelectionOverrides.TrackSelectionOverride.html#trackIndexes"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndexes</code></a> for a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div> <div class="block">Forces the selection of <a href="TrackSelectionOverrides.TrackSelectionOverride.html#trackIndices"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndices</code></a> for a <a href="../source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="altColor">

View file

@ -1890,21 +1890,21 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<!-- --> <!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a></code></td> </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a></code></td>
<th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/ExoPlayerLibraryInfo.html#VERSION">VERSION</a></code></th> <th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/ExoPlayerLibraryInfo.html#VERSION">VERSION</a></code></th>
<td class="colLast"><code>"2.16.0"</code></td> <td class="colLast"><code>"2.16.1"</code></td>
</tr> </tr>
<tr class="altColor"> <tr class="altColor">
<td class="colFirst"><a id="com.google.android.exoplayer2.ExoPlayerLibraryInfo.VERSION_INT"> <td class="colFirst"><a id="com.google.android.exoplayer2.ExoPlayerLibraryInfo.VERSION_INT">
<!-- --> <!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/ExoPlayerLibraryInfo.html#VERSION_INT">VERSION_INT</a></code></th> <th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/ExoPlayerLibraryInfo.html#VERSION_INT">VERSION_INT</a></code></th>
<td class="colLast"><code>2016000</code></td> <td class="colLast"><code>2016001</code></td>
</tr> </tr>
<tr class="rowColor"> <tr class="rowColor">
<td class="colFirst"><a id="com.google.android.exoplayer2.ExoPlayerLibraryInfo.VERSION_SLASHY"> <td class="colFirst"><a id="com.google.android.exoplayer2.ExoPlayerLibraryInfo.VERSION_SLASHY">
<!-- --> <!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a></code></td> </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://developer.android.com/reference/java/lang/String.html" title="class or interface in java.lang" class="externalLink" target="_top">String</a></code></td>
<th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/ExoPlayerLibraryInfo.html#VERSION_SLASHY">VERSION_SLASHY</a></code></th> <th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/ExoPlayerLibraryInfo.html#VERSION_SLASHY">VERSION_SLASHY</a></code></th>
<td class="colLast"><code>"ExoPlayerLib/2.16.0"</code></td> <td class="colLast"><code>"ExoPlayerLib/2.16.1"</code></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -4355,12 +4355,26 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<td class="colLast"><code>1684108385</code></td> <td class="colLast"><code>1684108385</code></td>
</tr> </tr>
<tr class="rowColor"> <tr class="rowColor">
<td class="colFirst"><a id="com.google.android.exoplayer2.audio.WavUtil.DS64_FOURCC">
<!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/audio/WavUtil.html#DS64_FOURCC">DS64_FOURCC</a></code></th>
<td class="colLast"><code>1685272116</code></td>
</tr>
<tr class="altColor">
<td class="colFirst"><a id="com.google.android.exoplayer2.audio.WavUtil.FMT_FOURCC"> <td class="colFirst"><a id="com.google.android.exoplayer2.audio.WavUtil.FMT_FOURCC">
<!-- --> <!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td> </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/audio/WavUtil.html#FMT_FOURCC">FMT_FOURCC</a></code></th> <th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/audio/WavUtil.html#FMT_FOURCC">FMT_FOURCC</a></code></th>
<td class="colLast"><code>1718449184</code></td> <td class="colLast"><code>1718449184</code></td>
</tr> </tr>
<tr class="rowColor">
<td class="colFirst"><a id="com.google.android.exoplayer2.audio.WavUtil.RF64_FOURCC">
<!-- -->
</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
<th class="colSecond" scope="row"><code><a href="com/google/android/exoplayer2/audio/WavUtil.html#RF64_FOURCC">RF64_FOURCC</a></code></th>
<td class="colLast"><code>1380333108</code></td>
</tr>
<tr class="altColor"> <tr class="altColor">
<td class="colFirst"><a id="com.google.android.exoplayer2.audio.WavUtil.RIFF_FOURCC"> <td class="colFirst"><a id="com.google.android.exoplayer2.audio.WavUtil.RIFF_FOURCC">
<!-- --> <!-- -->

View file

@ -1417,7 +1417,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<tr class="altColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/Player.html#getCurrentWindowIndex()">com.google.android.exoplayer2.Player.getCurrentWindowIndex()</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/Player.html#getCurrentWindowIndex()">com.google.android.exoplayer2.Player.getCurrentWindowIndex()</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/Player.html#getCurrentMediaItem()"><code>Player.getCurrentMediaItem()</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/Player.html#getCurrentMediaItemIndex()"><code>Player.getCurrentMediaItemIndex()</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="rowColor">
@ -1698,6 +1698,18 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setDrmHttpDataSourceFactory&#8203;(HttpDataSource.Factory)</a></th>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setDrmSessionManager&#8203;(DrmSessionManager)</a></th>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setDrmUserAgent&#8203;(String)</a></th>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setLivePresentationDelayMs(long,boolean)">com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setLivePresentationDelayMs&#8203;(long, boolean)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setLivePresentationDelayMs(long,boolean)">com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setLivePresentationDelayMs&#8203;(long, boolean)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"><code>MediaItem.Builder.setLiveConfiguration(MediaItem.LiveConfiguration)</code></a> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setLiveConfiguration(com.google.android.exoplayer2.MediaItem.LiveConfiguration)"><code>MediaItem.Builder.setLiveConfiguration(MediaItem.LiveConfiguration)</code></a>
@ -1705,18 +1717,30 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
manifest, or <a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setFallbackTargetLiveOffsetMs(long)"><code>DashMediaSource.Factory.setFallbackTargetLiveOffsetMs(long)</code></a> to provide a fallback value.</div> manifest, or <a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setFallbackTargetLiveOffsetMs(long)"><code>DashMediaSource.Factory.setFallbackTargetLiveOffsetMs(long)</code></a> to provide a fallback value.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setStreamKeys(java.util.List)"><code>MediaItem.Builder.setStreamKeys(List)</code></a> and <a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>DashMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setStreamKeys(java.util.List)"><code>MediaItem.Builder.setStreamKeys(List)</code></a> and <a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>DashMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setTag(java.lang.Object)">com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setTag&#8203;(Object)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setTag(java.lang.Object)">com.google.android.exoplayer2.source.dash.DashMediaSource.Factory.setTag&#8203;(Object)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setTag(java.lang.Object)"><code>MediaItem.Builder.setTag(Object)</code></a> and <a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>DashMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setTag(java.lang.Object)"><code>MediaItem.Builder.setTag(Object)</code></a> and <a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>DashMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">com.google.android.exoplayer2.source.DefaultMediaSourceFactory.setDrmHttpDataSourceFactory&#8203;(HttpDataSource.Factory)</a></th>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">com.google.android.exoplayer2.source.DefaultMediaSourceFactory.setDrmSessionManager&#8203;(DrmSessionManager)</a></th>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setDrmUserAgent(java.lang.String)">com.google.android.exoplayer2.source.DefaultMediaSourceFactory.setDrmUserAgent&#8203;(String)</a></th>
<td class="colLast"></td>
</tr>
<tr class="rowColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.DefaultMediaSourceFactory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.DefaultMediaSourceFactory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th>
<td class="colLast"> <td class="colLast">
@ -1730,24 +1754,36 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setDrmHttpDataSourceFactory&#8203;(HttpDataSource.Factory)</a></th>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setDrmSessionManager&#8203;(DrmSessionManager)</a></th>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setDrmUserAgent&#8203;(String)</a></th>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setStreamKeys(java.util.List)"><code>MediaItem.Builder.setStreamKeys(List)</code></a> and <a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>HlsMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setStreamKeys(java.util.List)"><code>MediaItem.Builder.setStreamKeys(List)</code></a> and <a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>HlsMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setTag(java.lang.Object)">com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setTag&#8203;(Object)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setTag(java.lang.Object)">com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory.setTag&#8203;(Object)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setTag(java.lang.Object)"><code>MediaItem.Builder.setTag(Object)</code></a> and <a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>HlsMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setTag(java.lang.Object)"><code>MediaItem.Builder.setTag(Object)</code></a> and <a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>HlsMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#createMediaSource(android.net.Uri)">com.google.android.exoplayer2.source.MediaSourceFactory.createMediaSource&#8203;(Uri)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#createMediaSource(android.net.Uri)">com.google.android.exoplayer2.source.MediaSourceFactory.createMediaSource&#8203;(Uri)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>MediaSourceFactory.createMediaSource(MediaItem)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>MediaSourceFactory.createMediaSource(MediaItem)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">com.google.android.exoplayer2.source.MediaSourceFactory.setDrmHttpDataSourceFactory&#8203;(HttpDataSource.Factory)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">com.google.android.exoplayer2.source.MediaSourceFactory.setDrmHttpDataSourceFactory&#8203;(HttpDataSource.Factory)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"><code>MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider)</code></a> and pass an <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"><code>MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider)</code></a> and pass an
@ -1755,14 +1791,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<a href="com/google/android/exoplayer2/upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a>.</div> <a href="com/google/android/exoplayer2/upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a>.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">com.google.android.exoplayer2.source.MediaSourceFactory.setDrmSessionManager&#8203;(DrmSessionManager)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">com.google.android.exoplayer2.source.MediaSourceFactory.setDrmSessionManager&#8203;(DrmSessionManager)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"><code>MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider)</code></a> and pass an <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"><code>MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider)</code></a> and pass an
implementation that always returns the same instance.</div> implementation that always returns the same instance.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">com.google.android.exoplayer2.source.MediaSourceFactory.setDrmUserAgent&#8203;(String)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">com.google.android.exoplayer2.source.MediaSourceFactory.setDrmUserAgent&#8203;(String)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"><code>MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider)</code></a> and pass an <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManagerProvider(com.google.android.exoplayer2.drm.DrmSessionManagerProvider)"><code>MediaSourceFactory.setDrmSessionManagerProvider(DrmSessionManagerProvider)</code></a> and pass an
@ -1770,24 +1806,36 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<code>userAgent</code>.</div> <code>userAgent</code>.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.MediaSourceFactory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.MediaSourceFactory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.LocalConfiguration.html#streamKeys"><code>MediaItem.LocalConfiguration.streamKeys</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.LocalConfiguration.html#streamKeys"><code>MediaItem.LocalConfiguration.streamKeys</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#createMediaSource(android.net.Uri)">com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.createMediaSource&#8203;(Uri)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#createMediaSource(android.net.Uri)">com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.createMediaSource&#8203;(Uri)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>ProgressiveMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>ProgressiveMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setCustomCacheKey(java.lang.String)">com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setCustomCacheKey&#8203;(String)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setCustomCacheKey(java.lang.String)">com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setCustomCacheKey&#8203;(String)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setCustomCacheKey(java.lang.String)"><code>MediaItem.Builder.setCustomCacheKey(String)</code></a> and <a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>ProgressiveMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setCustomCacheKey(java.lang.String)"><code>MediaItem.Builder.setCustomCacheKey(String)</code></a> and <a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>ProgressiveMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setDrmHttpDataSourceFactory&#8203;(HttpDataSource.Factory)</a></th>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setDrmSessionManager&#8203;(DrmSessionManager)</a></th>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setDrmUserAgent&#8203;(String)</a></th>
<td class="colLast"></td>
</tr>
<tr class="altColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setExtractorsFactory(com.google.android.exoplayer2.extractor.ExtractorsFactory)">com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setExtractorsFactory&#8203;(ExtractorsFactory)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setExtractorsFactory(com.google.android.exoplayer2.extractor.ExtractorsFactory)">com.google.android.exoplayer2.source.ProgressiveMediaSource.Factory.setExtractorsFactory&#8203;(ExtractorsFactory)</a></th>
<td class="colLast"> <td class="colLast">
@ -1827,110 +1875,136 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.setDrmHttpDataSourceFactory&#8203;(HttpDataSource.Factory)</a></th>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.setDrmSessionManager&#8203;(DrmSessionManager)</a></th>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.setDrmUserAgent&#8203;(String)</a></th>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setStreamKeys(java.util.List)">com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.setStreamKeys&#8203;(List&lt;StreamKey&gt;)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setStreamKeys(java.util.List)"><code>MediaItem.Builder.setStreamKeys(List)</code></a> and <a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>SsMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setStreamKeys(java.util.List)"><code>MediaItem.Builder.setStreamKeys(List)</code></a> and <a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>SsMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setTag(java.lang.Object)">com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.setTag&#8203;(Object)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setTag(java.lang.Object)">com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource.Factory.setTag&#8203;(Object)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setTag(java.lang.Object)"><code>MediaItem.Builder.setTag(Object)</code></a> and <a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>SsMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/MediaItem.Builder.html#setTag(java.lang.Object)"><code>MediaItem.Builder.setTag(Object)</code></a> and <a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#createMediaSource(com.google.android.exoplayer2.MediaItem)"><code>SsMediaSource.Factory.createMediaSource(MediaItem)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">com.google.android.exoplayer2.testutil.FakeMediaSourceFactory.setDrmHttpDataSourceFactory&#8203;(HttpDataSource.Factory)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">com.google.android.exoplayer2.testutil.FakeMediaSourceFactory.setDrmHttpDataSourceFactory&#8203;(HttpDataSource.Factory)</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">com.google.android.exoplayer2.testutil.FakeMediaSourceFactory.setDrmSessionManager&#8203;(DrmSessionManager)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">com.google.android.exoplayer2.testutil.FakeMediaSourceFactory.setDrmSessionManager&#8203;(DrmSessionManager)</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmUserAgent(java.lang.String)">com.google.android.exoplayer2.testutil.FakeMediaSourceFactory.setDrmUserAgent&#8203;(String)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmUserAgent(java.lang.String)">com.google.android.exoplayer2.testutil.FakeMediaSourceFactory.setDrmUserAgent&#8203;(String)</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#getAudioComponent()">com.google.android.exoplayer2.testutil.StubExoPlayer.getAudioComponent()</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#getAudioComponent()">com.google.android.exoplayer2.testutil.StubExoPlayer.getAudioComponent()</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#getDeviceComponent()">com.google.android.exoplayer2.testutil.StubExoPlayer.getDeviceComponent()</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#getDeviceComponent()">com.google.android.exoplayer2.testutil.StubExoPlayer.getDeviceComponent()</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#getTextComponent()">com.google.android.exoplayer2.testutil.StubExoPlayer.getTextComponent()</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#getTextComponent()">com.google.android.exoplayer2.testutil.StubExoPlayer.getTextComponent()</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#getVideoComponent()">com.google.android.exoplayer2.testutil.StubExoPlayer.getVideoComponent()</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#getVideoComponent()">com.google.android.exoplayer2.testutil.StubExoPlayer.getVideoComponent()</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#prepare(com.google.android.exoplayer2.source.MediaSource)">com.google.android.exoplayer2.testutil.StubExoPlayer.prepare&#8203;(MediaSource)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#prepare(com.google.android.exoplayer2.source.MediaSource)">com.google.android.exoplayer2.testutil.StubExoPlayer.prepare&#8203;(MediaSource)</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#retry()">com.google.android.exoplayer2.testutil.StubExoPlayer.retry()</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#retry()">com.google.android.exoplayer2.testutil.StubExoPlayer.retry()</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#setHandleWakeLock(boolean)">com.google.android.exoplayer2.testutil.StubExoPlayer.setHandleWakeLock&#8203;(boolean)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#setHandleWakeLock(boolean)">com.google.android.exoplayer2.testutil.StubExoPlayer.setHandleWakeLock&#8203;(boolean)</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#setThrowsWhenUsingWrongThread(boolean)">com.google.android.exoplayer2.testutil.StubExoPlayer.setThrowsWhenUsingWrongThread&#8203;(boolean)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubExoPlayer.html#setThrowsWhenUsingWrongThread(boolean)">com.google.android.exoplayer2.testutil.StubExoPlayer.setThrowsWhenUsingWrongThread&#8203;(boolean)</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubPlayer.html#stop(boolean)">com.google.android.exoplayer2.testutil.StubPlayer.stop&#8203;(boolean)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/testutil/StubPlayer.html#stop(boolean)">com.google.android.exoplayer2.testutil.StubPlayer.stop&#8203;(boolean)</a></th>
<td class="colLast"></td> <td class="colLast"></td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/Timeline.html#getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)">com.google.android.exoplayer2.Timeline.getPeriodPosition&#8203;(Timeline.Window, Timeline.Period, int, long)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/Timeline.html#getPeriodPosition(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)">com.google.android.exoplayer2.Timeline.getPeriodPosition&#8203;(Timeline.Window, Timeline.Period, int, long)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/Timeline.html#getPeriodPositionUs(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)"><code>Timeline.getPeriodPositionUs(Window, Period, int, long)</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/Timeline.html#getPeriodPositionUs(com.google.android.exoplayer2.Timeline.Window,com.google.android.exoplayer2.Timeline.Period,int,long)"><code>Timeline.getPeriodPositionUs(Window, Period, int, long)</code></a> instead.</div>
</td> </td>
</tr> </tr>
<tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html#getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters.getSelectionOverride&#8203;(int, TrackGroupArray)</a></th>
<td class="colLast">
<div class="deprecationComment">Only works to retrieve the overrides set with the deprecated <a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"><code>DefaultTrackSelector.ParametersBuilder.setSelectionOverride(int, TrackGroupArray, SelectionOverride)</code></a>. Use
<a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html#trackSelectionOverrides"><code>TrackSelectionParameters.trackSelectionOverrides</code></a> instead.</div>
</td>
</tr>
<tr class="rowColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html#hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters.hasSelectionOverride&#8203;(int, TrackGroupArray)</a></th>
<td class="colLast">
<div class="deprecationComment">Only works to retrieve the overrides set with the deprecated <a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"><code>DefaultTrackSelector.ParametersBuilder.setSelectionOverride(int, TrackGroupArray, SelectionOverride)</code></a>. Use
<a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html#trackSelectionOverrides"><code>TrackSelectionParameters.trackSelectionOverrides</code></a> instead.</div>
</td>
</tr>
<tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#clearSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder.clearSelectionOverride&#8203;(int, TrackGroupArray)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#clearSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder.clearSelectionOverride&#8203;(int, TrackGroupArray)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html#setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)"><code>TrackSelectionParameters.Builder.setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)</code></a>.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html#setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)"><code>TrackSelectionParameters.Builder.setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)</code></a>.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#clearSelectionOverrides(int)">com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder.clearSelectionOverrides&#8203;(int)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#clearSelectionOverrides(int)">com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder.clearSelectionOverrides&#8203;(int)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html#setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)"><code>TrackSelectionParameters.Builder.setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)</code></a>.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html#setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)"><code>TrackSelectionParameters.Builder.setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)</code></a>.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)">com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder.setSelectionOverride&#8203;(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)">com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder.setSelectionOverride&#8203;(int, TrackGroupArray, DefaultTrackSelector.SelectionOverride)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html#setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)"><code>TrackSelectionParameters.Builder.setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)</code></a>.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.Builder.html#setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)"><code>TrackSelectionParameters.Builder.setTrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides)</code></a>.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/ui/DownloadNotificationHelper.html#buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List)">com.google.android.exoplayer2.ui.DownloadNotificationHelper.buildProgressNotification&#8203;(Context, int, PendingIntent, String, List&lt;Download&gt;)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/ui/DownloadNotificationHelper.html#buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List)">com.google.android.exoplayer2.ui.DownloadNotificationHelper.buildProgressNotification&#8203;(Context, int, PendingIntent, String, List&lt;Download&gt;)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/ui/DownloadNotificationHelper.html#buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List,int)"><code>DownloadNotificationHelper.buildProgressNotification(Context, int, PendingIntent, String, List, <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/ui/DownloadNotificationHelper.html#buildProgressNotification(android.content.Context,int,android.app.PendingIntent,java.lang.String,java.util.List,int)"><code>DownloadNotificationHelper.buildProgressNotification(Context, int, PendingIntent, String, List,
int)</code></a>.</div> int)</code></a>.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/upstream/DefaultHttpDataSource.html#setContentTypePredicate(com.google.common.base.Predicate)">com.google.android.exoplayer2.upstream.DefaultHttpDataSource.setContentTypePredicate&#8203;(Predicate&lt;String&gt;)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/upstream/DefaultHttpDataSource.html#setContentTypePredicate(com.google.common.base.Predicate)">com.google.android.exoplayer2.upstream.DefaultHttpDataSource.setContentTypePredicate&#8203;(Predicate&lt;String&gt;)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/upstream/DefaultHttpDataSource.Factory.html#setContentTypePredicate(com.google.common.base.Predicate)"><code>DefaultHttpDataSource.Factory.setContentTypePredicate(Predicate)</code></a> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/upstream/DefaultHttpDataSource.Factory.html#setContentTypePredicate(com.google.common.base.Predicate)"><code>DefaultHttpDataSource.Factory.setContentTypePredicate(Predicate)</code></a>
instead.</div> instead.</div>
</td> </td>
</tr> </tr>
<tr class="altColor"> <tr class="rowColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.html#getVideoDecoderOutputBufferRenderer()">com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView.getVideoDecoderOutputBufferRenderer()</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/video/VideoDecoderGLSurfaceView.html#getVideoDecoderOutputBufferRenderer()">com.google.android.exoplayer2.video.VideoDecoderGLSurfaceView.getVideoDecoderOutputBufferRenderer()</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">This class implements <a href="com/google/android/exoplayer2/video/VideoDecoderOutputBufferRenderer.html" title="interface in com.google.android.exoplayer2.video"><code>VideoDecoderOutputBufferRenderer</code></a> directly.</div> <div class="deprecationComment">This class implements <a href="com/google/android/exoplayer2/video/VideoDecoderOutputBufferRenderer.html" title="interface in com.google.android.exoplayer2.video"><code>VideoDecoderOutputBufferRenderer</code></a> directly.</div>
</td> </td>
</tr> </tr>
<tr class="rowColor"> <tr class="altColor">
<th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/video/VideoRendererEventListener.html#onVideoInputFormatChanged(com.google.android.exoplayer2.Format)">com.google.android.exoplayer2.video.VideoRendererEventListener.onVideoInputFormatChanged&#8203;(Format)</a></th> <th class="colDeprecatedItemName" scope="row"><a href="com/google/android/exoplayer2/video/VideoRendererEventListener.html#onVideoInputFormatChanged(com.google.android.exoplayer2.Format)">com.google.android.exoplayer2.video.VideoRendererEventListener.onVideoInputFormatChanged&#8203;(Format)</a></th>
<td class="colLast"> <td class="colLast">
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/video/VideoRendererEventListener.html#onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"><code>VideoRendererEventListener.onVideoInputFormatChanged(Format, DecoderReuseEvaluation)</code></a>.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/video/VideoRendererEventListener.html#onVideoInputFormatChanged(com.google.android.exoplayer2.Format,com.google.android.exoplayer2.decoder.DecoderReuseEvaluation)"><code>VideoRendererEventListener.onVideoInputFormatChanged(Format, DecoderReuseEvaluation)</code></a>.</div>

View file

@ -1489,7 +1489,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.html#asList()">asList()</a></span> - Method in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.html#asList()">asList()</a></span> - Method in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides</a></dt>
<dd> <dd>
<div class="block">Returns all <a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection"><code>TrackSelectionOverrides.TrackSelectionOverride</code></a> contained.</div> <div class="block">Returns a list of the <a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection"><code>overrides</code></a>.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/util/NalUnitUtil.html#ASPECT_RATIO_IDC_VALUES">ASPECT_RATIO_IDC_VALUES</a></span> - Static variable in class com.google.android.exoplayer2.util.<a href="com/google/android/exoplayer2/util/NalUnitUtil.html" title="class in com.google.android.exoplayer2.util">NalUnitUtil</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/util/NalUnitUtil.html#ASPECT_RATIO_IDC_VALUES">ASPECT_RATIO_IDC_VALUES</a></span> - Static variable in class com.google.android.exoplayer2.util.<a href="com/google/android/exoplayer2/util/NalUnitUtil.html" title="class in com.google.android.exoplayer2.util">NalUnitUtil</a></dt>
<dd> <dd>
@ -9564,6 +9564,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd> <dd>
<div class="block">The number of times all buffers to a keyframe were dropped.</div> <div class="block">The number of times all buffers to a keyframe were dropped.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/audio/WavUtil.html#DS64_FOURCC">DS64_FOURCC</a></span> - Static variable in class com.google.android.exoplayer2.audio.<a href="com/google/android/exoplayer2/audio/WavUtil.html" title="class in com.google.android.exoplayer2.audio">WavUtil</a></dt>
<dd>
<div class="block">Four character code for "ds64".</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/audio/DtsUtil.html#DTS_HD_MAX_RATE_BYTES_PER_SECOND">DTS_HD_MAX_RATE_BYTES_PER_SECOND</a></span> - Static variable in class com.google.android.exoplayer2.audio.<a href="com/google/android/exoplayer2/audio/DtsUtil.html" title="class in com.google.android.exoplayer2.audio">DtsUtil</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/audio/DtsUtil.html#DTS_HD_MAX_RATE_BYTES_PER_SECOND">DTS_HD_MAX_RATE_BYTES_PER_SECOND</a></span> - Static variable in class com.google.android.exoplayer2.audio.<a href="com/google/android/exoplayer2/audio/DtsUtil.html" title="class in com.google.android.exoplayer2.audio">DtsUtil</a></dt>
<dd> <dd>
<div class="block">Maximum rate for a DTS-HD audio stream, in bytes per second.</div> <div class="block">Maximum rate for a DTS-HD audio stream, in bytes per second.</div>
@ -10571,6 +10575,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd> <dd>
<div class="block">Essential properties in the adaptation set.</div> <div class="block">Essential properties in the adaptation set.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html#essentialProperties">essentialProperties</a></span> - Variable in class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html" title="class in com.google.android.exoplayer2.source.dash.manifest">DashManifestParser.RepresentationInfo</a></dt>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html#essentialProperties">essentialProperties</a></span> - Variable in class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></dt>
<dd>
<div class="block">Essential properties in the representation.</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/metadata/id3/Id3Decoder.FramePredicate.html#evaluate(int,int,int,int,int)">evaluate(int, int, int, int, int)</a></span> - Method in interface com.google.android.exoplayer2.metadata.id3.<a href="com/google/android/exoplayer2/metadata/id3/Id3Decoder.FramePredicate.html" title="interface in com.google.android.exoplayer2.metadata.id3">Id3Decoder.FramePredicate</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/metadata/id3/Id3Decoder.FramePredicate.html#evaluate(int,int,int,int,int)">evaluate(int, int, int, int, int)</a></span> - Method in interface com.google.android.exoplayer2.metadata.id3.<a href="com/google/android/exoplayer2/metadata/id3/Id3Decoder.FramePredicate.html" title="interface in com.google.android.exoplayer2.metadata.id3">Id3Decoder.FramePredicate</a></dt>
<dd> <dd>
<div class="block">Returns whether a frame with the specified parameters should be decoded.</div> <div class="block">Returns whether a frame with the specified parameters should be decoded.</div>
@ -11285,6 +11295,16 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
instead.</div> instead.</div>
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/DefaultRenderersFactory.html#experimentalSetImmediateCodecStartAfterFlushEnabled(boolean)">experimentalSetImmediateCodecStartAfterFlushEnabled(boolean)</a></span> - Method in class com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></dt>
<dd>
<div class="block">Enable calling <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink"><code>MediaCodec.start()</code></a> immediately after <a href="https://developer.android.com/reference/android/media/MediaCodec.html?is-external=true#flush()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.flush()</code></a> on the
playback thread, when operating the codec in asynchronous mode.</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/mediacodec/DefaultMediaCodecAdapterFactory.html#experimentalSetImmediateCodecStartAfterFlushEnabled(boolean)">experimentalSetImmediateCodecStartAfterFlushEnabled(boolean)</a></span> - Method in class com.google.android.exoplayer2.mediacodec.<a href="com/google/android/exoplayer2/mediacodec/DefaultMediaCodecAdapterFactory.html" title="class in com.google.android.exoplayer2.mediacodec">DefaultMediaCodecAdapterFactory</a></dt>
<dd>
<div class="block">Enable calling <a href="https://developer.android.com/reference/android/media/MediaCodec.html#start()" title="class or interface in android.media" class="externalLink"><code>MediaCodec.start()</code></a> immediately after <a href="https://developer.android.com/reference/android/media/MediaCodec.html?is-external=true#flush()" title="class or interface in android.media" class="externalLink" target="_top"><code>MediaCodec.flush()</code></a> on the
playback thread, when operating the codec in asynchronous mode.</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/ExoPlayer.html#experimentalSetOffloadSchedulingEnabled(boolean)">experimentalSetOffloadSchedulingEnabled(boolean)</a></span> - Method in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/ExoPlayer.html" title="interface in com.google.android.exoplayer2">ExoPlayer</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/ExoPlayer.html#experimentalSetOffloadSchedulingEnabled(boolean)">experimentalSetOffloadSchedulingEnabled(boolean)</a></span> - Method in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/ExoPlayer.html" title="interface in com.google.android.exoplayer2">ExoPlayer</a></dt>
<dd> <dd>
<div class="block">Sets whether audio offload scheduling is enabled.</div> <div class="block">Sets whether audio offload scheduling is enabled.</div>
@ -13907,6 +13927,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html#getCodec()">getCodec()</a></span> - Method in class com.google.android.exoplayer2.mediacodec.<a href="com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html" title="class in com.google.android.exoplayer2.mediacodec">MediaCodecRenderer</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html#getCodec()">getCodec()</a></span> - Method in class com.google.android.exoplayer2.mediacodec.<a href="com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html" title="class in com.google.android.exoplayer2.mediacodec">MediaCodecRenderer</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/DefaultRenderersFactory.html#getCodecAdapterFactory()">getCodecAdapterFactory()</a></span> - Method in class com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/DefaultRenderersFactory.html" title="class in com.google.android.exoplayer2">DefaultRenderersFactory</a></dt>
<dd>
<div class="block">Returns the <a href="com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.Factory.html" title="interface in com.google.android.exoplayer2.mediacodec"><code>MediaCodecAdapter.Factory</code></a> that will be used when creating <a href="com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.html" title="class in com.google.android.exoplayer2.mediacodec"><code>MediaCodecRenderer</code></a> instances.</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/util/Util.html#getCodecCountOfType(java.lang.String,@com.google.android.exoplayer2.C.TrackTypeint)">getCodecCountOfType(String, @com.google.android.exoplayer2.C.TrackType int)</a></span> - Static method in class com.google.android.exoplayer2.util.<a href="com/google/android/exoplayer2/util/Util.html" title="class in com.google.android.exoplayer2.util">Util</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/util/Util.html#getCodecCountOfType(java.lang.String,@com.google.android.exoplayer2.C.TrackTypeint)">getCodecCountOfType(String, @com.google.android.exoplayer2.C.TrackType int)</a></span> - Static method in class com.google.android.exoplayer2.util.<a href="com/google/android/exoplayer2/util/Util.html" title="class in com.google.android.exoplayer2.util">Util</a></dt>
<dd> <dd>
<div class="block">Returns the number of codec strings in <code>codecs</code> whose type matches <code>trackType</code>.</div> <div class="block">Returns the number of codec strings in <code>codecs</code> whose type matches <code>trackType</code>.</div>
@ -14392,7 +14416,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Player.html#getCurrentWindowIndex()">getCurrentWindowIndex()</a></span> - Method in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Player.html" title="interface in com.google.android.exoplayer2">Player</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Player.html#getCurrentWindowIndex()">getCurrentWindowIndex()</a></span> - Method in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Player.html" title="interface in com.google.android.exoplayer2">Player</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/Player.html#getCurrentMediaItem()"><code>Player.getCurrentMediaItem()</code></a> instead.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/Player.html#getCurrentMediaItemIndex()"><code>Player.getCurrentMediaItemIndex()</code></a> instead.</div>
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CustomActionProvider.html#getCustomAction(com.google.android.exoplayer2.Player)">getCustomAction(Player)</a></span> - Method in interface com.google.android.exoplayer2.ext.mediasession.<a href="com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CustomActionProvider.html" title="interface in com.google.android.exoplayer2.ext.mediasession">MediaSessionConnector.CustomActionProvider</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CustomActionProvider.html#getCustomAction(com.google.android.exoplayer2.Player)">getCustomAction(Player)</a></span> - Method in interface com.google.android.exoplayer2.ext.mediasession.<a href="com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.CustomActionProvider.html" title="interface in com.google.android.exoplayer2.ext.mediasession">MediaSessionConnector.CustomActionProvider</a></dt>
@ -16787,8 +16811,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/upstream/TeeDataSource.html#getResponseHeaders()">getResponseHeaders()</a></span> - Method in class com.google.android.exoplayer2.upstream.<a href="com/google/android/exoplayer2/upstream/TeeDataSource.html" title="class in com.google.android.exoplayer2.upstream">TeeDataSource</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/upstream/TeeDataSource.html#getResponseHeaders()">getResponseHeaders()</a></span> - Method in class com.google.android.exoplayer2.upstream.<a href="com/google/android/exoplayer2/upstream/TeeDataSource.html" title="class in com.google.android.exoplayer2.upstream">TeeDataSource</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html#getResponseHeaders_caseInsensitive()">getResponseHeaders_caseInsensitive()</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html" title="class in com.google.android.exoplayer2.testutil">DataSourceContractTest</a></dt>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html#getResponseHeaders_isEmptyWhileNotOpen()">getResponseHeaders_isEmptyWhileNotOpen()</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html" title="class in com.google.android.exoplayer2.testutil">DataSourceContractTest</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html#getResponseHeaders_isEmptyWhileNotOpen()">getResponseHeaders_isEmptyWhileNotOpen()</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html" title="class in com.google.android.exoplayer2.testutil">DataSourceContractTest</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html#getResponseHeaders_noNullKeysOrValues()">getResponseHeaders_noNullKeysOrValues()</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html" title="class in com.google.android.exoplayer2.testutil">DataSourceContractTest</a></dt>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html#getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()">getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html" title="class in com.google.android.exoplayer2.testutil">DataSourceContractTest</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html#getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()">getResponseHeaders_resourceNotFound_isEmptyWhileNotOpen()</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/DataSourceContractTest.html" title="class in com.google.android.exoplayer2.testutil">DataSourceContractTest</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/upstream/ParsingLoadable.html#getResult()">getResult()</a></span> - Method in class com.google.android.exoplayer2.upstream.<a href="com/google/android/exoplayer2/upstream/ParsingLoadable.html" title="class in com.google.android.exoplayer2.upstream">ParsingLoadable</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/upstream/ParsingLoadable.html#getResult()">getResult()</a></span> - Method in class com.google.android.exoplayer2.upstream.<a href="com/google/android/exoplayer2/upstream/ParsingLoadable.html" title="class in com.google.android.exoplayer2.upstream">ParsingLoadable</a></dt>
@ -17057,7 +17085,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html#getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">getSelectionOverride(int, TrackGroupArray)</a></span> - Method in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.Parameters</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html#getSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">getSelectionOverride(int, TrackGroupArray)</a></span> - Method in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.Parameters</a></dt>
<dd> <dd>
<div class="block">Returns the override for the specified renderer and <a href="com/google/android/exoplayer2/source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a>.</div> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
<div class="deprecationComment">Only works to retrieve the overrides set with the deprecated <a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"><code>DefaultTrackSelector.ParametersBuilder.setSelectionOverride(int, TrackGroupArray, SelectionOverride)</code></a>. Use
<a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html#trackSelectionOverrides"><code>TrackSelectionParameters.trackSelectionOverrides</code></a> instead.</div>
</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/FakeTrackSelection.html#getSelectionReason()">getSelectionReason()</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/FakeTrackSelection.html" title="class in com.google.android.exoplayer2.testutil">FakeTrackSelection</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/FakeTrackSelection.html#getSelectionReason()">getSelectionReason()</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/FakeTrackSelection.html" title="class in com.google.android.exoplayer2.testutil">FakeTrackSelection</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
@ -17623,6 +17654,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd> <dd>
<div class="block">Returns the track type that the <a href="com/google/android/exoplayer2/Renderer.html" title="interface in com.google.android.exoplayer2"><code>Renderer</code></a> handles.</div> <div class="block">Returns the track type that the <a href="com/google/android/exoplayer2/Renderer.html" title="interface in com.google.android.exoplayer2"><code>Renderer</code></a> handles.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#getTrackType()">getTrackType()</a></span> - Method in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></dt>
<dd>
<div class="block">Returns the <a href="com/google/android/exoplayer2/C.TrackType.html" title="annotation in com.google.android.exoplayer2"><code>C.TrackType</code></a> of the overriden track group.</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/TracksInfo.TrackGroupInfo.html#getTrackType()">getTrackType()</a></span> - Method in class com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/TracksInfo.TrackGroupInfo.html" title="class in com.google.android.exoplayer2">TracksInfo.TrackGroupInfo</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/TracksInfo.TrackGroupInfo.html#getTrackType()">getTrackType()</a></span> - Method in class com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/TracksInfo.TrackGroupInfo.html" title="class in com.google.android.exoplayer2">TracksInfo.TrackGroupInfo</a></dt>
<dd> <dd>
<div class="block">Returns the <a href="com/google/android/exoplayer2/C.TrackType.html" title="annotation in com.google.android.exoplayer2"><code>C.TrackType</code></a> of the tracks in the <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div> <div class="block">Returns the <a href="com/google/android/exoplayer2/C.TrackType.html" title="annotation in com.google.android.exoplayer2"><code>C.TrackType</code></a> of the tracks in the <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div>
@ -18715,7 +18750,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html#hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">hasSelectionOverride(int, TrackGroupArray)</a></span> - Method in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.Parameters</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html#hasSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray)">hasSelectionOverride(int, TrackGroupArray)</a></span> - Method in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.Parameters.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector.Parameters</a></dt>
<dd> <dd>
<div class="block">Returns whether there is an override for the specified renderer and <a href="com/google/android/exoplayer2/source/TrackGroupArray.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroupArray</code></a>.</div> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
<div class="deprecationComment">Only works to retrieve the overrides set with the deprecated <a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.ParametersBuilder.html#setSelectionOverride(int,com.google.android.exoplayer2.source.TrackGroupArray,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)"><code>DefaultTrackSelector.ParametersBuilder.setSelectionOverride(int, TrackGroupArray, SelectionOverride)</code></a>. Use
<a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html#trackSelectionOverrides"><code>TrackSelectionParameters.trackSelectionOverrides</code></a> instead.</div>
</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/truth/SpannedSubject.html#hasStrikethroughSpanBetween(int,int)">hasStrikethroughSpanBetween(int, int)</a></span> - Method in class com.google.android.exoplayer2.testutil.truth.<a href="com/google/android/exoplayer2/testutil/truth/SpannedSubject.html" title="class in com.google.android.exoplayer2.testutil.truth">SpannedSubject</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/truth/SpannedSubject.html#hasStrikethroughSpanBetween(int,int)">hasStrikethroughSpanBetween(int, int)</a></span> - Method in class com.google.android.exoplayer2.testutil.truth.<a href="com/google/android/exoplayer2/testutil/truth/SpannedSubject.html" title="class in com.google.android.exoplayer2.testutil.truth">SpannedSubject</a></dt>
<dd> <dd>
@ -21652,11 +21690,6 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.StreamElement.html#maxWidth">maxWidth</a></span> - Variable in class com.google.android.exoplayer2.source.smoothstreaming.manifest.<a href="com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.StreamElement.html" title="class in com.google.android.exoplayer2.source.smoothstreaming.manifest">SsManifest.StreamElement</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.StreamElement.html#maxWidth">maxWidth</a></span> - Variable in class com.google.android.exoplayer2.source.smoothstreaming.manifest.<a href="com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.StreamElement.html" title="class in com.google.android.exoplayer2.source.smoothstreaming.manifest">SsManifest.StreamElement</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.html#maybeApplyOverride(com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo,com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters,int,com.google.android.exoplayer2.trackselection.ExoTrackSelection.Definition)">maybeApplyOverride(MappingTrackSelector.MappedTrackInfo, DefaultTrackSelector.Parameters, int, ExoTrackSelection.Definition)</a></span> - Method in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/DefaultTrackSelector.html" title="class in com.google.android.exoplayer2.trackselection">DefaultTrackSelector</a></dt>
<dd>
<div class="block">Returns the <a href="com/google/android/exoplayer2/trackselection/ExoTrackSelection.Definition.html" title="class in com.google.android.exoplayer2.trackselection"><code>ExoTrackSelection.Definition</code></a> of a renderer after applying selection
overriding and renderer disabling.</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/video/DecoderVideoRenderer.html#maybeDropBuffersToKeyframe(long)">maybeDropBuffersToKeyframe(long)</a></span> - Method in class com.google.android.exoplayer2.video.<a href="com/google/android/exoplayer2/video/DecoderVideoRenderer.html" title="class in com.google.android.exoplayer2.video">DecoderVideoRenderer</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/video/DecoderVideoRenderer.html#maybeDropBuffersToKeyframe(long)">maybeDropBuffersToKeyframe(long)</a></span> - Method in class com.google.android.exoplayer2.video.<a href="com/google/android/exoplayer2/video/DecoderVideoRenderer.html" title="class in com.google.android.exoplayer2.video">DecoderVideoRenderer</a></dt>
<dd> <dd>
<div class="block">Drops frames from the current output buffer to the next keyframe at or before the playback <div class="block">Drops frames from the current output buffer to the next keyframe at or before the playback
@ -22895,7 +22928,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/SegmentBase.MultiSegmentBase.html#%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,long,long)">MultiSegmentBase(RangedUri, long, long, long, long, List&lt;SegmentBase.SegmentTimelineElement&gt;, long, long, long)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/SegmentBase.MultiSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.MultiSegmentBase</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/SegmentBase.MultiSegmentBase.html#%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long,java.util.List,long,long,long)">MultiSegmentBase(RangedUri, long, long, long, long, List&lt;SegmentBase.SegmentTimelineElement&gt;, long, long, long)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/SegmentBase.MultiSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.MultiSegmentBase</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/Representation.MultiSegmentRepresentation.html#%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List)">MultiSegmentRepresentation(long, Format, List&lt;BaseUrl&gt;, SegmentBase.MultiSegmentBase, List&lt;Descriptor&gt;)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/Representation.MultiSegmentRepresentation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation.MultiSegmentRepresentation</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/Representation.MultiSegmentRepresentation.html#%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.MultiSegmentBase,java.util.List,java.util.List,java.util.List)">MultiSegmentRepresentation(long, Format, List&lt;BaseUrl&gt;, SegmentBase.MultiSegmentBase, List&lt;Descriptor&gt;, List&lt;Descriptor&gt;, List&lt;Descriptor&gt;)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/Representation.MultiSegmentRepresentation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation.MultiSegmentRepresentation</a></dt>
<dd> <dd>
<div class="block">Creates the multi-segment Representation.</div> <div class="block">Creates the multi-segment Representation.</div>
</dd> </dd>
@ -23073,11 +23106,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd> <dd>
<div class="block">Constructs a new instance.</div> <div class="block">Constructs a new instance.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List)">newInstance(long, Format, List&lt;BaseUrl&gt;, SegmentBase, List&lt;Descriptor&gt;)</a></span> - Static method in class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.util.List,java.util.List,java.lang.String)">newInstance(long, Format, List&lt;BaseUrl&gt;, SegmentBase, List&lt;Descriptor&gt;, List&lt;Descriptor&gt;, List&lt;Descriptor&gt;, String)</a></span> - Static method in class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></dt>
<dd>
<div class="block">Constructs a new instance.</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html#newInstance(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.util.List,java.lang.String)">newInstance(long, Format, List&lt;BaseUrl&gt;, SegmentBase, List&lt;Descriptor&gt;, String)</a></span> - Static method in class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></dt>
<dd> <dd>
<div class="block">Constructs a new instance.</div> <div class="block">Constructs a new instance.</div>
</dd> </dd>
@ -27194,6 +27223,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/metadata/flac/VorbisComment.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata(MediaMetadata.Builder)</a></span> - Method in class com.google.android.exoplayer2.metadata.flac.<a href="com/google/android/exoplayer2/metadata/flac/VorbisComment.html" title="class in com.google.android.exoplayer2.metadata.flac">VorbisComment</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/metadata/flac/VorbisComment.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata(MediaMetadata.Builder)</a></span> - Method in class com.google.android.exoplayer2.metadata.flac.<a href="com/google/android/exoplayer2/metadata/flac/VorbisComment.html" title="class in com.google.android.exoplayer2.metadata.flac">VorbisComment</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/metadata/icy/IcyHeaders.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata(MediaMetadata.Builder)</a></span> - Method in class com.google.android.exoplayer2.metadata.icy.<a href="com/google/android/exoplayer2/metadata/icy/IcyHeaders.html" title="class in com.google.android.exoplayer2.metadata.icy">IcyHeaders</a></dt>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/metadata/icy/IcyInfo.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata(MediaMetadata.Builder)</a></span> - Method in class com.google.android.exoplayer2.metadata.icy.<a href="com/google/android/exoplayer2/metadata/icy/IcyInfo.html" title="class in com.google.android.exoplayer2.metadata.icy">IcyInfo</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/metadata/icy/IcyInfo.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata(MediaMetadata.Builder)</a></span> - Method in class com.google.android.exoplayer2.metadata.icy.<a href="com/google/android/exoplayer2/metadata/icy/IcyInfo.html" title="class in com.google.android.exoplayer2.metadata.icy">IcyInfo</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/metadata/id3/ApicFrame.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata(MediaMetadata.Builder)</a></span> - Method in class com.google.android.exoplayer2.metadata.id3.<a href="com/google/android/exoplayer2/metadata/id3/ApicFrame.html" title="class in com.google.android.exoplayer2.metadata.id3">ApicFrame</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/metadata/id3/ApicFrame.html#populateMediaMetadata(com.google.android.exoplayer2.MediaMetadata.Builder)">populateMediaMetadata(MediaMetadata.Builder)</a></span> - Method in class com.google.android.exoplayer2.metadata.id3.<a href="com/google/android/exoplayer2/metadata/id3/ApicFrame.html" title="class in com.google.android.exoplayer2.metadata.id3">ApicFrame</a></dt>
@ -29541,7 +29572,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.html#representationHolders">representationHolders</a></span> - Variable in class com.google.android.exoplayer2.source.dash.<a href="com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.html" title="class in com.google.android.exoplayer2.source.dash">DefaultDashChunkSource</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.html#representationHolders">representationHolders</a></span> - Variable in class com.google.android.exoplayer2.source.dash.<a href="com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.html" title="class in com.google.android.exoplayer2.source.dash">DefaultDashChunkSource</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html#%3Cinit%3E(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,long)">RepresentationInfo(Format, List&lt;BaseUrl&gt;, SegmentBase, String, ArrayList&lt;DrmInitData.SchemeData&gt;, ArrayList&lt;Descriptor&gt;, long)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html" title="class in com.google.android.exoplayer2.source.dash.manifest">DashManifestParser.RepresentationInfo</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html#%3Cinit%3E(com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase,java.lang.String,java.util.ArrayList,java.util.ArrayList,java.util.List,java.util.List,long)">RepresentationInfo(Format, List&lt;BaseUrl&gt;, SegmentBase, String, ArrayList&lt;DrmInitData.SchemeData&gt;, ArrayList&lt;Descriptor&gt;, List&lt;Descriptor&gt;, List&lt;Descriptor&gt;, long)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html" title="class in com.google.android.exoplayer2.source.dash.manifest">DashManifestParser.RepresentationInfo</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.html#representations">representations</a></span> - Variable in class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.html" title="class in com.google.android.exoplayer2.source.dash.manifest">AdaptationSet</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.html#representations">representations</a></span> - Variable in class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/AdaptationSet.html" title="class in com.google.android.exoplayer2.source.dash.manifest">AdaptationSet</a></dt>
<dd> <dd>
@ -30028,6 +30059,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/ui/PlayerNotificationManager.Builder.html#rewindActionIconResourceId">rewindActionIconResourceId</a></span> - Variable in class com.google.android.exoplayer2.ui.<a href="com/google/android/exoplayer2/ui/PlayerNotificationManager.Builder.html" title="class in com.google.android.exoplayer2.ui">PlayerNotificationManager.Builder</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/ui/PlayerNotificationManager.Builder.html#rewindActionIconResourceId">rewindActionIconResourceId</a></span> - Variable in class com.google.android.exoplayer2.ui.<a href="com/google/android/exoplayer2/ui/PlayerNotificationManager.Builder.html" title="class in com.google.android.exoplayer2.ui">PlayerNotificationManager.Builder</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/audio/WavUtil.html#RF64_FOURCC">RF64_FOURCC</a></span> - Static variable in class com.google.android.exoplayer2.audio.<a href="com/google/android/exoplayer2/audio/WavUtil.html" title="class in com.google.android.exoplayer2.audio">WavUtil</a></dt>
<dd>
<div class="block">Four character code for "RF64".</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/audio/WavUtil.html#RIFF_FOURCC">RIFF_FOURCC</a></span> - Static variable in class com.google.android.exoplayer2.audio.<a href="com/google/android/exoplayer2/audio/WavUtil.html" title="class in com.google.android.exoplayer2.audio">WavUtil</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/audio/WavUtil.html#RIFF_FOURCC">RIFF_FOURCC</a></span> - Static variable in class com.google.android.exoplayer2.audio.<a href="com/google/android/exoplayer2/audio/WavUtil.html" title="class in com.google.android.exoplayer2.audio">WavUtil</a></dt>
<dd> <dd>
<div class="block">Four character code for "RIFF".</div> <div class="block">Four character code for "RIFF".</div>
@ -32395,11 +32430,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<div class="block">Sets the <a href="com/google/android/exoplayer2/upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="com/google/android/exoplayer2/drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> which executes key and provisioning requests over HTTP.</div> <div class="block">Sets the <a href="com/google/android/exoplayer2/upstream/HttpDataSource.Factory.html" title="interface in com.google.android.exoplayer2.upstream"><code>HttpDataSource.Factory</code></a> to be used for creating <a href="com/google/android/exoplayer2/drm/HttpMediaDrmCallback.html" title="class in com.google.android.exoplayer2.drm"><code>HttpMediaDrmCallbacks</code></a> which executes key and provisioning requests over HTTP.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.dash.<a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.dash.<a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.hls.<a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.hls.<a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in interface com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/MediaSourceFactory.html" title="interface in com.google.android.exoplayer2.source">MediaSourceFactory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in interface com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/MediaSourceFactory.html" title="interface in com.google.android.exoplayer2.source">MediaSourceFactory</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
@ -32409,7 +32450,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.rtsp.<a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.rtsp">RtspMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.rtsp.<a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.rtsp">RtspMediaSource.Factory</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
@ -32417,7 +32460,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.smoothstreaming.<a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.source.smoothstreaming.<a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html" title="class in com.google.android.exoplayer2.testutil">FakeMediaSourceFactory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmHttpDataSourceFactory(com.google.android.exoplayer2.upstream.HttpDataSource.Factory)">setDrmHttpDataSourceFactory(HttpDataSource.Factory)</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html" title="class in com.google.android.exoplayer2.testutil">FakeMediaSourceFactory</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
@ -32477,11 +32522,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.dash.<a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.dash.<a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.hls.<a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.hls.<a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in interface com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/MediaSourceFactory.html" title="interface in com.google.android.exoplayer2.source">MediaSourceFactory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in interface com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/MediaSourceFactory.html" title="interface in com.google.android.exoplayer2.source">MediaSourceFactory</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
@ -32490,7 +32541,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.rtsp.<a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.rtsp">RtspMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.rtsp.<a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.rtsp">RtspMediaSource.Factory</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
@ -32498,7 +32551,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.smoothstreaming.<a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.source.smoothstreaming.<a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html" title="class in com.google.android.exoplayer2.testutil">FakeMediaSourceFactory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmSessionManager(com.google.android.exoplayer2.drm.DrmSessionManager)">setDrmSessionManager(DrmSessionManager)</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html" title="class in com.google.android.exoplayer2.testutil">FakeMediaSourceFactory</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
@ -32529,11 +32584,17 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<div class="block">Sets the optional user agent to be used for DRM requests.</div> <div class="block">Sets the optional user agent to be used for DRM requests.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.dash.<a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.dash.<a href="com/google/android/exoplayer2/source/dash/DashMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.dash">DashMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html" title="class in com.google.android.exoplayer2.source">DefaultMediaSourceFactory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.hls.<a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.hls.<a href="com/google/android/exoplayer2/source/hls/HlsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.hls">HlsMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in interface com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/MediaSourceFactory.html" title="interface in com.google.android.exoplayer2.source">MediaSourceFactory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/MediaSourceFactory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in interface com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/MediaSourceFactory.html" title="interface in com.google.android.exoplayer2.source">MediaSourceFactory</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
@ -32543,7 +32604,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.<a href="com/google/android/exoplayer2/source/ProgressiveMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source">ProgressiveMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.rtsp.<a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.rtsp">RtspMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.rtsp.<a href="com/google/android/exoplayer2/source/rtsp/RtspMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.rtsp">RtspMediaSource.Factory</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span>
@ -32551,7 +32614,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.smoothstreaming.<a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.source.smoothstreaming.<a href="com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.Factory.html" title="class in com.google.android.exoplayer2.source.smoothstreaming">SsMediaSource.Factory</a></dt>
<dd>&nbsp;</dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html" title="class in com.google.android.exoplayer2.testutil">FakeMediaSourceFactory</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html#setDrmUserAgent(java.lang.String)">setDrmUserAgent(String)</a></span> - Method in class com.google.android.exoplayer2.testutil.<a href="com/google/android/exoplayer2/testutil/FakeMediaSourceFactory.html" title="class in com.google.android.exoplayer2.testutil">FakeMediaSourceFactory</a></dt>
<dd> <dd>
<div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div> <div class="deprecationBlock"><span class="deprecatedLabel">Deprecated.</span></div>
@ -34991,6 +35056,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd> <dd>
<div class="block">Sets all states to <a href="com/google/android/exoplayer2/offline/Download.html#STATE_REMOVING"><code>Download.STATE_REMOVING</code></a>.</div> <div class="block">Sets all states to <a href="com/google/android/exoplayer2/offline/Download.html#STATE_REMOVING"><code>Download.STATE_REMOVING</code></a>.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/MediaMetadata.Builder.html#setStation(java.lang.CharSequence)">setStation(CharSequence)</a></span> - Method in class com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/MediaMetadata.Builder.html" title="class in com.google.android.exoplayer2">MediaMetadata.Builder</a></dt>
<dd>
<div class="block">Sets the name of the station streaming the media.</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Format.Builder.html#setStereoMode(int)">setStereoMode(int)</a></span> - Method in class com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Format.Builder.html" title="class in com.google.android.exoplayer2">Format.Builder</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Format.Builder.html#setStereoMode(int)">setStereoMode(int)</a></span> - Method in class com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Format.Builder.html" title="class in com.google.android.exoplayer2">Format.Builder</a></dt>
<dd> <dd>
<div class="block">Sets <a href="com/google/android/exoplayer2/Format.html#stereoMode"><code>Format.stereoMode</code></a>.</div> <div class="block">Sets <a href="com/google/android/exoplayer2/Format.html#stereoMode"><code>Format.stereoMode</code></a>.</div>
@ -36183,7 +36252,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/SegmentBase.SingleSegmentBase.html#%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)">SingleSegmentBase(RangedUri, long, long, long, long)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/SegmentBase.SingleSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.SingleSegmentBase</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/SegmentBase.SingleSegmentBase.html#%3Cinit%3E(com.google.android.exoplayer2.source.dash.manifest.RangedUri,long,long,long,long)">SingleSegmentBase(RangedUri, long, long, long, long)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/SegmentBase.SingleSegmentBase.html" title="class in com.google.android.exoplayer2.source.dash.manifest">SegmentBase.SingleSegmentBase</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/Representation.SingleSegmentRepresentation.html#%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.lang.String,long)">SingleSegmentRepresentation(long, Format, List&lt;BaseUrl&gt;, SegmentBase.SingleSegmentBase, List&lt;Descriptor&gt;, String, long)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/Representation.SingleSegmentRepresentation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation.SingleSegmentRepresentation</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/Representation.SingleSegmentRepresentation.html#%3Cinit%3E(long,com.google.android.exoplayer2.Format,java.util.List,com.google.android.exoplayer2.source.dash.manifest.SegmentBase.SingleSegmentBase,java.util.List,java.util.List,java.util.List,java.lang.String,long)">SingleSegmentRepresentation(long, Format, List&lt;BaseUrl&gt;, SegmentBase.SingleSegmentBase, List&lt;Descriptor&gt;, List&lt;Descriptor&gt;, List&lt;Descriptor&gt;, String, long)</a></span> - Constructor for class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/Representation.SingleSegmentRepresentation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation.SingleSegmentRepresentation</a></dt>
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/audio/AudioSink.html#SINK_FORMAT_SUPPORTED_DIRECTLY">SINK_FORMAT_SUPPORTED_DIRECTLY</a></span> - Static variable in interface com.google.android.exoplayer2.audio.<a href="com/google/android/exoplayer2/audio/AudioSink.html" title="interface in com.google.android.exoplayer2.audio">AudioSink</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/audio/AudioSink.html#SINK_FORMAT_SUPPORTED_DIRECTLY">SINK_FORMAT_SUPPORTED_DIRECTLY</a></span> - Static variable in interface com.google.android.exoplayer2.audio.<a href="com/google/android/exoplayer2/audio/AudioSink.html" title="interface in com.google.android.exoplayer2.audio">AudioSink</a></dt>
<dd> <dd>
@ -36935,7 +37004,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Player.html#STATE_IDLE">STATE_IDLE</a></span> - Static variable in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Player.html" title="interface in com.google.android.exoplayer2">Player</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Player.html#STATE_IDLE">STATE_IDLE</a></span> - Static variable in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Player.html" title="interface in com.google.android.exoplayer2">Player</a></dt>
<dd> <dd>
<div class="block">The player is idle, and must be <a href="com/google/android/exoplayer2/Player.html#prepare()"><code>prepared</code></a> before it will play the media.</div> <div class="block">The player is idle, meaning it holds only limited resources.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/drm/DrmSession.html#STATE_OPENED">STATE_OPENED</a></span> - Static variable in interface com.google.android.exoplayer2.drm.<a href="com/google/android/exoplayer2/drm/DrmSession.html" title="interface in com.google.android.exoplayer2.drm">DrmSession</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/drm/DrmSession.html#STATE_OPENED">STATE_OPENED</a></span> - Static variable in interface com.google.android.exoplayer2.drm.<a href="com/google/android/exoplayer2/drm/DrmSession.html" title="interface in com.google.android.exoplayer2.drm">DrmSession</a></dt>
<dd> <dd>
@ -36981,6 +37050,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd> <dd>
<div class="block">The state of each ad in the ad group.</div> <div class="block">The state of each ad in the ad group.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/MediaMetadata.html#station">station</a></span> - Variable in class com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/MediaMetadata.html" title="class in com.google.android.exoplayer2">MediaMetadata</a></dt>
<dd>
<div class="block">Optional name of the station streaming the media.</div>
</dd>
<dt><a href="com/google/android/exoplayer2/upstream/StatsDataSource.html" title="class in com.google.android.exoplayer2.upstream"><span class="typeNameLink">StatsDataSource</span></a> - Class in <a href="com/google/android/exoplayer2/upstream/package-summary.html">com.google.android.exoplayer2.upstream</a></dt> <dt><a href="com/google/android/exoplayer2/upstream/StatsDataSource.html" title="class in com.google.android.exoplayer2.upstream"><span class="typeNameLink">StatsDataSource</span></a> - Class in <a href="com/google/android/exoplayer2/upstream/package-summary.html">com.google.android.exoplayer2.upstream</a></dt>
<dd> <dd>
<div class="block"><a href="com/google/android/exoplayer2/upstream/DataSource.html" title="interface in com.google.android.exoplayer2.upstream"><code>DataSource</code></a> wrapper which keeps track of bytes transferred, redirected uris, and response <div class="block"><a href="com/google/android/exoplayer2/upstream/DataSource.html" title="interface in com.google.android.exoplayer2.upstream"><code>DataSource</code></a> wrapper which keeps track of bytes transferred, redirected uris, and response
@ -37021,7 +37094,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd>&nbsp;</dd> <dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Player.html#stop()">stop()</a></span> - Method in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Player.html" title="interface in com.google.android.exoplayer2">Player</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Player.html#stop()">stop()</a></span> - Method in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Player.html" title="interface in com.google.android.exoplayer2">Player</a></dt>
<dd> <dd>
<div class="block">Stops playback without resetting the player.</div> <div class="block">Stops playback without resetting the playlist.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Renderer.html#stop()">stop()</a></span> - Method in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Renderer.html" title="interface in com.google.android.exoplayer2">Renderer</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/Renderer.html#stop()">stop()</a></span> - Method in interface com.google.android.exoplayer2.<a href="com/google/android/exoplayer2/Renderer.html" title="interface in com.google.android.exoplayer2">Renderer</a></dt>
<dd> <dd>
@ -37406,6 +37479,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<dd> <dd>
<div class="block">Supplemental properties in the adaptation set.</div> <div class="block">Supplemental properties in the adaptation set.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html#supplementalProperties">supplementalProperties</a></span> - Variable in class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.RepresentationInfo.html" title="class in com.google.android.exoplayer2.source.dash.manifest">DashManifestParser.RepresentationInfo</a></dt>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html#supplementalProperties">supplementalProperties</a></span> - Variable in class com.google.android.exoplayer2.source.dash.manifest.<a href="com/google/android/exoplayer2/source/dash/manifest/Representation.html" title="class in com.google.android.exoplayer2.source.dash.manifest">Representation</a></dt>
<dd>
<div class="block">Supplemental properties in the adaptation set.</div>
</dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/ext/opus/OpusLibrary.html#supportsCryptoType(@com.google.android.exoplayer2.C.CryptoTypeint)">supportsCryptoType(@com.google.android.exoplayer2.C.CryptoType int)</a></span> - Static method in class com.google.android.exoplayer2.ext.opus.<a href="com/google/android/exoplayer2/ext/opus/OpusLibrary.html" title="class in com.google.android.exoplayer2.ext.opus">OpusLibrary</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/ext/opus/OpusLibrary.html#supportsCryptoType(@com.google.android.exoplayer2.C.CryptoTypeint)">supportsCryptoType(@com.google.android.exoplayer2.C.CryptoType int)</a></span> - Static method in class com.google.android.exoplayer2.ext.opus.<a href="com/google/android/exoplayer2/ext/opus/OpusLibrary.html" title="class in com.google.android.exoplayer2.ext.opus">OpusLibrary</a></dt>
<dd> <dd>
<div class="block">Returns whether the library supports the given <a href="com/google/android/exoplayer2/C.CryptoType.html" title="annotation in com.google.android.exoplayer2"><code>C.CryptoType</code></a>.</div> <div class="block">Returns whether the library supports the given <a href="com/google/android/exoplayer2/C.CryptoType.html" title="annotation in com.google.android.exoplayer2"><code>C.CryptoType</code></a>.</div>
@ -38439,7 +38518,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackGroup">trackGroup</a></span> - Variable in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackGroup">trackGroup</a></span> - Variable in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></dt>
<dd> <dd>
<div class="block">The <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> whose <a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackIndexes"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndexes</code></a> are forced to be selected.</div> <div class="block">The <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> whose <a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackIndices"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndices</code></a> are forced to be selected.</div>
</dd> </dd>
<dt><a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><span class="typeNameLink">TrackGroup</span></a> - Class in <a href="com/google/android/exoplayer2/source/package-summary.html">com.google.android.exoplayer2.source</a></dt> <dt><a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><span class="typeNameLink">TrackGroup</span></a> - Class in <a href="com/google/android/exoplayer2/source/package-summary.html">com.google.android.exoplayer2.source</a></dt>
<dd> <dd>
@ -38471,9 +38550,9 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
<div class="deprecationComment">Use <a href="com/google/android/exoplayer2/offline/StreamKey.html#streamIndex"><code>StreamKey.streamIndex</code></a>.</div> <div class="deprecationComment">Use <a href="com/google/android/exoplayer2/offline/StreamKey.html#streamIndex"><code>StreamKey.streamIndex</code></a>.</div>
</div> </div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackIndexes">trackIndexes</a></span> - Variable in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackIndices">trackIndices</a></span> - Variable in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></dt>
<dd> <dd>
<div class="block">The index of tracks in a <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> to be selected.</div> <div class="block">The indices of tracks in a <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a> to be selected.</div>
</dd> </dd>
<dt><a href="com/google/android/exoplayer2/ui/TrackNameProvider.html" title="interface in com.google.android.exoplayer2.ui"><span class="typeNameLink">TrackNameProvider</span></a> - Interface in <a href="com/google/android/exoplayer2/ui/package-summary.html">com.google.android.exoplayer2.ui</a></dt> <dt><a href="com/google/android/exoplayer2/ui/TrackNameProvider.html" title="interface in com.google.android.exoplayer2.ui"><span class="typeNameLink">TrackNameProvider</span></a> - Interface in <a href="com/google/android/exoplayer2/ui/package-summary.html">com.google.android.exoplayer2.ui</a></dt>
<dd> <dd>
@ -38551,7 +38630,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,java.util.List)">TrackSelectionOverride(TrackGroup, List&lt;Integer&gt;)</a></span> - Constructor for class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#%3Cinit%3E(com.google.android.exoplayer2.source.TrackGroup,java.util.List)">TrackSelectionOverride(TrackGroup, List&lt;Integer&gt;)</a></span> - Constructor for class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionOverrides.TrackSelectionOverride</a></dt>
<dd> <dd>
<div class="block">Constructs an instance to force <code>trackIndexes</code> in <code>trackGroup</code> to be selected.</div> <div class="block">Constructs an instance to force <code>trackIndices</code> in <code>trackGroup</code> to be selected.</div>
</dd> </dd>
<dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html#trackSelectionOverrides">trackSelectionOverrides</a></span> - Variable in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionParameters</a></dt> <dt><span class="memberNameLink"><a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html#trackSelectionOverrides">trackSelectionOverrides</a></span> - Variable in class com.google.android.exoplayer2.trackselection.<a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html" title="class in com.google.android.exoplayer2.trackselection">TrackSelectionParameters</a></dt>
<dd> <dd>
@ -38567,7 +38646,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
</dd> </dd>
<dt><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection"><span class="typeNameLink">TrackSelectionOverrides.TrackSelectionOverride</span></a> - Class in <a href="com/google/android/exoplayer2/trackselection/package-summary.html">com.google.android.exoplayer2.trackselection</a></dt> <dt><a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html" title="class in com.google.android.exoplayer2.trackselection"><span class="typeNameLink">TrackSelectionOverrides.TrackSelectionOverride</span></a> - Class in <a href="com/google/android/exoplayer2/trackselection/package-summary.html">com.google.android.exoplayer2.trackselection</a></dt>
<dd> <dd>
<div class="block">Forces the selection of <a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackIndexes"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndexes</code></a> for a <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div> <div class="block">Forces the selection of <a href="com/google/android/exoplayer2/trackselection/TrackSelectionOverrides.TrackSelectionOverride.html#trackIndices"><code>TrackSelectionOverrides.TrackSelectionOverride.trackIndices</code></a> for a <a href="com/google/android/exoplayer2/source/TrackGroup.html" title="class in com.google.android.exoplayer2.source"><code>TrackGroup</code></a>.</div>
</dd> </dd>
<dt><a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html" title="class in com.google.android.exoplayer2.trackselection"><span class="typeNameLink">TrackSelectionParameters</span></a> - Class in <a href="com/google/android/exoplayer2/trackselection/package-summary.html">com.google.android.exoplayer2.trackselection</a></dt> <dt><a href="com/google/android/exoplayer2/trackselection/TrackSelectionParameters.html" title="class in com.google.android.exoplayer2.trackselection"><span class="typeNameLink">TrackSelectionParameters</span></a> - Class in <a href="com/google/android/exoplayer2/trackselection/package-summary.html">com.google.android.exoplayer2.trackselection</a></dt>
<dd> <dd>

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
packageSearchIndex = [{"l":"All Packages","url":"allpackages-index.html"},{"l":"com.google.android.exoplayer2"},{"l":"com.google.android.exoplayer2.analytics"},{"l":"com.google.android.exoplayer2.audio"},{"l":"com.google.android.exoplayer2.database"},{"l":"com.google.android.exoplayer2.decoder"},{"l":"com.google.android.exoplayer2.drm"},{"l":"com.google.android.exoplayer2.ext.av1"},{"l":"com.google.android.exoplayer2.ext.cast"},{"l":"com.google.android.exoplayer2.ext.cronet"},{"l":"com.google.android.exoplayer2.ext.ffmpeg"},{"l":"com.google.android.exoplayer2.ext.flac"},{"l":"com.google.android.exoplayer2.ext.ima"},{"l":"com.google.android.exoplayer2.ext.leanback"},{"l":"com.google.android.exoplayer2.ext.media2"},{"l":"com.google.android.exoplayer2.ext.mediasession"},{"l":"com.google.android.exoplayer2.ext.okhttp"},{"l":"com.google.android.exoplayer2.ext.opus"},{"l":"com.google.android.exoplayer2.ext.rtmp"},{"l":"com.google.android.exoplayer2.ext.vp9"},{"l":"com.google.android.exoplayer2.ext.workmanager"},{"l":"com.google.android.exoplayer2.extractor"},{"l":"com.google.android.exoplayer2.extractor.amr"},{"l":"com.google.android.exoplayer2.extractor.flac"},{"l":"com.google.android.exoplayer2.extractor.flv"},{"l":"com.google.android.exoplayer2.extractor.jpeg"},{"l":"com.google.android.exoplayer2.extractor.mkv"},{"l":"com.google.android.exoplayer2.extractor.mp3"},{"l":"com.google.android.exoplayer2.extractor.mp4"},{"l":"com.google.android.exoplayer2.extractor.ogg"},{"l":"com.google.android.exoplayer2.extractor.rawcc"},{"l":"com.google.android.exoplayer2.extractor.ts"},{"l":"com.google.android.exoplayer2.extractor.wav"},{"l":"com.google.android.exoplayer2.mediacodec"},{"l":"com.google.android.exoplayer2.metadata"},{"l":"com.google.android.exoplayer2.metadata.dvbsi"},{"l":"com.google.android.exoplayer2.metadata.emsg"},{"l":"com.google.android.exoplayer2.metadata.flac"},{"l":"com.google.android.exoplayer2.metadata.icy"},{"l":"com.google.android.exoplayer2.metadata.id3"},{"l":"com.google.android.exoplayer2.metadata.mp4"},{"l":"com.google.android.exoplayer2.metadata.scte35"},{"l":"com.google.android.exoplayer2.offline"},{"l":"com.google.android.exoplayer2.robolectric"},{"l":"com.google.android.exoplayer2.scheduler"},{"l":"com.google.android.exoplayer2.source"},{"l":"com.google.android.exoplayer2.source.ads"},{"l":"com.google.android.exoplayer2.source.chunk"},{"l":"com.google.android.exoplayer2.source.dash"},{"l":"com.google.android.exoplayer2.source.dash.manifest"},{"l":"com.google.android.exoplayer2.source.dash.offline"},{"l":"com.google.android.exoplayer2.source.hls"},{"l":"com.google.android.exoplayer2.source.hls.offline"},{"l":"com.google.android.exoplayer2.source.hls.playlist"},{"l":"com.google.android.exoplayer2.source.mediaparser"},{"l":"com.google.android.exoplayer2.source.rtsp"},{"l":"com.google.android.exoplayer2.source.rtsp.reader"},{"l":"com.google.android.exoplayer2.source.smoothstreaming"},{"l":"com.google.android.exoplayer2.source.smoothstreaming.manifest"},{"l":"com.google.android.exoplayer2.source.smoothstreaming.offline"},{"l":"com.google.android.exoplayer2.testutil"},{"l":"com.google.android.exoplayer2.testutil.truth"},{"l":"com.google.android.exoplayer2.text"},{"l":"com.google.android.exoplayer2.text.cea"},{"l":"com.google.android.exoplayer2.text.dvb"},{"l":"com.google.android.exoplayer2.text.pgs"},{"l":"com.google.android.exoplayer2.text.span"},{"l":"com.google.android.exoplayer2.text.ssa"},{"l":"com.google.android.exoplayer2.text.subrip"},{"l":"com.google.android.exoplayer2.text.ttml"},{"l":"com.google.android.exoplayer2.text.tx3g"},{"l":"com.google.android.exoplayer2.text.webvtt"},{"l":"com.google.android.exoplayer2.trackselection"},{"l":"com.google.android.exoplayer2.transformer"},{"l":"com.google.android.exoplayer2.ui"},{"l":"com.google.android.exoplayer2.upstream"},{"l":"com.google.android.exoplayer2.upstream.cache"},{"l":"com.google.android.exoplayer2.upstream.crypto"},{"l":"com.google.android.exoplayer2.util"},{"l":"com.google.android.exoplayer2.video"},{"l":"com.google.android.exoplayer2.video.spherical"}] packageSearchIndex = [{"l":"All Packages","url":"allpackages-index.html"},{"l":"com.google.android.exoplayer2"},{"l":"com.google.android.exoplayer2.analytics"},{"l":"com.google.android.exoplayer2.audio"},{"l":"com.google.android.exoplayer2.database"},{"l":"com.google.android.exoplayer2.decoder"},{"l":"com.google.android.exoplayer2.drm"},{"l":"com.google.android.exoplayer2.ext.av1"},{"l":"com.google.android.exoplayer2.ext.cast"},{"l":"com.google.android.exoplayer2.ext.cronet"},{"l":"com.google.android.exoplayer2.ext.ffmpeg"},{"l":"com.google.android.exoplayer2.ext.flac"},{"l":"com.google.android.exoplayer2.ext.ima"},{"l":"com.google.android.exoplayer2.ext.leanback"},{"l":"com.google.android.exoplayer2.ext.media2"},{"l":"com.google.android.exoplayer2.ext.mediasession"},{"l":"com.google.android.exoplayer2.ext.okhttp"},{"l":"com.google.android.exoplayer2.ext.opus"},{"l":"com.google.android.exoplayer2.ext.rtmp"},{"l":"com.google.android.exoplayer2.ext.vp9"},{"l":"com.google.android.exoplayer2.ext.workmanager"},{"l":"com.google.android.exoplayer2.extractor"},{"l":"com.google.android.exoplayer2.extractor.amr"},{"l":"com.google.android.exoplayer2.extractor.flac"},{"l":"com.google.android.exoplayer2.extractor.flv"},{"l":"com.google.android.exoplayer2.extractor.jpeg"},{"l":"com.google.android.exoplayer2.extractor.mkv"},{"l":"com.google.android.exoplayer2.extractor.mp3"},{"l":"com.google.android.exoplayer2.extractor.mp4"},{"l":"com.google.android.exoplayer2.extractor.ogg"},{"l":"com.google.android.exoplayer2.extractor.rawcc"},{"l":"com.google.android.exoplayer2.extractor.ts"},{"l":"com.google.android.exoplayer2.extractor.wav"},{"l":"com.google.android.exoplayer2.mediacodec"},{"l":"com.google.android.exoplayer2.metadata"},{"l":"com.google.android.exoplayer2.metadata.dvbsi"},{"l":"com.google.android.exoplayer2.metadata.emsg"},{"l":"com.google.android.exoplayer2.metadata.flac"},{"l":"com.google.android.exoplayer2.metadata.icy"},{"l":"com.google.android.exoplayer2.metadata.id3"},{"l":"com.google.android.exoplayer2.metadata.mp4"},{"l":"com.google.android.exoplayer2.metadata.scte35"},{"l":"com.google.android.exoplayer2.offline"},{"l":"com.google.android.exoplayer2.robolectric"},{"l":"com.google.android.exoplayer2.scheduler"},{"l":"com.google.android.exoplayer2.source"},{"l":"com.google.android.exoplayer2.source.ads"},{"l":"com.google.android.exoplayer2.source.chunk"},{"l":"com.google.android.exoplayer2.source.dash"},{"l":"com.google.android.exoplayer2.source.dash.manifest"},{"l":"com.google.android.exoplayer2.source.dash.offline"},{"l":"com.google.android.exoplayer2.source.hls"},{"l":"com.google.android.exoplayer2.source.hls.offline"},{"l":"com.google.android.exoplayer2.source.hls.playlist"},{"l":"com.google.android.exoplayer2.source.mediaparser"},{"l":"com.google.android.exoplayer2.source.rtsp"},{"l":"com.google.android.exoplayer2.source.rtsp.reader"},{"l":"com.google.android.exoplayer2.source.smoothstreaming"},{"l":"com.google.android.exoplayer2.source.smoothstreaming.manifest"},{"l":"com.google.android.exoplayer2.source.smoothstreaming.offline"},{"l":"com.google.android.exoplayer2.testutil"},{"l":"com.google.android.exoplayer2.testutil.truth"},{"l":"com.google.android.exoplayer2.text"},{"l":"com.google.android.exoplayer2.text.cea"},{"l":"com.google.android.exoplayer2.text.dvb"},{"l":"com.google.android.exoplayer2.text.pgs"},{"l":"com.google.android.exoplayer2.text.span"},{"l":"com.google.android.exoplayer2.text.ssa"},{"l":"com.google.android.exoplayer2.text.subrip"},{"l":"com.google.android.exoplayer2.text.ttml"},{"l":"com.google.android.exoplayer2.text.tx3g"},{"l":"com.google.android.exoplayer2.text.webvtt"},{"l":"com.google.android.exoplayer2.trackselection"},{"l":"com.google.android.exoplayer2.transformer"},{"l":"com.google.android.exoplayer2.ui"},{"l":"com.google.android.exoplayer2.upstream"},{"l":"com.google.android.exoplayer2.upstream.cache"},{"l":"com.google.android.exoplayer2.upstream.crypto"},{"l":"com.google.android.exoplayer2.util"},{"l":"com.google.android.exoplayer2.video"},{"l":"com.google.android.exoplayer2.video.spherical"}]

File diff suppressed because one or more lines are too long

View file

@ -6,7 +6,6 @@ The [Transformer API][] can be used to convert media streams. It takes an input
media stream, applies changes to it as configured by the app, and produces the media stream, applies changes to it as configured by the app, and produces the
corresponding output file. The available transformations are: corresponding output file. The available transformations are:
* Transmuxing between container formats.
* Track removal. * Track removal.
* Flattening of slow motion videos or, in other words, their conversion into * Flattening of slow motion videos or, in other words, their conversion into
normal videos that retain the desired slow motion effects, but can be played normal videos that retain the desired slow motion effects, but can be played
@ -16,7 +15,7 @@ corresponding output file. The available transformations are:
## Starting a transformation ## ## Starting a transformation ##
To transform media, you need add the following dependency to your apps To transform media, you need to add the following dependency to your apps
`build.gradle` file: `build.gradle` file:
~~~ ~~~
@ -28,8 +27,7 @@ where `2.X.X` is your preferred ExoPlayer version.
You can then start a transformation by building a `Transformer` instance and You can then start a transformation by building a `Transformer` instance and
calling `startTransformation` on it. The code sample below starts a calling `startTransformation` on it. The code sample below starts a
transformation that removes the audio track from the input and sets the output transformation that removes the audio track from the input:
container format to WebM:
~~~ ~~~
// Configure and create a Transformer instance. // Configure and create a Transformer instance.
@ -37,7 +35,6 @@ Transformer transformer =
new Transformer.Builder() new Transformer.Builder()
.setContext(context) .setContext(context)
.setRemoveAudio(true) .setRemoveAudio(true)
.setOutputMimeType(MimeTypes.VIDEO_WEBM)
.setListener(transformerListener) .setListener(transformerListener)
.build(); .build();
// Start the transformation. // Start the transformation.
@ -52,7 +49,9 @@ builder.
a `ParcelFileDescriptor` indicating where the output should be written. The a `ParcelFileDescriptor` indicating where the output should be written. The
input can be a progressive or an adaptive stream, but the output is always a input can be a progressive or an adaptive stream, but the output is always a
progressive stream. For adaptive inputs, the highest resolution tracks are progressive stream. For adaptive inputs, the highest resolution tracks are
always selected for the transformation. always selected for the transformation. The input can be of any container format
supported by ExoPlayer (see the [Supported formats page][] for details), but the
output is always an MP4 file.
Multiple transformations can be executed sequentially with the same Multiple transformations can be executed sequentially with the same
`Transformer` instance, but concurrent transformations with the same instance `Transformer` instance, but concurrent transformations with the same instance
@ -137,4 +136,5 @@ flattened version of the video instead of the original one.
Currently, Samsung's slow motion format is the only one supported. Currently, Samsung's slow motion format is the only one supported.
[Transformer API]: {{ site.exo_sdk }}/transformer/Transformer.html [Transformer API]: {{ site.exo_sdk }}/transformer/Transformer.html
[Supported formats page]: {{ site.baseurl }}/supported-formats.html

View file

@ -75,6 +75,7 @@ public final class MediaMetadata implements Bundleable {
@Nullable private Integer totalDiscCount; @Nullable private Integer totalDiscCount;
@Nullable private CharSequence genre; @Nullable private CharSequence genre;
@Nullable private CharSequence compilation; @Nullable private CharSequence compilation;
@Nullable private CharSequence station;
@Nullable private Bundle extras; @Nullable private Bundle extras;
public Builder() {} public Builder() {}
@ -110,6 +111,7 @@ public final class MediaMetadata implements Bundleable {
this.totalDiscCount = mediaMetadata.totalDiscCount; this.totalDiscCount = mediaMetadata.totalDiscCount;
this.genre = mediaMetadata.genre; this.genre = mediaMetadata.genre;
this.compilation = mediaMetadata.compilation; this.compilation = mediaMetadata.compilation;
this.station = mediaMetadata.station;
this.extras = mediaMetadata.extras; this.extras = mediaMetadata.extras;
} }
@ -346,6 +348,12 @@ public final class MediaMetadata implements Bundleable {
return this; return this;
} }
/** Sets the name of the station streaming the media. */
public Builder setStation(@Nullable CharSequence station) {
this.station = station;
return this;
}
/** Sets the extras {@link Bundle}. */ /** Sets the extras {@link Bundle}. */
public Builder setExtras(@Nullable Bundle extras) { public Builder setExtras(@Nullable Bundle extras) {
this.extras = extras; this.extras = extras;
@ -485,6 +493,9 @@ public final class MediaMetadata implements Bundleable {
if (mediaMetadata.compilation != null) { if (mediaMetadata.compilation != null) {
setCompilation(mediaMetadata.compilation); setCompilation(mediaMetadata.compilation);
} }
if (mediaMetadata.station != null) {
setStation(mediaMetadata.station);
}
if (mediaMetadata.extras != null) { if (mediaMetadata.extras != null) {
setExtras(mediaMetadata.extras); setExtras(mediaMetadata.extras);
} }
@ -679,6 +690,8 @@ public final class MediaMetadata implements Bundleable {
@Nullable public final CharSequence genre; @Nullable public final CharSequence genre;
/** Optional compilation. */ /** Optional compilation. */
@Nullable public final CharSequence compilation; @Nullable public final CharSequence compilation;
/** Optional name of the station streaming the media. */
@Nullable public final CharSequence station;
/** /**
* Optional extras {@link Bundle}. * Optional extras {@link Bundle}.
@ -720,6 +733,7 @@ public final class MediaMetadata implements Bundleable {
this.totalDiscCount = builder.totalDiscCount; this.totalDiscCount = builder.totalDiscCount;
this.genre = builder.genre; this.genre = builder.genre;
this.compilation = builder.compilation; this.compilation = builder.compilation;
this.station = builder.station;
this.extras = builder.extras; this.extras = builder.extras;
} }
@ -766,7 +780,8 @@ public final class MediaMetadata implements Bundleable {
&& Util.areEqual(discNumber, that.discNumber) && Util.areEqual(discNumber, that.discNumber)
&& Util.areEqual(totalDiscCount, that.totalDiscCount) && Util.areEqual(totalDiscCount, that.totalDiscCount)
&& Util.areEqual(genre, that.genre) && Util.areEqual(genre, that.genre)
&& Util.areEqual(compilation, that.compilation); && Util.areEqual(compilation, that.compilation)
&& Util.areEqual(station, that.station);
} }
@Override @Override
@ -801,7 +816,8 @@ public final class MediaMetadata implements Bundleable {
discNumber, discNumber,
totalDiscCount, totalDiscCount,
genre, genre,
compilation); compilation,
station);
} }
// Bundleable implementation. // Bundleable implementation.
@ -839,6 +855,7 @@ public final class MediaMetadata implements Bundleable {
FIELD_TOTAL_DISC_COUNT, FIELD_TOTAL_DISC_COUNT,
FIELD_GENRE, FIELD_GENRE,
FIELD_COMPILATION, FIELD_COMPILATION,
FIELD_STATION,
FIELD_EXTRAS FIELD_EXTRAS
}) })
private @interface FieldNumber {} private @interface FieldNumber {}
@ -873,6 +890,7 @@ public final class MediaMetadata implements Bundleable {
private static final int FIELD_GENRE = 27; private static final int FIELD_GENRE = 27;
private static final int FIELD_COMPILATION = 28; private static final int FIELD_COMPILATION = 28;
private static final int FIELD_ARTWORK_DATA_TYPE = 29; private static final int FIELD_ARTWORK_DATA_TYPE = 29;
private static final int FIELD_STATION = 30;
private static final int FIELD_EXTRAS = 1000; private static final int FIELD_EXTRAS = 1000;
@Override @Override
@ -893,6 +911,7 @@ public final class MediaMetadata implements Bundleable {
bundle.putCharSequence(keyForField(FIELD_CONDUCTOR), conductor); bundle.putCharSequence(keyForField(FIELD_CONDUCTOR), conductor);
bundle.putCharSequence(keyForField(FIELD_GENRE), genre); bundle.putCharSequence(keyForField(FIELD_GENRE), genre);
bundle.putCharSequence(keyForField(FIELD_COMPILATION), compilation); bundle.putCharSequence(keyForField(FIELD_COMPILATION), compilation);
bundle.putCharSequence(keyForField(FIELD_STATION), station);
if (userRating != null) { if (userRating != null) {
bundle.putBundle(keyForField(FIELD_USER_RATING), userRating.toBundle()); bundle.putBundle(keyForField(FIELD_USER_RATING), userRating.toBundle());
@ -970,6 +989,7 @@ public final class MediaMetadata implements Bundleable {
.setConductor(bundle.getCharSequence(keyForField(FIELD_CONDUCTOR))) .setConductor(bundle.getCharSequence(keyForField(FIELD_CONDUCTOR)))
.setGenre(bundle.getCharSequence(keyForField(FIELD_GENRE))) .setGenre(bundle.getCharSequence(keyForField(FIELD_GENRE)))
.setCompilation(bundle.getCharSequence(keyForField(FIELD_COMPILATION))) .setCompilation(bundle.getCharSequence(keyForField(FIELD_COMPILATION)))
.setStation(bundle.getCharSequence(keyForField(FIELD_STATION)))
.setExtras(bundle.getBundle(keyForField(FIELD_EXTRAS))); .setExtras(bundle.getBundle(keyForField(FIELD_EXTRAS)));
if (bundle.containsKey(keyForField(FIELD_USER_RATING))) { if (bundle.containsKey(keyForField(FIELD_USER_RATING))) {

View file

@ -300,6 +300,28 @@ public final class AdPlaybackState implements Bundleable {
timeUs, count, states, uris, durationsUs, contentResumeOffsetUs, isServerSideInserted); timeUs, count, states, uris, durationsUs, contentResumeOffsetUs, isServerSideInserted);
} }
/**
* Returns an instance with all ads in final states (played, skipped, error) reset to either
* available or unavailable, which allows to play them again.
*/
@CheckResult
public AdGroup withAllAdsReset() {
if (count == C.LENGTH_UNSET) {
return this;
}
int count = this.states.length;
@AdState int[] states = Arrays.copyOf(this.states, count);
for (int i = 0; i < count; i++) {
if (states[i] == AD_STATE_PLAYED
|| states[i] == AD_STATE_SKIPPED
|| states[i] == AD_STATE_ERROR) {
states[i] = uris[i] == null ? AD_STATE_UNAVAILABLE : AD_STATE_AVAILABLE;
}
}
return new AdGroup(
timeUs, count, states, uris, durationsUs, contentResumeOffsetUs, isServerSideInserted);
}
@CheckResult @CheckResult
private static @AdState int[] copyStatesWithSpaceForAdCount(@AdState int[] states, int count) { private static @AdState int[] copyStatesWithSpaceForAdCount(@AdState int[] states, int count) {
int oldStateCount = states.length; int oldStateCount = states.length;
@ -783,6 +805,19 @@ public final class AdPlaybackState implements Bundleable {
adsId, adGroups, adResumePositionUs, contentDurationUs, removedAdGroupCount); adsId, adGroups, adResumePositionUs, contentDurationUs, removedAdGroupCount);
} }
/**
* Returns an instance with all ads in the specified ad group reset from final states (played,
* skipped, error) to either available or unavailable, which allows to play them again.
*/
@CheckResult
public AdPlaybackState withResetAdGroup(@IntRange(from = 0) int adGroupIndex) {
int adjustedIndex = adGroupIndex - removedAdGroupCount;
AdGroup[] adGroups = Util.nullSafeArrayCopy(this.adGroups, this.adGroups.length);
adGroups[adjustedIndex] = adGroups[adjustedIndex].withAllAdsReset();
return new AdPlaybackState(
adsId, adGroups, adResumePositionUs, contentDurationUs, removedAdGroupCount);
}
@Override @Override
public boolean equals(@Nullable Object o) { public boolean equals(@Nullable Object o) {
if (this == o) { if (this == o) {

View file

@ -64,6 +64,7 @@ public class MediaMetadataTest {
assertThat(mediaMetadata.totalDiscCount).isNull(); assertThat(mediaMetadata.totalDiscCount).isNull();
assertThat(mediaMetadata.genre).isNull(); assertThat(mediaMetadata.genre).isNull();
assertThat(mediaMetadata.compilation).isNull(); assertThat(mediaMetadata.compilation).isNull();
assertThat(mediaMetadata.station).isNull();
assertThat(mediaMetadata.extras).isNull(); assertThat(mediaMetadata.extras).isNull();
} }
@ -149,6 +150,7 @@ public class MediaMetadataTest {
.setTotalDiscCount(3) .setTotalDiscCount(3)
.setGenre("Pop") .setGenre("Pop")
.setCompilation("Amazing songs.") .setCompilation("Amazing songs.")
.setStation("radio station")
.setExtras(extras) .setExtras(extras)
.build(); .build();
} }

View file

@ -16,7 +16,10 @@
package com.google.android.exoplayer2.source.ads; package com.google.android.exoplayer2.source.ads;
import static com.google.android.exoplayer2.source.ads.AdPlaybackState.AD_STATE_AVAILABLE; import static com.google.android.exoplayer2.source.ads.AdPlaybackState.AD_STATE_AVAILABLE;
import static com.google.android.exoplayer2.source.ads.AdPlaybackState.AD_STATE_ERROR;
import static com.google.android.exoplayer2.source.ads.AdPlaybackState.AD_STATE_PLAYED; import static com.google.android.exoplayer2.source.ads.AdPlaybackState.AD_STATE_PLAYED;
import static com.google.android.exoplayer2.source.ads.AdPlaybackState.AD_STATE_SKIPPED;
import static com.google.android.exoplayer2.source.ads.AdPlaybackState.AD_STATE_UNAVAILABLE;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
@ -254,6 +257,60 @@ public class AdPlaybackStateTest {
assertThat(state.getAdGroup(1).count).isEqualTo(0); assertThat(state.getAdGroup(1).count).isEqualTo(0);
} }
@Test
public void withResetAdGroup_beforeSetAdCount_doesNothing() {
AdPlaybackState state = new AdPlaybackState(TEST_ADS_ID, TEST_AD_GROUP_TIMES_US);
state = state.withResetAdGroup(/* adGroupIndex= */ 1);
assertThat(state.getAdGroup(1).count).isEqualTo(C.LENGTH_UNSET);
}
@Test
public void withResetAdGroup_resetsAdsInFinalStates() {
AdPlaybackState state = new AdPlaybackState(TEST_ADS_ID, TEST_AD_GROUP_TIMES_US);
state = state.withAdCount(/* adGroupIndex= */ 1, /* adCount= */ 5);
state =
state.withAdDurationsUs(
/* adGroupIndex= */ 1, /* adDurationsUs...= */ 1_000L, 2_000L, 3_000L, 4_000L, 5_000L);
state = state.withAdUri(/* adGroupIndex= */ 1, /* adIndexInAdGroup= */ 1, Uri.EMPTY);
state = state.withAdUri(/* adGroupIndex= */ 1, /* adIndexInAdGroup= */ 2, Uri.EMPTY);
state = state.withAdUri(/* adGroupIndex= */ 1, /* adIndexInAdGroup= */ 3, Uri.EMPTY);
state = state.withAdUri(/* adGroupIndex= */ 1, /* adIndexInAdGroup= */ 4, Uri.EMPTY);
state = state.withPlayedAd(/* adGroupIndex= */ 1, /* adIndexInAdGroup= */ 2);
state = state.withSkippedAd(/* adGroupIndex= */ 1, /* adIndexInAdGroup= */ 3);
state = state.withAdLoadError(/* adGroupIndex= */ 1, /* adIndexInAdGroup= */ 4);
// Verify setup.
assertThat(state.getAdGroup(/* adGroupIndex= */ 1).states)
.asList()
.containsExactly(
AD_STATE_UNAVAILABLE,
AD_STATE_AVAILABLE,
AD_STATE_PLAYED,
AD_STATE_SKIPPED,
AD_STATE_ERROR)
.inOrder();
state = state.withResetAdGroup(/* adGroupIndex= */ 1);
assertThat(state.getAdGroup(/* adGroupIndex= */ 1).states)
.asList()
.containsExactly(
AD_STATE_UNAVAILABLE,
AD_STATE_AVAILABLE,
AD_STATE_AVAILABLE,
AD_STATE_AVAILABLE,
AD_STATE_AVAILABLE)
.inOrder();
assertThat(state.getAdGroup(/* adGroupIndex= */ 1).uris)
.asList()
.containsExactly(null, Uri.EMPTY, Uri.EMPTY, Uri.EMPTY, Uri.EMPTY)
.inOrder();
assertThat(state.getAdGroup(/* adGroupIndex= */ 1).durationsUs)
.asList()
.containsExactly(1_000L, 2_000L, 3_000L, 4_000L, 5_000L);
}
@Test @Test
public void roundTripViaBundle_yieldsEqualFieldsExceptAdsId() { public void roundTripViaBundle_yieldsEqualFieldsExceptAdsId() {
AdPlaybackState originalState = AdPlaybackState originalState =

View file

@ -30,6 +30,7 @@ import android.view.Surface;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.SurfaceView; import android.view.SurfaceView;
import android.view.TextureView; import android.view.TextureView;
import androidx.annotation.DoNotInline;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener; import com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener;
@ -1866,6 +1867,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
private static final class Api31 { private static final class Api31 {
private Api31() {} private Api31() {}
@DoNotInline
public static PlayerId createPlayerId() { public static PlayerId createPlayerId() {
// TODO: Create a MediaMetricsListener and obtain LogSessionId from it. // TODO: Create a MediaMetricsListener and obtain LogSessionId from it.
return new PlayerId(LogSessionId.LOG_SESSION_ID_NONE); return new PlayerId(LogSessionId.LOG_SESSION_ID_NONE);

View file

@ -24,6 +24,7 @@ import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.analytics.PlayerId;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@ -281,6 +282,13 @@ public interface AudioSink {
*/ */
void setListener(Listener listener); void setListener(Listener listener);
/**
* Sets the {@link PlayerId} of the player using this audio sink.
*
* @param playerId The {@link PlayerId}, or null to clear a previously set id.
*/
default void setPlayerId(@Nullable PlayerId playerId) {}
/** /**
* Returns whether the sink supports a given {@link Format}. * Returns whether the sink supports a given {@link Format}.
* *

View file

@ -530,6 +530,7 @@ public abstract class DecoderAudioRenderer<
} else { } else {
audioSink.disableTunneling(); audioSink.disableTunneling();
} }
audioSink.setPlayerId(getPlayerId());
} }
@Override @Override

View file

@ -23,16 +23,19 @@ import android.media.AudioFormat;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.AudioTrack; import android.media.AudioTrack;
import android.media.PlaybackParams; import android.media.PlaybackParams;
import android.media.metrics.LogSessionId;
import android.os.ConditionVariable; import android.os.ConditionVariable;
import android.os.Handler; import android.os.Handler;
import android.os.SystemClock; import android.os.SystemClock;
import android.util.Pair; import android.util.Pair;
import androidx.annotation.DoNotInline;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
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.PlaybackParameters; import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.audio.AudioProcessor.UnhandledAudioFormatException; import com.google.android.exoplayer2.audio.AudioProcessor.UnhandledAudioFormatException;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Log;
@ -323,6 +326,7 @@ public final class DefaultAudioSink implements AudioSink {
initializationExceptionPendingExceptionHolder; initializationExceptionPendingExceptionHolder;
private final PendingExceptionHolder<WriteException> writeExceptionPendingExceptionHolder; private final PendingExceptionHolder<WriteException> writeExceptionPendingExceptionHolder;
@Nullable private PlayerId playerId;
@Nullable private Listener listener; @Nullable private Listener listener;
@Nullable private Configuration pendingConfiguration; @Nullable private Configuration pendingConfiguration;
@MonotonicNonNull private Configuration configuration; @MonotonicNonNull private Configuration configuration;
@ -477,6 +481,11 @@ public final class DefaultAudioSink implements AudioSink {
this.listener = listener; this.listener = listener;
} }
@Override
public void setPlayerId(@Nullable PlayerId playerId) {
this.playerId = playerId;
}
@Override @Override
public boolean supportsFormat(Format format) { public boolean supportsFormat(Format format) {
return getFormatSupport(format) != SINK_FORMAT_UNSUPPORTED; return getFormatSupport(format) != SINK_FORMAT_UNSUPPORTED;
@ -665,6 +674,9 @@ public final class DefaultAudioSink implements AudioSink {
configuration.inputFormat.encoderDelay, configuration.inputFormat.encoderPadding); configuration.inputFormat.encoderDelay, configuration.inputFormat.encoderPadding);
} }
} }
if (Util.SDK_INT >= 31 && playerId != null) {
Api31.setLogSessionIdOnAudioTrack(audioTrack, playerId);
}
audioSessionId = audioTrack.getAudioSessionId(); audioSessionId = audioTrack.getAudioSessionId();
audioTrackPositionTracker.setAudioTrack( audioTrackPositionTracker.setAudioTrack(
audioTrack, audioTrack,
@ -2094,6 +2106,7 @@ public final class DefaultAudioSink implements AudioSink {
audioSessionId); audioSessionId);
} }
@SuppressWarnings("deprecation") // Using deprecated AudioTrack constructor.
private AudioTrack createAudioTrackV9(AudioAttributes audioAttributes, int audioSessionId) { private AudioTrack createAudioTrackV9(AudioAttributes audioAttributes, int audioSessionId) {
int streamType = Util.getStreamTypeForAudioUsage(audioAttributes.usage); int streamType = Util.getStreamTypeForAudioUsage(audioAttributes.usage);
if (audioSessionId == C.AUDIO_SESSION_ID_UNSET) { if (audioSessionId == C.AUDIO_SESSION_ID_UNSET) {
@ -2216,4 +2229,17 @@ public final class DefaultAudioSink implements AudioSink {
pendingException = null; pendingException = null;
} }
} }
@RequiresApi(31)
private static final class Api31 {
private Api31() {}
@DoNotInline
public static void setLogSessionIdOnAudioTrack(AudioTrack audioTrack, PlayerId playerId) {
LogSessionId logSessionId = playerId.getLogSessionId();
if (!logSessionId.equals(LogSessionId.LOG_SESSION_ID_NONE)) {
audioTrack.setLogSessionId(logSessionId);
}
}
}
} }

View file

@ -18,6 +18,7 @@ package com.google.android.exoplayer2.audio;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.analytics.PlayerId;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
/** An overridable {@link AudioSink} implementation forwarding all methods to another sink. */ /** An overridable {@link AudioSink} implementation forwarding all methods to another sink. */
@ -34,6 +35,11 @@ public class ForwardingAudioSink implements AudioSink {
sink.setListener(listener); sink.setListener(listener);
} }
@Override
public void setPlayerId(@Nullable PlayerId playerId) {
sink.setPlayerId(playerId);
}
@Override @Override
public boolean supportsFormat(Format format) { public boolean supportsFormat(Format format) {
return sink.supportsFormat(format); return sink.supportsFormat(format);

View file

@ -500,6 +500,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
} else { } else {
audioSink.disableTunneling(); audioSink.disableTunneling();
} }
audioSink.setPlayerId(getPlayerId());
} }
@Override @Override

View file

@ -18,6 +18,7 @@ package com.google.android.exoplayer2.drm;
import static com.google.android.exoplayer2.util.Assertions.checkArgument; import static com.google.android.exoplayer2.util.Assertions.checkArgument;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import static com.google.android.exoplayer2.util.Assertions.checkState; import static com.google.android.exoplayer2.util.Assertions.checkState;
import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.media.ResourceBusyException; import android.media.ResourceBusyException;
@ -31,6 +32,7 @@ import androidx.annotation.RequiresApi;
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.PlaybackException; import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
import com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener; import com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener;
@ -59,7 +61,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
* A {@link DrmSessionManager} that supports playbacks using {@link ExoMediaDrm}. * A {@link DrmSessionManager} that supports playbacks using {@link ExoMediaDrm}.
* *
* <p>This implementation supports pre-acquisition of sessions using {@link * <p>This implementation supports pre-acquisition of sessions using {@link
* #preacquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)}. * #preacquireSession(DrmSessionEventListener.EventDispatcher, Format)}.
*/ */
@RequiresApi(18) @RequiresApi(18)
public class DefaultDrmSessionManager implements DrmSessionManager { public class DefaultDrmSessionManager implements DrmSessionManager {
@ -419,8 +421,8 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
/** /**
* Sets the mode, which determines the role of sessions acquired from the instance. This must be * Sets the mode, which determines the role of sessions acquired from the instance. This must be
* called before {@link #acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)} * called before {@link #acquireSession(DrmSessionEventListener.EventDispatcher, Format)} is
* is called. * called.
* *
* <p>By default, the mode is {@link #MODE_PLAYBACK} and a streaming license is requested when * <p>By default, the mode is {@link #MODE_PLAYBACK} and a streaming license is requested when
* required. * required.
@ -488,12 +490,15 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
} }
@Override @Override
public DrmSessionReference preacquireSession( public void setPlayer(Looper playbackLooper, PlayerId playerId) {
Looper playbackLooper,
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher,
Format format) {
checkState(prepareCallsCount > 0);
initPlaybackLooper(playbackLooper); initPlaybackLooper(playbackLooper);
}
@Override
public DrmSessionReference preacquireSession(
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) {
checkState(prepareCallsCount > 0);
checkStateNotNull(playbackLooper);
PreacquiredSessionReference preacquiredSessionReference = PreacquiredSessionReference preacquiredSessionReference =
new PreacquiredSessionReference(eventDispatcher); new PreacquiredSessionReference(eventDispatcher);
preacquiredSessionReference.acquire(format); preacquiredSessionReference.acquire(format);
@ -503,11 +508,9 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
@Override @Override
@Nullable @Nullable
public DrmSession acquireSession( public DrmSession acquireSession(
Looper playbackLooper, @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) {
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher,
Format format) {
checkState(prepareCallsCount > 0); checkState(prepareCallsCount > 0);
initPlaybackLooper(playbackLooper); checkStateNotNull(playbackLooper);
return acquireSession( return acquireSession(
playbackLooper, playbackLooper,
eventDispatcher, eventDispatcher,
@ -977,7 +980,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager {
* Constructs an instance. * Constructs an instance.
* *
* @param eventDispatcher The {@link DrmSessionEventListener.EventDispatcher} passed to {@link * @param eventDispatcher The {@link DrmSessionEventListener.EventDispatcher} passed to {@link
* #acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)}. * #acquireSession(DrmSessionEventListener.EventDispatcher, Format)}.
*/ */
public PreacquiredSessionReference( public PreacquiredSessionReference(
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) { @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) {

View file

@ -20,6 +20,7 @@ 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.PlaybackException; import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.analytics.PlayerId;
/** Manages a DRM session. */ /** Manages a DRM session. */
public interface DrmSessionManager { public interface DrmSessionManager {
@ -45,12 +46,13 @@ public interface DrmSessionManager {
DrmSessionManager DRM_UNSUPPORTED = DrmSessionManager DRM_UNSUPPORTED =
new DrmSessionManager() { new DrmSessionManager() {
@Override
public void setPlayer(Looper playbackLooper, PlayerId playerId) {}
@Override @Override
@Nullable @Nullable
public DrmSession acquireSession( public DrmSession acquireSession(
Looper playbackLooper, @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) {
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher,
Format format) {
if (format.drmInitData == null) { if (format.drmInitData == null) {
return null; return null;
} else { } else {
@ -100,25 +102,33 @@ public interface DrmSessionManager {
// Do nothing. // Do nothing.
} }
/**
* Sets information about the player using this DRM session manager.
*
* @param playbackLooper The {@link Looper} associated with the player's playback thread.
* @param playerId The {@link PlayerId} of the player.
*/
void setPlayer(Looper playbackLooper, PlayerId playerId);
/** /**
* Pre-acquires a DRM session for the specified {@link Format}. * Pre-acquires a DRM session for the specified {@link Format}.
* *
* <p>This notifies the manager that a subsequent call to {@link #acquireSession(Looper, * <p>This notifies the manager that a subsequent call to {@link #acquireSession(
* DrmSessionEventListener.EventDispatcher, Format)} with the same {@link Format} is likely, * DrmSessionEventListener.EventDispatcher, Format)} with the same {@link Format} is likely,
* allowing a manager that supports pre-acquisition to get the required {@link DrmSession} ready * allowing a manager that supports pre-acquisition to get the required {@link DrmSession} ready
* in the background. * in the background.
* *
* <p>The caller must call {@link DrmSessionReference#release()} on the returned instance when * <p>The caller must call {@link DrmSessionReference#release()} on the returned instance when
* they no longer require the pre-acquisition (i.e. they know they won't be making a matching call * they no longer require the pre-acquisition (i.e. they know they won't be making a matching call
* to {@link #acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)} in the near * to {@link #acquireSession(DrmSessionEventListener.EventDispatcher, Format)} in the near
* future). * future).
* *
* <p>This manager may silently release the underlying session in order to allow another operation * <p>This manager may silently release the underlying session in order to allow another operation
* to complete. This will result in a subsequent call to {@link #acquireSession(Looper, * to complete. This will result in a subsequent call to {@link #acquireSession(
* DrmSessionEventListener.EventDispatcher, Format)} re-initializing a new session, including * DrmSessionEventListener.EventDispatcher, Format)} re-initializing a new session, including
* repeating key loads and other async initialization steps. * repeating key loads and other async initialization steps.
* *
* <p>The caller must separately call {@link #acquireSession(Looper, * <p>The caller must separately call {@link #acquireSession(
* DrmSessionEventListener.EventDispatcher, Format)} in order to obtain a session suitable for * DrmSessionEventListener.EventDispatcher, Format)} in order to obtain a session suitable for
* playback. The pre-acquired {@link DrmSessionReference} and full {@link DrmSession} instances * playback. The pre-acquired {@link DrmSessionReference} and full {@link DrmSession} instances
* are distinct. The caller must release both, and can release the {@link DrmSessionReference} * are distinct. The caller must release both, and can release the {@link DrmSessionReference}
@ -129,19 +139,15 @@ public interface DrmSessionManager {
* <p>Implementations that do not support pre-acquisition always return an empty {@link * <p>Implementations that do not support pre-acquisition always return an empty {@link
* DrmSessionReference} instance. * DrmSessionReference} instance.
* *
* @param playbackLooper The looper associated with the media playback thread.
* @param eventDispatcher The {@link DrmSessionEventListener.EventDispatcher} used to distribute * @param eventDispatcher The {@link DrmSessionEventListener.EventDispatcher} used to distribute
* events, and passed on to {@link * events, and passed on to {@link
* DrmSession#acquire(DrmSessionEventListener.EventDispatcher)}. * DrmSession#acquire(DrmSessionEventListener.EventDispatcher)}.
* @param format The {@link Format} for which to pre-acquire a {@link DrmSession}. * @param format The {@link Format} for which to pre-acquire a {@link DrmSession}.
* @return A releaser for the pre-acquired session. Guaranteed to be non-null even if the matching * @return A releaser for the pre-acquired session. Guaranteed to be non-null even if the matching
* {@link #acquireSession(Looper, DrmSessionEventListener.EventDispatcher, Format)} would * {@link #acquireSession(DrmSessionEventListener.EventDispatcher, Format)} would return null.
* return null.
*/ */
default DrmSessionReference preacquireSession( default DrmSessionReference preacquireSession(
Looper playbackLooper, @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) {
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher,
Format format) {
return DrmSessionReference.EMPTY; return DrmSessionReference.EMPTY;
} }
@ -158,7 +164,6 @@ public interface DrmSessionManager {
* used to configure secure decoders for playback of clear content periods, which can reduce the * used to configure secure decoders for playback of clear content periods, which can reduce the
* cost of transitioning between clear and encrypted content. * cost of transitioning between clear and encrypted content.
* *
* @param playbackLooper The looper associated with the media playback thread.
* @param eventDispatcher The {@link DrmSessionEventListener.EventDispatcher} used to distribute * @param eventDispatcher The {@link DrmSessionEventListener.EventDispatcher} used to distribute
* events, and passed on to {@link * events, and passed on to {@link
* DrmSession#acquire(DrmSessionEventListener.EventDispatcher)}. * DrmSession#acquire(DrmSessionEventListener.EventDispatcher)}.
@ -167,9 +172,7 @@ public interface DrmSessionManager {
*/ */
@Nullable @Nullable
DrmSession acquireSession( DrmSession acquireSession(
Looper playbackLooper, @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format);
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher,
Format format);
/** /**
* Returns the {@link C.CryptoType} that the DRM session manager will use for a given {@link * Returns the {@link C.CryptoType} that the DRM session manager will use for a given {@link

View file

@ -23,6 +23,7 @@ import android.util.Pair;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DefaultDrmSessionManager.Mode; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager.Mode;
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
@ -235,6 +236,7 @@ public final class OfflineLicenseHelper {
public synchronized Pair<Long, Long> getLicenseDurationRemainingSec(byte[] offlineLicenseKeySetId) public synchronized Pair<Long, Long> getLicenseDurationRemainingSec(byte[] offlineLicenseKeySetId)
throws DrmSessionException { throws DrmSessionException {
Assertions.checkNotNull(offlineLicenseKeySetId); Assertions.checkNotNull(offlineLicenseKeySetId);
drmSessionManager.setPlayer(handlerThread.getLooper(), PlayerId.UNSET);
drmSessionManager.prepare(); drmSessionManager.prepare();
DrmSession drmSession = DrmSession drmSession =
openBlockingKeyRequest( openBlockingKeyRequest(
@ -263,6 +265,7 @@ public final class OfflineLicenseHelper {
private byte[] blockingKeyRequest( private byte[] blockingKeyRequest(
@Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, Format format) @Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, Format format)
throws DrmSessionException { throws DrmSessionException {
drmSessionManager.setPlayer(handlerThread.getLooper(), PlayerId.UNSET);
drmSessionManager.prepare(); drmSessionManager.prepare();
DrmSession drmSession = openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId, format); DrmSession drmSession = openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId, format);
DrmSessionException error = drmSession.getError(); DrmSessionException error = drmSession.getError();
@ -280,8 +283,7 @@ public final class OfflineLicenseHelper {
Assertions.checkNotNull(format.drmInitData); Assertions.checkNotNull(format.drmInitData);
drmSessionManager.setMode(licenseMode, offlineLicenseKeySetId); drmSessionManager.setMode(licenseMode, offlineLicenseKeySetId);
conditionVariable.close(); conditionVariable.close();
DrmSession drmSession = DrmSession drmSession = drmSessionManager.acquireSession(eventDispatcher, format);
drmSessionManager.acquireSession(handlerThread.getLooper(), eventDispatcher, format);
// Block current thread until key loading is finished // Block current thread until key loading is finished
conditionVariable.block(); conditionVariable.block();
return Assertions.checkNotNull(drmSession); return Assertions.checkNotNull(drmSession);

View file

@ -51,6 +51,7 @@ public final class DefaultMediaCodecAdapterFactory implements MediaCodecAdapter.
public DefaultMediaCodecAdapterFactory() { public DefaultMediaCodecAdapterFactory() {
asynchronousMode = MODE_DEFAULT; asynchronousMode = MODE_DEFAULT;
enableImmediateCodecStartAfterFlush = true;
} }
/** /**
@ -92,7 +93,7 @@ public final class DefaultMediaCodecAdapterFactory implements MediaCodecAdapter.
* playback thread, when operating the codec in asynchronous mode. If disabled, {@link * playback thread, when operating the codec in asynchronous mode. If disabled, {@link
* MediaCodec#start} will be called by the callback thread after pending callbacks are handled. * MediaCodec#start} will be called by the callback thread after pending callbacks are handled.
* *
* <p>By default, this feature is disabled. * <p>By default, this feature is enabled.
* *
* <p>This method is experimental, and will be renamed or removed in a future release. * <p>This method is experimental, and will be renamed or removed in a future release.
* *

View file

@ -37,10 +37,12 @@ import android.media.MediaCodec.CryptoException;
import android.media.MediaCrypto; import android.media.MediaCrypto;
import android.media.MediaCryptoException; import android.media.MediaCryptoException;
import android.media.MediaFormat; import android.media.MediaFormat;
import android.media.metrics.LogSessionId;
import android.os.Bundle; import android.os.Bundle;
import android.os.SystemClock; import android.os.SystemClock;
import androidx.annotation.CallSuper; import androidx.annotation.CallSuper;
import androidx.annotation.CheckResult; import androidx.annotation.CheckResult;
import androidx.annotation.DoNotInline;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
@ -50,6 +52,7 @@ import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.CryptoConfig;
import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
@ -1060,6 +1063,9 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
TraceUtil.beginSection("createCodec:" + codecName); TraceUtil.beginSection("createCodec:" + codecName);
MediaCodecAdapter.Configuration configuration = MediaCodecAdapter.Configuration configuration =
getMediaCodecConfiguration(codecInfo, inputFormat, crypto, codecOperatingRate); getMediaCodecConfiguration(codecInfo, inputFormat, crypto, codecOperatingRate);
if (Util.SDK_INT >= 31) {
Api31.setLogSessionIdToMediaCodecFormat(configuration, getPlayerId());
}
codec = codecAdapterFactory.createAdapter(configuration); codec = codecAdapterFactory.createAdapter(configuration);
codecInitializedTimestamp = SystemClock.elapsedRealtime(); codecInitializedTimestamp = SystemClock.elapsedRealtime();
@ -2421,4 +2427,18 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
&& format.channelCount == 1 && format.channelCount == 1
&& "OMX.MTK.AUDIO.DECODER.MP3".equals(name); && "OMX.MTK.AUDIO.DECODER.MP3".equals(name);
} }
@RequiresApi(31)
private static final class Api31 {
private Api31() {}
@DoNotInline
public static void setLogSessionIdToMediaCodecFormat(
MediaCodecAdapter.Configuration codecConfiguration, PlayerId playerId) {
LogSessionId logSessionId = playerId.getLogSessionId();
if (!logSessionId.equals(LogSessionId.LOG_SESSION_ID_NONE)) {
codecConfiguration.mediaFormat.setString("log-session-id", logSessionId.getStringId());
}
}
}
} }

View file

@ -26,12 +26,15 @@ import android.net.Uri;
import android.util.Pair; import android.util.Pair;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.Extractor;
import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.ExtractorOutput;
import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.PositionHolder;
import com.google.android.exoplayer2.source.mediaparser.InputReaderAdapterV30; import com.google.android.exoplayer2.source.mediaparser.InputReaderAdapterV30;
import com.google.android.exoplayer2.source.mediaparser.MediaParserUtil;
import com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30; import com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30;
import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.upstream.DataReader;
import com.google.android.exoplayer2.util.Util;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -52,7 +55,7 @@ public final class MediaParserExtractorAdapter implements ProgressiveMediaExtrac
private String parserName; private String parserName;
@SuppressLint("WrongConstant") @SuppressLint("WrongConstant")
public MediaParserExtractorAdapter() { public MediaParserExtractorAdapter(PlayerId playerId) {
// TODO: Add support for injecting the desired extractor list. // TODO: Add support for injecting the desired extractor list.
outputConsumerAdapter = new OutputConsumerAdapterV30(); outputConsumerAdapter = new OutputConsumerAdapterV30();
inputReaderAdapter = new InputReaderAdapterV30(); inputReaderAdapter = new InputReaderAdapterV30();
@ -61,6 +64,9 @@ public final class MediaParserExtractorAdapter implements ProgressiveMediaExtrac
mediaParser.setParameter(PARAMETER_IN_BAND_CRYPTO_INFO, true); mediaParser.setParameter(PARAMETER_IN_BAND_CRYPTO_INFO, true);
mediaParser.setParameter(PARAMETER_INCLUDE_SUPPLEMENTAL_DATA, true); mediaParser.setParameter(PARAMETER_INCLUDE_SUPPLEMENTAL_DATA, true);
parserName = MediaParser.PARSER_NAME_UNKNOWN; parserName = MediaParser.PARSER_NAME_UNKNOWN;
if (Util.SDK_INT >= 31) {
MediaParserUtil.setLogSessionIdOnMediaParser(mediaParser, playerId);
}
} }
@Override @Override

View file

@ -17,6 +17,7 @@ package com.google.android.exoplayer2.source;
import android.net.Uri; import android.net.Uri;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.Extractor;
import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.ExtractorOutput;
import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.PositionHolder;
@ -31,8 +32,12 @@ public interface ProgressiveMediaExtractor {
/** Creates {@link ProgressiveMediaExtractor} instances. */ /** Creates {@link ProgressiveMediaExtractor} instances. */
interface Factory { interface Factory {
/** Returns a new {@link ProgressiveMediaExtractor} instance. */ /**
ProgressiveMediaExtractor createProgressiveMediaExtractor(); * Returns a new {@link ProgressiveMediaExtractor} instance.
*
* @param playerId The {@link PlayerId} of the player this extractor is used for.
*/
ProgressiveMediaExtractor createProgressiveMediaExtractor(PlayerId playerId);
} }
/** /**

View file

@ -717,11 +717,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
} }
} }
SampleQueue trackOutput = SampleQueue trackOutput =
SampleQueue.createWithDrm( SampleQueue.createWithDrm(allocator, drmSessionManager, drmEventDispatcher);
allocator,
/* playbackLooper= */ handler.getLooper(),
drmSessionManager,
drmEventDispatcher);
trackOutput.setUpstreamFormatChangeListener(this); trackOutput.setUpstreamFormatChangeListener(this);
@NullableType @NullableType
TrackId[] sampleQueueTrackIds = Arrays.copyOf(this.sampleQueueTrackIds, trackCount + 1); TrackId[] sampleQueueTrackIds = Arrays.copyOf(this.sampleQueueTrackIds, trackCount + 1);

View file

@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import android.net.Uri; import android.net.Uri;
import android.os.Looper;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
@ -77,7 +78,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
* Factory(dataSourceFactory, () -> new BundledExtractorsAdapter(extractorsFactory)}. * Factory(dataSourceFactory, () -> new BundledExtractorsAdapter(extractorsFactory)}.
*/ */
public Factory(DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) { public Factory(DataSource.Factory dataSourceFactory, ExtractorsFactory extractorsFactory) {
this(dataSourceFactory, () -> new BundledExtractorsAdapter(extractorsFactory)); this(dataSourceFactory, playerId -> new BundledExtractorsAdapter(extractorsFactory));
} }
/** /**
@ -105,7 +106,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
@Deprecated @Deprecated
public Factory setExtractorsFactory(@Nullable ExtractorsFactory extractorsFactory) { public Factory setExtractorsFactory(@Nullable ExtractorsFactory extractorsFactory) {
this.progressiveMediaExtractorFactory = this.progressiveMediaExtractorFactory =
() -> playerId ->
new BundledExtractorsAdapter( new BundledExtractorsAdapter(
extractorsFactory != null ? extractorsFactory : new DefaultExtractorsFactory()); extractorsFactory != null ? extractorsFactory : new DefaultExtractorsFactory());
return this; return this;
@ -296,6 +297,8 @@ public final class ProgressiveMediaSource extends BaseMediaSource
protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
transferListener = mediaTransferListener; transferListener = mediaTransferListener;
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), getPlayerId());
notifySourceInfoRefreshed(); notifySourceInfoRefreshed();
} }
@ -313,7 +316,7 @@ public final class ProgressiveMediaSource extends BaseMediaSource
return new ProgressiveMediaPeriod( return new ProgressiveMediaPeriod(
localConfiguration.uri, localConfiguration.uri,
dataSource, dataSource,
progressiveMediaExtractorFactory.createProgressiveMediaExtractor(), progressiveMediaExtractorFactory.createProgressiveMediaExtractor(getPlayerId()),
drmSessionManager, drmSessionManager,
createDrmEventDispatcher(id), createDrmEventDispatcher(id),
loadableLoadErrorHandlingPolicy, loadableLoadErrorHandlingPolicy,

View file

@ -30,11 +30,13 @@ import androidx.annotation.VisibleForTesting;
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.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer.InsufficientCapacityException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer.InsufficientCapacityException;
import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionEventListener.EventDispatcher;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.DrmSessionManager.DrmSessionReference; import com.google.android.exoplayer2.drm.DrmSessionManager.DrmSessionReference;
import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.extractor.TrackOutput;
@ -71,7 +73,6 @@ public class SampleQueue implements TrackOutput {
private final SpannedData<SharedSampleMetadata> sharedSampleMetadata; private final SpannedData<SharedSampleMetadata> sharedSampleMetadata;
@Nullable private final DrmSessionManager drmSessionManager; @Nullable private final DrmSessionManager drmSessionManager;
@Nullable private final DrmSessionEventListener.EventDispatcher drmEventDispatcher; @Nullable private final DrmSessionEventListener.EventDispatcher drmEventDispatcher;
@Nullable private final Looper playbackLooper;
@Nullable private UpstreamFormatChangedListener upstreamFormatChangeListener; @Nullable private UpstreamFormatChangedListener upstreamFormatChangeListener;
@Nullable private Format downstreamFormat; @Nullable private Format downstreamFormat;
@ -113,10 +114,7 @@ public class SampleQueue implements TrackOutput {
*/ */
public static SampleQueue createWithoutDrm(Allocator allocator) { public static SampleQueue createWithoutDrm(Allocator allocator) {
return new SampleQueue( return new SampleQueue(
allocator, allocator, /* drmSessionManager= */ null, /* drmEventDispatcher= */ null);
/* playbackLooper= */ null,
/* drmSessionManager= */ null,
/* drmEventDispatcher= */ null);
} }
/** /**
@ -126,7 +124,6 @@ public class SampleQueue implements TrackOutput {
* keys needed to decrypt it. * keys needed to decrypt it.
* *
* @param allocator An {@link Allocator} from which allocations for sample data can be obtained. * @param allocator An {@link Allocator} from which allocations for sample data can be obtained.
* @param playbackLooper The looper associated with the media playback thread.
* @param drmSessionManager The {@link DrmSessionManager} to obtain {@link DrmSession DrmSessions} * @param drmSessionManager The {@link DrmSessionManager} to obtain {@link DrmSession DrmSessions}
* from. The created instance does not take ownership of this {@link DrmSessionManager}. * from. The created instance does not take ownership of this {@link DrmSessionManager}.
* @param drmEventDispatcher A {@link DrmSessionEventListener.EventDispatcher} to notify of events * @param drmEventDispatcher A {@link DrmSessionEventListener.EventDispatcher} to notify of events
@ -134,22 +131,36 @@ public class SampleQueue implements TrackOutput {
*/ */
public static SampleQueue createWithDrm( public static SampleQueue createWithDrm(
Allocator allocator, Allocator allocator,
Looper playbackLooper,
DrmSessionManager drmSessionManager, DrmSessionManager drmSessionManager,
DrmSessionEventListener.EventDispatcher drmEventDispatcher) { DrmSessionEventListener.EventDispatcher drmEventDispatcher) {
return new SampleQueue( return new SampleQueue(
allocator, allocator,
Assertions.checkNotNull(playbackLooper), Assertions.checkNotNull(drmSessionManager),
Assertions.checkNotNull(drmEventDispatcher));
}
/**
* @deprecated Use {@link #createWithDrm(Allocator, DrmSessionManager, EventDispatcher)} instead.
* The {@code playbackLooper} should be configured on the {@link DrmSessionManager} with
* {@link DrmSessionManager#setPlayer(Looper, PlayerId)}.
*/
@Deprecated
public static SampleQueue createWithDrm(
Allocator allocator,
Looper playbackLooper,
DrmSessionManager drmSessionManager,
DrmSessionEventListener.EventDispatcher drmEventDispatcher) {
drmSessionManager.setPlayer(playbackLooper, PlayerId.UNSET);
return new SampleQueue(
allocator,
Assertions.checkNotNull(drmSessionManager), Assertions.checkNotNull(drmSessionManager),
Assertions.checkNotNull(drmEventDispatcher)); Assertions.checkNotNull(drmEventDispatcher));
} }
protected SampleQueue( protected SampleQueue(
Allocator allocator, Allocator allocator,
@Nullable Looper playbackLooper,
@Nullable DrmSessionManager drmSessionManager, @Nullable DrmSessionManager drmSessionManager,
@Nullable DrmSessionEventListener.EventDispatcher drmEventDispatcher) { @Nullable DrmSessionEventListener.EventDispatcher drmEventDispatcher) {
this.playbackLooper = playbackLooper;
this.drmSessionManager = drmSessionManager; this.drmSessionManager = drmSessionManager;
this.drmEventDispatcher = drmEventDispatcher; this.drmEventDispatcher = drmEventDispatcher;
sampleDataQueue = new SampleDataQueue(allocator); sampleDataQueue = new SampleDataQueue(allocator);
@ -803,8 +814,7 @@ public class SampleQueue implements TrackOutput {
|| !sharedSampleMetadata.getEndValue().format.equals(upstreamFormat)) { || !sharedSampleMetadata.getEndValue().format.equals(upstreamFormat)) {
DrmSessionReference drmSessionReference = DrmSessionReference drmSessionReference =
drmSessionManager != null drmSessionManager != null
? drmSessionManager.preacquireSession( ? drmSessionManager.preacquireSession(drmEventDispatcher, upstreamFormat)
checkNotNull(playbackLooper), drmEventDispatcher, upstreamFormat)
: DrmSessionReference.EMPTY; : DrmSessionReference.EMPTY;
sharedSampleMetadata.appendSpan( sharedSampleMetadata.appendSpan(
@ -913,9 +923,7 @@ public class SampleQueue implements TrackOutput {
// Ensure we acquire the new session before releasing the previous one in case the same session // Ensure we acquire the new session before releasing the previous one in case the same session
// is being used for both DrmInitData. // is being used for both DrmInitData.
@Nullable DrmSession previousSession = currentDrmSession; @Nullable DrmSession previousSession = currentDrmSession;
currentDrmSession = currentDrmSession = drmSessionManager.acquireSession(drmEventDispatcher, newFormat);
drmSessionManager.acquireSession(
Assertions.checkNotNull(playbackLooper), drmEventDispatcher, newFormat);
outputFormatHolder.drmSession = currentDrmSession; outputFormatHolder.drmSession = currentDrmSession;
if (previousSession != null) { if (previousSession != null) {

View file

@ -51,7 +51,8 @@ public final class BundledChunkExtractor implements ExtractorOutput, ChunkExtrac
format, format,
enableEventMessageTrack, enableEventMessageTrack,
closedCaptionFormats, closedCaptionFormats,
playerEmsgTrackOutput) -> { playerEmsgTrackOutput,
playerId) -> {
@Nullable String containerMimeType = format.containerMimeType; @Nullable String containerMimeType = format.containerMimeType;
Extractor extractor; Extractor extractor;
if (MimeTypes.isText(containerMimeType)) { if (MimeTypes.isText(containerMimeType)) {

View file

@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source.chunk;
import androidx.annotation.Nullable; 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.analytics.PlayerId;
import com.google.android.exoplayer2.extractor.ChunkIndex; import com.google.android.exoplayer2.extractor.ChunkIndex;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.extractor.TrackOutput;
@ -42,6 +43,8 @@ public interface ChunkExtractor {
* @param representationFormat The format of the representation to extract from. * @param representationFormat The format of the representation to extract from.
* @param enableEventMessageTrack Whether to enable the event message track. * @param enableEventMessageTrack Whether to enable the event message track.
* @param closedCaptionFormats The {@link Format Formats} of the Closed-Caption tracks. * @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. * @return A new {@link ChunkExtractor} instance, or null if not applicable.
*/ */
@Nullable @Nullable
@ -50,7 +53,8 @@ public interface ChunkExtractor {
Format representationFormat, Format representationFormat,
boolean enableEventMessageTrack, boolean enableEventMessageTrack,
List<Format> closedCaptionFormats, List<Format> closedCaptionFormats,
@Nullable TrackOutput playerEmsgTrackOutput); @Nullable TrackOutput playerEmsgTrackOutput,
PlayerId playerId);
} }
/** Provides {@link TrackOutput} instances to be written to during extraction. */ /** Provides {@link TrackOutput} instances to be written to during extraction. */

View file

@ -19,7 +19,6 @@ import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import static java.lang.Math.max; import static java.lang.Math.max;
import static java.lang.Math.min; import static java.lang.Math.min;
import android.os.Looper;
import androidx.annotation.Nullable; 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;
@ -144,11 +143,7 @@ public class ChunkSampleStream<T extends ChunkSource>
SampleQueue[] sampleQueues = new SampleQueue[1 + embeddedTrackCount]; SampleQueue[] sampleQueues = new SampleQueue[1 + embeddedTrackCount];
primarySampleQueue = primarySampleQueue =
SampleQueue.createWithDrm( SampleQueue.createWithDrm(allocator, drmSessionManager, drmEventDispatcher);
allocator,
/* playbackLooper= */ checkNotNull(Looper.myLooper()),
drmSessionManager,
drmEventDispatcher);
trackTypes[0] = primaryTrackType; trackTypes[0] = primaryTrackType;
sampleQueues[0] = primarySampleQueue; sampleQueues[0] = primarySampleQueue;

View file

@ -30,6 +30,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
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.analytics.PlayerId;
import com.google.android.exoplayer2.extractor.ChunkIndex; import com.google.android.exoplayer2.extractor.ChunkIndex;
import com.google.android.exoplayer2.extractor.DummyTrackOutput; import com.google.android.exoplayer2.extractor.DummyTrackOutput;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
@ -42,6 +43,7 @@ import com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Log;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -58,10 +60,12 @@ public final class MediaParserChunkExtractor implements ChunkExtractor {
format, format,
enableEventMessageTrack, enableEventMessageTrack,
closedCaptionFormats, closedCaptionFormats,
playerEmsgTrackOutput) -> { playerEmsgTrackOutput,
playerId) -> {
if (!MimeTypes.isText(format.containerMimeType)) { if (!MimeTypes.isText(format.containerMimeType)) {
// Container is either Matroska or Fragmented MP4. // Container is either Matroska or Fragmented MP4.
return new MediaParserChunkExtractor(primaryTrackType, format, closedCaptionFormats); return new MediaParserChunkExtractor(
primaryTrackType, format, closedCaptionFormats, playerId);
} else { } else {
// This is either RAWCC (unsupported) or a text track that does not require an extractor. // This is either RAWCC (unsupported) or a text track that does not require an extractor.
Log.w(TAG, "Ignoring an unsupported text track."); Log.w(TAG, "Ignoring an unsupported text track.");
@ -86,10 +90,14 @@ public final class MediaParserChunkExtractor implements ChunkExtractor {
* @param manifestFormat The chunks {@link Format} as obtained from the manifest. * @param manifestFormat The chunks {@link Format} as obtained from the manifest.
* @param closedCaptionFormats A list containing the {@link Format Formats} of the closed-caption * @param closedCaptionFormats A list containing the {@link Format Formats} of the closed-caption
* tracks in the chunks. * tracks in the chunks.
* @param playerId The {@link PlayerId} of the player this chunk extractor is used for.
*/ */
@SuppressLint("WrongConstant") @SuppressLint("WrongConstant")
public MediaParserChunkExtractor( public MediaParserChunkExtractor(
@C.TrackType int primaryTrackType, Format manifestFormat, List<Format> closedCaptionFormats) { @C.TrackType int primaryTrackType,
Format manifestFormat,
List<Format> closedCaptionFormats,
PlayerId playerId) {
outputConsumerAdapter = outputConsumerAdapter =
new OutputConsumerAdapterV30( new OutputConsumerAdapterV30(
manifestFormat, primaryTrackType, /* expectDummySeekMap= */ true); manifestFormat, primaryTrackType, /* expectDummySeekMap= */ true);
@ -114,6 +122,9 @@ public final class MediaParserChunkExtractor implements ChunkExtractor {
MediaParserUtil.toCaptionsMediaFormat(closedCaptionFormats.get(i))); MediaParserUtil.toCaptionsMediaFormat(closedCaptionFormats.get(i)));
} }
mediaParser.setParameter(PARAMETER_EXPOSE_CAPTION_FORMATS, closedCaptionMediaFormats); mediaParser.setParameter(PARAMETER_EXPOSE_CAPTION_FORMATS, closedCaptionMediaFormats);
if (Util.SDK_INT >= 31) {
MediaParserUtil.setLogSessionIdOnMediaParser(mediaParser, playerId);
}
outputConsumerAdapter.setMuxedCaptionFormats(closedCaptionFormats); outputConsumerAdapter.setMuxedCaptionFormats(closedCaptionFormats);
trackOutputProviderAdapter = new TrackOutputProviderAdapter(); trackOutputProviderAdapter = new TrackOutputProviderAdapter();
dummyTrackOutput = new DummyTrackOutput(); dummyTrackOutput = new DummyTrackOutput();

View file

@ -17,7 +17,11 @@ package com.google.android.exoplayer2.source.mediaparser;
import android.media.MediaFormat; import android.media.MediaFormat;
import android.media.MediaParser; import android.media.MediaParser;
import android.media.metrics.LogSessionId;
import androidx.annotation.DoNotInline;
import androidx.annotation.RequiresApi;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.analytics.PlayerId;
/** /**
* Miscellaneous constants and utility methods related to the {@link MediaParser} integration. * Miscellaneous constants and utility methods related to the {@link MediaParser} integration.
@ -57,4 +61,28 @@ public final class MediaParserUtil {
} }
return mediaFormat; return mediaFormat;
} }
/**
* Calls {@link MediaParser#setLogSessionId(LogSessionId)}.
*
* @param mediaParser The {@link MediaParser} to call the method on.
* @param playerId The {@link PlayerId} to obtain the {@link LogSessionId} from.
*/
@RequiresApi(31)
public static void setLogSessionIdOnMediaParser(MediaParser mediaParser, PlayerId playerId) {
Api31.setLogSessionIdOnMediaParser(mediaParser, playerId);
}
@RequiresApi(31)
private static final class Api31 {
private Api31() {}
@DoNotInline
public static void setLogSessionIdOnMediaParser(MediaParser mediaParser, PlayerId playerId) {
LogSessionId logSessionId = playerId.getLogSessionId();
if (!logSessionId.equals(LogSessionId.LOG_SESSION_ID_NONE)) {
mediaParser.setLogSessionId(logSessionId);
}
}
}
} }

View file

@ -567,6 +567,13 @@ public class DefaultTrackSelector extends MappingTrackSelector {
* Sets whether to enable tunneling if possible. Tunneling will only be enabled if it's * Sets whether to enable tunneling if possible. Tunneling will only be enabled if it's
* supported by the audio and video renderers for the selected tracks. * supported by the audio and video renderers for the selected tracks.
* *
* <p>Tunneling is known to have many device specific issues and limitations. Manual testing is
* strongly recomended to check that the media plays correctly when this option is enabled. See
* [#9661](https://github.com/google/ExoPlayer/issues/9661),
* [#9133](https://github.com/google/ExoPlayer/issues/9133),
* [#9317](https://github.com/google/ExoPlayer/issues/9317),
* [#9502](https://github.com/google/ExoPlayer/issues/9502).
*
* @param tunnelingEnabled Whether to enable tunneling if possible. * @param tunnelingEnabled Whether to enable tunneling if possible.
* @return This builder. * @return This builder.
*/ */

View file

@ -30,6 +30,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
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.RendererConfiguration; import com.google.android.exoplayer2.RendererConfiguration;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.decoder.CryptoConfig; import com.google.android.exoplayer2.decoder.CryptoConfig;
import com.google.android.exoplayer2.decoder.DecoderException; import com.google.android.exoplayer2.decoder.DecoderException;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
@ -84,6 +85,7 @@ public class DecoderAudioRendererTest {
return FORMAT; return FORMAT;
} }
}; };
audioRenderer.init(/* index= */ 0, PlayerId.UNSET);
} }
@Config(sdk = 19) @Config(sdk = 19)

View file

@ -39,6 +39,7 @@ import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.RendererConfiguration; import com.google.android.exoplayer2.RendererConfiguration;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo; import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
@ -110,6 +111,7 @@ public class MediaCodecAudioRendererTest {
eventHandler, eventHandler,
audioRendererEventListener, audioRendererEventListener,
audioSink); audioSink);
mediaCodecAudioRenderer.init(/* index= */ 0, PlayerId.UNSET);
} }
@Test @Test
@ -264,6 +266,7 @@ public class MediaCodecAudioRendererTest {
oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM)); oneByteSample(/* timeUs= */ 0, C.BUFFER_FLAG_KEY_FRAME), END_OF_STREAM_ITEM));
fakeSampleStream.writeData(/* startPositionUs= */ 0); fakeSampleStream.writeData(/* startPositionUs= */ 0);
exceptionThrowingRenderer.init(/* index= */ 0, PlayerId.UNSET);
exceptionThrowingRenderer.enable( exceptionThrowingRenderer.enable(
RendererConfiguration.DEFAULT, RendererConfiguration.DEFAULT,
new Format[] {AUDIO_AAC, changedFormat}, new Format[] {AUDIO_AAC, changedFormat},

View file

@ -25,6 +25,7 @@ import androidx.annotation.Nullable;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
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.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DrmSessionManager.DrmSessionReference; import com.google.android.exoplayer2.drm.DrmSessionManager.DrmSessionReference;
import com.google.android.exoplayer2.drm.ExoMediaDrm.AppManagedProvider; import com.google.android.exoplayer2.drm.ExoMediaDrm.AppManagedProvider;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
@ -67,12 +68,11 @@ public class DefaultDrmSessionManagerTest {
.setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm()) .setUuidAndExoMediaDrmProvider(DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm())
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS);
@ -91,12 +91,11 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS);
@ -117,12 +116,11 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
drmSession.release(/* eventDispatcher= */ null); drmSession.release(/* eventDispatcher= */ null);
@ -140,12 +138,11 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
drmSession.release(/* eventDispatcher= */ null); drmSession.release(/* eventDispatcher= */ null);
@ -165,12 +162,11 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS);
@ -192,12 +188,11 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
drmSessionManager.release(); drmSessionManager.release();
// The manager is now in a 'releasing' state because the session is still active - so the // The manager is now in a 'releasing' state because the session is still active - so the
@ -238,12 +233,11 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
// Release the manager (there's still an explicit reference to the session from acquireSession). // Release the manager (there's still an explicit reference to the session from acquireSession).
@ -278,12 +272,11 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession firstDrmSession = DrmSession firstDrmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(firstDrmSession); waitForOpenedWithKeys(firstDrmSession);
firstDrmSession.release(/* eventDispatcher= */ null); firstDrmSession.release(/* eventDispatcher= */ null);
@ -293,9 +286,7 @@ public class DefaultDrmSessionManagerTest {
DrmSession secondDrmSession = DrmSession secondDrmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, secondFormatWithDrmInitData));
/* eventDispatcher= */ null,
secondFormatWithDrmInitData));
// The drmSessionManager had to release firstDrmSession in order to acquire secondDrmSession. // The drmSessionManager had to release firstDrmSession in order to acquire secondDrmSession.
assertThat(firstDrmSession.getState()).isEqualTo(DrmSession.STATE_RELEASED); assertThat(firstDrmSession.getState()).isEqualTo(DrmSession.STATE_RELEASED);
@ -322,18 +313,15 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSessionReference firstDrmSessionReference = DrmSessionReference firstDrmSessionReference =
checkNotNull( checkNotNull(
drmSessionManager.preacquireSession( drmSessionManager.preacquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
DrmSession firstDrmSession = DrmSession firstDrmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(firstDrmSession); waitForOpenedWithKeys(firstDrmSession);
firstDrmSession.release(/* eventDispatcher= */ null); firstDrmSession.release(/* eventDispatcher= */ null);
@ -343,9 +331,7 @@ public class DefaultDrmSessionManagerTest {
DrmSession secondDrmSession = DrmSession secondDrmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, secondFormatWithDrmInitData));
/* eventDispatcher= */ null,
secondFormatWithDrmInitData));
// The drmSessionManager had to release both it's internal keep-alive reference and the // The drmSessionManager had to release both it's internal keep-alive reference and the
// reference represented by firstDrmSessionReference in order to acquire secondDrmSession. // reference represented by firstDrmSessionReference in order to acquire secondDrmSession.
assertThat(firstDrmSession.getState()).isEqualTo(DrmSession.STATE_RELEASED); assertThat(firstDrmSession.getState()).isEqualTo(DrmSession.STATE_RELEASED);
@ -372,12 +358,11 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession firstDrmSession = DrmSession firstDrmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(firstDrmSession); waitForOpenedWithKeys(firstDrmSession);
firstDrmSession.release(/* eventDispatcher= */ null); firstDrmSession.release(/* eventDispatcher= */ null);
@ -388,9 +373,7 @@ public class DefaultDrmSessionManagerTest {
DrmSession secondDrmSession = DrmSession secondDrmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
assertThat(secondDrmSession).isSameInstanceAs(firstDrmSession); assertThat(secondDrmSession).isSameInstanceAs(firstDrmSession);
// Let the timeout definitely expire, and check the session didn't get released. // Let the timeout definitely expire, and check the session didn't get released.
@ -422,12 +405,10 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSessionReference sessionReference = DrmSessionReference sessionReference =
drmSessionManager.preacquireSession( drmSessionManager.preacquireSession(eventDispatcher, FORMAT_WITH_DRM_INIT_DATA);
/* playbackLooper= */ checkNotNull(Looper.myLooper()),
eventDispatcher,
FORMAT_WITH_DRM_INIT_DATA);
// Wait for the key load event to propagate, indicating the pre-acquired session is in // Wait for the key load event to propagate, indicating the pre-acquired session is in
// STATE_OPENED_WITH_KEYS. // STATE_OPENED_WITH_KEYS.
@ -439,9 +420,7 @@ public class DefaultDrmSessionManagerTest {
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
// Without idling the main/playback looper, we assert the session is already in OPENED_WITH_KEYS // Without idling the main/playback looper, we assert the session is already in OPENED_WITH_KEYS
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED_WITH_KEYS);
@ -471,12 +450,10 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSessionReference sessionReference = DrmSessionReference sessionReference =
drmSessionManager.preacquireSession( drmSessionManager.preacquireSession(/* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA);
/* playbackLooper= */ checkNotNull(Looper.myLooper()),
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA);
// Release the pre-acquired reference before the underlying session has had a chance to be // Release the pre-acquired reference before the underlying session has had a chance to be
// constructed. // constructed.
@ -487,9 +464,7 @@ public class DefaultDrmSessionManagerTest {
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED);
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
@ -511,12 +486,10 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSessionReference sessionReference = DrmSessionReference sessionReference =
drmSessionManager.preacquireSession( drmSessionManager.preacquireSession(/* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA);
/* playbackLooper= */ checkNotNull(Looper.myLooper()),
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA);
// Release the manager before the underlying session has had a chance to be constructed. This // Release the manager before the underlying session has had a chance to be constructed. This
// will release all pre-acquired sessions. // will release all pre-acquired sessions.
@ -531,9 +504,7 @@ public class DefaultDrmSessionManagerTest {
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED);
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
@ -559,14 +530,13 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DefaultDrmSession drmSession = DefaultDrmSession drmSession =
(DefaultDrmSession) (DefaultDrmSession)
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
assertThat(licenseServer.getReceivedSchemeDatas()).hasSize(1); assertThat(licenseServer.getReceivedSchemeDatas()).hasSize(1);
@ -601,14 +571,13 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DefaultDrmSession drmSession = DefaultDrmSession drmSession =
(DefaultDrmSession) (DefaultDrmSession)
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
assertThat(licenseServer.getReceivedSchemeDatas()).hasSize(1); assertThat(licenseServer.getReceivedSchemeDatas()).hasSize(1);
@ -646,12 +615,11 @@ public class DefaultDrmSessionManagerTest {
uuid -> new FakeExoMediaDrm.Builder().setProvisionsRequired(1).build()) uuid -> new FakeExoMediaDrm.Builder().setProvisionsRequired(1).build())
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
// Confirm that opening the session threw NotProvisionedException (otherwise state would be // Confirm that opening the session threw NotProvisionedException (otherwise state would be
// OPENED) // OPENED)
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING);
@ -680,12 +648,11 @@ public class DefaultDrmSessionManagerTest {
.build()) .build())
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED);
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
@ -707,12 +674,11 @@ public class DefaultDrmSessionManagerTest {
uuid -> new FakeExoMediaDrm.Builder().setProvisionsRequired(2).build()) uuid -> new FakeExoMediaDrm.Builder().setProvisionsRequired(2).build())
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
// Confirm that opening the session threw NotProvisionedException (otherwise state would be // Confirm that opening the session threw NotProvisionedException (otherwise state would be
// OPENED) // OPENED)
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING);
@ -736,12 +702,11 @@ public class DefaultDrmSessionManagerTest {
DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm.Builder().build()) DRM_SCHEME_UUID, uuid -> new FakeExoMediaDrm.Builder().build())
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENED);
waitForOpenedWithKeys(drmSession); waitForOpenedWithKeys(drmSession);
@ -763,12 +728,11 @@ public class DefaultDrmSessionManagerTest {
.setSessionKeepaliveMs(C.TIME_UNSET) .setSessionKeepaliveMs(C.TIME_UNSET)
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
// Confirm that opening the session threw NotProvisionedException (otherwise state would be // Confirm that opening the session threw NotProvisionedException (otherwise state would be
// OPENED) // OPENED)
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING);
@ -780,9 +744,7 @@ public class DefaultDrmSessionManagerTest {
drmSession = drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
// Confirm that opening the session threw NotProvisionedException (otherwise state would be // Confirm that opening the session threw NotProvisionedException (otherwise state would be
// OPENED) // OPENED)
assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING); assertThat(drmSession.getState()).isEqualTo(DrmSession.STATE_OPENING);
@ -803,16 +765,12 @@ public class DefaultDrmSessionManagerTest {
Exception.class, Exception.class,
() -> () ->
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
assertThrows( assertThrows(
Exception.class, Exception.class,
() -> () ->
drmSessionManager.preacquireSession( drmSessionManager.preacquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
} }
@Test @Test
@ -825,12 +783,11 @@ public class DefaultDrmSessionManagerTest {
.build(/* mediaDrmCallback= */ licenseServer); .build(/* mediaDrmCallback= */ licenseServer);
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), PlayerId.UNSET);
DrmSession drmSession = DrmSession drmSession =
checkNotNull( checkNotNull(
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
drmSessionManager.release(); drmSessionManager.release();
// The manager's prepareCount is now zero, but the drmSession is keeping it in a 'releasing' // The manager's prepareCount is now zero, but the drmSession is keeping it in a 'releasing'
@ -839,16 +796,12 @@ public class DefaultDrmSessionManagerTest {
Exception.class, Exception.class,
() -> () ->
drmSessionManager.acquireSession( drmSessionManager.acquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
assertThrows( assertThrows(
Exception.class, Exception.class,
() -> () ->
drmSessionManager.preacquireSession( drmSessionManager.preacquireSession(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), /* eventDispatcher= */ null, FORMAT_WITH_DRM_INIT_DATA));
/* eventDispatcher= */ null,
FORMAT_WITH_DRM_INIT_DATA));
drmSession.release(/* eventDispatcher= */ null); drmSession.release(/* eventDispatcher= */ null);
} }

View file

@ -22,6 +22,7 @@ import android.net.Uri;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor; import com.google.android.exoplayer2.extractor.mp4.Mp4Extractor;
@ -48,7 +49,8 @@ public final class ProgressiveMediaPeriodTest {
@Test @Test
public void prepareUsingMediaParser_updatesSourceInfoBeforeOnPreparedCallback() public void prepareUsingMediaParser_updatesSourceInfoBeforeOnPreparedCallback()
throws TimeoutException { throws TimeoutException {
testExtractorsUpdatesSourceInfoBeforeOnPreparedCallback(new MediaParserExtractorAdapter()); testExtractorsUpdatesSourceInfoBeforeOnPreparedCallback(
new MediaParserExtractorAdapter(PlayerId.UNSET));
} }
private static void testExtractorsUpdatesSourceInfoBeforeOnPreparedCallback( private static void testExtractorsUpdatesSourceInfoBeforeOnPreparedCallback(

View file

@ -36,6 +36,7 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
@ -46,7 +47,6 @@ import com.google.android.exoplayer2.testutil.FakeCryptoConfig;
import com.google.android.exoplayer2.testutil.TestUtil; import com.google.android.exoplayer2.testutil.TestUtil;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.DefaultAllocator; import com.google.android.exoplayer2.upstream.DefaultAllocator;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.ParsableByteArray;
import com.google.common.primitives.Bytes; import com.google.common.primitives.Bytes;
@ -146,12 +146,7 @@ public final class SampleQueueTest {
mockDrmSession = Mockito.mock(DrmSession.class); mockDrmSession = Mockito.mock(DrmSession.class);
mockDrmSessionManager = new MockDrmSessionManager(mockDrmSession); mockDrmSessionManager = new MockDrmSessionManager(mockDrmSession);
eventDispatcher = new DrmSessionEventListener.EventDispatcher(); eventDispatcher = new DrmSessionEventListener.EventDispatcher();
sampleQueue = sampleQueue = new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher);
new SampleQueue(
allocator,
/* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()),
mockDrmSessionManager,
eventDispatcher);
formatHolder = new FormatHolder(); formatHolder = new FormatHolder();
inputBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); inputBuffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL);
} }
@ -424,12 +419,7 @@ public final class SampleQueueTest {
public void isReadyReturnsTrueForClearSampleAndPlayClearSamplesWithoutKeysIsTrue() { public void isReadyReturnsTrueForClearSampleAndPlayClearSamplesWithoutKeysIsTrue() {
when(mockDrmSession.playClearSamplesWithoutKeys()).thenReturn(true); when(mockDrmSession.playClearSamplesWithoutKeys()).thenReturn(true);
// We recreate the queue to ensure the mock DRM session manager flags are taken into account. // We recreate the queue to ensure the mock DRM session manager flags are taken into account.
sampleQueue = sampleQueue = new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher);
new SampleQueue(
allocator,
/* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()),
mockDrmSessionManager,
eventDispatcher);
writeTestDataWithEncryptedSections(); writeTestDataWithEncryptedSections();
assertThat(sampleQueue.isReady(/* loadingFinished= */ false)).isTrue(); assertThat(sampleQueue.isReady(/* loadingFinished= */ false)).isTrue();
} }
@ -574,12 +564,7 @@ public final class SampleQueueTest {
public void allowPlayClearSamplesWithoutKeysReadsClearSamples() { public void allowPlayClearSamplesWithoutKeysReadsClearSamples() {
when(mockDrmSession.playClearSamplesWithoutKeys()).thenReturn(true); when(mockDrmSession.playClearSamplesWithoutKeys()).thenReturn(true);
// We recreate the queue to ensure the mock DRM session manager flags are taken into account. // We recreate the queue to ensure the mock DRM session manager flags are taken into account.
sampleQueue = sampleQueue = new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher);
new SampleQueue(
allocator,
/* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()),
mockDrmSessionManager,
eventDispatcher);
when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED); when(mockDrmSession.getState()).thenReturn(DrmSession.STATE_OPENED);
writeTestDataWithEncryptedSections(); writeTestDataWithEncryptedSections();
@ -1246,11 +1231,7 @@ public final class SampleQueueTest {
public void adjustUpstreamFormat() { public void adjustUpstreamFormat() {
String label = "label"; String label = "label";
sampleQueue = sampleQueue =
new SampleQueue( new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher) {
allocator,
/* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()),
mockDrmSessionManager,
eventDispatcher) {
@Override @Override
public Format getAdjustedUpstreamFormat(Format format) { public Format getAdjustedUpstreamFormat(Format format) {
return super.getAdjustedUpstreamFormat(copyWithLabel(format, label)); return super.getAdjustedUpstreamFormat(copyWithLabel(format, label));
@ -1266,11 +1247,7 @@ public final class SampleQueueTest {
public void invalidateUpstreamFormatAdjustment() { public void invalidateUpstreamFormatAdjustment() {
AtomicReference<String> label = new AtomicReference<>("label1"); AtomicReference<String> label = new AtomicReference<>("label1");
sampleQueue = sampleQueue =
new SampleQueue( new SampleQueue(allocator, mockDrmSessionManager, eventDispatcher) {
allocator,
/* playbackLooper= */ Assertions.checkNotNull(Looper.myLooper()),
mockDrmSessionManager,
eventDispatcher) {
@Override @Override
public Format getAdjustedUpstreamFormat(Format format) { public Format getAdjustedUpstreamFormat(Format format) {
return super.getAdjustedUpstreamFormat(copyWithLabel(format, label.get())); return super.getAdjustedUpstreamFormat(copyWithLabel(format, label.get()));
@ -1770,12 +1747,13 @@ public final class SampleQueueTest {
this.mockDrmSession = mockDrmSession; this.mockDrmSession = mockDrmSession;
} }
@Override
public void setPlayer(Looper playbackLooper, PlayerId playerId) {}
@Override @Override
@Nullable @Nullable
public DrmSession acquireSession( public DrmSession acquireSession(
Looper playbackLooper, @Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) {
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher,
Format format) {
return format.drmInitData != null ? mockDrmSession : mockPlaceholderDrmSession; return format.drmInitData != null ? mockDrmSession : mockPlaceholderDrmSession;
} }

View file

@ -19,6 +19,7 @@ import android.os.SystemClock;
import androidx.annotation.Nullable; 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.analytics.PlayerId;
import com.google.android.exoplayer2.source.chunk.ChunkSource; import com.google.android.exoplayer2.source.chunk.ChunkSource;
import com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler; import com.google.android.exoplayer2.source.dash.PlayerEmsgHandler.PlayerTrackEmsgHandler;
import com.google.android.exoplayer2.source.dash.manifest.DashManifest; import com.google.android.exoplayer2.source.dash.manifest.DashManifest;
@ -49,6 +50,7 @@ public interface DashChunkSource extends ChunkSource {
* @param closedCaptionFormats The {@link Format Formats} of closed caption tracks to be output. * @param closedCaptionFormats The {@link Format Formats} of closed caption tracks to be output.
* @param transferListener The transfer listener which should be informed of any data transfers. * @param transferListener The transfer listener which should be informed of any data transfers.
* May be null if no listener is available. * May be null if no listener is available.
* @param playerId The {@link PlayerId} of the player using this chunk source.
* @return The created {@link DashChunkSource}. * @return The created {@link DashChunkSource}.
*/ */
DashChunkSource createDashChunkSource( DashChunkSource createDashChunkSource(
@ -63,7 +65,8 @@ public interface DashChunkSource extends ChunkSource {
boolean enableEventMessageTrack, boolean enableEventMessageTrack,
List<Format> closedCaptionFormats, List<Format> closedCaptionFormats,
@Nullable PlayerTrackEmsgHandler playerEmsgHandler, @Nullable PlayerTrackEmsgHandler playerEmsgHandler,
@Nullable TransferListener transferListener); @Nullable TransferListener transferListener,
PlayerId playerId);
} }
/** /**

View file

@ -25,6 +25,7 @@ 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.SeekParameters; import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.offline.StreamKey; import com.google.android.exoplayer2.offline.StreamKey;
@ -96,6 +97,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
trackEmsgHandlerBySampleStream; trackEmsgHandlerBySampleStream;
private final MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher; private final MediaSourceEventListener.EventDispatcher mediaSourceEventDispatcher;
private final DrmSessionEventListener.EventDispatcher drmEventDispatcher; private final DrmSessionEventListener.EventDispatcher drmEventDispatcher;
private final PlayerId playerId;
@Nullable private Callback callback; @Nullable private Callback callback;
private ChunkSampleStream<DashChunkSource>[] sampleStreams; private ChunkSampleStream<DashChunkSource>[] sampleStreams;
@ -120,7 +122,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
LoaderErrorThrower manifestLoaderErrorThrower, LoaderErrorThrower manifestLoaderErrorThrower,
Allocator allocator, Allocator allocator,
CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
PlayerEmsgCallback playerEmsgCallback) { PlayerEmsgCallback playerEmsgCallback,
PlayerId playerId) {
this.id = id; this.id = id;
this.manifest = manifest; this.manifest = manifest;
this.baseUrlExclusionList = baseUrlExclusionList; this.baseUrlExclusionList = baseUrlExclusionList;
@ -135,6 +138,7 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
this.manifestLoaderErrorThrower = manifestLoaderErrorThrower; this.manifestLoaderErrorThrower = manifestLoaderErrorThrower;
this.allocator = allocator; this.allocator = allocator;
this.compositeSequenceableLoaderFactory = compositeSequenceableLoaderFactory; this.compositeSequenceableLoaderFactory = compositeSequenceableLoaderFactory;
this.playerId = playerId;
playerEmsgHandler = new PlayerEmsgHandler(manifest, playerEmsgCallback, allocator); playerEmsgHandler = new PlayerEmsgHandler(manifest, playerEmsgCallback, allocator);
sampleStreams = newSampleStreamArray(0); sampleStreams = newSampleStreamArray(0);
eventSampleStreams = new EventSampleStream[0]; eventSampleStreams = new EventSampleStream[0];
@ -777,7 +781,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
enableEventMessageTrack, enableEventMessageTrack,
embeddedClosedCaptionTrackFormats, embeddedClosedCaptionTrackFormats,
trackPlayerEmsgHandler, trackPlayerEmsgHandler,
transferListener); transferListener,
playerId);
ChunkSampleStream<DashChunkSource> stream = ChunkSampleStream<DashChunkSource> stream =
new ChunkSampleStream<>( new ChunkSampleStream<>(
trackGroupInfo.trackType, trackGroupInfo.trackType,

View file

@ -22,6 +22,7 @@ import static java.lang.Math.min;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock; import android.os.SystemClock;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.SparseArray; import android.util.SparseArray;
@ -559,6 +560,7 @@ public final class DashMediaSource extends BaseMediaSource {
protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
this.mediaTransferListener = mediaTransferListener; this.mediaTransferListener = mediaTransferListener;
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(/* playbackLooper= */ Looper.myLooper(), getPlayerId());
if (sideloadedManifest) { if (sideloadedManifest) {
processManifest(false); processManifest(false);
} else { } else {
@ -596,7 +598,8 @@ public final class DashMediaSource extends BaseMediaSource {
manifestLoadErrorThrower, manifestLoadErrorThrower,
allocator, allocator,
compositeSequenceableLoaderFactory, compositeSequenceableLoaderFactory,
playerEmsgCallback); playerEmsgCallback,
getPlayerId());
periodsById.put(mediaPeriod.id, mediaPeriod); periodsById.put(mediaPeriod.id, mediaPeriod);
return mediaPeriod; return mediaPeriod;
} }

View file

@ -25,6 +25,7 @@ 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.SeekParameters; import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.extractor.ChunkIndex; import com.google.android.exoplayer2.extractor.ChunkIndex;
import com.google.android.exoplayer2.source.BehindLiveWindowException; import com.google.android.exoplayer2.source.BehindLiveWindowException;
import com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator; import com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator;
@ -110,7 +111,8 @@ public class DefaultDashChunkSource implements DashChunkSource {
boolean enableEventMessageTrack, boolean enableEventMessageTrack,
List<Format> closedCaptionFormats, List<Format> closedCaptionFormats,
@Nullable PlayerTrackEmsgHandler playerEmsgHandler, @Nullable PlayerTrackEmsgHandler playerEmsgHandler,
@Nullable TransferListener transferListener) { @Nullable TransferListener transferListener,
PlayerId playerId) {
DataSource dataSource = dataSourceFactory.createDataSource(); DataSource dataSource = dataSourceFactory.createDataSource();
if (transferListener != null) { if (transferListener != null) {
dataSource.addTransferListener(transferListener); dataSource.addTransferListener(transferListener);
@ -129,7 +131,8 @@ public class DefaultDashChunkSource implements DashChunkSource {
maxSegmentsPerLoad, maxSegmentsPerLoad,
enableEventMessageTrack, enableEventMessageTrack,
closedCaptionFormats, closedCaptionFormats,
playerEmsgHandler); playerEmsgHandler,
playerId);
} }
} }
@ -171,6 +174,7 @@ public class DefaultDashChunkSource implements DashChunkSource {
* @param closedCaptionFormats The {@link Format Formats} of closed caption tracks to be output. * @param closedCaptionFormats The {@link Format Formats} of closed caption tracks to be output.
* @param playerTrackEmsgHandler The {@link PlayerTrackEmsgHandler} instance to handle emsg * @param playerTrackEmsgHandler The {@link PlayerTrackEmsgHandler} instance to handle emsg
* messages targeting the player. Maybe null if this is not necessary. * messages targeting the player. Maybe null if this is not necessary.
* @param playerId The {@link PlayerId} of the player using this chunk source.
*/ */
public DefaultDashChunkSource( public DefaultDashChunkSource(
ChunkExtractor.Factory chunkExtractorFactory, ChunkExtractor.Factory chunkExtractorFactory,
@ -186,7 +190,8 @@ public class DefaultDashChunkSource implements DashChunkSource {
int maxSegmentsPerLoad, int maxSegmentsPerLoad,
boolean enableEventMessageTrack, boolean enableEventMessageTrack,
List<Format> closedCaptionFormats, List<Format> closedCaptionFormats,
@Nullable PlayerTrackEmsgHandler playerTrackEmsgHandler) { @Nullable PlayerTrackEmsgHandler playerTrackEmsgHandler,
PlayerId playerId) {
this.manifestLoaderErrorThrower = manifestLoaderErrorThrower; this.manifestLoaderErrorThrower = manifestLoaderErrorThrower;
this.manifest = manifest; this.manifest = manifest;
this.baseUrlExclusionList = baseUrlExclusionList; this.baseUrlExclusionList = baseUrlExclusionList;
@ -217,7 +222,8 @@ public class DefaultDashChunkSource implements DashChunkSource {
representation.format, representation.format,
enableEventMessageTrack, enableEventMessageTrack,
closedCaptionFormats, closedCaptionFormats,
playerTrackEmsgHandler), playerTrackEmsgHandler,
playerId),
/* segmentNumShift= */ 0, /* segmentNumShift= */ 0,
representation.getIndex()); representation.getIndex());
} }

View file

@ -21,6 +21,7 @@ import android.net.Uri;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory;
@ -212,7 +213,8 @@ public final class DashMediaPeriodTest {
mock(LoaderErrorThrower.class), mock(LoaderErrorThrower.class),
mock(Allocator.class), mock(Allocator.class),
mock(CompositeSequenceableLoaderFactory.class), mock(CompositeSequenceableLoaderFactory.class),
mock(PlayerEmsgCallback.class)); mock(PlayerEmsgCallback.class),
PlayerId.UNSET);
} }
private static DashManifest parseManifest(String fileName) throws IOException { private static DashManifest parseManifest(String fileName) throws IOException {

View file

@ -26,6 +26,7 @@ import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
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.analytics.PlayerId;
import com.google.android.exoplayer2.source.LoadEventInfo; import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaLoadData;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
@ -95,7 +96,8 @@ public class DefaultDashChunkSourceTest {
/* maxSegmentsPerLoad= */ 1, /* maxSegmentsPerLoad= */ 1,
/* enableEventMessageTrack= */ false, /* enableEventMessageTrack= */ false,
/* closedCaptionFormats */ ImmutableList.of(), /* closedCaptionFormats */ ImmutableList.of(),
/* playerTrackEmsgHandler= */ null); /* playerTrackEmsgHandler= */ null,
PlayerId.UNSET);
long nowInPeriodUs = Util.msToUs(nowMs - manifest.availabilityStartTimeMs); long nowInPeriodUs = Util.msToUs(nowMs - manifest.availabilityStartTimeMs);
ChunkHolder output = new ChunkHolder(); ChunkHolder output = new ChunkHolder();
@ -143,7 +145,8 @@ public class DefaultDashChunkSourceTest {
/* maxSegmentsPerLoad= */ 1, /* maxSegmentsPerLoad= */ 1,
/* enableEventMessageTrack= */ false, /* enableEventMessageTrack= */ false,
/* closedCaptionFormats */ ImmutableList.of(), /* closedCaptionFormats */ ImmutableList.of(),
/* playerTrackEmsgHandler= */ null); /* playerTrackEmsgHandler= */ null,
PlayerId.UNSET);
ChunkHolder output = new ChunkHolder(); ChunkHolder output = new ChunkHolder();
chunkSource.getNextChunk( chunkSource.getNextChunk(
@ -326,7 +329,8 @@ public class DefaultDashChunkSourceTest {
/* maxSegmentsPerLoad= */ 1, /* maxSegmentsPerLoad= */ 1,
/* enableEventMessageTrack= */ false, /* enableEventMessageTrack= */ false,
/* closedCaptionFormats */ ImmutableList.of(), /* closedCaptionFormats */ ImmutableList.of(),
/* playerTrackEmsgHandler= */ null); /* playerTrackEmsgHandler= */ null,
PlayerId.UNSET);
} }
private LoadErrorHandlingPolicy.LoadErrorInfo createFakeLoadErrorInfo( private LoadErrorHandlingPolicy.LoadErrorInfo createFakeLoadErrorInfo(

View file

@ -20,7 +20,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.testutil.DataSourceContractTest; import com.google.android.exoplayer2.testutil.DataSourceContractTest;
import com.google.android.exoplayer2.testutil.HttpDataSourceTestEnv; import com.google.android.exoplayer2.testutil.HttpDataSourceTestEnv;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -44,8 +43,4 @@ public class DefaultHttpDataSourceContractTest extends DataSourceContractTest {
protected Uri getNotFoundUri() { protected Uri getNotFoundUri() {
return Uri.parse(httpDataSourceTestEnv.getNonexistentUrl()); return Uri.parse(httpDataSourceTestEnv.getNonexistentUrl());
} }
@Override
@Ignore("internal b/205811776")
public void getResponseHeaders_noNullKeysOrValues() {}
} }

View file

@ -29,6 +29,9 @@ import com.google.android.exoplayer2.upstream.DataSpec.HttpMethod;
import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Log;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.ForwardingMap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import com.google.common.net.HttpHeaders; import com.google.common.net.HttpHeaders;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -39,10 +42,10 @@ import java.net.HttpURLConnection;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.NoRouteToHostException; import java.net.NoRouteToHostException;
import java.net.URL; import java.net.URL;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
/** /**
@ -310,7 +313,18 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou
@Override @Override
public Map<String, List<String>> getResponseHeaders() { public Map<String, List<String>> getResponseHeaders() {
return connection == null ? Collections.emptyMap() : connection.getHeaderFields(); if (connection == null) {
return ImmutableMap.of();
}
// connection.getHeaderFields() always contains a null key with a value like
// ["HTTP/1.1 200 OK"]. The response code is available from HttpURLConnection#getResponseCode()
// and the HTTP version is fixed when establishing the connection.
// DataSource#getResponseHeaders() doesn't allow null keys in the returned map, so we need to
// remove it.
// connection.getHeaderFields() returns a special unmodifiable case-insensitive Map
// so we can't just remove the null key or make a copy without the null key. Instead we wrap it
// in a ForwardingMap subclass that ignores and filters out null keys in the read methods.
return new NullFilteringHeadersMap(connection.getHeaderFields());
} }
@Override @Override
@ -815,4 +829,64 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou
String contentEncoding = connection.getHeaderField("Content-Encoding"); String contentEncoding = connection.getHeaderField("Content-Encoding");
return "gzip".equalsIgnoreCase(contentEncoding); return "gzip".equalsIgnoreCase(contentEncoding);
} }
private static class NullFilteringHeadersMap extends ForwardingMap<String, List<String>> {
private final Map<String, List<String>> headers;
public NullFilteringHeadersMap(Map<String, List<String>> headers) {
this.headers = headers;
}
@Override
protected Map<String, List<String>> delegate() {
return headers;
}
@Override
public boolean containsKey(@Nullable Object key) {
return key != null && super.containsKey(key);
}
@Nullable
@Override
public List<String> get(@Nullable Object key) {
return key == null ? null : super.get(key);
}
@Override
public Set<String> keySet() {
return Sets.filter(super.keySet(), key -> key != null);
}
@Override
public Set<Entry<String, List<String>>> entrySet() {
return Sets.filter(super.entrySet(), entry -> entry.getKey() != null);
}
@Override
public int size() {
return super.size() - (super.containsKey(null) ? 1 : 0);
}
@Override
public boolean isEmpty() {
return super.isEmpty() || (super.size() == 1 && super.containsKey(null));
}
@Override
public boolean containsValue(@Nullable Object value) {
return super.standardContainsValue(value);
}
@Override
public boolean equals(@Nullable Object object) {
return object != null && super.standardEquals(object);
}
@Override
public int hashCode() {
return super.standardHashCode();
}
}
} }

View file

@ -20,6 +20,7 @@ import android.os.Parcelable;
import androidx.annotation.Nullable; 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.MediaMetadata;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Log;
@ -169,6 +170,16 @@ public final class IcyHeaders implements Metadata.Entry {
metadataInterval = in.readInt(); metadataInterval = in.readInt();
} }
@Override
public void populateMediaMetadata(MediaMetadata.Builder builder) {
if (name != null) {
builder.setStation(name);
}
if (genre != null) {
builder.setGenre(genre);
}
}
@Override @Override
public boolean equals(@Nullable Object obj) { public boolean equals(@Nullable Object obj) {
if (this == obj) { if (this == obj) {

View file

@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat;
import android.os.Parcel; import android.os.Parcel;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.MediaMetadata;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -45,4 +46,23 @@ public final class IcyHeadersTest {
// Assert equals. // Assert equals.
assertThat(fromParcelIcyHeaders).isEqualTo(icyHeaders); assertThat(fromParcelIcyHeaders).isEqualTo(icyHeaders);
} }
@Test
public void populateMediaMetadata() {
IcyHeaders headers =
new IcyHeaders(
/* bitrate= */ 1234,
/* genre= */ "pop",
/* name= */ "radio station",
/* url= */ "url",
/* isPublic= */ true,
/* metadataInterval= */ 5678);
MediaMetadata.Builder builder = new MediaMetadata.Builder();
headers.populateMediaMetadata(builder);
MediaMetadata mediaMetadata = builder.build();
assertThat(mediaMetadata.station.toString()).isEqualTo("radio station");
assertThat(mediaMetadata.genre.toString()).isEqualTo("pop");
}
} }

View file

@ -22,6 +22,7 @@ import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.Extractor;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
import com.google.android.exoplayer2.extractor.mp3.Mp3Extractor; import com.google.android.exoplayer2.extractor.mp3.Mp3Extractor;
@ -94,7 +95,8 @@ public final class DefaultHlsExtractorFactory implements HlsExtractorFactory {
@Nullable List<Format> muxedCaptionFormats, @Nullable List<Format> muxedCaptionFormats,
TimestampAdjuster timestampAdjuster, TimestampAdjuster timestampAdjuster,
Map<String, List<String>> responseHeaders, Map<String, List<String>> responseHeaders,
ExtractorInput sniffingExtractorInput) ExtractorInput sniffingExtractorInput,
PlayerId playerId)
throws IOException { throws IOException {
@FileTypes.Type @FileTypes.Type
int formatInferredFileType = FileTypes.inferFileTypeFromMimeType(format.sampleMimeType); int formatInferredFileType = FileTypes.inferFileTypeFromMimeType(format.sampleMimeType);

View file

@ -26,6 +26,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
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.analytics.PlayerId;
import com.google.android.exoplayer2.source.BehindLiveWindowException; import com.google.android.exoplayer2.source.BehindLiveWindowException;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator; import com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator;
@ -122,6 +123,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private final TrackGroup trackGroup; private final TrackGroup trackGroup;
@Nullable private final List<Format> muxedCaptionFormats; @Nullable private final List<Format> muxedCaptionFormats;
private final FullSegmentEncryptionKeyCache keyCache; private final FullSegmentEncryptionKeyCache keyCache;
private final PlayerId playerId;
private boolean isTimestampMaster; private boolean isTimestampMaster;
private byte[] scratchSpace; private byte[] scratchSpace;
@ -161,13 +163,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
HlsDataSourceFactory dataSourceFactory, HlsDataSourceFactory dataSourceFactory,
@Nullable TransferListener mediaTransferListener, @Nullable TransferListener mediaTransferListener,
TimestampAdjusterProvider timestampAdjusterProvider, TimestampAdjusterProvider timestampAdjusterProvider,
@Nullable List<Format> muxedCaptionFormats) { @Nullable List<Format> muxedCaptionFormats,
PlayerId playerId) {
this.extractorFactory = extractorFactory; this.extractorFactory = extractorFactory;
this.playlistTracker = playlistTracker; this.playlistTracker = playlistTracker;
this.playlistUrls = playlistUrls; this.playlistUrls = playlistUrls;
this.playlistFormats = playlistFormats; this.playlistFormats = playlistFormats;
this.timestampAdjusterProvider = timestampAdjusterProvider; this.timestampAdjusterProvider = timestampAdjusterProvider;
this.muxedCaptionFormats = muxedCaptionFormats; this.muxedCaptionFormats = muxedCaptionFormats;
this.playerId = playerId;
keyCache = new FullSegmentEncryptionKeyCache(KEY_CACHE_SIZE); keyCache = new FullSegmentEncryptionKeyCache(KEY_CACHE_SIZE);
scratchSpace = Util.EMPTY_BYTE_ARRAY; scratchSpace = Util.EMPTY_BYTE_ARRAY;
liveEdgeInPeriodTimeUs = C.TIME_UNSET; liveEdgeInPeriodTimeUs = C.TIME_UNSET;
@ -453,7 +457,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
previous, previous,
/* mediaSegmentKey= */ keyCache.get(mediaSegmentKeyUri), /* mediaSegmentKey= */ keyCache.get(mediaSegmentKeyUri),
/* initSegmentKey= */ keyCache.get(initSegmentKeyUri), /* initSegmentKey= */ keyCache.get(initSegmentKeyUri),
shouldSpliceIn); shouldSpliceIn,
playerId);
} }
@Nullable @Nullable

View file

@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source.hls;
import android.net.Uri; import android.net.Uri;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.Extractor;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.PositionHolder;
@ -44,6 +45,7 @@ public interface HlsExtractorFactory {
* @param sniffingExtractorInput The first extractor input that will be passed to the returned * @param sniffingExtractorInput The first extractor input that will be passed to the returned
* extractor's {@link Extractor#read(ExtractorInput, PositionHolder)}. Must only be used to * extractor's {@link Extractor#read(ExtractorInput, PositionHolder)}. Must only be used to
* call {@link Extractor#sniff(ExtractorInput)}. * call {@link Extractor#sniff(ExtractorInput)}.
* @param playerId The {@link PlayerId} of the player using this extractors factory.
* @return An {@link HlsMediaChunkExtractor}. * @return An {@link HlsMediaChunkExtractor}.
* @throws IOException If an I/O error is encountered while sniffing. * @throws IOException If an I/O error is encountered while sniffing.
*/ */
@ -53,6 +55,7 @@ public interface HlsExtractorFactory {
@Nullable List<Format> muxedCaptionFormats, @Nullable List<Format> muxedCaptionFormats,
TimestampAdjuster timestampAdjuster, TimestampAdjuster timestampAdjuster,
Map<String, List<String>> responseHeaders, Map<String, List<String>> responseHeaders,
ExtractorInput sniffingExtractorInput) ExtractorInput sniffingExtractorInput,
PlayerId playerId)
throws IOException; throws IOException;
} }

View file

@ -21,6 +21,7 @@ import android.net.Uri;
import androidx.annotation.Nullable; 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.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.DefaultExtractorInput;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
@ -91,7 +92,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@Nullable HlsMediaChunk previousChunk, @Nullable HlsMediaChunk previousChunk,
@Nullable byte[] mediaSegmentKey, @Nullable byte[] mediaSegmentKey,
@Nullable byte[] initSegmentKey, @Nullable byte[] initSegmentKey,
boolean shouldSpliceIn) { boolean shouldSpliceIn,
PlayerId playerId) {
// Media segment. // Media segment.
HlsMediaPlaylist.SegmentBase mediaSegment = segmentBaseHolder.segmentBase; HlsMediaPlaylist.SegmentBase mediaSegment = segmentBaseHolder.segmentBase;
DataSpec dataSpec = DataSpec dataSpec =
@ -184,7 +186,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
previousExtractor, previousExtractor,
id3Decoder, id3Decoder,
scratchId3Data, scratchId3Data,
shouldSpliceIn); shouldSpliceIn,
playerId);
} }
/** /**
@ -256,6 +259,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private final ParsableByteArray scratchId3Data; private final ParsableByteArray scratchId3Data;
private final boolean mediaSegmentEncrypted; private final boolean mediaSegmentEncrypted;
private final boolean initSegmentEncrypted; private final boolean initSegmentEncrypted;
private final PlayerId playerId;
private @MonotonicNonNull HlsMediaChunkExtractor extractor; private @MonotonicNonNull HlsMediaChunkExtractor extractor;
private @MonotonicNonNull HlsSampleStreamWrapper output; private @MonotonicNonNull HlsSampleStreamWrapper output;
@ -295,7 +299,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@Nullable HlsMediaChunkExtractor previousExtractor, @Nullable HlsMediaChunkExtractor previousExtractor,
Id3Decoder id3Decoder, Id3Decoder id3Decoder,
ParsableByteArray scratchId3Data, ParsableByteArray scratchId3Data,
boolean shouldSpliceIn) { boolean shouldSpliceIn,
PlayerId playerId) {
super( super(
mediaDataSource, mediaDataSource,
dataSpec, dataSpec,
@ -324,6 +329,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
this.id3Decoder = id3Decoder; this.id3Decoder = id3Decoder;
this.scratchId3Data = scratchId3Data; this.scratchId3Data = scratchId3Data;
this.shouldSpliceIn = shouldSpliceIn; this.shouldSpliceIn = shouldSpliceIn;
this.playerId = playerId;
sampleQueueFirstSampleIndices = ImmutableList.of(); sampleQueueFirstSampleIndices = ImmutableList.of();
uid = uidSource.getAndIncrement(); uid = uidSource.getAndIncrement();
} }
@ -497,7 +503,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
muxedCaptionFormats, muxedCaptionFormats,
timestampAdjuster, timestampAdjuster,
dataSource.getResponseHeaders(), dataSource.getResponseHeaders(),
extractorInput); extractorInput,
playerId);
if (extractor.isPackedAudioExtractor()) { if (extractor.isPackedAudioExtractor()) {
output.setSampleOffsetUs( output.setSampleOffsetUs(
id3Timestamp != C.TIME_UNSET id3Timestamp != C.TIME_UNSET

View file

@ -21,6 +21,7 @@ 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.SeekParameters; import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionEventListener;
@ -80,6 +81,7 @@ public final class HlsMediaPeriod
private final boolean allowChunklessPreparation; private final boolean allowChunklessPreparation;
private final @HlsMediaSource.MetadataType int metadataType; private final @HlsMediaSource.MetadataType int metadataType;
private final boolean useSessionKeys; private final boolean useSessionKeys;
private final PlayerId playerId;
@Nullable private Callback callback; @Nullable private Callback callback;
private int pendingPrepareCount; private int pendingPrepareCount;
@ -123,7 +125,8 @@ public final class HlsMediaPeriod
CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory, CompositeSequenceableLoaderFactory compositeSequenceableLoaderFactory,
boolean allowChunklessPreparation, boolean allowChunklessPreparation,
@HlsMediaSource.MetadataType int metadataType, @HlsMediaSource.MetadataType int metadataType,
boolean useSessionKeys) { boolean useSessionKeys,
PlayerId playerId) {
this.extractorFactory = extractorFactory; this.extractorFactory = extractorFactory;
this.playlistTracker = playlistTracker; this.playlistTracker = playlistTracker;
this.dataSourceFactory = dataSourceFactory; this.dataSourceFactory = dataSourceFactory;
@ -137,6 +140,7 @@ public final class HlsMediaPeriod
this.allowChunklessPreparation = allowChunklessPreparation; this.allowChunklessPreparation = allowChunklessPreparation;
this.metadataType = metadataType; this.metadataType = metadataType;
this.useSessionKeys = useSessionKeys; this.useSessionKeys = useSessionKeys;
this.playerId = playerId;
compositeSequenceableLoader = compositeSequenceableLoader =
compositeSequenceableLoaderFactory.createCompositeSequenceableLoader(); compositeSequenceableLoaderFactory.createCompositeSequenceableLoader();
streamWrapperIndices = new IdentityHashMap<>(); streamWrapperIndices = new IdentityHashMap<>();
@ -771,7 +775,8 @@ public final class HlsMediaPeriod
dataSourceFactory, dataSourceFactory,
mediaTransferListener, mediaTransferListener,
timestampAdjusterProvider, timestampAdjusterProvider,
muxedCaptionFormats); muxedCaptionFormats,
playerId);
return new HlsSampleStreamWrapper( return new HlsSampleStreamWrapper(
trackType, trackType,
/* callback= */ this, /* callback= */ this,

View file

@ -19,6 +19,7 @@ import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import static java.lang.annotation.RetentionPolicy.SOURCE; import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.net.Uri; import android.net.Uri;
import android.os.Looper;
import android.os.SystemClock; import android.os.SystemClock;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -466,6 +467,8 @@ public final class HlsMediaSource extends BaseMediaSource
protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) { protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
this.mediaTransferListener = mediaTransferListener; this.mediaTransferListener = mediaTransferListener;
drmSessionManager.prepare(); drmSessionManager.prepare();
drmSessionManager.setPlayer(
/* playbackLooper= */ checkNotNull(Looper.myLooper()), getPlayerId());
MediaSourceEventListener.EventDispatcher eventDispatcher = MediaSourceEventListener.EventDispatcher eventDispatcher =
createEventDispatcher(/* mediaPeriodId= */ null); createEventDispatcher(/* mediaPeriodId= */ null);
playlistTracker.start( playlistTracker.start(
@ -494,7 +497,8 @@ public final class HlsMediaSource extends BaseMediaSource
compositeSequenceableLoaderFactory, compositeSequenceableLoaderFactory,
allowChunklessPreparation, allowChunklessPreparation,
metadataType, metadataType,
useSessionKeys); useSessionKeys,
getPlayerId());
} }
@Override @Override

View file

@ -23,7 +23,6 @@ import static java.lang.Math.min;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import android.os.Looper;
import android.util.SparseIntArray; import android.util.SparseIntArray;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
@ -1100,12 +1099,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
boolean isAudioVideo = type == C.TRACK_TYPE_AUDIO || type == C.TRACK_TYPE_VIDEO; boolean isAudioVideo = type == C.TRACK_TYPE_AUDIO || type == C.TRACK_TYPE_VIDEO;
HlsSampleQueue sampleQueue = HlsSampleQueue sampleQueue =
new HlsSampleQueue( new HlsSampleQueue(allocator, drmSessionManager, drmEventDispatcher, overridingDrmInitData);
allocator,
/* playbackLooper= */ handler.getLooper(),
drmSessionManager,
drmEventDispatcher,
overridingDrmInitData);
sampleQueue.setStartTimeUs(lastSeekPositionUs); sampleQueue.setStartTimeUs(lastSeekPositionUs);
if (isAudioVideo) { if (isAudioVideo) {
sampleQueue.setDrmInitData(drmInitData); sampleQueue.setDrmInitData(drmInitData);
@ -1392,23 +1386,31 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
Format sampleFormat = Assertions.checkStateNotNull(sampleQueues[i].getUpstreamFormat()); Format sampleFormat = Assertions.checkStateNotNull(sampleQueues[i].getUpstreamFormat());
if (i == primaryExtractorTrackIndex) { if (i == primaryExtractorTrackIndex) {
Format[] formats = new Format[chunkSourceTrackCount]; Format[] formats = new Format[chunkSourceTrackCount];
if (chunkSourceTrackCount == 1) { for (int j = 0; j < chunkSourceTrackCount; j++) {
formats[0] = sampleFormat.withManifestFormatInfo(chunkSourceTrackGroup.getFormat(0)); Format playlistFormat = chunkSourceTrackGroup.getFormat(j);
} else { if (primaryExtractorTrackType == C.TRACK_TYPE_AUDIO && muxedAudioFormat != null) {
for (int j = 0; j < chunkSourceTrackCount; j++) { playlistFormat = playlistFormat.withManifestFormatInfo(muxedAudioFormat);
formats[j] = deriveFormat(chunkSourceTrackGroup.getFormat(j), sampleFormat, true);
} }
// If there's only a single variant (chunkSourceTrackCount == 1) then we can safely
// retain all fields from sampleFormat. Else we need to use deriveFormat to retain only
// the fields that will be the same for all variants.
formats[j] =
chunkSourceTrackCount == 1
? sampleFormat.withManifestFormatInfo(playlistFormat)
: deriveFormat(playlistFormat, sampleFormat, /* propagateBitrates= */ true);
} }
trackGroups[i] = new TrackGroup(formats); trackGroups[i] = new TrackGroup(formats);
primaryTrackGroupIndex = i; primaryTrackGroupIndex = i;
} else { } else {
@Nullable @Nullable
Format trackFormat = Format playlistFormat =
primaryExtractorTrackType == C.TRACK_TYPE_VIDEO primaryExtractorTrackType == C.TRACK_TYPE_VIDEO
&& MimeTypes.isAudio(sampleFormat.sampleMimeType) && MimeTypes.isAudio(sampleFormat.sampleMimeType)
? muxedAudioFormat ? muxedAudioFormat
: null; : null;
trackGroups[i] = new TrackGroup(deriveFormat(trackFormat, sampleFormat, false)); trackGroups[i] =
new TrackGroup(
deriveFormat(playlistFormat, sampleFormat, /* propagateBitrates= */ false));
} }
} }
this.trackGroups = createTrackGroupArrayWithDrmInfo(trackGroups); this.trackGroups = createTrackGroupArrayWithDrmInfo(trackGroups);
@ -1496,8 +1498,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
* sample format that may have been obtained from a chunk belonging to a different track in the * sample format that may have been obtained from a chunk belonging to a different track in the
* same track group. * same track group.
* *
* <p>Note: Since the sample format may have been obtained from a chunk belonging to a different
* track, it should not be used as a source for data that may vary between tracks.
*
* @param playlistFormat The format information obtained from the master playlist. * @param playlistFormat The format information obtained from the master playlist.
* @param sampleFormat The format information obtained from the samples. * @param sampleFormat The format information obtained from samples within a chunk. The chunk may
* belong to a different track in the same track group.
* @param propagateBitrates Whether the bitrates from the playlist format should be included in * @param propagateBitrates Whether the bitrates from the playlist format should be included in
* the derived format. * the derived format.
* @return The derived track format. * @return The derived track format.
@ -1627,11 +1633,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
private HlsSampleQueue( private HlsSampleQueue(
Allocator allocator, Allocator allocator,
Looper playbackLooper,
DrmSessionManager drmSessionManager, DrmSessionManager drmSessionManager,
DrmSessionEventListener.EventDispatcher eventDispatcher, DrmSessionEventListener.EventDispatcher eventDispatcher,
Map<String, DrmInitData> overridingDrmInitData) { Map<String, DrmInitData> overridingDrmInitData) {
super(allocator, playbackLooper, drmSessionManager, eventDispatcher); super(allocator, drmSessionManager, eventDispatcher);
this.overridingDrmInitData = overridingDrmInitData; this.overridingDrmInitData = overridingDrmInitData;
} }

View file

@ -34,6 +34,7 @@ import android.text.TextUtils;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.ExtractorOutput;
import com.google.android.exoplayer2.source.mediaparser.InputReaderAdapterV30; import com.google.android.exoplayer2.source.mediaparser.InputReaderAdapterV30;
@ -42,6 +43,7 @@ import com.google.android.exoplayer2.source.mediaparser.OutputConsumerAdapterV30
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.FileTypes; import com.google.android.exoplayer2.util.FileTypes;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.io.IOException; import java.io.IOException;
@ -60,7 +62,8 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt
muxedCaptionFormats, muxedCaptionFormats,
timestampAdjuster, timestampAdjuster,
responseHeaders, responseHeaders,
sniffingExtractorInput) -> { sniffingExtractorInput,
playerId) -> {
if (FileTypes.inferFileTypeFromMimeType(format.sampleMimeType) == FileTypes.WEBVTT) { if (FileTypes.inferFileTypeFromMimeType(format.sampleMimeType) == FileTypes.WEBVTT) {
// The segment contains WebVTT. MediaParser does not support WebVTT parsing, so we use the // The segment contains WebVTT. MediaParser does not support WebVTT parsing, so we use the
// bundled extractor. // bundled extractor.
@ -100,6 +103,7 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt
format, format,
overrideInBandCaptionDeclarations, overrideInBandCaptionDeclarations,
muxedCaptionMediaFormats, muxedCaptionMediaFormats,
playerId,
MediaParser.PARSER_NAME_FMP4, MediaParser.PARSER_NAME_FMP4,
MediaParser.PARSER_NAME_AC3, MediaParser.PARSER_NAME_AC3,
MediaParser.PARSER_NAME_AC4, MediaParser.PARSER_NAME_AC4,
@ -119,7 +123,8 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt
format, format,
overrideInBandCaptionDeclarations, overrideInBandCaptionDeclarations,
muxedCaptionMediaFormats, muxedCaptionMediaFormats,
/* leadingBytesToSkip= */ peekingInputReader.totalPeekedBytes); /* leadingBytesToSkip= */ peekingInputReader.totalPeekedBytes,
playerId);
}; };
private final OutputConsumerAdapterV30 outputConsumerAdapter; private final OutputConsumerAdapterV30 outputConsumerAdapter;
@ -128,6 +133,8 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt
private final Format format; private final Format format;
private final boolean overrideInBandCaptionDeclarations; private final boolean overrideInBandCaptionDeclarations;
private final ImmutableList<MediaFormat> muxedCaptionMediaFormats; private final ImmutableList<MediaFormat> muxedCaptionMediaFormats;
private final PlayerId playerId;
private int pendingSkipBytes; private int pendingSkipBytes;
/** /**
@ -146,6 +153,7 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt
* that {@link MediaParser} should expose. * that {@link MediaParser} should expose.
* @param leadingBytesToSkip The number of bytes to skip from the start of the input before * @param leadingBytesToSkip The number of bytes to skip from the start of the input before
* starting extraction. * starting extraction.
* @param playerId The {@link PlayerId} of the player using this chunk extractor.
*/ */
public MediaParserHlsMediaChunkExtractor( public MediaParserHlsMediaChunkExtractor(
MediaParser mediaParser, MediaParser mediaParser,
@ -153,12 +161,14 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt
Format format, Format format,
boolean overrideInBandCaptionDeclarations, boolean overrideInBandCaptionDeclarations,
ImmutableList<MediaFormat> muxedCaptionMediaFormats, ImmutableList<MediaFormat> muxedCaptionMediaFormats,
int leadingBytesToSkip) { int leadingBytesToSkip,
PlayerId playerId) {
this.mediaParser = mediaParser; this.mediaParser = mediaParser;
this.outputConsumerAdapter = outputConsumerAdapter; this.outputConsumerAdapter = outputConsumerAdapter;
this.overrideInBandCaptionDeclarations = overrideInBandCaptionDeclarations; this.overrideInBandCaptionDeclarations = overrideInBandCaptionDeclarations;
this.muxedCaptionMediaFormats = muxedCaptionMediaFormats; this.muxedCaptionMediaFormats = muxedCaptionMediaFormats;
this.format = format; this.format = format;
this.playerId = playerId;
pendingSkipBytes = leadingBytesToSkip; pendingSkipBytes = leadingBytesToSkip;
inputReaderAdapter = new InputReaderAdapterV30(); inputReaderAdapter = new InputReaderAdapterV30();
} }
@ -203,12 +213,14 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt
format, format,
overrideInBandCaptionDeclarations, overrideInBandCaptionDeclarations,
muxedCaptionMediaFormats, muxedCaptionMediaFormats,
playerId,
mediaParser.getParserName()), mediaParser.getParserName()),
outputConsumerAdapter, outputConsumerAdapter,
format, format,
overrideInBandCaptionDeclarations, overrideInBandCaptionDeclarations,
muxedCaptionMediaFormats, muxedCaptionMediaFormats,
/* leadingBytesToSkip= */ 0); /* leadingBytesToSkip= */ 0,
playerId);
} }
@Override @Override
@ -223,6 +235,7 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt
Format format, Format format,
boolean overrideInBandCaptionDeclarations, boolean overrideInBandCaptionDeclarations,
ImmutableList<MediaFormat> muxedCaptionMediaFormats, ImmutableList<MediaFormat> muxedCaptionMediaFormats,
PlayerId playerId,
String... parserNames) { String... parserNames) {
MediaParser mediaParser = MediaParser mediaParser =
parserNames.length == 1 parserNames.length == 1
@ -248,6 +261,9 @@ public final class MediaParserHlsMediaChunkExtractor implements HlsMediaChunkExt
mediaParser.setParameter(PARAMETER_TS_IGNORE_AVC_STREAM, true); mediaParser.setParameter(PARAMETER_TS_IGNORE_AVC_STREAM, true);
} }
} }
if (Util.SDK_INT >= 31) {
MediaParserUtil.setLogSessionIdOnMediaParser(mediaParser, playerId);
}
return mediaParser; return mediaParser;
} }

View file

@ -21,6 +21,7 @@ import android.net.Uri;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
import com.google.android.exoplayer2.extractor.mp3.Mp3Extractor; import com.google.android.exoplayer2.extractor.mp3.Mp3Extractor;
@ -79,7 +80,8 @@ public class DefaultHlsExtractorFactoryTest {
/* muxedCaptionFormats= */ null, /* muxedCaptionFormats= */ null,
timestampAdjuster, timestampAdjuster,
ac3ResponseHeaders, ac3ResponseHeaders,
webVttExtractorInput); webVttExtractorInput,
PlayerId.UNSET);
assertThat(result.extractor.getClass()).isEqualTo(WebvttExtractor.class); assertThat(result.extractor.getClass()).isEqualTo(WebvttExtractor.class);
} }
@ -103,7 +105,8 @@ public class DefaultHlsExtractorFactoryTest {
/* muxedCaptionFormats= */ null, /* muxedCaptionFormats= */ null,
timestampAdjuster, timestampAdjuster,
ac3ResponseHeaders, ac3ResponseHeaders,
ac3ExtractorInput); ac3ExtractorInput,
PlayerId.UNSET);
assertThat(result.extractor.getClass()).isEqualTo(Ac3Extractor.class); assertThat(result.extractor.getClass()).isEqualTo(Ac3Extractor.class);
} }
@ -125,7 +128,8 @@ public class DefaultHlsExtractorFactoryTest {
/* muxedCaptionFormats= */ null, /* muxedCaptionFormats= */ null,
timestampAdjuster, timestampAdjuster,
ac3ResponseHeaders, ac3ResponseHeaders,
tsExtractorInput); tsExtractorInput,
PlayerId.UNSET);
assertThat(result.extractor.getClass()).isEqualTo(TsExtractor.class); assertThat(result.extractor.getClass()).isEqualTo(TsExtractor.class);
} }
@ -148,7 +152,8 @@ public class DefaultHlsExtractorFactoryTest {
/* muxedCaptionFormats= */ null, /* muxedCaptionFormats= */ null,
timestampAdjuster, timestampAdjuster,
ac3ResponseHeaders, ac3ResponseHeaders,
mp3ExtractorInput); mp3ExtractorInput,
PlayerId.UNSET);
assertThat(result.extractor.getClass()).isEqualTo(Mp3Extractor.class); assertThat(result.extractor.getClass()).isEqualTo(Mp3Extractor.class);
} }
@ -170,7 +175,8 @@ public class DefaultHlsExtractorFactoryTest {
/* muxedCaptionFormats= */ null, /* muxedCaptionFormats= */ null,
timestampAdjuster, timestampAdjuster,
ImmutableMap.of("Content-Type", ImmutableList.of(MimeTypes.IMAGE_JPEG)), ImmutableMap.of("Content-Type", ImmutableList.of(MimeTypes.IMAGE_JPEG)),
tsExtractorInput); tsExtractorInput,
PlayerId.UNSET);
assertThat(result.extractor.getClass()).isEqualTo(TsExtractor.class); assertThat(result.extractor.getClass()).isEqualTo(TsExtractor.class);
} }
@ -187,7 +193,8 @@ public class DefaultHlsExtractorFactoryTest {
/* muxedCaptionFormats= */ null, /* muxedCaptionFormats= */ null,
timestampAdjuster, timestampAdjuster,
ac3ResponseHeaders, ac3ResponseHeaders,
emptyExtractorInput); emptyExtractorInput,
PlayerId.UNSET);
// The format indicates WebVTT so we expect a WebVTT extractor. // The format indicates WebVTT so we expect a WebVTT extractor.
assertThat(result.extractor.getClass()).isEqualTo(WebvttExtractor.class); assertThat(result.extractor.getClass()).isEqualTo(WebvttExtractor.class);
@ -205,7 +212,8 @@ public class DefaultHlsExtractorFactoryTest {
/* muxedCaptionFormats= */ null, /* muxedCaptionFormats= */ null,
timestampAdjuster, timestampAdjuster,
ac3ResponseHeaders, ac3ResponseHeaders,
emptyExtractorInput); emptyExtractorInput,
PlayerId.UNSET);
// No format info, so we expect an AC-3 Extractor, as per HTTP Content-Type header. // No format info, so we expect an AC-3 Extractor, as per HTTP Content-Type header.
assertThat(result.extractor.getClass()).isEqualTo(Ac3Extractor.class); assertThat(result.extractor.getClass()).isEqualTo(Ac3Extractor.class);
@ -223,7 +231,8 @@ public class DefaultHlsExtractorFactoryTest {
/* muxedCaptionFormats= */ null, /* muxedCaptionFormats= */ null,
timestampAdjuster, timestampAdjuster,
/* responseHeaders= */ ImmutableMap.of(), /* responseHeaders= */ ImmutableMap.of(),
emptyExtractorInput); emptyExtractorInput,
PlayerId.UNSET);
// No format info, and no HTTP headers, so we expect an fMP4 extractor, as per file extension. // No format info, and no HTTP headers, so we expect an fMP4 extractor, as per file extension.
assertThat(result.extractor.getClass()).isEqualTo(FragmentedMp4Extractor.class); assertThat(result.extractor.getClass()).isEqualTo(FragmentedMp4Extractor.class);
@ -241,7 +250,8 @@ public class DefaultHlsExtractorFactoryTest {
/* muxedCaptionFormats= */ null, /* muxedCaptionFormats= */ null,
timestampAdjuster, timestampAdjuster,
/* responseHeaders= */ ImmutableMap.of(), /* responseHeaders= */ ImmutableMap.of(),
emptyExtractorInput); emptyExtractorInput,
PlayerId.UNSET);
// There's no information for inferring the file type, we expect the factory to fall back on // There's no information for inferring the file type, we expect the factory to fall back on
// Transport Stream. // Transport Stream.

View file

@ -22,6 +22,7 @@ import static org.mockito.Mockito.when;
import android.net.Uri; import android.net.Uri;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory;
@ -92,7 +93,8 @@ public final class HlsMediaPeriodTest {
mock(CompositeSequenceableLoaderFactory.class), mock(CompositeSequenceableLoaderFactory.class),
/* allowChunklessPreparation= */ true, /* allowChunklessPreparation= */ true,
HlsMediaSource.METADATA_TYPE_ID3, HlsMediaSource.METADATA_TYPE_ID3,
/* useSessionKeys= */ false); /* useSessionKeys= */ false,
PlayerId.UNSET);
}; };
MediaPeriodAsserts.assertGetStreamKeysAndManifestFilterIntegration( MediaPeriodAsserts.assertGetStreamKeysAndManifestFilterIntegration(

View file

@ -23,6 +23,7 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.ParsableByteArray;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.google.common.math.IntMath;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
/** /**
@ -132,6 +133,16 @@ public final class RtpPacket {
public static final int MAX_SEQUENCE_NUMBER = 0xFFFF; public static final int MAX_SEQUENCE_NUMBER = 0xFFFF;
public static final int CSRC_SIZE = 4; public static final int CSRC_SIZE = 4;
/** Returns the next sequence number of the {@code sequenceNumber}. */
public static int getNextSequenceNumber(int sequenceNumber) {
return IntMath.mod(sequenceNumber + 1, MAX_SEQUENCE_NUMBER + 1);
}
/** Returns the previous sequence number from the {@code sequenceNumber}. */
public static int getPreviousSequenceNumber(int sequenceNumber) {
return IntMath.mod(sequenceNumber - 1, MAX_SEQUENCE_NUMBER + 1);
}
private static final byte[] EMPTY = new byte[0]; private static final byte[] EMPTY = new byte[0];
/** The RTP version field (Word 0, bits 0-1), should always be 2. */ /** The RTP version field (Word 0, bits 0-1), should always be 2. */

View file

@ -34,8 +34,6 @@ import java.util.TreeSet;
/** The maximum sequence number discontinuity allowed without resetting the re-ordering buffer. */ /** The maximum sequence number discontinuity allowed without resetting the re-ordering buffer. */
@VisibleForTesting /* package */ static final int MAX_SEQUENCE_LEAP_ALLOWED = 1000; @VisibleForTesting /* package */ static final int MAX_SEQUENCE_LEAP_ALLOWED = 1000;
private static final int MAX_SEQUENCE_NUMBER = RtpPacket.MAX_SEQUENCE_NUMBER;
/** Queue size threshold for resetting the queue. 5000 packets equate about 7MB in buffer size. */ /** Queue size threshold for resetting the queue. 5000 packets equate about 7MB in buffer size. */
private static final int QUEUE_SIZE_THRESHOLD_FOR_RESET = 5000; private static final int QUEUE_SIZE_THRESHOLD_FOR_RESET = 5000;
@ -96,13 +94,13 @@ import java.util.TreeSet;
int packetSequenceNumber = packet.sequenceNumber; int packetSequenceNumber = packet.sequenceNumber;
if (!started) { if (!started) {
reset(); reset();
lastDequeuedSequenceNumber = prevSequenceNumber(packetSequenceNumber); lastDequeuedSequenceNumber = RtpPacket.getPreviousSequenceNumber(packetSequenceNumber);
started = true; started = true;
addToQueue(new RtpPacketContainer(packet, receivedTimestampMs)); addToQueue(new RtpPacketContainer(packet, receivedTimestampMs));
return true; return true;
} }
int expectedSequenceNumber = nextSequenceNumber(lastReceivedSequenceNumber); int expectedSequenceNumber = RtpPacket.getNextSequenceNumber(lastReceivedSequenceNumber);
// A positive shift means the packet succeeds the last received packet. // A positive shift means the packet succeeds the last received packet.
int sequenceNumberShift = int sequenceNumberShift =
calculateSequenceNumberShift(packetSequenceNumber, expectedSequenceNumber); calculateSequenceNumberShift(packetSequenceNumber, expectedSequenceNumber);
@ -114,7 +112,7 @@ import java.util.TreeSet;
} }
} else { } else {
// Discard all previous received packets and start subsequent receiving from here. // Discard all previous received packets and start subsequent receiving from here.
lastDequeuedSequenceNumber = prevSequenceNumber(packetSequenceNumber); lastDequeuedSequenceNumber = RtpPacket.getPreviousSequenceNumber(packetSequenceNumber);
packetQueue.clear(); packetQueue.clear();
addToQueue(new RtpPacketContainer(packet, receivedTimestampMs)); addToQueue(new RtpPacketContainer(packet, receivedTimestampMs));
return true; return true;
@ -140,7 +138,7 @@ import java.util.TreeSet;
RtpPacketContainer packetContainer = packetQueue.first(); RtpPacketContainer packetContainer = packetQueue.first();
int packetSequenceNumber = packetContainer.packet.sequenceNumber; int packetSequenceNumber = packetContainer.packet.sequenceNumber;
if (packetSequenceNumber == nextSequenceNumber(lastDequeuedSequenceNumber) if (packetSequenceNumber == RtpPacket.getNextSequenceNumber(lastDequeuedSequenceNumber)
|| cutoffTimestampMs >= packetContainer.receivedTimestampMs) { || cutoffTimestampMs >= packetContainer.receivedTimestampMs) {
packetQueue.pollFirst(); packetQueue.pollFirst();
lastDequeuedSequenceNumber = packetSequenceNumber; lastDequeuedSequenceNumber = packetSequenceNumber;
@ -168,16 +166,6 @@ import java.util.TreeSet;
} }
} }
private static int nextSequenceNumber(int sequenceNumber) {
return (sequenceNumber + 1) % MAX_SEQUENCE_NUMBER;
}
private static int prevSequenceNumber(int sequenceNumber) {
return sequenceNumber == 0
? MAX_SEQUENCE_NUMBER - 1
: (sequenceNumber - 1) % MAX_SEQUENCE_NUMBER;
}
/** /**
* Calculates the sequence number shift, accounting for wrapping around. * Calculates the sequence number shift, accounting for wrapping around.
* *
@ -193,7 +181,7 @@ import java.util.TreeSet;
int shift = int shift =
min(sequenceNumber, previousSequenceNumber) min(sequenceNumber, previousSequenceNumber)
- max(sequenceNumber, previousSequenceNumber) - max(sequenceNumber, previousSequenceNumber)
+ MAX_SEQUENCE_NUMBER; + RtpPacket.MAX_SEQUENCE_NUMBER;
// Check whether this is actually an wrap-over. For example, it is a wrap around if receiving // Check whether this is actually an wrap-over. For example, it is a wrap around if receiving
// 65500 (prevSequenceNumber) after 1 (sequenceNumber); but it is not when prevSequenceNumber // 65500 (prevSequenceNumber) after 1 (sequenceNumber); but it is not when prevSequenceNumber
// is 30000. // is 30000.

Some files were not shown because too many files have changed in this diff Show more