diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml
index 62889430ef..7bafdbef78 100644
--- a/.github/ISSUE_TEMPLATE/bug.yml
+++ b/.github/ISSUE_TEMPLATE/bug.yml
@@ -18,6 +18,7 @@ body:
label: ExoPlayer Version
description: What version of ExoPlayer are you using?
options:
+ - 2.18.3
- 2.18.2
- 2.18.1
- 2.18.0
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 3bc2239e6c..f25103a3ab 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -1,5 +1,79 @@
# Release notes
+### 2.18.3 (2023-02-16)
+
+This release corresponds to the
+[AndroidX Media3 1.0.0-rc01 release](https://github.com/androidx/media/releases/tag/1.0.0-rc01).
+
+* Core library:
+ * Tweak the renderer's decoder ordering logic to uphold the
+ `MediaCodecSelector`'s preferences, even if a decoder reports it may not
+ be able to play the media performantly. For example with default
+ selector, hardware decoder with only functional support will be
+ preferred over software decoder that fully supports the format
+ ([#10604](https://github.com/google/ExoPlayer/issues/10604)).
+ * Add `ExoPlayer.Builder.setPlaybackLooper` that sets a pre-existing
+ playback thread for a new ExoPlayer instance.
+ * Allow download manager helpers to be cleared
+ ([#10776](https://github.com/google/ExoPlayer/issues/10776)).
+ * Add parameter to `BasePlayer.seekTo` to also indicate the command used
+ for seeking.
+ * Use theme when loading drawables on API 21+
+ ([#220](https://github.com/androidx/media/issues/220)).
+ * Add `ConcatenatingMediaSource2` that allows combining multiple media
+ items into a single window
+ ([#247](https://github.com/androidx/media/issues/247)).
+* Extractors:
+ * Throw a `ParserException` instead of a `NullPointerException` if the
+ sample table (stbl) is missing a required sample description (stsd) when
+ parsing trak atoms.
+ * Correctly skip samples when seeking directly to a sync frame in fMP4
+ ([#10941](https://github.com/google/ExoPlayer/issues/10941)).
+* Audio:
+ * Use the compressed audio format bitrate to calculate the min buffer size
+ for `AudioTrack` in direct playbacks (passthrough).
+* Text:
+ * Fix `TextRenderer` passing an invalid (negative) index to
+ `Subtitle.getEventTime` if a subtitle file contains no cues.
+ * SubRip: Add support for UTF-16 files if they start with a byte order
+ mark.
+* Metadata:
+ * Parse multiple null-separated values from ID3 frames, as permitted by
+ ID3 v2.4.
+ * Add `MediaMetadata.mediaType` to denote the type of content or the type
+ of folder described by the metadata.
+ * Add `MediaMetadata.isBrowsable` as a replacement for
+ `MediaMetadata.folderType`. The folder type will be deprecated in the
+ next release.
+* DASH:
+ * Add full parsing for image adaptation sets, including tile counts
+ ([#3752](https://github.com/google/ExoPlayer/issues/3752)).
+* UI:
+ * Fix the deprecated
+ `StyledPlayerView.setControllerVisibilityListener(StyledPlayerControlView.VisibilityListener)`
+ to ensure visibility changes are passed to the registered listener
+ ([#229](https://github.com/androidx/media/issues/229)).
+ * Fix the ordering of the center player controls in `StyledPlayerView`
+ when using a right-to-left (RTL) layout
+ ([#227](https://github.com/androidx/media/issues/227)).
+* Cast extension:
+ * Bump Cast SDK version to 21.2.0.
+* IMA extension:
+ * Remove player listener of the `ImaServerSideAdInsertionMediaSource` on
+ the application thread to avoid threading issues.
+ * Add a property `focusSkipButtonWhenAvailable` to the
+ `ImaServerSideAdInsertionMediaSource.AdsLoader.Builder` to request
+ focusing the skip button on TV devices and set it to true by default.
+ * Add a method `focusSkipButton()` to the
+ `ImaServerSideAdInsertionMediaSource.AdsLoader` to programmatically
+ request to focus the skip button.
+ * Fix a bug which prevented playback from starting for a DAI stream
+ without any ads.
+ * Bump IMA SDK version to 3.29.0.
+* Demo app:
+ * Request notification permission for download notifications at runtime
+ ([#10884](https://github.com/google/ExoPlayer/issues/10884)).
+
### 2.18.2 (2022-11-22)
This release corresponds to the
diff --git a/constants.gradle b/constants.gradle
index 3068e7646b..b25526aa41 100644
--- a/constants.gradle
+++ b/constants.gradle
@@ -13,8 +13,8 @@
// limitations under the License.
project.ext {
// ExoPlayer version and version code.
- releaseVersion = '2.18.2'
- releaseVersionCode = 2_018_002
+ releaseVersion = '2.18.3'
+ releaseVersionCode = 2_018_003
minSdkVersion = 16
appTargetSdkVersion = 33
// API version before restricting local file access.
diff --git a/demos/main/src/main/AndroidManifest.xml b/demos/main/src/main/AndroidManifest.xml
index 5783424b52..adad57b650 100644
--- a/demos/main/src/main/AndroidManifest.xml
+++ b/demos/main/src/main/AndroidManifest.xml
@@ -23,6 +23,7 @@
+
@@ -35,6 +36,7 @@
android:largeHeap="true"
android:allowBackup="false"
android:requestLegacyExternalStorage="true"
+ android:supportsRtl="true"
android:name="androidx.multidex.MultiDexApplication"
tools:targetApi="29">
diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java
index e47c273455..85c5f218ba 100644
--- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java
+++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java
@@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -41,7 +42,9 @@ import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
+import androidx.annotation.DoNotInline;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.MediaItem.ClippingConfiguration;
@@ -75,6 +78,7 @@ public class SampleChooserActivity extends AppCompatActivity
private static final String TAG = "SampleChooserActivity";
private static final String GROUP_POSITION_PREFERENCE_KEY = "sample_chooser_group_position";
private static final String CHILD_POSITION_PREFERENCE_KEY = "sample_chooser_child_position";
+ private static final int POST_NOTIFICATION_PERMISSION_REQUEST_CODE = 100;
private String[] uris;
private boolean useExtensionRenderers;
@@ -82,6 +86,8 @@ public class SampleChooserActivity extends AppCompatActivity
private SampleAdapter sampleAdapter;
private MenuItem preferExtensionDecodersMenuItem;
private ExpandableListView sampleListView;
+ @Nullable private MediaItem downloadMediaItemWaitingForNotificationPermission;
+ private boolean notificationPermissionToastShown;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -170,12 +176,34 @@ public class SampleChooserActivity extends AppCompatActivity
public void onRequestPermissionsResult(
int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (requestCode == POST_NOTIFICATION_PERMISSION_REQUEST_CODE) {
+ handlePostNotificationPermissionGrantResults(grantResults);
+ } else {
+ handleExternalStoragePermissionGrantResults(grantResults);
+ }
+ }
+
+ private void handlePostNotificationPermissionGrantResults(int[] grantResults) {
+ if (!notificationPermissionToastShown
+ && (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED)) {
+ Toast.makeText(
+ getApplicationContext(), R.string.post_notification_not_granted, Toast.LENGTH_LONG)
+ .show();
+ notificationPermissionToastShown = true;
+ }
+ if (downloadMediaItemWaitingForNotificationPermission != null) {
+ // Download with or without permission to post notifications.
+ toggleDownload(downloadMediaItemWaitingForNotificationPermission);
+ downloadMediaItemWaitingForNotificationPermission = null;
+ }
+ }
+
+ private void handleExternalStoragePermissionGrantResults(int[] grantResults) {
if (grantResults.length == 0) {
// Empty results are triggered if a permission is requested while another request was already
// pending and can be safely ignored in this case.
return;
- }
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
loadSample();
} else {
Toast.makeText(getApplicationContext(), R.string.sample_list_load_error, Toast.LENGTH_LONG)
@@ -242,15 +270,26 @@ public class SampleChooserActivity extends AppCompatActivity
if (downloadUnsupportedStringId != 0) {
Toast.makeText(getApplicationContext(), downloadUnsupportedStringId, Toast.LENGTH_LONG)
.show();
+ } else if (!notificationPermissionToastShown
+ && Util.SDK_INT >= 33
+ && checkSelfPermission(Api33.getPostNotificationPermissionString())
+ != PackageManager.PERMISSION_GRANTED) {
+ downloadMediaItemWaitingForNotificationPermission = playlistHolder.mediaItems.get(0);
+ requestPermissions(
+ new String[] {Api33.getPostNotificationPermissionString()},
+ /* requestCode= */ POST_NOTIFICATION_PERMISSION_REQUEST_CODE);
} else {
- RenderersFactory renderersFactory =
- DemoUtil.buildRenderersFactory(
- /* context= */ this, isNonNullAndChecked(preferExtensionDecodersMenuItem));
- downloadTracker.toggleDownload(
- getSupportFragmentManager(), playlistHolder.mediaItems.get(0), renderersFactory);
+ toggleDownload(playlistHolder.mediaItems.get(0));
}
}
+ private void toggleDownload(MediaItem mediaItem) {
+ RenderersFactory renderersFactory =
+ DemoUtil.buildRenderersFactory(
+ /* context= */ this, isNonNullAndChecked(preferExtensionDecodersMenuItem));
+ downloadTracker.toggleDownload(getSupportFragmentManager(), mediaItem, renderersFactory);
+ }
+
private int getDownloadUnsupportedStringId(PlaylistHolder playlistHolder) {
if (playlistHolder.mediaItems.size() > 1) {
return R.string.download_playlist_unsupported;
@@ -627,4 +666,13 @@ public class SampleChooserActivity extends AppCompatActivity
this.playlists = new ArrayList<>();
}
}
+
+ @RequiresApi(33)
+ private static class Api33 {
+
+ @DoNotInline
+ public static String getPostNotificationPermissionString() {
+ return Manifest.permission.POST_NOTIFICATIONS;
+ }
+ }
}
diff --git a/demos/main/src/main/res/values/strings.xml b/demos/main/src/main/res/values/strings.xml
index 49441ef7da..ce9c90d0c2 100644
--- a/demos/main/src/main/res/values/strings.xml
+++ b/demos/main/src/main/res/values/strings.xml
@@ -45,6 +45,8 @@
One or more sample lists failed to load
+ Notifications suppressed. Grant permission to see download notifications.
+
Failed to start downloadFailed to obtain offline license
diff --git a/docs/_includes/media3-known-issue-box.html b/docs/_includes/media3-known-issue-box.html
new file mode 100644
index 0000000000..93d2989c04
--- /dev/null
+++ b/docs/_includes/media3-known-issue-box.html
@@ -0,0 +1,2 @@
+**[Known issue #{{include.issue-id}}](https://github.com/androidx/media/issues/{{include.issue-id}})** - {{ include.description }}
+{:.error}
diff --git a/docs/doc/reference/allclasses-index.html b/docs/doc/reference/allclasses-index.html
index f89fe5717b..958661400f 100644
--- a/docs/doc/reference/allclasses-index.html
+++ b/docs/doc/reference/allclasses-index.html
@@ -25,7 +25,7 @@
catch(err) {
}
//-->
-var data = {"i0":2,"i1":32,"i2":2,"i3":2,"i4":2,"i5":2,"i6":2,"i7":2,"i8":32,"i9":2,"i10":2,"i11":2,"i12":2,"i13":2,"i14":2,"i15":2,"i16":2,"i17":2,"i18":2,"i19":2,"i20":2,"i21":2,"i22":2,"i23":2,"i24":2,"i25":2,"i26":2,"i27":2,"i28":2,"i29":2,"i30":2,"i31":2,"i32":2,"i33":2,"i34":2,"i35":2,"i36":2,"i37":2,"i38":2,"i39":2,"i40":2,"i41":2,"i42":2,"i43":2,"i44":2,"i45":2,"i46":1,"i47":2,"i48":2,"i49":1,"i50":2,"i51":2,"i52":2,"i53":2,"i54":2,"i55":2,"i56":2,"i57":32,"i58":2,"i59":2,"i60":32,"i61":1,"i62":1,"i63":1,"i64":2,"i65":8,"i66":32,"i67":2,"i68":32,"i69":2,"i70":1,"i71":2,"i72":2,"i73":2,"i74":2,"i75":1,"i76":1,"i77":2,"i78":32,"i79":1,"i80":1,"i81":32,"i82":2,"i83":2,"i84":2,"i85":2,"i86":2,"i87":2,"i88":1,"i89":32,"i90":2,"i91":2,"i92":2,"i93":8,"i94":2,"i95":2,"i96":2,"i97":2,"i98":2,"i99":2,"i100":1,"i101":1,"i102":2,"i103":8,"i104":1,"i105":1,"i106":2,"i107":1,"i108":8,"i109":8,"i110":1,"i111":32,"i112":8,"i113":8,"i114":2,"i115":2,"i116":2,"i117":1,"i118":1,"i119":2,"i120":2,"i121":2,"i122":2,"i123":2,"i124":2,"i125":2,"i126":2,"i127":2,"i128":2,"i129":2,"i130":2,"i131":8,"i132":2,"i133":2,"i134":2,"i135":2,"i136":2,"i137":1,"i138":2,"i139":1,"i140":2,"i141":1,"i142":1,"i143":2,"i144":2,"i145":2,"i146":2,"i147":2,"i148":2,"i149":2,"i150":2,"i151":2,"i152":32,"i153":32,"i154":32,"i155":32,"i156":32,"i157":32,"i158":32,"i159":32,"i160":32,"i161":32,"i162":32,"i163":32,"i164":32,"i165":32,"i166":32,"i167":32,"i168":32,"i169":32,"i170":32,"i171":32,"i172":32,"i173":32,"i174":32,"i175":32,"i176":32,"i177":32,"i178":32,"i179":32,"i180":1,"i181":8,"i182":1,"i183":2,"i184":2,"i185":2,"i186":8,"i187":2,"i188":2,"i189":32,"i190":1,"i191":2,"i192":32,"i193":2,"i194":1,"i195":1,"i196":2,"i197":2,"i198":1,"i199":1,"i200":2,"i201":2,"i202":32,"i203":2,"i204":2,"i205":2,"i206":2,"i207":2,"i208":2,"i209":2,"i210":2,"i211":2,"i212":1,"i213":1,"i214":1,"i215":2,"i216":2,"i217":2,"i218":1,"i219":1,"i220":2,"i221":2,"i222":8,"i223":32,"i224":1,"i225":1,"i226":1,"i227":1,"i228":2,"i229":2,"i230":1,"i231":2,"i232":2,"i233":2,"i234":2,"i235":1,"i236":2,"i237":2,"i238":2,"i239":1,"i240":2,"i241":2,"i242":8,"i243":1,"i244":2,"i245":2,"i246":2,"i247":2,"i248":2,"i249":8,"i250":2,"i251":2,"i252":2,"i253":2,"i254":1,"i255":8,"i256":2,"i257":2,"i258":32,"i259":2,"i260":32,"i261":32,"i262":32,"i263":2,"i264":2,"i265":2,"i266":1,"i267":1,"i268":2,"i269":2,"i270":2,"i271":2,"i272":8,"i273":2,"i274":2,"i275":1,"i276":2,"i277":2,"i278":8,"i279":1,"i280":2,"i281":1,"i282":2,"i283":1,"i284":1,"i285":1,"i286":1,"i287":2,"i288":2,"i289":2,"i290":2,"i291":8,"i292":2,"i293":2,"i294":2,"i295":2,"i296":32,"i297":32,"i298":2,"i299":1,"i300":2,"i301":1,"i302":1,"i303":2,"i304":2,"i305":2,"i306":8,"i307":2,"i308":32,"i309":8,"i310":2,"i311":1,"i312":2,"i313":32,"i314":32,"i315":2,"i316":2,"i317":2,"i318":2,"i319":1,"i320":1,"i321":2,"i322":2,"i323":8,"i324":32,"i325":32,"i326":2,"i327":2,"i328":2,"i329":2,"i330":2,"i331":2,"i332":2,"i333":2,"i334":2,"i335":2,"i336":2,"i337":2,"i338":2,"i339":2,"i340":2,"i341":2,"i342":2,"i343":2,"i344":2,"i345":2,"i346":8,"i347":32,"i348":2,"i349":2,"i350":2,"i351":2,"i352":2,"i353":2,"i354":2,"i355":2,"i356":2,"i357":2,"i358":2,"i359":2,"i360":2,"i361":2,"i362":2,"i363":2,"i364":2,"i365":2,"i366":2,"i367":2,"i368":2,"i369":1,"i370":2,"i371":2,"i372":2,"i373":2,"i374":32,"i375":2,"i376":2,"i377":2,"i378":2,"i379":2,"i380":2,"i381":2,"i382":2,"i383":2,"i384":2,"i385":32,"i386":2,"i387":2,"i388":32,"i389":2,"i390":2,"i391":32,"i392":2,"i393":2,"i394":2,"i395":32,"i396":32,"i397":2,"i398":1,"i399":1,"i400":1,"i401":1,"i402":8,"i403":2,"i404":1,"i405":8,"i406":1,"i407":2,"i408":1,"i409":2,"i410":2,"i411":2,"i412":2,"i413":8,"i414":2,"i415":2,"i416":2,"i417":1,"i418":8,"i419":32,"i420":1,"i421":2,"i422":1,"i423":1,"i424":1,"i425":2,"i426":32,"i427":2,"i428":2,"i429":2,"i430":2,"i431":2,"i432":1,"i433":2,"i434":2,"i435":2,"i436":1,"i437":2,"i438":2,"i439":2,"i440":1,"i441":32,"i442":1,"i443":2,"i444":32,"i445":1,"i446":1,"i447":2,"i448":1,"i449":1,"i450":2,"i451":1,"i452":2,"i453":2,"i454":2,"i455":2,"i456":2,"i457":2,"i458":2,"i459":2,"i460":1,"i461":2,"i462":2,"i463":32,"i464":2,"i465":1,"i466":1,"i467":1,"i468":1,"i469":2,"i470":8,"i471":32,"i472":1,"i473":1,"i474":1,"i475":2,"i476":1,"i477":1,"i478":1,"i479":2,"i480":2,"i481":2,"i482":2,"i483":8,"i484":32,"i485":1,"i486":2,"i487":1,"i488":1,"i489":32,"i490":2,"i491":2,"i492":2,"i493":1,"i494":2,"i495":1,"i496":1,"i497":1,"i498":2,"i499":2,"i500":2,"i501":2,"i502":2,"i503":2,"i504":2,"i505":2,"i506":2,"i507":2,"i508":2,"i509":2,"i510":2,"i511":2,"i512":2,"i513":2,"i514":2,"i515":2,"i516":2,"i517":2,"i518":2,"i519":2,"i520":2,"i521":8,"i522":2,"i523":2,"i524":2,"i525":2,"i526":2,"i527":1,"i528":2,"i529":2,"i530":2,"i531":2,"i532":2,"i533":2,"i534":2,"i535":2,"i536":2,"i537":2,"i538":2,"i539":1,"i540":2,"i541":2,"i542":2,"i543":2,"i544":8,"i545":2,"i546":2,"i547":2,"i548":8,"i549":2,"i550":32,"i551":1,"i552":2,"i553":2,"i554":2,"i555":2,"i556":2,"i557":8,"i558":2,"i559":2,"i560":32,"i561":32,"i562":2,"i563":2,"i564":2,"i565":2,"i566":2,"i567":2,"i568":2,"i569":2,"i570":2,"i571":2,"i572":2,"i573":2,"i574":2,"i575":2,"i576":2,"i577":2,"i578":2,"i579":2,"i580":2,"i581":32,"i582":2,"i583":8,"i584":1,"i585":1,"i586":1,"i587":2,"i588":2,"i589":2,"i590":2,"i591":8,"i592":2,"i593":2,"i594":1,"i595":2,"i596":2,"i597":1,"i598":2,"i599":1,"i600":1,"i601":1,"i602":1,"i603":2,"i604":8,"i605":2,"i606":2,"i607":2,"i608":2,"i609":1,"i610":1,"i611":2,"i612":2,"i613":1,"i614":2,"i615":1,"i616":2,"i617":2,"i618":1,"i619":2,"i620":2,"i621":2,"i622":32,"i623":2,"i624":2,"i625":2,"i626":2,"i627":2,"i628":2,"i629":32,"i630":2,"i631":2,"i632":2,"i633":2,"i634":2,"i635":8,"i636":1,"i637":1,"i638":1,"i639":1,"i640":8,"i641":8,"i642":1,"i643":2,"i644":2,"i645":2,"i646":2,"i647":1,"i648":2,"i649":2,"i650":1,"i651":2,"i652":8,"i653":1,"i654":8,"i655":32,"i656":8,"i657":8,"i658":2,"i659":2,"i660":2,"i661":2,"i662":2,"i663":2,"i664":2,"i665":2,"i666":1,"i667":2,"i668":2,"i669":2,"i670":8,"i671":2,"i672":2,"i673":2,"i674":2,"i675":2,"i676":2,"i677":2,"i678":2,"i679":2,"i680":2,"i681":2,"i682":2,"i683":2,"i684":8,"i685":1,"i686":2,"i687":2,"i688":2,"i689":2,"i690":2,"i691":2,"i692":2,"i693":2,"i694":2,"i695":2,"i696":1,"i697":1,"i698":1,"i699":1,"i700":2,"i701":1,"i702":1,"i703":2,"i704":1,"i705":8,"i706":1,"i707":2,"i708":1,"i709":2,"i710":2,"i711":32,"i712":2,"i713":2,"i714":2,"i715":2,"i716":1,"i717":32,"i718":2,"i719":2,"i720":2,"i721":2,"i722":32,"i723":2,"i724":1,"i725":2,"i726":2,"i727":1,"i728":2,"i729":32,"i730":2,"i731":2,"i732":2,"i733":1,"i734":1,"i735":1,"i736":2,"i737":1,"i738":1,"i739":2,"i740":8,"i741":2,"i742":2,"i743":8,"i744":1,"i745":2,"i746":8,"i747":8,"i748":2,"i749":2,"i750":1,"i751":8,"i752":2,"i753":2,"i754":2,"i755":2,"i756":2,"i757":2,"i758":2,"i759":2,"i760":2,"i761":2,"i762":2,"i763":2,"i764":2,"i765":2,"i766":2,"i767":2,"i768":2,"i769":2,"i770":2,"i771":1,"i772":1,"i773":2,"i774":2,"i775":2,"i776":32,"i777":32,"i778":2,"i779":2,"i780":2,"i781":2,"i782":2,"i783":1,"i784":1,"i785":2,"i786":1,"i787":2,"i788":2,"i789":1,"i790":1,"i791":1,"i792":2,"i793":1,"i794":1,"i795":32,"i796":1,"i797":1,"i798":1,"i799":1,"i800":1,"i801":1,"i802":2,"i803":1,"i804":1,"i805":2,"i806":1,"i807":2,"i808":2,"i809":8,"i810":32,"i811":2,"i812":1,"i813":1,"i814":1,"i815":2,"i816":1,"i817":2,"i818":2,"i819":2,"i820":2,"i821":2,"i822":2,"i823":32,"i824":2,"i825":32,"i826":2,"i827":2,"i828":2,"i829":2,"i830":1,"i831":1,"i832":8,"i833":2,"i834":2,"i835":2,"i836":2,"i837":2,"i838":1,"i839":32,"i840":2,"i841":2,"i842":2,"i843":32,"i844":2,"i845":2,"i846":2,"i847":2,"i848":2,"i849":2,"i850":8,"i851":2,"i852":2,"i853":2,"i854":2,"i855":2,"i856":2,"i857":8,"i858":2,"i859":1,"i860":2,"i861":2,"i862":2,"i863":2,"i864":2,"i865":2,"i866":2,"i867":2,"i868":2,"i869":2,"i870":8,"i871":32,"i872":2,"i873":2,"i874":1,"i875":1,"i876":2,"i877":2,"i878":2,"i879":2,"i880":2,"i881":1,"i882":1,"i883":32,"i884":2,"i885":2,"i886":32,"i887":32,"i888":2,"i889":1,"i890":32,"i891":32,"i892":32,"i893":2,"i894":32,"i895":32,"i896":32,"i897":2,"i898":1,"i899":1,"i900":2,"i901":1,"i902":2,"i903":2,"i904":1,"i905":1,"i906":2,"i907":2,"i908":1,"i909":1,"i910":1,"i911":32,"i912":32,"i913":2,"i914":32,"i915":2,"i916":2,"i917":32,"i918":2,"i919":2,"i920":2,"i921":2,"i922":8,"i923":2,"i924":2,"i925":2,"i926":2,"i927":2,"i928":1,"i929":1,"i930":2,"i931":2,"i932":2,"i933":2,"i934":2,"i935":2,"i936":2,"i937":2,"i938":2,"i939":2,"i940":8,"i941":1,"i942":32,"i943":32,"i944":1,"i945":1,"i946":32,"i947":32,"i948":32,"i949":32,"i950":32,"i951":32,"i952":2,"i953":1,"i954":2,"i955":2,"i956":32,"i957":2,"i958":2,"i959":2,"i960":2,"i961":32,"i962":2,"i963":1,"i964":2,"i965":2,"i966":1,"i967":2,"i968":2,"i969":2,"i970":1,"i971":2,"i972":2,"i973":2,"i974":2,"i975":2,"i976":2,"i977":2,"i978":2,"i979":1,"i980":1,"i981":2,"i982":2,"i983":2,"i984":2,"i985":8,"i986":2,"i987":2,"i988":2,"i989":1,"i990":8,"i991":1,"i992":32,"i993":32,"i994":2,"i995":2,"i996":1,"i997":1,"i998":2,"i999":1,"i1000":2,"i1001":2,"i1002":2,"i1003":2,"i1004":2,"i1005":2,"i1006":2,"i1007":2,"i1008":2,"i1009":2,"i1010":2,"i1011":2,"i1012":2,"i1013":1,"i1014":1,"i1015":2,"i1016":1,"i1017":2,"i1018":2,"i1019":1,"i1020":2,"i1021":1,"i1022":1,"i1023":2,"i1024":1,"i1025":2,"i1026":1,"i1027":1,"i1028":1,"i1029":1,"i1030":2,"i1031":2,"i1032":1,"i1033":2,"i1034":2,"i1035":2,"i1036":2,"i1037":2,"i1038":2,"i1039":2,"i1040":2,"i1041":2,"i1042":2,"i1043":2,"i1044":2,"i1045":2,"i1046":2,"i1047":2,"i1048":2,"i1049":2,"i1050":2,"i1051":2,"i1052":2,"i1053":2,"i1054":2,"i1055":2,"i1056":2,"i1057":2,"i1058":2,"i1059":2,"i1060":2,"i1061":1,"i1062":2,"i1063":2,"i1064":1,"i1065":1,"i1066":1,"i1067":1,"i1068":1,"i1069":1,"i1070":1,"i1071":1,"i1072":1,"i1073":2,"i1074":2,"i1075":1,"i1076":2,"i1077":2,"i1078":2,"i1079":2,"i1080":2,"i1081":2,"i1082":2,"i1083":2,"i1084":2,"i1085":1,"i1086":1,"i1087":2,"i1088":2,"i1089":2,"i1090":2,"i1091":2,"i1092":8,"i1093":2,"i1094":2,"i1095":2,"i1096":2,"i1097":2,"i1098":2,"i1099":2,"i1100":2,"i1101":2,"i1102":2,"i1103":2,"i1104":1,"i1105":1,"i1106":1,"i1107":2,"i1108":1,"i1109":1,"i1110":32,"i1111":2,"i1112":1,"i1113":1,"i1114":8,"i1115":1,"i1116":2,"i1117":2,"i1118":2,"i1119":2,"i1120":32,"i1121":2,"i1122":2,"i1123":2,"i1124":2,"i1125":2,"i1126":1,"i1127":2,"i1128":2,"i1129":2,"i1130":2,"i1131":2,"i1132":2,"i1133":2,"i1134":32,"i1135":2,"i1136":32,"i1137":32,"i1138":2,"i1139":1,"i1140":2,"i1141":2,"i1142":2,"i1143":1,"i1144":1,"i1145":2,"i1146":2,"i1147":2,"i1148":2,"i1149":2,"i1150":2,"i1151":2,"i1152":1,"i1153":2,"i1154":1,"i1155":2,"i1156":2,"i1157":2,"i1158":2,"i1159":1,"i1160":2,"i1161":2,"i1162":32,"i1163":2,"i1164":2,"i1165":2,"i1166":1,"i1167":1,"i1168":2,"i1169":32,"i1170":2,"i1171":2,"i1172":1,"i1173":32,"i1174":2,"i1175":2,"i1176":1,"i1177":2,"i1178":2,"i1179":2,"i1180":2,"i1181":1,"i1182":2,"i1183":1,"i1184":2,"i1185":1,"i1186":2,"i1187":1,"i1188":8,"i1189":32,"i1190":2,"i1191":2,"i1192":2,"i1193":2,"i1194":2,"i1195":2,"i1196":1,"i1197":32,"i1198":2,"i1199":2,"i1200":32,"i1201":1,"i1202":2,"i1203":2,"i1204":1,"i1205":32,"i1206":2,"i1207":2,"i1208":2,"i1209":2,"i1210":2,"i1211":8,"i1212":32,"i1213":8,"i1214":8,"i1215":32,"i1216":2,"i1217":2,"i1218":2,"i1219":2,"i1220":2,"i1221":2,"i1222":2,"i1223":2,"i1224":1,"i1225":2,"i1226":32,"i1227":2,"i1228":1,"i1229":2,"i1230":1,"i1231":2,"i1232":2,"i1233":2,"i1234":2,"i1235":2,"i1236":2,"i1237":2,"i1238":2,"i1239":2,"i1240":2,"i1241":8,"i1242":2,"i1243":2,"i1244":2,"i1245":2,"i1246":2,"i1247":2,"i1248":2,"i1249":32,"i1250":32,"i1251":2,"i1252":2,"i1253":2,"i1254":2,"i1255":2,"i1256":2,"i1257":2,"i1258":2,"i1259":2,"i1260":1,"i1261":2};
+var data = {"i0":2,"i1":32,"i2":2,"i3":2,"i4":2,"i5":2,"i6":2,"i7":2,"i8":32,"i9":2,"i10":2,"i11":2,"i12":2,"i13":2,"i14":2,"i15":2,"i16":2,"i17":2,"i18":2,"i19":2,"i20":2,"i21":2,"i22":2,"i23":2,"i24":2,"i25":2,"i26":2,"i27":2,"i28":2,"i29":2,"i30":2,"i31":2,"i32":2,"i33":2,"i34":2,"i35":2,"i36":2,"i37":2,"i38":2,"i39":2,"i40":2,"i41":2,"i42":2,"i43":2,"i44":2,"i45":2,"i46":1,"i47":2,"i48":2,"i49":1,"i50":2,"i51":2,"i52":2,"i53":2,"i54":2,"i55":2,"i56":2,"i57":32,"i58":2,"i59":2,"i60":32,"i61":1,"i62":1,"i63":1,"i64":2,"i65":8,"i66":32,"i67":2,"i68":32,"i69":2,"i70":1,"i71":2,"i72":2,"i73":2,"i74":2,"i75":1,"i76":1,"i77":2,"i78":32,"i79":1,"i80":1,"i81":32,"i82":2,"i83":2,"i84":2,"i85":2,"i86":2,"i87":2,"i88":1,"i89":32,"i90":2,"i91":2,"i92":2,"i93":8,"i94":2,"i95":2,"i96":2,"i97":2,"i98":2,"i99":2,"i100":1,"i101":1,"i102":2,"i103":8,"i104":1,"i105":1,"i106":2,"i107":1,"i108":8,"i109":8,"i110":1,"i111":32,"i112":8,"i113":8,"i114":2,"i115":2,"i116":2,"i117":1,"i118":1,"i119":2,"i120":2,"i121":2,"i122":2,"i123":2,"i124":2,"i125":2,"i126":2,"i127":2,"i128":2,"i129":2,"i130":2,"i131":8,"i132":2,"i133":2,"i134":2,"i135":2,"i136":2,"i137":1,"i138":2,"i139":1,"i140":2,"i141":1,"i142":1,"i143":2,"i144":2,"i145":2,"i146":2,"i147":2,"i148":2,"i149":2,"i150":2,"i151":2,"i152":32,"i153":32,"i154":32,"i155":32,"i156":32,"i157":32,"i158":32,"i159":32,"i160":32,"i161":32,"i162":32,"i163":32,"i164":32,"i165":32,"i166":32,"i167":32,"i168":32,"i169":32,"i170":32,"i171":32,"i172":32,"i173":32,"i174":32,"i175":32,"i176":32,"i177":32,"i178":32,"i179":32,"i180":1,"i181":8,"i182":1,"i183":2,"i184":2,"i185":2,"i186":8,"i187":2,"i188":2,"i189":32,"i190":1,"i191":2,"i192":32,"i193":2,"i194":1,"i195":1,"i196":2,"i197":2,"i198":1,"i199":1,"i200":2,"i201":2,"i202":32,"i203":2,"i204":2,"i205":2,"i206":2,"i207":2,"i208":2,"i209":2,"i210":2,"i211":2,"i212":1,"i213":1,"i214":1,"i215":2,"i216":2,"i217":2,"i218":1,"i219":1,"i220":2,"i221":2,"i222":8,"i223":32,"i224":1,"i225":1,"i226":1,"i227":1,"i228":2,"i229":2,"i230":1,"i231":2,"i232":2,"i233":2,"i234":2,"i235":1,"i236":2,"i237":2,"i238":2,"i239":2,"i240":2,"i241":1,"i242":2,"i243":2,"i244":8,"i245":1,"i246":2,"i247":2,"i248":2,"i249":2,"i250":2,"i251":8,"i252":2,"i253":2,"i254":2,"i255":2,"i256":1,"i257":8,"i258":2,"i259":2,"i260":32,"i261":2,"i262":32,"i263":32,"i264":32,"i265":2,"i266":2,"i267":2,"i268":1,"i269":1,"i270":2,"i271":2,"i272":2,"i273":2,"i274":8,"i275":2,"i276":2,"i277":1,"i278":2,"i279":2,"i280":8,"i281":1,"i282":2,"i283":1,"i284":2,"i285":1,"i286":1,"i287":1,"i288":1,"i289":2,"i290":2,"i291":2,"i292":2,"i293":8,"i294":2,"i295":2,"i296":2,"i297":2,"i298":32,"i299":32,"i300":2,"i301":1,"i302":2,"i303":1,"i304":1,"i305":2,"i306":2,"i307":2,"i308":8,"i309":2,"i310":32,"i311":8,"i312":2,"i313":1,"i314":2,"i315":32,"i316":32,"i317":2,"i318":2,"i319":2,"i320":2,"i321":1,"i322":1,"i323":2,"i324":2,"i325":8,"i326":32,"i327":32,"i328":2,"i329":2,"i330":2,"i331":2,"i332":2,"i333":2,"i334":2,"i335":2,"i336":2,"i337":2,"i338":2,"i339":2,"i340":2,"i341":2,"i342":2,"i343":2,"i344":2,"i345":2,"i346":2,"i347":2,"i348":8,"i349":32,"i350":2,"i351":2,"i352":2,"i353":2,"i354":2,"i355":2,"i356":2,"i357":2,"i358":2,"i359":2,"i360":2,"i361":2,"i362":2,"i363":2,"i364":2,"i365":2,"i366":2,"i367":2,"i368":2,"i369":2,"i370":2,"i371":1,"i372":2,"i373":2,"i374":2,"i375":2,"i376":32,"i377":2,"i378":2,"i379":2,"i380":2,"i381":2,"i382":2,"i383":2,"i384":2,"i385":2,"i386":2,"i387":32,"i388":2,"i389":2,"i390":32,"i391":2,"i392":2,"i393":32,"i394":2,"i395":2,"i396":2,"i397":32,"i398":32,"i399":2,"i400":1,"i401":1,"i402":1,"i403":1,"i404":8,"i405":2,"i406":1,"i407":8,"i408":1,"i409":2,"i410":1,"i411":2,"i412":2,"i413":2,"i414":2,"i415":8,"i416":2,"i417":2,"i418":2,"i419":1,"i420":8,"i421":32,"i422":1,"i423":2,"i424":1,"i425":1,"i426":1,"i427":2,"i428":32,"i429":2,"i430":2,"i431":2,"i432":2,"i433":2,"i434":1,"i435":2,"i436":2,"i437":2,"i438":1,"i439":2,"i440":2,"i441":2,"i442":1,"i443":32,"i444":1,"i445":2,"i446":32,"i447":1,"i448":1,"i449":2,"i450":1,"i451":1,"i452":2,"i453":1,"i454":2,"i455":2,"i456":2,"i457":2,"i458":2,"i459":2,"i460":2,"i461":2,"i462":1,"i463":2,"i464":2,"i465":32,"i466":2,"i467":1,"i468":1,"i469":1,"i470":1,"i471":2,"i472":8,"i473":32,"i474":1,"i475":1,"i476":1,"i477":2,"i478":1,"i479":1,"i480":1,"i481":2,"i482":2,"i483":2,"i484":2,"i485":8,"i486":32,"i487":1,"i488":2,"i489":1,"i490":1,"i491":32,"i492":2,"i493":2,"i494":2,"i495":1,"i496":2,"i497":1,"i498":1,"i499":1,"i500":2,"i501":2,"i502":2,"i503":2,"i504":2,"i505":2,"i506":2,"i507":2,"i508":2,"i509":2,"i510":2,"i511":2,"i512":2,"i513":2,"i514":2,"i515":2,"i516":2,"i517":2,"i518":2,"i519":2,"i520":2,"i521":2,"i522":2,"i523":8,"i524":2,"i525":2,"i526":2,"i527":2,"i528":2,"i529":1,"i530":2,"i531":2,"i532":2,"i533":2,"i534":2,"i535":2,"i536":2,"i537":2,"i538":2,"i539":2,"i540":2,"i541":1,"i542":2,"i543":2,"i544":2,"i545":2,"i546":8,"i547":2,"i548":2,"i549":2,"i550":8,"i551":2,"i552":32,"i553":1,"i554":2,"i555":2,"i556":2,"i557":2,"i558":2,"i559":8,"i560":2,"i561":2,"i562":32,"i563":32,"i564":2,"i565":2,"i566":2,"i567":2,"i568":2,"i569":2,"i570":2,"i571":2,"i572":2,"i573":2,"i574":2,"i575":2,"i576":2,"i577":2,"i578":2,"i579":2,"i580":2,"i581":2,"i582":2,"i583":32,"i584":2,"i585":8,"i586":1,"i587":1,"i588":1,"i589":2,"i590":2,"i591":2,"i592":2,"i593":8,"i594":2,"i595":2,"i596":1,"i597":2,"i598":2,"i599":1,"i600":2,"i601":1,"i602":1,"i603":1,"i604":1,"i605":2,"i606":8,"i607":2,"i608":2,"i609":2,"i610":2,"i611":1,"i612":1,"i613":2,"i614":2,"i615":1,"i616":2,"i617":1,"i618":2,"i619":2,"i620":1,"i621":2,"i622":2,"i623":2,"i624":32,"i625":2,"i626":2,"i627":2,"i628":2,"i629":2,"i630":2,"i631":32,"i632":2,"i633":2,"i634":2,"i635":2,"i636":2,"i637":8,"i638":1,"i639":1,"i640":1,"i641":1,"i642":8,"i643":8,"i644":1,"i645":2,"i646":2,"i647":2,"i648":2,"i649":1,"i650":2,"i651":2,"i652":1,"i653":2,"i654":8,"i655":1,"i656":8,"i657":32,"i658":8,"i659":8,"i660":2,"i661":2,"i662":2,"i663":2,"i664":2,"i665":2,"i666":2,"i667":2,"i668":1,"i669":2,"i670":2,"i671":2,"i672":8,"i673":2,"i674":2,"i675":2,"i676":2,"i677":2,"i678":2,"i679":2,"i680":2,"i681":2,"i682":2,"i683":2,"i684":2,"i685":2,"i686":8,"i687":1,"i688":2,"i689":2,"i690":2,"i691":2,"i692":2,"i693":2,"i694":2,"i695":2,"i696":2,"i697":2,"i698":1,"i699":1,"i700":1,"i701":1,"i702":2,"i703":1,"i704":1,"i705":2,"i706":1,"i707":8,"i708":1,"i709":2,"i710":1,"i711":2,"i712":2,"i713":32,"i714":2,"i715":2,"i716":2,"i717":2,"i718":1,"i719":32,"i720":2,"i721":2,"i722":2,"i723":2,"i724":32,"i725":2,"i726":1,"i727":2,"i728":2,"i729":1,"i730":2,"i731":32,"i732":2,"i733":2,"i734":2,"i735":1,"i736":1,"i737":1,"i738":2,"i739":1,"i740":1,"i741":2,"i742":8,"i743":2,"i744":2,"i745":8,"i746":1,"i747":2,"i748":8,"i749":8,"i750":2,"i751":2,"i752":1,"i753":8,"i754":2,"i755":2,"i756":2,"i757":2,"i758":2,"i759":2,"i760":2,"i761":2,"i762":2,"i763":2,"i764":2,"i765":2,"i766":2,"i767":2,"i768":2,"i769":2,"i770":2,"i771":2,"i772":2,"i773":1,"i774":1,"i775":2,"i776":2,"i777":2,"i778":32,"i779":32,"i780":32,"i781":2,"i782":2,"i783":2,"i784":2,"i785":2,"i786":1,"i787":1,"i788":2,"i789":1,"i790":2,"i791":2,"i792":1,"i793":1,"i794":1,"i795":2,"i796":1,"i797":1,"i798":32,"i799":1,"i800":1,"i801":1,"i802":1,"i803":1,"i804":1,"i805":2,"i806":1,"i807":1,"i808":2,"i809":1,"i810":2,"i811":2,"i812":8,"i813":32,"i814":2,"i815":1,"i816":1,"i817":1,"i818":2,"i819":1,"i820":2,"i821":2,"i822":2,"i823":2,"i824":2,"i825":2,"i826":32,"i827":2,"i828":32,"i829":2,"i830":2,"i831":2,"i832":2,"i833":1,"i834":1,"i835":8,"i836":2,"i837":2,"i838":2,"i839":2,"i840":2,"i841":1,"i842":32,"i843":2,"i844":2,"i845":2,"i846":32,"i847":2,"i848":2,"i849":2,"i850":2,"i851":2,"i852":2,"i853":8,"i854":2,"i855":2,"i856":2,"i857":2,"i858":2,"i859":2,"i860":8,"i861":2,"i862":1,"i863":2,"i864":2,"i865":2,"i866":2,"i867":2,"i868":2,"i869":2,"i870":2,"i871":2,"i872":2,"i873":8,"i874":32,"i875":2,"i876":2,"i877":1,"i878":1,"i879":2,"i880":2,"i881":2,"i882":2,"i883":2,"i884":1,"i885":1,"i886":32,"i887":2,"i888":2,"i889":32,"i890":32,"i891":2,"i892":1,"i893":32,"i894":32,"i895":32,"i896":2,"i897":32,"i898":32,"i899":32,"i900":2,"i901":1,"i902":1,"i903":2,"i904":1,"i905":2,"i906":2,"i907":1,"i908":1,"i909":2,"i910":2,"i911":1,"i912":1,"i913":1,"i914":32,"i915":32,"i916":2,"i917":32,"i918":2,"i919":2,"i920":32,"i921":2,"i922":2,"i923":2,"i924":2,"i925":8,"i926":2,"i927":2,"i928":2,"i929":2,"i930":2,"i931":1,"i932":1,"i933":2,"i934":2,"i935":2,"i936":2,"i937":2,"i938":2,"i939":2,"i940":2,"i941":2,"i942":2,"i943":8,"i944":1,"i945":32,"i946":32,"i947":1,"i948":1,"i949":32,"i950":32,"i951":32,"i952":32,"i953":32,"i954":32,"i955":2,"i956":1,"i957":2,"i958":2,"i959":32,"i960":2,"i961":2,"i962":2,"i963":2,"i964":32,"i965":2,"i966":1,"i967":2,"i968":2,"i969":1,"i970":2,"i971":2,"i972":2,"i973":1,"i974":2,"i975":2,"i976":2,"i977":2,"i978":2,"i979":2,"i980":2,"i981":2,"i982":1,"i983":1,"i984":2,"i985":2,"i986":2,"i987":2,"i988":8,"i989":2,"i990":2,"i991":2,"i992":1,"i993":8,"i994":1,"i995":32,"i996":32,"i997":2,"i998":2,"i999":1,"i1000":1,"i1001":2,"i1002":1,"i1003":2,"i1004":2,"i1005":2,"i1006":2,"i1007":2,"i1008":2,"i1009":2,"i1010":2,"i1011":2,"i1012":2,"i1013":2,"i1014":2,"i1015":2,"i1016":1,"i1017":1,"i1018":2,"i1019":1,"i1020":2,"i1021":2,"i1022":1,"i1023":2,"i1024":1,"i1025":1,"i1026":2,"i1027":1,"i1028":2,"i1029":1,"i1030":1,"i1031":1,"i1032":1,"i1033":2,"i1034":2,"i1035":1,"i1036":2,"i1037":2,"i1038":2,"i1039":2,"i1040":2,"i1041":2,"i1042":2,"i1043":2,"i1044":2,"i1045":2,"i1046":1,"i1047":2,"i1048":2,"i1049":2,"i1050":2,"i1051":2,"i1052":2,"i1053":2,"i1054":2,"i1055":2,"i1056":2,"i1057":2,"i1058":2,"i1059":2,"i1060":2,"i1061":2,"i1062":2,"i1063":2,"i1064":2,"i1065":2,"i1066":2,"i1067":2,"i1068":2,"i1069":1,"i1070":2,"i1071":2,"i1072":1,"i1073":1,"i1074":1,"i1075":1,"i1076":1,"i1077":1,"i1078":1,"i1079":1,"i1080":1,"i1081":2,"i1082":2,"i1083":1,"i1084":2,"i1085":2,"i1086":2,"i1087":2,"i1088":2,"i1089":2,"i1090":2,"i1091":2,"i1092":2,"i1093":1,"i1094":1,"i1095":2,"i1096":2,"i1097":2,"i1098":2,"i1099":2,"i1100":8,"i1101":2,"i1102":2,"i1103":2,"i1104":2,"i1105":2,"i1106":2,"i1107":2,"i1108":2,"i1109":2,"i1110":2,"i1111":2,"i1112":1,"i1113":1,"i1114":1,"i1115":2,"i1116":1,"i1117":1,"i1118":32,"i1119":2,"i1120":1,"i1121":1,"i1122":8,"i1123":1,"i1124":2,"i1125":2,"i1126":2,"i1127":2,"i1128":32,"i1129":2,"i1130":2,"i1131":2,"i1132":2,"i1133":2,"i1134":1,"i1135":2,"i1136":2,"i1137":2,"i1138":2,"i1139":2,"i1140":2,"i1141":2,"i1142":32,"i1143":2,"i1144":32,"i1145":32,"i1146":2,"i1147":1,"i1148":2,"i1149":2,"i1150":2,"i1151":1,"i1152":1,"i1153":2,"i1154":2,"i1155":2,"i1156":2,"i1157":2,"i1158":2,"i1159":2,"i1160":1,"i1161":2,"i1162":1,"i1163":2,"i1164":2,"i1165":2,"i1166":2,"i1167":1,"i1168":2,"i1169":2,"i1170":32,"i1171":2,"i1172":2,"i1173":2,"i1174":1,"i1175":1,"i1176":2,"i1177":32,"i1178":2,"i1179":2,"i1180":1,"i1181":32,"i1182":2,"i1183":2,"i1184":1,"i1185":2,"i1186":2,"i1187":2,"i1188":2,"i1189":1,"i1190":2,"i1191":1,"i1192":2,"i1193":1,"i1194":2,"i1195":1,"i1196":8,"i1197":32,"i1198":2,"i1199":2,"i1200":2,"i1201":2,"i1202":2,"i1203":2,"i1204":1,"i1205":32,"i1206":2,"i1207":2,"i1208":32,"i1209":1,"i1210":2,"i1211":2,"i1212":1,"i1213":32,"i1214":2,"i1215":2,"i1216":2,"i1217":2,"i1218":2,"i1219":8,"i1220":32,"i1221":8,"i1222":8,"i1223":32,"i1224":2,"i1225":2,"i1226":2,"i1227":2,"i1228":2,"i1229":2,"i1230":2,"i1231":2,"i1232":1,"i1233":2,"i1234":32,"i1235":2,"i1236":1,"i1237":2,"i1238":1,"i1239":2,"i1240":2,"i1241":2,"i1242":2,"i1243":2,"i1244":2,"i1245":2,"i1246":2,"i1247":2,"i1248":2,"i1249":8,"i1250":2,"i1251":2,"i1252":2,"i1253":2,"i1254":2,"i1255":2,"i1256":2,"i1257":32,"i1258":32,"i1259":2,"i1260":2,"i1261":2,"i1262":2,"i1263":2,"i1264":2,"i1265":2,"i1266":2,"i1267":2,"i1268":1,"i1269":2};
var tabs = {65535:["t0","All Classes"],1:["t1","Interface Summary"],2:["t2","Class Summary"],8:["t4","Exception Summary"],32:["t6","Annotation Types Summary"]};
var altColor = "altColor";
var rowColor = "rowColor";
@@ -1556,706 +1556,718 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
An ExtractorsFactory that provides an array of extractors for the following formats:
@@ -2280,1851 +2292,1851 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
com.google.android.exoplayer2.ext.flac.FlacExtractor is used.
Base class for TrackSelectors that first establish a mapping between TrackGroups
@@ -4512,1184 +4524,1191 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
renderer.
Provides a default MediaMetadataCompat with properties and extras taken from the MediaDescriptionCompat of the MediaSessionCompat.QueueItem of the active queue item.
A media player interface defining traditional high-level functionality, such as the ability to
play, pause, seek and query properties of the currently playing media.
Controls how a frame is presented with options to set the output resolution and choose how to map
@@ -5697,646 +5716,646 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
match the specified output frame, or fitting the input frame using letterboxing).
Default implementation of SessionCallbackBuilder.AllowedCommandProvider that behaves as follows:
@@ -6347,906 +6366,938 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
Controller is in the same package as the session.
An immutable description of an item in the playlist, containing both static setup information
+ like MediaItem and dynamic data that is generally read from the media like the
+ duration.
Interface for time bar views that can display a playback position, buffered position, duration
and ad markers, and that have a listener for scrubbing (seeking) events.
Adapter to get MediaDescriptionCompat of items in the queue and to notify the
application about changes in the queue to sync the data structure backing the MediaSessionConnector.
Information about a single group of tracks, including the underlying TrackGroup, the
@@ -7254,544 +7305,544 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
selected.
Seeks to the default position associated with the current MediaItem. The position can
depend on the type of media being played. For live streams it will typically be the live edge.
- For other streams it will typically be the start.
+ For other streams it will typically be the start.
+
+
Seeks to the default position associated with the specified MediaItem. The position can
depend on the type of media being played. For live streams it will typically be the live edge.
- For other streams it will typically be the start.
+ For other streams it will typically be the start.
+
+
speed - The linear factor by which playback will be sped up. Must be higher than 0. 1 is
- normal speed, 2 is twice as fast, 0.5 is half normal speed...
+ normal speed, 2 is twice as fast, 0.5 is half normal speed.
@@ -1437,7 +1540,9 @@ public final int getNextWindowIndex()
@@ -1648,7 +1765,9 @@ public final boolean isCurrentWindowLive()
positive.
Note that this offset may rely on an accurate local time, so this method may return an
- incorrect value if the difference between system clock and server clock is unknown.
+ incorrect value if the difference between system clock and server clock is unknown.
+
+
If Player.isPlayingAd() returns true, returns the duration of the current content in
milliseconds, or C.TIME_UNSET if the duration is not known. If there is no ad playing,
- the returned duration is the same as that returned by Player.getDuration().
+ the returned duration is the same as that returned by Player.getDuration().
+
+
ExoPlayer instances must be accessed from a single application thread unless indicated
+ otherwise. For the vast majority of cases this should be the application's main thread.
+ Using the application's main thread is also a requirement when using ExoPlayer's UI
+ components or the IMA extension. The thread on which an ExoPlayer instance must be accessed
+ can be explicitly specified by passing a `Looper` when creating the player. If no `Looper`
+ is specified, then the `Looper` of the thread that the player is created on is used, or if
+ that thread does not have a `Looper`, the `Looper` of the application's main thread is
+ used. In all cases the `Looper` of the thread from which the player must be accessed can be
+ queried using Player.getApplicationLooper().
Registered listeners are called on the thread associated with Player.getApplicationLooper(). Note that this means registered listeners are called on the same
thread which must be used to access the player.
An internal playback thread is responsible for playback. Injected player components such as
@@ -990,7 +990,9 @@ extends
startIndex - The MediaItem index to start playback from. If C.INDEX_UNSET
is passed, the current position is not reset.
startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given MediaItem is used. In
@@ -1369,7 +1369,7 @@ implements Specified by:
toIndex - The first item not to be included in the range (exclusive).
+
fromIndex - The start of the range to move. If the index is larger than the size of the
+ playlist, the request is ignored.
+
toIndex - The first item not to be included in the range (exclusive). If the index is
+ larger than the size of the playlist, items up to the end of the playlist are moved.
newIndex - The new index of the first media item of the range. If the new index is larger
than the size of the remaining playlist after removing the range, the range is moved to the
end of the playlist.
fromIndex - The index at which to start removing media items.
+
fromIndex - The index at which to start removing media items. If the index is larger than
+ the size of the playlist, the request is ignored.
toIndex - The index of the first item to be kept (exclusive). If the index is larger than
- the size of the playlist, media items to the end of the playlist are removed.
+ the size of the playlist, media items up to the end of the playlist are removed.
speed - The linear factor by which playback will be sped up. Must be higher than 0. 1 is
- normal speed, 2 is twice as fast, 0.5 is half normal speed...
+ normal speed, 2 is twice as fast, 0.5 is half normal speed.
diff --git a/docs/doc/reference/com/google/android/exoplayer2/LegacyMediaPlayerWrapper.html b/docs/doc/reference/com/google/android/exoplayer2/LegacyMediaPlayerWrapper.html
index 97861af301..762054e1d6 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/LegacyMediaPlayerWrapper.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/LegacyMediaPlayerWrapper.html
@@ -164,7 +164,7 @@ extends SimpleBasePlayer
-SimpleBasePlayer.State
+SimpleBasePlayer.MediaItemData, SimpleBasePlayer.PeriodData, SimpleBasePlayer.PositionSupplier, SimpleBasePlayer.State
@@ -1166,7 +1158,7 @@ public final @com.google.android.exoplayer2.PlaybackException.ErrorCode int
and Bundleable.Creator.
Subclasses should obtain their Bundle's field keys by applying a non-negative
- offset on this constant and passing the result to keyForField(int).
+ offset on this constant and passing the result to Util.intToStringMaxRadix(int).
All methods have no-op default implementations to allow selective overrides.
+
All methods have no-op default implementations to allow selective overrides.
+
+
If the return value of a Player getter changes due to a change in command availability, the corresponding listener
+ method(s) will be invoked. If the return value of a Player getter does not change
+ because the corresponding command is not
+ available, the corresponding listener method will not be invoked.
State changes and events that happen within one Looper message queue iteration are
reported together and only after all individual callbacks were triggered.
-
Only state changes represented by events are reported through this method.
-
Listeners should prefer this method over individual callbacks in the following cases:
Note that the current MediaItem or playback position may change as a result of a
timeline change. If playback can't continue smoothly because of this timeline change, a
@@ -539,8 +542,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
Called when playback transitions to a media item or starts repeating a media item according
to the current repeat mode.
-
Note that this callback is also called when the playlist becomes non-empty or empty as a
- consequence of a playlist change.
+
Note that this callback is also called when the value of Player.getCurrentTimeline()
+ becomes non-empty or empty.
onEvents(Player, Events) will also be called to report this event along with
other events that happen in the same Looper message queue iteration.
The provided MediaMetadata is a combination of the MediaItem metadata, the static metadata in the media's Format, and
- any timed metadata that has been parsed from the media and output via onMetadata(Metadata). If a field is populated in the MediaItem.mediaMetadata, it will be prioritised above the same field coming from static or
- timed metadata.
+
Called when the current playback parameters change. The playback parameters may change due to
- a call to Player.setPlaybackParameters(PlaybackParameters), or the player itself may change
- them (for example, if audio playback switches to passthrough or offload mode, where speed
- adjustment is no longer possible).
+
Called when the value of Player.getPlaybackParameters() changes. The playback parameters
+ may change due to a call to Player.setPlaybackParameters(PlaybackParameters), or the player
+ itself may change them (for example, if audio playback switches to passthrough or offload
+ mode, where speed adjustment is no longer possible).
onEvents(Player, Events) will also be called to report this event along with
other events that happen in the same Looper message queue iteration.
A media player interface defining traditional high-level functionality, such as the ability to
play, pause, seek and query properties of the currently playing media.
+
All methods must be called from a single application
+ thread unless indicated otherwise. Callbacks in registered listeners are called on the same
+ thread.
+
This interface includes some convenience methods that can be implemented by calling other
methods in the interface. BasePlayer implements these convenience methods so inheriting
BasePlayer is recommended when implementing the interface so that only the minimal set of
@@ -170,14 +174,15 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
startIndex - The MediaItem index to start playback from. If C.INDEX_UNSET
is passed, the current position is not reset.
startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given MediaItem is used. In
@@ -3355,7 +3534,9 @@ static final int COMMAND_SEEK_TO_WINDOW
index - The index at which to add the media item. If the index is larger than the size of
@@ -3434,10 +3623,12 @@ static final int COMMAND_SEEK_TO_WINDOW
index - The index at which to add the media items. If the index is larger than the size of
the playlist, the media items are added to the end of the playlist.
toIndex - The first item not to be included in the range (exclusive).
+
fromIndex - The start of the range to move. If the index is larger than the size of the
+ playlist, the request is ignored.
+
toIndex - The first item not to be included in the range (exclusive). If the index is
+ larger than the size of the playlist, items up to the end of the playlist are moved.
newIndex - The new index of the first media item of the range. If the new index is larger
than the size of the remaining playlist after removing the range, the range is moved to the
end of the playlist.
@@ -3502,10 +3702,13 @@ static final int COMMAND_SEEK_TO_WINDOW
removeMediaItem
void removeMediaItem(int index)
-
Removes the media item at the given index of the playlist.
+
Removes the media item at the given index of the playlist.
+
+
fromIndex - The index at which to start removing media items.
+
fromIndex - The index at which to start removing media items. If the index is larger than
+ the size of the playlist, the request is ignored.
toIndex - The index of the first item to be kept (exclusive). If the index is larger than
- the size of the playlist, media items to the end of the playlist are removed.
+ the size of the playlist, media items up to the end of the playlist are removed.
@@ -3533,7 +3739,9 @@ static final int COMMAND_SEEK_TO_WINDOW
shuffleModeEnabled - Whether shuffling is enabled.
@@ -3830,7 +4038,9 @@ static final int COMMAND_SEEK_TO_WINDOW
void seekToDefaultPosition()
Seeks to the default position associated with the current MediaItem. The position can
depend on the type of media being played. For live streams it will typically be the live edge.
- For other streams it will typically be the start.
+ For other streams it will typically be the start.
+
+
mediaItemIndex - The index of the MediaItem whose associated default position
- should be seeked to.
-
Throws:
-
IllegalSeekPositionException - If the player has a non-empty timeline and the provided
- mediaItemIndex is not within the bounds of the current timeline.
+ should be seeked to. If the index is larger than the size of the playlist, the request is
+ ignored.
@@ -3860,7 +4070,10 @@ static final int COMMAND_SEEK_TO_WINDOW
seekTo
void seekTo(long positionMs)
-
Seeks to a position specified in milliseconds in the current MediaItem.
+
Seeks to a position specified in milliseconds in the current MediaItem.
+
+
mediaItemIndex - The index of the MediaItem. If the index is larger than the size
+ of the playlist, the request is ignored.
positionMs - The seek position in the specified MediaItem, or C.TIME_UNSET
to seek to the media item's default position.
-
Throws:
-
IllegalSeekPositionException - If the player has a non-empty timeline and the provided
- mediaItemIndex is not within the bounds of the current timeline.
@@ -3911,7 +4124,9 @@ static final int COMMAND_SEEK_TO_WINDOW
speed - The linear factor by which playback will be sped up. Must be higher than 0. 1 is
- normal speed, 2 is twice as fast, 0.5 is half normal speed...
+ normal speed, 2 is twice as fast, 0.5 is half normal speed.
@@ -4233,7 +4467,9 @@ void seekToNextWindow()
still be called on the player if it's no longer required.
Calling this method does not clear the playlist, reset the playback position or the playback
- error.
+ error.
+
+
This MediaMetadata is a combination of the MediaItem
metadata, the static metadata in the media's Format, and any timed
metadata that has been parsed from the media and output via Player.Listener.onMetadata(Metadata). If a field is populated in the MediaItem.mediaMetadata,
- it will be prioritised above the same field coming from static or timed metadata.
+ it will be prioritised above the same field coming from static or timed metadata.
+
+
Note that this offset may rely on an accurate local time, so this method may return an
- incorrect value if the difference between system clock and server clock is unknown.
+ incorrect value if the difference between system clock and server clock is unknown.
+
+
If isPlayingAd() returns true, returns the duration of the current content in
milliseconds, or C.TIME_UNSET if the duration is not known. If there is no ad playing,
- the returned duration is the same as that returned by getDuration().
+ the returned duration is the same as that returned by getDuration().
+
+
If isPlayingAd() returns true, returns the content position that will be
played once all ads in the ad group have finished playing, in milliseconds. If there is no ad
- playing, the returned position is the same as that returned by getCurrentPosition().
+ playing, the returned position is the same as that returned by getCurrentPosition().
+
+
If isPlayingAd() returns true, returns an estimate of the content position in
the current content up to which data is buffered, in milliseconds. If there is no ad playing,
- the returned position is the same as that returned by getBufferedPosition().
This data includes static data from the MediaItem and
+ the media's Format, as well any dynamic metadata that has been
+ parsed from the media. If null, the metadata is assumed to be the simple combination of the
+ MediaItem metadata and the metadata of the selected Formats.
+
+
Parameters:
+
mediaMetadata - The MediaMetadata, or null to assume that the metadata is the
+ simple combination of the MediaItem metadata and the
+ metadata of the selected Formats.
This value can only be set to anything other than C.TIME_UNSET if the stream is
+ live.
+
+
Parameters:
+
presentationStartTimeMs - The start time of the live presentation, in milliseconds
+ since the Unix epoch, or C.TIME_UNSET if unknown or not applicable.
This value can only be set to anything other than C.TIME_UNSET if the stream is
+ live. The value should also be greater or equal than the
+ presentation start time, if set.
+
+
Parameters:
+
windowStartTimeMs - The start time of the live window, in milliseconds since the Unix
+ epoch, or C.TIME_UNSET if unknown or not applicable.
Sets the offset between SystemClock.elapsedRealtime() and the time since the Unix
+ epoch according to the clock of the media origin server.
+
+
This value can only be set to anything other than C.TIME_UNSET if the stream is
+ live.
+
+
Parameters:
+
elapsedRealtimeEpochOffsetMs - The offset between SystemClock.elapsedRealtime() and the time since the Unix epoch according to the clock
+ of the media origin server, or C.TIME_UNSET if unknown or not applicable.
Sets the duration of the media item, in microseconds.
+
+
If both this duration and all period durations are set, the sum
+ of this duration and the offset in the first
+ period must match the total duration of all periods.
+
+
Parameters:
+
durationUs - The duration of the media item, in microseconds, or C.TIME_UNSET
+ if unknown.
protected static final class SimpleBasePlayer.MediaItemData
+extends Object
+
An immutable description of an item in the playlist, containing both static setup information
+ like MediaItem and dynamic data that is generally read from the media like the
+ duration.
The offset between SystemClock.elapsedRealtime() and the time since the Unix epoch
+ according to the clock of the media origin server, or C.TIME_UNSET if unknown or not
+ applicable.
The MediaMetadata, including static data from the MediaItem and the media's Format, as well any dynamic metadata that
+ has been parsed from the media.
The MediaMetadata, including static data from the MediaItem and the media's Format, as well any dynamic metadata that
+ has been parsed from the media. If null, the metadata is assumed to be the simple combination
+ of the MediaItem metadata and the metadata of the selected
+ Formats.
The offset between SystemClock.elapsedRealtime() and the time since the Unix epoch
+ according to the clock of the media origin server, or C.TIME_UNSET if unknown or not
+ applicable.
Sets whether a frame has been rendered for the first time since setting the surface, a
+ rendering reset, or since the stream being rendered was changed.
Sets whether a frame has been rendered for the first time since setting the surface, a
+ rendering reset, or since the stream being rendered was changed.
+
+
contentPositionMsSupplier - The SimpleBasePlayer.PositionSupplier for the current content
+ playback position in milliseconds, or C.TIME_UNSET to indicate the default
+ start position.
Sets the current ad playback position in milliseconds. The value is unused if no ad is
+ playing.
+
+
This position will be converted to an advancing SimpleBasePlayer.PositionSupplier if the overall
+ state indicates an advancing ad playback position.
+
+
adPositionMsSupplier - The SimpleBasePlayer.PositionSupplier for the current ad playback
+ position in milliseconds. The value is unused if no ad is playing.
Sets the SimpleBasePlayer.PositionSupplier for the estimated position up to which the currently
+ playing content is buffered, in milliseconds.
+
+
Parameters:
+
contentBufferedPositionMsSupplier - The SimpleBasePlayer.PositionSupplier for the estimated
+ position up to which the currently playing content is buffered, in milliseconds, or
+ C.TIME_UNSET to indicate the default start position.
Sets the SimpleBasePlayer.PositionSupplier for the estimated position up to which the currently
+ playing ad is buffered, in milliseconds. The value is unused if no ad is playing.
+
+
Parameters:
+
adBufferedPositionMsSupplier - The SimpleBasePlayer.PositionSupplier for the estimated position
+ up to which the currently playing ad is buffered, in milliseconds. The value is unused
+ if no ad is playing.
The SimpleBasePlayer.PositionSupplier for the estimated position up to which the currently playing
+ content is buffered, in milliseconds, or C.TIME_UNSET to indicate the default start
+ position.
The SimpleBasePlayer.PositionSupplier for the estimated position up to which the currently playing
+ content is buffered, in milliseconds, or C.TIME_UNSET to indicate the default start
+ position.
The SimpleBasePlayer.PositionSupplier for the estimated position up to which the currently playing ad
+ is buffered, in milliseconds. The value is unused if no ad is playing.
The position, in milliseconds, in the current content or ad from which playback continued
+ after the discontinuity. The value is unused if hasPositionDiscontinuity is
+ false.
+
+
diff --git a/docs/doc/reference/com/google/android/exoplayer2/SimpleBasePlayer.html b/docs/doc/reference/com/google/android/exoplayer2/SimpleBasePlayer.html
index f3c093bf29..f4f42c3f7c 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/SimpleBasePlayer.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/SimpleBasePlayer.html
@@ -25,7 +25,7 @@
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,"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":10,"i38":6,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":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,"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":10,"i38":10,"i39":6,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
@@ -198,6 +198,29 @@ extends
An immutable description of an item in the playlist, containing both static setup information
+ like MediaItem and dynamic data that is generally read from the media like the
+ duration.
index - The index at which to add the media items. If the index is larger than the size of
the playlist, the media items are added to the end of the playlist.
toIndex - The first item not to be included in the range (exclusive).
+
fromIndex - The start of the range to move. If the index is larger than the size of the
+ playlist, the request is ignored.
+
toIndex - The first item not to be included in the range (exclusive). If the index is
+ larger than the size of the playlist, items up to the end of the playlist are moved.
newIndex - The new index of the first media item of the range. If the new index is larger
than the size of the remaining playlist after removing the range, the range is moved to the
end of the playlist.
fromIndex - The index at which to start removing media items.
+
fromIndex - The index at which to start removing media items. If the index is larger than
+ the size of the playlist, the request is ignored.
toIndex - The index of the first item to be kept (exclusive). If the index is larger than
- the size of the playlist, media items to the end of the playlist are removed.
+ the size of the playlist, media items up to the end of the playlist are removed.
Returns the playback position in the current content or ad, in milliseconds, or the prospective
- position in milliseconds if the current timeline is empty.
+ position in milliseconds if the current timeline is empty.
+
+
Returns an estimate of the total buffered duration from the current position, in milliseconds.
- This includes pre-buffered data for subsequent ads and media items.
+ This includes pre-buffered data for subsequent ads and media items.
+
+
If Player.isPlayingAd() returns true, returns the content position that will be
played once all ads in the ad group have finished playing, in milliseconds. If there is no ad
- playing, the returned position is the same as that returned by Player.getCurrentPosition().
If Player.isPlayingAd() returns true, returns an estimate of the content position in
the current content up to which data is buffered, in milliseconds. If there is no ad playing,
- the returned position is the same as that returned by Player.getBufferedPosition().
videoOutput - The video output to clear. If null any current output should be cleared. If
+ non-null, the output should only be cleared if it matches the provided argument. This is
+ either a Surface, SurfaceHolder, TextureView or SurfaceView.
fromIndex - The start index of the items to move. The index is in the range 0 <=
+ fromIndex < BasePlayer.getMediaItemCount().
+
toIndex - The index of the first item not to be included in the move (exclusive). The
+ index is in the range fromIndex < toIndex <= BasePlayer.getMediaItemCount().
+
newIndex - The new index of the first moved item. The index is in the range 0
+ <= newIndex < - (toIndex - fromIndex).
@@ -1838,7 +1846,9 @@ public @com.google.android.exoplayer2.C.VideoChangeFrameRateStrategy int&nb
rendered. The player will track the lifecycle of the surface automatically.
startIndex - The MediaItem index to start playback from. If C.INDEX_UNSET
is passed, the current position is not reset.
startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given MediaItem is used. In
@@ -2939,14 +2979,16 @@ public void prepare(List<MediaItem> mediaItems)
index - The index at which to add the media items. If the index is larger than the size of
the playlist, the media items are added to the end of the playlist.
toIndex - The first item not to be included in the range (exclusive).
+
fromIndex - The start of the range to move. If the index is larger than the size of the
+ playlist, the request is ignored.
+
toIndex - The first item not to be included in the range (exclusive). If the index is
+ larger than the size of the playlist, items up to the end of the playlist are moved.
newIndex - The new index of the first media item of the range. If the new index is larger
than the size of the remaining playlist after removing the range, the range is moved to the
end of the playlist.
@@ -3060,14 +3106,17 @@ public void prepare(Deprecated.
fromIndex - The index at which to start removing media items.
+
fromIndex - The index at which to start removing media items. If the index is larger than
+ the size of the playlist, the request is ignored.
toIndex - The index of the first item to be kept (exclusive). If the index is larger than
- the size of the playlist, media items to the end of the playlist are removed.
+ the size of the playlist, media items up to the end of the playlist are removed.
@@ -3198,7 +3249,9 @@ public @com.google.android.exoplayer2.Player.RepeatMode int getRepeatM
@com.google.android.exoplayer2.Player.RepeatMode int repeatMode)
positionMs - The seek position in the specified MediaItem, or C.TIME_UNSET
- to seek to the media item's default position.
+
positionMs - The seek position in the specified MediaItem in milliseconds, or
+ C.TIME_UNSET to seek to the media item's default position.
+
seekCommand - The Player.Command used to trigger the seek.
+
isRepeatingCurrentItem - Whether this seeks repeats the current item.
@@ -3357,7 +3417,9 @@ public @com.google.android.exoplayer2.Player.RepeatMode int getRepeatM
player to the default, which means there is no speed or pitch adjustment.
@@ -3740,7 +3809,9 @@ public MediaMetadata is a combination of the MediaItem
metadata, the static metadata in the media's Format, and any timed
metadata that has been parsed from the media and output via Player.Listener.onMetadata(Metadata). If a field is populated in the MediaItem.mediaMetadata,
- it will be prioritised above the same field coming from static or timed metadata.
+ it will be prioritised above the same field coming from static or timed metadata.
+
+
Returns the playback position in the current content or ad, in milliseconds, or the prospective
- position in milliseconds if the current timeline is empty.
+ position in milliseconds if the current timeline is empty.
+
+
Returns an estimate of the total buffered duration from the current position, in milliseconds.
- This includes pre-buffered data for subsequent ads and media items.
+ This includes pre-buffered data for subsequent ads and media items.
+
+
If Player.isPlayingAd() returns true, returns the content position that will be
played once all ads in the ad group have finished playing, in milliseconds. If there is no ad
- playing, the returned position is the same as that returned by Player.getCurrentPosition().
If Player.isPlayingAd() returns true, returns an estimate of the content position in
the current content up to which data is buffered, in milliseconds. If there is no ad playing,
- the returned position is the same as that returned by Player.getBufferedPosition().
Note that the current MediaItem or playback position may change as a result of a
timeline change. If playback can't continue smoothly because of this timeline change, a
@@ -1603,8 +1632,8 @@ public void release()
Called when playback transitions to a media item or starts repeating a media item according
to the current repeat mode.
-
Note that this callback is also called when the playlist becomes non-empty or empty as a
- consequence of a playlist change.
+
Note that this callback is also called when the value of Player.getCurrentTimeline()
+ becomes non-empty or empty.
Called when the current playback parameters change. The playback parameters may change due to
- a call to Player.setPlaybackParameters(PlaybackParameters), or the player itself may change
- them (for example, if audio playback switches to passthrough or offload mode, where speed
- adjustment is no longer possible).
+
Called when the value of Player.getPlaybackParameters() changes. The playback parameters
+ may change due to a call to Player.setPlaybackParameters(PlaybackParameters), or the player
+ itself may change them (for example, if audio playback switches to passthrough or offload
+ mode, where speed adjustment is no longer possible).
State changes and events that happen within one Looper message queue iteration are
reported together and only after all individual callbacks were triggered.
-
Only state changes represented by events are reported through this method.
-
Listeners should prefer this method over individual callbacks in the following cases:
getBufferSizeInBytes(int minBufferSizeInBytes,
@com.google.android.exoplayer2.C.Encoding int encoding,
@com.google.android.exoplayer2.audio.DefaultAudioSink.OutputMode int outputMode,
int pcmFrameSize,
int sampleRate,
+ int bitrate,
double maxAudioTrackPlaybackSpeed)
Returns the buffer size to use when creating an AudioTrack for a specific format and
@@ -226,7 +227,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
@@ -237,6 +238,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
@com.google.android.exoplayer2.audio.DefaultAudioSink.OutputMode int outputMode,
int pcmFrameSize,
int sampleRate,
+ int bitrate,
double maxAudioTrackPlaybackSpeed)
Returns the buffer size to use when creating an AudioTrack for a specific format and
output mode.
getBufferSizeInBytes(int minBufferSizeInBytes,
@com.google.android.exoplayer2.C.Encoding int encoding,
@com.google.android.exoplayer2.audio.DefaultAudioSink.OutputMode int outputMode,
int pcmFrameSize,
int sampleRate,
+ int bitrate,
double maxAudioTrackPlaybackSpeed)
Returns the buffer size to use when creating an AudioTrack for a specific format and
@@ -318,7 +320,8 @@ implements
startIndex - The MediaItem index to start playback from. If C.INDEX_UNSET
is passed, the current position is not reset.
startPositionMs - The position in milliseconds to start playback from. If C.TIME_UNSET is passed, the default position of the given MediaItem is used. In
@@ -1098,12 +1108,14 @@ public com.google.android.gms.cast.MediaQueueItem getItem(int&n
public void addMediaItems(int index,
List<MediaItem> mediaItems)
index - The index at which to add the media items. If the index is larger than the size of
the playlist, the media items are added to the end of the playlist.
toIndex - The first item not to be included in the range (exclusive).
+
fromIndex - The start of the range to move. If the index is larger than the size of the
+ playlist, the request is ignored.
+
toIndex - The first item not to be included in the range (exclusive). If the index is
+ larger than the size of the playlist, items up to the end of the playlist are moved.
newIndex - The new index of the first media item of the range. If the new index is larger
than the size of the remaining playlist after removing the range, the range is moved to the
end of the playlist.
@@ -1137,12 +1153,15 @@ public com.google.android.gms.cast.MediaQueueItem getItem(int&n
public void removeMediaItems(int fromIndex,
int toIndex)
fromIndex - The index at which to start removing media items.
+
fromIndex - The index at which to start removing media items. If the index is larger than
+ the size of the playlist, the request is ignored.
toIndex - The index of the first item to be kept (exclusive). If the index is larger than
- the size of the playlist, media items to the end of the playlist are removed.
+ the size of the playlist, media items up to the end of the playlist are removed.
@@ -1157,13 +1176,7 @@ public com.google.android.gms.cast.MediaQueueItem getItem(int&n
@@ -1217,7 +1232,7 @@ public @com.google.android.exoplayer2.Player.PlaybackSuppressionReason int&
true, or Player.PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed.
This MediaMetadata is a combination of the MediaItem
metadata, the static metadata in the media's Format, and any timed
metadata that has been parsed from the media and output via Player.Listener.onMetadata(Metadata). If a field is populated in the MediaItem.mediaMetadata,
- it will be prioritised above the same field coming from static or timed metadata.
+ it will be prioritised above the same field coming from static or timed metadata.
+
+
Returns the playback position in the current content or ad, in milliseconds, or the prospective
- position in milliseconds if the current timeline is empty.
+ position in milliseconds if the current timeline is empty.
+
+
Returns an estimate of the total buffered duration from the current position, in milliseconds.
- This includes pre-buffered data for subsequent ads and media items.
+ This includes pre-buffered data for subsequent ads and media items.
+
+
If Player.isPlayingAd() returns true, returns the content position that will be
played once all ads in the ad group have finished playing, in milliseconds. If there is no ad
- playing, the returned position is the same as that returned by Player.getCurrentPosition().
If Player.isPlayingAd() returns true, returns an estimate of the content position in
the current content up to which data is buffered, in milliseconds. If there is no ad playing,
- the returned position is the same as that returned by Player.getBufferedPosition().
Returns a copy of the provided decoder list sorted such that decoders with format support are
- listed first. The returned list is modifiable for convenience.
+
Returns a copy of the provided decoder list sorted such that decoders with functional format
+ support are listed first. The returned list is modifiable for convenience.
Apps with target SDK 33 and greater need to add the
+ android.permission.POST_NOTIFICATIONS permission to the manifest and request the permission at
+ runtime before starting downloads. Without that permission granted by the user, notifications
+ posted by this service are not displayed. See the
+ official UI guide for more detailed information.
Clear all download manager helpers before restarting the
+ service.
+
+
Calling this method is normally only required if an app supports downloading content for
+ multiple users for which different download directories should be used.
An immutable description of an item in the playlist, containing both static setup information
+ like MediaItem and dynamic data that is generally read from the media like the
+ duration.
This method must not be used with media items for progressive media that can't provide
+ their duration with their first Timeline update. Use add(MediaItem, long)
+ instead.
Setting a placeholder duration is required for media items for progressive media that
+ can't provide their duration with their first Timeline update. It may also be used
+ for other items to make the duration known immediately.
initialPlaceholderDurationMs - The initial placeholder duration in milliseconds used
+ while the actual duration is still unknown, or C.TIME_UNSET to not define one.
+ The placeholder duration is used for every Timeline.Window defined by Timeline of the MediaItem.
Adds a MediaSource to the concatenation and specifies its initial placeholder
+ duration used while the actual duration is still unknown.
+
+
Setting a placeholder duration is required for sources like ProgressiveMediaSource
+ that can't provide their duration with their first Timeline update. It may also be
+ used for other sources to make the duration known immediately.
initialPlaceholderDurationMs - The initial placeholder duration in milliseconds used
+ while the actual duration is still unknown, or C.TIME_UNSET to not define one.
+ The placeholder duration is used for every Timeline.Window defined by Timeline of the MediaSource.
This class can only be used under the following conditions:
+
+
+
All sources must be non-empty.
+
All Windows defined by the sources, except the first, must have an
+ period offset of zero. This excludes,
+ for example, live streams or ClippingMediaSource with a non-zero start position.
+
Returns the initial placeholder timeline that is returned immediately when the real timeline is
+ not yet known, or null to let the player create an initial timeline.
Returns the initial placeholder timeline that is returned immediately when the real timeline is
+ not yet known, or null to let the player create an initial timeline.
+
+
The initial timeline must use the same uids for windows and periods that the real timeline
+ will use. It also must provide windows which are marked as dynamic to indicate that the window
+ is expected to change when the real timeline arrives.
+
+
Any media source which has multiple windows should typically provide such an initial
+ timeline to make sure the player reports the correct number of windows immediately.
mediaTransferListener - The transfer listener which should be informed of any media data
+ transfers. May be null if no listener is available. Note that this listener should usually
+ be only informed of transfers related to the media loads and not of auxiliary loads for
+ manifests and other data.
Returns the MediaSource.MediaPeriodId in the composite source corresponding to the specified MediaSource.MediaPeriodId in a child source. The default implementation does not change the media period
+ id.
Returns the window index in the composite source corresponding to the specified window index in
+ a child source. The default implementation does not change the window index.
Parses given descriptors for thumbnail tile information.
+
+
Parameters:
+
essentialProperties - List of descriptors that contain thumbnail tile information.
+
Returns:
+
A pair of Integer values, where the first is the count of horizontal tiles and the
+ second is the count of vertical tiles, or null if no thumbnail tile information is found.
@@ -862,7 +868,7 @@ public @com.google.android.exoplayer2.Player.PlaybackSuppressionReason int&
true, or Player.PLAYBACK_SUPPRESSION_REASON_NONE if playback is not suppressed.
index - The index at which to add the media items. If the index is larger than the size of
the playlist, the media items are added to the end of the playlist.
toIndex - The first item not to be included in the range (exclusive).
+
fromIndex - The start of the range to move. If the index is larger than the size of the
+ playlist, the request is ignored.
+
toIndex - The first item not to be included in the range (exclusive). If the index is
+ larger than the size of the playlist, items up to the end of the playlist are moved.
newIndex - The new index of the first media item of the range. If the new index is larger
than the size of the remaining playlist after removing the range, the range is moved to the
end of the playlist.
fromIndex - The index at which to start removing media items.
+
fromIndex - The index at which to start removing media items. If the index is larger than
+ the size of the playlist, the request is ignored.
toIndex - The index of the first item to be kept (exclusive). If the index is larger than
- the size of the playlist, media items to the end of the playlist are removed.
+ the size of the playlist, media items up to the end of the playlist are removed.
This MediaMetadata is a combination of the MediaItem
metadata, the static metadata in the media's Format, and any timed
metadata that has been parsed from the media and output via Player.Listener.onMetadata(Metadata). If a field is populated in the MediaItem.mediaMetadata,
- it will be prioritised above the same field coming from static or timed metadata.
+ it will be prioritised above the same field coming from static or timed metadata.
+
+
Returns the playback position in the current content or ad, in milliseconds, or the prospective
- position in milliseconds if the current timeline is empty.
+ position in milliseconds if the current timeline is empty.
+
+
Returns an estimate of the total buffered duration from the current position, in milliseconds.
- This includes pre-buffered data for subsequent ads and media items.
+ This includes pre-buffered data for subsequent ads and media items.
+
+
If Player.isPlayingAd() returns true, returns the content position that will be
played once all ads in the ad group have finished playing, in milliseconds. If there is no ad
- playing, the returned position is the same as that returned by Player.getCurrentPosition().
If Player.isPlayingAd() returns true, returns an estimate of the content position in
the current content up to which data is buffered, in milliseconds. If there is no ad playing,
- the returned position is the same as that returned by Player.getBufferedPosition().
@@ -883,7 +875,7 @@ public final @com.google.android.exoplayer2.C.SelectionFlags int ignoredTex
and Bundleable.Creator.
Subclasses should obtain keys for their Bundle representation by applying a
- non-negative offset on this constant and passing the result to keyForField(int).
+ non-negative offset on this constant and passing the result to Util.intToStringMaxRadix(int).
listener - The listener to be notified about visibility changes, or null to remove the
@@ -1396,7 +1396,7 @@ public void setControllerVisibilityListener(@Nullable
iterationFinishedEvent - An ListenerSet.IterationFinishedEvent sent when all other events sent
during one Looper message queue iteration were handled by the listeners.
A line is considered to be terminated by any one of a carriage return ('\r'), a line feed
- ('\n'), or a carriage return followed immediately by a line feed ('\r\n'). The UTF-8 charset is
- used. This method discards leading UTF-8 byte order marks, if present.
+ ('\n'), or a carriage return followed immediately by a line feed ('\r\n'). This method discards
+ leading UTF byte order marks (BOM), if present.
+
+
The position is advanced to start of the next line (i.e. any
+ line terminators are skipped).
+
Parameters:
+
charset - The charset used to interpret the bytes as a String.
Returns:
The line not including any line-termination characters, or null if the end of the data
has already been reached.
+
Throws:
+
IllegalArgumentException - if charset is not supported. Only US_ASCII, UTF-8, UTF-16,
+ UTF-16BE, and UTF-16LE are supported.
getPcmFormat(@com.google.android.exoplayer2.C.PcmEncoding int pcmEncoding,
int channels,
@@ -718,7 +727,7 @@ extends Gets a PCM Format with the specified parameters.
-
+
static int
getPcmFrameSize(@com.google.android.exoplayer2.C.PcmEncoding int pcmEncoding,
int channelCount)
Use DataSpec.position except for specific use cases where the absolute position
@@ -599,7 +605,7 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
position is required, use uriPositionOffset + position.
Attributes for audio playback, which configure the underlying platform AudioTrack.
@@ -2451,6 +2487,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
bitmap should be displayed at its natural height given the bitmap dimensions and the specified
Cue.size.
The SimpleBasePlayer.PositionSupplier for the estimated position up to which the currently playing
+ content is buffered, in milliseconds, or C.TIME_UNSET to indicate the default start
+ position.
The offset in microseconds which should be added to the content stream when resuming playback
@@ -6708,6 +6810,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
Media period identifier for the currently playing media period at the
@@ -7969,12 +8090,12 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
The discontinuity sequence number of the first media segment in the playlist, as defined by
@@ -10368,6 +10507,14 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
The duration of the track in microseconds, or C.TIME_UNSET if unknown.
The offset between SystemClock.elapsedRealtime() and the time since the Unix epoch
+ according to the clock of the media origin server, or C.TIME_UNSET if unknown or not
+ applicable.
The offset between SystemClock.elapsedRealtime() and the time since the Unix epoch
@@ -10696,6 +10849,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
Returns whether a loader should fall back to using another resource on encountering an error,
@@ -16454,6 +16635,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
Whether the HlsMediaPlaylist.startOffsetUs was explicitly defined by #EXT-X-START as a positive value
@@ -21543,6 +21829,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
The MediaMetadata, including static data from the MediaItem and the media's Format, as well any dynamic metadata that
+ has been parsed from the media.
Parses the number of channels from the value attribute of an AudioChannelConfiguration with
schemeIdUri "urn:mpeg:mpegB:cicp:ChannelConfiguration", as defined by ISO 23001-8 clause 8.1.
The position of the start of this window relative to the start of the first period belonging
@@ -29951,6 +30508,8 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
The start time of the presentation to which this window belongs in milliseconds since the
@@ -30816,7 +31379,11 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
Runs tasks of the main Looper until the player completely handled all previously issued
@@ -33487,6 +34067,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
Sets a listener for ad errors that will be passed to AdsLoader.addAdErrorListener(AdErrorListener) and
@@ -34269,10 +34868,22 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
Sets the MIME types to prioritize for linear ad media.
Sets the duration in milliseconds for which the player must buffer while preloading an ad
@@ -34557,6 +35168,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
Sets whether a frame has been rendered for the first time since setting the surface, a
+ rendering reset, or since the stream being rendered was changed.
Sets whether clear samples within protected content should be played when keys for the
@@ -37266,6 +38026,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
An immutable description of an item in the playlist, containing both static setup information
+ like MediaItem and dynamic data that is generally read from the media like the
+ duration.
Converts a collection of Bundleable to an ArrayList of Bundle so that
@@ -41658,6 +42584,10 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));
The window's start time in milliseconds since the Unix epoch, or C.TIME_UNSET if
@@ -44258,7 +45232,19 @@ $('.navPadding').css('padding-top', $('.fixedNav').css("height"));