diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 0d4f4c531f9..2df40851666 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -1,11 +1,31 @@
# Release notes
+### 2.18.6 (2023-04-18)
+
+This release corresponds to the
+[AndroidX Media3 1.0.1 release](https://github.com/androidx/media/releases/tag/1.0.1).
+
+* Core library:
+ * Reset target live stream override when seeking to default position
+ ([#11051](https://github.com/google/ExoPlayer/pull/11051)).
+ * Fix bug where empty sample streams in the media could cause playback to
+ be stuck.
+* DASH:
+ * Fix handling of empty segment timelines
+ ([#11014](https://github.com/google/ExoPlayer/issues/11014)).
+* RTSP:
+ * Retry with TCP if RTSP Setup with UDP fails with RTSP Error 461
+ UnsupportedTransport
+ ([#11069](https://github.com/google/ExoPlayer/issues/11069)).
+
### 2.18.5 (2023-03-22)
This release corresponds to the
[AndroidX Media3 1.0.0 release](https://github.com/androidx/media/releases/tag/1.0.0).
-There are no changes since 2.18.4.
+* Migration script
+ * Fix bug where backup files for each touched file were left in a migrated
+ project on OSX.
### 2.18.4 (2023-03-02)
diff --git a/constants.gradle b/constants.gradle
index 3e799796b87..c4159f2d58a 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.5'
- releaseVersionCode = 2_018_005
+ releaseVersion = '2.18.6'
+ releaseVersionCode = 2_018_006
minSdkVersion = 16
appTargetSdkVersion = 33
// API version before restricting local file access.
diff --git a/demos/gl/build.gradle b/demos/gl/build.gradle
index b08f5e48169..39fa85618d2 100644
--- a/demos/gl/build.gradle
+++ b/demos/gl/build.gradle
@@ -27,6 +27,7 @@ android {
versionCode project.ext.releaseVersionCode
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.appTargetSdkVersion
+ multiDexEnabled true
}
buildTypes {
diff --git a/demos/main/src/main/res/values/strings.xml b/demos/main/src/main/res/values/strings.xml
index ce9c90d0c24..b8f6e7c3206 100644
--- a/demos/main/src/main/res/values/strings.xml
+++ b/demos/main/src/main/res/values/strings.xml
@@ -21,7 +21,7 @@
Unexpected intent action: %1$s
- Cleartext HTTP traffic not permitted. See https://exoplayer.dev/issues/cleartext-not-permitted
+ Cleartext HTTP traffic not permitted. See https://developer.android.com/guide/topics/media/issues/cleartext-not-permitted
Playback failed
diff --git a/demos/transformer/README.md b/demos/transformer/README.md
index fd767ba6c88..9733337292a 100644
--- a/demos/transformer/README.md
+++ b/demos/transformer/README.md
@@ -61,6 +61,6 @@ manual steps.
(this will only appear if the AAR is present), then build and run the demo
app and select a MediaPipe-based effect.
-[Transformer]: https://exoplayer.dev/transforming-media.html
+[Transformer]: https://developer.android.com/guide/topics/media/transforming-media
[MediaPipe]: https://google.github.io/mediapipe/
[build an AAR]: https://google.github.io/mediapipe/getting_started/android_archive_library.html
diff --git a/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/MatrixTransformationFactory.java b/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/MatrixTransformationFactory.java
index 042dd88c756..df9ccf49065 100644
--- a/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/MatrixTransformationFactory.java
+++ b/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/MatrixTransformationFactory.java
@@ -28,7 +28,7 @@
*/
/* package */ final class MatrixTransformationFactory {
/**
- * Returns a {@link MatrixTransformation} that rescales the frames over the first {@value
+ * Returns a {@link MatrixTransformation} that rescales the frames over the first {@link
* #ZOOM_DURATION_SECONDS} seconds, such that the rectangle filled with the input frame increases
* linearly in size from a single point to filling the full output frame.
*/
diff --git a/docs/doc/reference/allclasses-index.html b/docs/doc/reference/allclasses-index.html
index 4777975afd6..616f1249bd2 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":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 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":8,"i990":2,"i991":2,"i992":2,"i993":1,"i994":8,"i995":1,"i996":32,"i997":32,"i998":2,"i999":2,"i1000":1,"i1001":1,"i1002":2,"i1003":1,"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":2,"i1017":1,"i1018":1,"i1019":2,"i1020":1,"i1021":2,"i1022":2,"i1023":1,"i1024":2,"i1025":1,"i1026":1,"i1027":2,"i1028":1,"i1029":2,"i1030":1,"i1031":1,"i1032":1,"i1033":1,"i1034":2,"i1035":2,"i1036":1,"i1037":2,"i1038":2,"i1039":2,"i1040":2,"i1041":2,"i1042":2,"i1043":2,"i1044":2,"i1045":2,"i1046":2,"i1047":1,"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":2,"i1070":1,"i1071":2,"i1072":2,"i1073":1,"i1074":1,"i1075":1,"i1076":1,"i1077":1,"i1078":1,"i1079":1,"i1080":1,"i1081":1,"i1082":2,"i1083":2,"i1084":1,"i1085":2,"i1086":2,"i1087":2,"i1088":2,"i1089":2,"i1090":2,"i1091":2,"i1092":2,"i1093":2,"i1094":1,"i1095":1,"i1096":2,"i1097":2,"i1098":2,"i1099":2,"i1100":2,"i1101":8,"i1102":2,"i1103":2,"i1104":2,"i1105":2,"i1106":2,"i1107":2,"i1108":2,"i1109":2,"i1110":2,"i1111":2,"i1112":2,"i1113":1,"i1114":1,"i1115":1,"i1116":2,"i1117":1,"i1118":1,"i1119":32,"i1120":2,"i1121":1,"i1122":1,"i1123":8,"i1124":1,"i1125":2,"i1126":2,"i1127":2,"i1128":2,"i1129":32,"i1130":2,"i1131":2,"i1132":2,"i1133":2,"i1134":2,"i1135":1,"i1136":2,"i1137":2,"i1138":2,"i1139":2,"i1140":2,"i1141":2,"i1142":2,"i1143":32,"i1144":2,"i1145":32,"i1146":32,"i1147":2,"i1148":1,"i1149":2,"i1150":2,"i1151":2,"i1152":1,"i1153":1,"i1154":2,"i1155":2,"i1156":2,"i1157":2,"i1158":2,"i1159":2,"i1160":2,"i1161":1,"i1162":2,"i1163":1,"i1164":2,"i1165":2,"i1166":2,"i1167":2,"i1168":1,"i1169":2,"i1170":2,"i1171":32,"i1172":2,"i1173":2,"i1174":2,"i1175":1,"i1176":1,"i1177":2,"i1178":32,"i1179":2,"i1180":2,"i1181":1,"i1182":32,"i1183":2,"i1184":2,"i1185":1,"i1186":2,"i1187":2,"i1188":2,"i1189":2,"i1190":1,"i1191":2,"i1192":1,"i1193":2,"i1194":1,"i1195":2,"i1196":1,"i1197":8,"i1198":32,"i1199":2,"i1200":2,"i1201":2,"i1202":2,"i1203":2,"i1204":2,"i1205":1,"i1206":32,"i1207":2,"i1208":2,"i1209":32,"i1210":1,"i1211":2,"i1212":2,"i1213":1,"i1214":32,"i1215":2,"i1216":2,"i1217":2,"i1218":2,"i1219":2,"i1220":8,"i1221":32,"i1222":8,"i1223":8,"i1224":32,"i1225":2,"i1226":2,"i1227":2,"i1228":2,"i1229":2,"i1230":2,"i1231":2,"i1232":2,"i1233":1,"i1234":2,"i1235":32,"i1236":2,"i1237":1,"i1238":2,"i1239":1,"i1240":2,"i1241":2,"i1242":2,"i1243":2,"i1244":2,"i1245":2,"i1246":2,"i1247":2,"i1248":2,"i1249":2,"i1250":8,"i1251":2,"i1252":2,"i1253":2,"i1254":2,"i1255":2,"i1256":2,"i1257":2,"i1258":32,"i1259":32,"i1260":2,"i1261":2,"i1262":2,"i1263":2,"i1264":2,"i1265":2,"i1266":2,"i1267":2,"i1268":2,"i1269":1,"i1270":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";
@@ -6131,231 +6131,237 @@
All Classes
+RtspMediaSource.RtspUdpUnsupportedTransportException
+
+Thrown when an RTSP Unsupported Transport error (461) is encountered during RTSP Setup.
+
+
+
RubySpan
A styling span for ruby text.
-
+
RunnableFutureTask <R ,E extends Exception >
A
RunnableFuture
that supports additional uninterruptible operations to query whether
execution has started and finished.
-
+
SampleQueue
A queue of media samples.
-
+
SampleQueue.UpstreamFormatChangedListener
A listener for changes to the upstream format.
-
+
SampleQueueMappingException
-
+
SampleStream
A stream of media samples (and associated format information).
-
+
SampleStream.ReadDataResult
-
+
SampleStream.ReadFlags
-
+
ScaleToFitTransformation
Specifies a simple rotation and/or scale to apply in the vertex shader.
-
+
ScaleToFitTransformation.Builder
-
+
Scheduler
Schedules a service to be started in the foreground when some
Requirements
are met.
-
+
SectionPayloadReader
Reads section data.
-
+
SectionReader
-
+
SeekMap
Maps seek positions (in microseconds) to corresponding positions (byte offsets) in the stream.
-
+
SeekMap.SeekPoints
-
+
SeekMap.Unseekable
A
SeekMap
that does not support seeking.
-
+
SeekParameters
Parameters that apply to seeking.
-
+
SeekPoint
Defines a seek point in a media stream.
-
+
SegmentBase
An approximate representation of a SegmentBase manifest element.
-
+
SegmentBase.MultiSegmentBase
-
+
SegmentBase.SegmentList
-
+
SegmentBase.SegmentTemplate
-
+
SegmentBase.SegmentTimelineElement
Represents a timeline segment from the MPD's SegmentTimeline list.
-
+
SegmentBase.SingleSegmentBase
-
+
SegmentDownloader <M extends FilterableManifest <M >>
Base class for multi segment stream downloaders.
-
+
SegmentDownloader.Segment
Smallest unit of content to be downloaded.
-
+
SeiReader
Consumes SEI buffers, outputting contained CEA-608/708 messages to a
TrackOutput
.
-
+
SequenceableLoader
A loader that can proceed in approximate synchronization with other loaders.
-
+
SequenceableLoader.Callback <T extends SequenceableLoader >
-
+
ServerSideAdInsertionMediaSource
-
+
ServerSideAdInsertionMediaSource.AdPlaybackStateUpdater
Receives ad playback state update requests when the
Timeline
of the content media
source has changed.
-
+
ServerSideAdInsertionUtil
A static utility class with methods to work with server-side inserted ads.
-
+
ServiceDescriptionElement
Represents a service description element.
-
+
SessionAvailabilityListener
Listener of changes in the cast session availability.
-
+
SessionCallbackBuilder
Builds a MediaSession.SessionCallback
with various collaborators.
-
+
SessionCallbackBuilder.AllowedCommandProvider
Provides allowed commands for MediaController
.
-
+
SessionCallbackBuilder.CustomCommandProvider
Callbacks for querying what custom commands are supported, and for handling a custom command
when a controller sends it.
-
+
SessionCallbackBuilder.DefaultAllowedCommandProvider
-
+
SessionCallbackBuilder.DisconnectedCallback
Callback for handling controller disconnection.
-
+
SessionCallbackBuilder.MediaIdMediaItemProvider
-
+
SessionCallbackBuilder.MediaItemProvider
Provides the MediaItem
.
-
+
SessionCallbackBuilder.PostConnectCallback
Callback for handling extra initialization after the connection.
-
+
SessionCallbackBuilder.RatingCallback
Callback receiving a user rating for a specified media id.
-
+
SessionCallbackBuilder.SkipCallback
Callback receiving skip backward and skip forward.
-
+
SessionPlayerConnector
An implementation of
SessionPlayer
that wraps a given ExoPlayer
Player
instance.
-
+
ShadowMediaCodecConfig
A JUnit @Rule to configure Roboelectric's ShadowMediaCodec
.
-
+
ShuffleOrder
Shuffled order of indices.
-
+
ShuffleOrder.DefaultShuffleOrder
The default
ShuffleOrder
implementation for random shuffle order.
-
+
ShuffleOrder.UnshuffledShuffleOrder
-
+
SilenceMediaSource
Media source with a single period consisting of silent raw audio of a given duration.
-
+
SilenceMediaSource.Factory
-
+
SilenceSkippingAudioProcessor
-
+
SimpleBasePlayer
A base implementation for
Player
that reduces the number of methods to implement to a
minimum.
-
+
SimpleBasePlayer.MediaItemData
An immutable description of an item in the playlist, containing both static setup information
@@ -6465,839 +6471,839 @@
All Classes
duration.
-
+
SimpleBasePlayer.MediaItemData.Builder
-
+
SimpleBasePlayer.PeriodData
-
+
SimpleBasePlayer.PeriodData.Builder
-
+
SimpleBasePlayer.PositionSupplier
A supplier for a position.
-
+
SimpleBasePlayer.State
An immutable state description of the player.
-
+
SimpleBasePlayer.State.Builder
-
+
SimpleCache
A
Cache
implementation that maintains an in-memory representation.
-
+
SimpleDecoder <I extends DecoderInputBuffer ,O extends DecoderOutputBuffer ,E extends DecoderException >
Base class for
Decoder
s that use their own decode thread and decode each input buffer
immediately into a corresponding output buffer.
-
+
SimpleDecoderOutputBuffer
-
+
SimpleExoPlayer
Deprecated.
-
+
SimpleExoPlayer.Builder
Deprecated.
-
+
SimpleMetadataDecoder
-
+
SimpleSubtitleDecoder
Base class for subtitle parsers that use their own decode thread.
-
+
SingleColorLut
Transforms the colors of a frame by applying the same color lookup table to each frame.
-
+
SingleFrameGlTextureProcessor
Manages a GLSL shader program for processing a frame.
-
+
SinglePeriodAdTimeline
-
+
SinglePeriodTimeline
A
Timeline
consisting of a single period and static window.
-
+
SingleSampleMediaChunk
-
+
SingleSampleMediaSource
Loads data at a given
Uri
as a single sample belonging to a single
MediaPeriod
.
-
+
SingleSampleMediaSource.Factory
-
+
Size
Immutable class for describing width and height dimensions in pixels.
-
+
SlidingPercentile
Calculate any percentile over a sliding window of weighted values.
-
+
SlowMotionData
Holds information about the segments of slow motion playback within a track.
-
+
SlowMotionData.Segment
Holds information about a single segment of slow motion playback within a track.
-
+
SmtaMetadataEntry
Stores metadata from the Samsung smta box.
-
+
SntpClient
Static utility to retrieve the device time offset using SNTP.
-
+
SntpClient.InitializationCallback
-
+
SonicAudioProcessor
An
AudioProcessor
that uses the Sonic library to modify audio speed/pitch/sample rate.
-
+
SpannedSubject
A Truth
Subject
for assertions on
Spanned
instances containing text styling.
-
+
SpannedSubject.AbsoluteSized
Allows assertions about the absolute size of a span.
-
+
SpannedSubject.Aligned
Allows assertions about the alignment of a span.
-
+
SpannedSubject.AndSpanFlags
Allows additional assertions to be made on the flags of matching spans.
-
+
SpannedSubject.Colored
Allows assertions about the color of a span.
-
+
SpannedSubject.EmphasizedText
Allows assertions about a span's text emphasis mark and its position.
-
+
SpannedSubject.RelativeSized
Allows assertions about the relative size of a span.
-
+
SpannedSubject.RubyText
Allows assertions about a span's ruby text and its position.
-
+
SpannedSubject.Typefaced
Allows assertions about the typeface of a span.
-
+
SpannedSubject.WithSpanFlags
Allows additional assertions to be made on the flags of matching spans.
-
+
SpanUtil
-
+
SphericalGLSurfaceView
Renders a GL scene in a non-VR Activity that is affected by phone orientation and touch input.
-
+
SphericalGLSurfaceView.VideoSurfaceListener
Listener for the
Surface
to which video frames should be rendered.
-
+
SpliceCommand
Superclass for SCTE35 splice commands.
-
+
SpliceInfoDecoder
Decodes splice info sections and produces splice commands.
-
+
SpliceInsertCommand
Represents a splice insert command defined in SCTE35, Section 9.3.3.
-
+
SpliceInsertCommand.ComponentSplice
Holds splicing information for specific splice insert command components.
-
+
SpliceNullCommand
Represents a splice null command as defined in SCTE35, Section 9.3.1.
-
+
SpliceScheduleCommand
Represents a splice schedule command as defined in SCTE35, Section 9.3.2.
-
+
SpliceScheduleCommand.ComponentSplice
Holds splicing information for specific splice schedule command components.
-
+
SpliceScheduleCommand.Event
-
+
SsaDecoder
-
+
SsChunkSource
-
+
SsChunkSource.Factory
-
+
SsDownloader
A downloader for SmoothStreaming streams.
-
+
SsManifest
Represents a SmoothStreaming manifest.
-
+
SsManifest.ProtectionElement
Represents a protection element containing a single header.
-
+
SsManifest.StreamElement
Represents a StreamIndex element.
-
+
SsManifestParser
Parses SmoothStreaming client manifests.
-
+
SsManifestParser.MissingFieldException
Thrown if a required field is missing.
-
+
SsMediaSource
-
+
SsMediaSource.Factory
-
+
StandaloneDatabaseProvider
-
+
StandaloneMediaClock
A
MediaClock
whose position advances with real time based on the playback parameters when
started.
-
+
StarRating
A rating expressed as a fractional number of stars.
-
+
StartOffsetExtractorOutput
An extractor output that wraps another extractor output and applies a give start byte offset to
seek positions.
-
+
StatsDataSource
DataSource
wrapper which keeps track of bytes transferred, redirected uris, and response
headers.
-
+
StreamKey
A key for a subset of media that can be separately loaded (a "stream").
-
+
StubExoPlayer
-
+
StubPlayer
-
+
StyledPlayerControlView
A view for controlling
Player
instances.
-
+
StyledPlayerControlView.OnFullScreenModeChangedListener
Deprecated.
-
+
StyledPlayerControlView.ProgressUpdateListener
Listener to be notified when progress has been updated.
-
+
StyledPlayerControlView.VisibilityListener
Deprecated.
-
+
StyledPlayerView
A high level view for
Player
media playbacks.
-
+
StyledPlayerView.ControllerVisibilityListener
Listener to be notified about changes of the visibility of the UI controls.
-
+
StyledPlayerView.FullscreenButtonClickListener
Listener invoked when the fullscreen button is clicked.
-
+
StyledPlayerView.ShowBuffering
Determines when the buffering view is shown.
-
+
SubripDecoder
-
+
Subtitle
A subtitle consisting of timed
Cue
s.
-
+
SubtitleDecoder
-
+
SubtitleDecoderException
Thrown when an error occurs decoding subtitle data.
-
+
SubtitleDecoderFactory
-
+
SubtitleExtractor
Generic extractor for extracting subtitles from various subtitle formats.
-
+
SubtitleInputBuffer
-
+
SubtitleOutputBuffer
-
+
SubtitleView
A view for displaying subtitle
Cue
s.
-
+
SubtitleView.ViewType
The type of
View
to use to display subtitles.
-
+
SurfaceInfo
Immutable value class for a
Surface
and supporting information.
-
+
SynchronousMediaCodecAdapter
-
+
SynchronousMediaCodecAdapter.Factory
-
+
SystemClock
The standard implementation of
Clock
, an instance of which is available via
Clock.DEFAULT
.
-
+
TeeAudioProcessor
Audio processor that outputs its input unmodified and also outputs its input to a given sink.
-
+
TeeAudioProcessor.AudioBufferSink
A sink for audio buffers handled by the audio processor.
-
+
TeeAudioProcessor.WavFileAudioBufferSink
A sink for audio buffers that writes output audio as .wav files with a given path prefix.
-
+
TeeDataSource
Tees data into a
DataSink
as the data is read.
-
+
TestDownloadManagerListener
-
+
TestExoPlayerBuilder
A builder of
ExoPlayer
instances for testing.
-
+
TestPlayerRunHelper
Helper methods to block the calling thread until the provided
ExoPlayer
instance reaches
a particular state.
-
+
TestUtil
Utility methods for tests.
-
+
TextAnnotation
Properties of a text annotation (i.e.
-
+
TextAnnotation.Position
The possible positions of the annotation text relative to the base text.
-
+
TextEmphasisSpan
A styling span for text emphasis marks.
-
+
TextEmphasisSpan.MarkFill
The possible mark fills that can be used.
-
+
TextEmphasisSpan.MarkShape
The possible mark shapes that can be used.
-
+
TextInformationFrame
Text information ID3 frame.
-
+
TextOutput
Receives text output.
-
+
TextRenderer
A renderer for text.
-
+
TextureInfo
Contains information describing an OpenGL texture.
-
+
ThumbRating
A rating expressed as "thumbs up" or "thumbs down".
-
+
TimeBar
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.
-
+
TimeBar.OnScrubListener
Listener for scrubbing events.
-
+
TimedValueQueue <V >
A utility class to keep a queue of values with timestamps.
-
+
Timeline
A flexible representation of the structure of media.
-
+
Timeline.Period
Holds information about a period in a
Timeline
.
-
+
Timeline.RemotableTimeline
-
+
Timeline.Window
Holds information about a window in a
Timeline
.
-
+
TimelineAsserts
-
+
TimelineQueueEditor
-
+
TimelineQueueEditor.MediaDescriptionConverter
Converts a
MediaDescriptionCompat
to a
MediaItem
.
-
+
TimelineQueueEditor.MediaIdEqualityChecker
Media description comparator comparing the media IDs.
-
+
TimelineQueueEditor.QueueDataAdapter
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
.
-
+
TimelineQueueNavigator
-
+
TimeSignalCommand
Represents a time signal command as defined in SCTE35, Section 9.3.4.
-
+
TimestampAdjuster
Adjusts and offsets sample timestamps.
-
+
TimestampAdjusterProvider
-
+
TimeToFirstByteEstimator
Provides an estimate of the time to first byte of a transfer.
-
+
TraceUtil
Calls through to
Trace
methods on supported API levels.
-
+
Track
Encapsulates information describing an MP4 track.
-
+
Track.Transformation
The transformation to apply to samples in the track, if any.
-
+
TrackEncryptionBox
Encapsulates information parsed from a track encryption (tenc) box or sample group description
(sgpd) box in an MP4 stream.
-
+
TrackGroup
An immutable group of tracks available within a media stream.
-
+
TrackGroupArray
-
+
TrackNameProvider
Converts
Format
s to user readable track names.
-
+
TrackOutput
Receives track level data extracted by an
Extractor
.
-
+
TrackOutput.CryptoData
Holds data required to decrypt a sample.
-
+
TrackOutput.SampleDataPart
-
+
Tracks
Information about groups of tracks.
-
+
Tracks.Group
Information about a single group of tracks, including the underlying
TrackGroup
, the
@@ -7305,544 +7311,544 @@
All Classes
selected.
-
+
TrackSelection
A track selection consisting of a static subset of selected tracks belonging to a
TrackGroup
.
-
+
TrackSelection.Type
Represents a type track selection.
-
+
TrackSelectionArray
-
+
TrackSelectionDialogBuilder
-
+
TrackSelectionDialogBuilder.DialogCallback
Callback which is invoked when a track selection has been made.
-
+
TrackSelectionOverride
A track selection override, consisting of a
TrackGroup
and the indices of the tracks
within the group that should be selected.
-
+
TrackSelectionParameters
Parameters for controlling track selection.
-
+
TrackSelectionParameters.Builder
-
+
TrackSelectionUtil
Track selection related utility methods.
-
+
TrackSelectionUtil.AdaptiveTrackSelectionFactory
Functional interface to create a single adaptive track selection.
-
+
TrackSelectionView
A view for making track selections.
-
+
TrackSelectionView.TrackSelectionListener
Listener for changes to the selected tracks.
-
+
TrackSelector
The component of an
ExoPlayer
responsible for selecting tracks to be consumed by each of
the player's
Renderer
s.
-
+
TrackSelector.InvalidationListener
Notified when selections previously made by a
TrackSelector
are no longer valid.
-
+
TrackSelectorResult
-
+
TransferListener
A listener of data transfer events.
-
+
TransformationException
Thrown when a non-locally recoverable transformation failure occurs.
-
+
TransformationException.ErrorCode
-
+
TransformationRequest
A media transformation request.
-
+
TransformationRequest.Builder
-
+
TransformationResult
Information about the result of a successful transformation.
-
+
TransformationResult.Builder
-
+
Transformer
A transformer to transform media inputs.
-
+
Transformer.Builder
-
+
Transformer.Listener
A listener for the transformation events.
-
+
Transformer.ProgressState
Progress state.
-
+
TrueHdSampleRechunker
-
+
TsExtractor
Extracts data from the MPEG-2 TS container format.
-
+
TsExtractor.Mode
Modes for the extractor.
-
+
TsPayloadReader
Parses TS packet payload data.
-
+
TsPayloadReader.DvbSubtitleInfo
Holds information about a DVB subtitle, as defined in ETSI EN 300 468 V1.11.1 section 6.2.41.
-
+
TsPayloadReader.EsInfo
Holds information associated with a PMT entry.
-
+
TsPayloadReader.Factory
-
+
TsPayloadReader.Flags
Contextual flags indicating the presence of indicators in the TS packet or PES packet headers.
-
+
TsPayloadReader.TrackIdGenerator
-
+
TsUtil
Utilities method for extracting MPEG-TS streams.
-
+
TtmlDecoder
-
+
Tx3gDecoder
-
+
UdpDataSource
-
+
UdpDataSource.UdpDataSourceException
Thrown when an error is encountered when trying to read from a
UdpDataSource
.
-
+
UnknownNull
Annotation for specifying unknown nullness.
-
+
UnrecognizedInputFormatException
Thrown if the input format was not recognized.
-
+
UnsupportedDrmException
Thrown when the requested DRM scheme is not supported.
-
+
UnsupportedDrmException.Reason
The reason for the exception.
-
+
UriUtil
Utility methods for manipulating URIs.
-
+
UrlLinkFrame
Url link ID3 frame.
-
+
UrlTemplate
A template from which URLs can be built.
-
+
UtcTimingElement
Represents a UTCTiming element.
-
+
Util
Miscellaneous utility methods.
-
+
VersionTable
Utility methods for accessing versions of media library database components.
-
+
VideoDecoderGLSurfaceView
-
+
VideoDecoderOutputBuffer
Video decoder output buffer containing video frame data.
-
+
VideoDecoderOutputBufferRenderer
-
+
VideoEncoderSettings
Represents the video encoder settings.
-
+
VideoEncoderSettings.BitrateMode
The allowed values for bitrateMode
.
-
+
VideoEncoderSettings.Builder
-
+
VideoFrameMetadataListener
A listener for metadata corresponding to video frames being rendered.
-
+
VideoFrameReleaseHelper
-
+
VideoRendererEventListener
-
+
VideoRendererEventListener.EventDispatcher
-
+
VideoSize
Represents the video size.
-
+
VorbisBitArray
Wraps a byte array, providing methods that allow it to be read as a Vorbis bitstream.
-
+
VorbisComment
Deprecated.
-
+
VorbisComment
A vorbis comment, extracted from a FLAC or Ogg file.
-
+
VorbisUtil
Utility methods for parsing Vorbis streams.
-
+
VorbisUtil.CommentHeader
Vorbis comment header.
-
+
VorbisUtil.Mode
Vorbis setup header modes.
-
+
VorbisUtil.VorbisIdHeader
Vorbis identification header.
-
+
VpxDecoder
Vpx decoder.
-
+
VpxDecoderException
Thrown when a libvpx decoder error occurs.
-
+
VpxLibrary
Configures and queries the underlying native library.
-
+
WavExtractor
Extracts data from WAV byte streams.
-
+
WavUtil
Utilities for handling WAVE files.
-
+
WebServerDispatcher
A Dispatcher
for MockWebServer
that allows per-path
customisation of the static data served.
-
+
WebServerDispatcher.Resource
-
+
WebServerDispatcher.Resource.Builder
-
+
WebvttCssStyle
Style object of a CSS style block in a WebVTT file.
-
+
WebvttCssStyle.FontSizeUnit
Font size unit enum.
-
+
WebvttCssStyle.StyleFlags
Style flag enum.
-
+
WebvttCueInfo
A representation of a WebVTT cue.
-
+
WebvttCueParser
Parser for WebVTT cues.
-
+
WebvttDecoder
-
+
WebvttExtractor
A special purpose extractor for WebVTT content in HLS.
-
+
WebvttParserUtil
Utility methods for parsing WebVTT data.
-
+
WidevineUtil
Utility methods for Widevine.
-
+
WorkManagerScheduler
-
+
WorkManagerScheduler.SchedulerWorker
A Worker
that starts the target service if the requirements are met.
-
+
WrappingMediaSource
-
+
WritableDownloadIndex
-
+
XmlPullParserUtil
diff --git a/docs/doc/reference/allclasses.html b/docs/doc/reference/allclasses.html
index 55fdc38cb92..b4a657d9f58 100644
--- a/docs/doc/reference/allclasses.html
+++ b/docs/doc/reference/allclasses.html
@@ -1008,6 +1008,7 @@ All Classes
RtspMediaSource
RtspMediaSource.Factory
RtspMediaSource.RtspPlaybackException
+RtspMediaSource.RtspUdpUnsupportedTransportException
RubySpan
RunnableFutureTask
SampleQueue
diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html
index 538b11869b0..9a0cea1b08d 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html
@@ -177,8 +177,7 @@ Threading model
The figure below shows ExoPlayer's threading model.
-
+
ExoPlayer instances must be accessed from a single application thread unless indicated
diff --git a/docs/doc/reference/com/google/android/exoplayer2/Format.html b/docs/doc/reference/com/google/android/exoplayer2/Format.html
index fc4a88a5261..d41f0c89227 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/Format.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/Format.html
@@ -139,7 +139,8 @@ Class Format
Represents a media format.
When building formats, populate all fields whose values are known and relevant to the type of
- format being constructed. For information about different types of format, see ExoPlayer's Supported formats page .
+ format being constructed. For information about different types of format, see ExoPlayer's Supported
+ formats page .
Fields commonly relevant to all formats
diff --git a/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html
index c186c4574ed..f66ea28f5c4 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/ForwardingPlayer.html
@@ -1183,8 +1183,14 @@
getApplicationLooper
See Also:
Constant Field Values
diff --git a/docs/doc/reference/com/google/android/exoplayer2/Renderer.html b/docs/doc/reference/com/google/android/exoplayer2/Renderer.html
index 8826ad3e77d..0f5a553db7f 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/Renderer.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/Renderer.html
@@ -138,8 +138,7 @@ Interface Renderer
valid state transitions are shown below, annotated with the methods that are called during each
transition.
-
+
diff --git a/docs/doc/reference/com/google/android/exoplayer2/Timeline.html b/docs/doc/reference/com/google/android/exoplayer2/Timeline.html
index 0ffea12e2dc..c0793f53455 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/Timeline.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/Timeline.html
@@ -163,8 +163,7 @@ Class Timeline
Single media file or on-demand stream
-
+
A timeline for a single media file or on-demand stream consists of a single period and window.
The window spans the whole period, indicating that all parts of the media are available for
@@ -173,8 +172,7 @@
Single media file or on-demand stream
Playlist of media files or on-demand streams
-
+
A timeline for a playlist of media files or on-demand streams consists of multiple periods,
each with its own window. Each window spans the whole of the corresponding period, and typically
@@ -184,8 +182,7 @@
Playlist of media files or on-demand streams
Live stream with limited availability
-
+
A timeline for a live stream consists of a period whose duration is unknown, since it's
continually extending as more content is broadcast. If content only remains available for a
@@ -197,8 +194,7 @@
Live stream with limited availability
Live stream with indefinite availability
-
+
A timeline for a live stream with indefinite availability is similar to the Live stream with limited availability case, except that the window
starts at the beginning of the period to indicate that all of the previously broadcast content
@@ -206,8 +202,7 @@
Live stream with indefinite availability
Live stream with multiple periods
-
+
This case arises when a live stream is explicitly divided into separate periods, for example
at content boundaries. This case is similar to the Live stream with
@@ -216,8 +211,7 @@ Live stream with multiple periods
On-demand stream followed by live stream
-
+
This case is the concatenation of the Single media file or on-demand
stream and Live stream with multiple periods cases. When playback
@@ -226,8 +220,7 @@
On-demand stream followed by live stream
On-demand stream with mid-roll ads
-
+
This case includes mid-roll ad groups, which are defined as part of the timeline's single
period. The period can be queried for information about the ad groups and the ads they contain.
diff --git a/docs/doc/reference/com/google/android/exoplayer2/Tracks.Group.html b/docs/doc/reference/com/google/android/exoplayer2/Tracks.Group.html
index e4c331cedde..606fff58f69 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/Tracks.Group.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/Tracks.Group.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};
+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};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
@@ -239,58 +239,65 @@
Method Summary
Description
+Tracks.Group
+copyWithId (String groupId)
+
+
+
+
+
boolean
equals (Object other)
-
+
TrackGroup
getMediaTrackGroup ()
Returns the underlying
TrackGroup
defined by the media.
-
+
Format
getTrackFormat (int trackIndex)
Returns the
Format
for a specified track.
-
+
@com.google.android.exoplayer2.C.FormatSupport int
getTrackSupport (int trackIndex)
Returns the level of support for a specified track.
-
+
@com.google.android.exoplayer2.C.TrackType int
getType ()
-
+
int
hashCode ()
-
+
boolean
isAdaptiveSupported ()
Returns whether adaptive selections containing more than one track are supported.
-
+
boolean
isSelected ()
Returns whether at least one track in the group is selected for playback.
-
+
boolean
isSupported ()
@@ -298,21 +305,21 @@ Method Summary
the advertised capabilities of the device.
-
+
boolean
isSupported (boolean allowExceedsCapabilities)
Returns whether at least one track in the group is supported for playback.
-
+
boolean
isTrackSelected (int trackIndex)
Returns whether a specified track is selected for playback.
-
+
boolean
isTrackSupported (int trackIndex)
@@ -320,7 +327,7 @@ Method Summary
capabilities of the device.
-
+
boolean
isTrackSupported (int trackIndex,
boolean allowExceedsCapabilities)
@@ -328,7 +335,7 @@ Method Summary
Returns whether a specified track is supported for playback.
-
+
Bundle
toBundle ()
@@ -591,6 +598,22 @@ getType
+
+
+
+
diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/AuxEffectInfo.html b/docs/doc/reference/com/google/android/exoplayer2/audio/AuxEffectInfo.html
index 5ee419d5e56..da84a041a2d 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/audio/AuxEffectInfo.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/audio/AuxEffectInfo.html
@@ -318,12 +318,12 @@ AuxEffectInfo
Creates an instance with the given effect identifier and send level.
Parameters:
-effectId
- The effect identifier. This is the value returned by AudioEffect.getId()
on the effect, or 0 which represents no
+effectId
- The effect identifier. This is the value returned by AudioEffect.getId()
on the effect, or NO_AUX_EFFECT_ID
which represents no
effect. This value is passed to AudioTrack.attachAuxEffect(int)
on the underlying
audio track.
sendLevel
- The send level for the effect, where 0 represents no effect and a value of 1
- is full send. If effectId
is not 0 , this value is passed
- to AudioTrack.setAuxEffectSendLevel(float)
on the underlying audio track.
+ is full send. If effectId
is not NO_AUX_EFFECT_ID
, this value is passed to
+ AudioTrack.setAuxEffectSendLevel(float)
on the underlying audio track.
diff --git a/docs/doc/reference/com/google/android/exoplayer2/audio/DefaultAudioTrackBufferSizeProvider.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/audio/DefaultAudioTrackBufferSizeProvider.Builder.html
index 32e17ad2ea3..abc7234f3ed 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/audio/DefaultAudioTrackBufferSizeProvider.Builder.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/audio/DefaultAudioTrackBufferSizeProvider.Builder.html
@@ -282,7 +282,7 @@ setMinPcmBufferDurationUs
@CanIgnoreReturnValue
public DefaultAudioTrackBufferSizeProvider.Builder setMinPcmBufferDurationUs(int minPcmBufferDurationUs)
Sets the minimum length for PCM
AudioTrack
buffers, in microseconds. Default is
-
250000 .
+ DefaultAudioTrackBufferSizeProvider.MIN_PCM_BUFFER_DURATION_US
.
@@ -294,7 +294,7 @@ setMaxPcmBufferDurationUs
@CanIgnoreReturnValue
public DefaultAudioTrackBufferSizeProvider.Builder setMaxPcmBufferDurationUs(int maxPcmBufferDurationUs)
Sets the maximum length for PCM
AudioTrack
buffers, in microseconds. Default is
-
750000 .
+ DefaultAudioTrackBufferSizeProvider.MAX_PCM_BUFFER_DURATION_US
.
@@ -306,7 +306,7 @@ setPcmBufferMultiplicationFactor
@CanIgnoreReturnValue
public DefaultAudioTrackBufferSizeProvider.Builder setPcmBufferMultiplicationFactor(int pcmBufferMultiplicationFactor)
Sets the multiplication factor to apply to the minimum buffer size requested. Default is
-
4 .
+ DefaultAudioTrackBufferSizeProvider.PCM_BUFFER_MULTIPLICATION_FACTOR
.
@@ -318,7 +318,7 @@ setPassthroughBufferDurationUs
@CanIgnoreReturnValue
public DefaultAudioTrackBufferSizeProvider.Builder setPassthroughBufferDurationUs(int passthroughBufferDurationUs)
Sets the length for passthrough
AudioTrack
buffers, in microseconds. Default is
-
250000 .
+ DefaultAudioTrackBufferSizeProvider.PASSTHROUGH_BUFFER_DURATION_US
.
@@ -329,7 +329,7 @@ setPassthroughBufferDurationUs
setOffloadBufferDurationUs
@CanIgnoreReturnValue
public DefaultAudioTrackBufferSizeProvider.Builder setOffloadBufferDurationUs(int offloadBufferDurationUs)
-
+
@@ -341,7 +341,7 @@ setAc3BufferMultiplicationFactor
@CanIgnoreReturnValue
public DefaultAudioTrackBufferSizeProvider.Builder setAc3BufferMultiplicationFactor(int ac3BufferMultiplicationFactor)
Sets the multiplication factor to apply to the passthrough buffer for AC3 to avoid underruns
- on some devices (e.g., Broadcom 7271). Default is
2 .
+ on some devices (e.g., Broadcom 7271). Default is DefaultAudioTrackBufferSizeProvider.AC3_BUFFER_MULTIPLICATION_FACTOR
.
diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.Builder.html
index 91a4ede980b..897da54ec96 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.Builder.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.Builder.html
@@ -561,7 +561,7 @@ setAdPreloadTimeoutMs
@CanIgnoreReturnValue
public ImaAdsLoader.Builder setAdPreloadTimeoutMs(long adPreloadTimeoutMs)
Sets the duration in milliseconds for which the player must buffer while preloading an ad
- group before that ad group is skipped and marked as having failed to load. Pass
C.TIME_UNSET
if there should be no such timeout. The default value is
10000L ms.
+ group before that ad group is skipped and marked as having failed to load. Pass
C.TIME_UNSET
if there should be no such timeout. The default value is
DEFAULT_AD_PRELOAD_TIMEOUT_MS
ms.
The purpose of this timeout is to avoid playback getting stuck in the unexpected case that
the IMA SDK does not load an ad break based on the player's reported content position.
diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html b/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html
index 8e4809aef96..8bd08ccb713 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html
@@ -144,14 +144,14 @@ Class DefaultMediaSour
DashMediaSource.Factory
if the item's uri
ends in '.mpd' or if its mimeType field
is
- explicitly set to MimeTypes.APPLICATION_MPD
(Requires the exoplayer-dash module
- to be added to the app).
+ explicitly set to MimeTypes.APPLICATION_MPD
(Requires the exoplayer-dash
+ module to be added to the app).
HlsMediaSource.Factory
if the item's uri
ends in '.m3u8' or if its mimeType field
is
- explicitly set to MimeTypes.APPLICATION_M3U8
(Requires the exoplayer-hls module to
- be added to the app).
+ explicitly set to MimeTypes.APPLICATION_M3U8
(Requires the exoplayer-hls
+ module to be added to the app).
SsMediaSource.Factory
if the item's uri
- ends in '.ism', '.ism/Manifest' or if its mimeType field
is explicitly set to MimeTypes.APPLICATION_SS
(Requires the
+ ends in '.ism', '.ism/Manifest' or if its mimeType field
is explicitly set to MimeTypes.APPLICATION_SS
(Requires the
exoplayer-smoothstreaming module to be added to the app).
ProgressiveMediaSource.Factory
serves as a fallback if the item's uri
doesn't match one of the above. It tries to infer the
required extractor by using the DefaultExtractorsFactory
or the ExtractorsFactory
provided in the constructor. An UnrecognizedInputFormatException
diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.RtspPlaybackException.html b/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.RtspPlaybackException.html
index 804a62adea3..c447f354bf4 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.RtspPlaybackException.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.RtspPlaybackException.html
@@ -142,11 +142,15 @@ Class Rtsp
Serializable
+Direct Known Subclasses:
+RtspMediaSource.RtspUdpUnsupportedTransportException
+
+
Enclosing class:
RtspMediaSource
-public static final class RtspMediaSource.RtspPlaybackException
+public static class RtspMediaSource.RtspPlaybackException
extends IOException
Thrown when an exception or error is encountered during loading an RTSP stream.
diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.RtspUdpUnsupportedTransportException.html b/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.RtspUdpUnsupportedTransportException.html
new file mode 100644
index 00000000000..bc726738bcd
--- /dev/null
+++ b/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.RtspUdpUnsupportedTransportException.html
@@ -0,0 +1,304 @@
+
+
+
+
+RtspMediaSource.RtspUdpUnsupportedTransportException (ExoPlayer library)
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+Detail:
+Field |
+Constr |
+Method
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+
+
+
+
+
+
+
+
+
+
+Method Summary
+
+
+
+
+Methods inherited from class java.lang.Throwable
+addSuppressed , fillInStackTrace , getCause , getLocalizedMessage , getMessage , getStackTrace , getSuppressed , initCause , printStackTrace , printStackTrace , printStackTrace , setStackTrace , toString
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Detail
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+Detail:
+Field |
+Constr |
+Method
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.html b/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.html
index e20479acd0a..2c6eb38b1a9 100644
--- a/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.html
+++ b/docs/doc/reference/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.html
@@ -175,6 +175,13 @@ Nested Class Summary
Thrown when an exception or error is encountered during loading an RTSP stream.
+
+static class
+RtspMediaSource.RtspUdpUnsupportedTransportException
+
+Thrown when an RTSP Unsupported Transport error (461) is encountered during RTSP Setup.
+
+
com.google.android.exoplayer2.util.PriorityTaskManager.PriorityTooLowException
-com.google.android.exoplayer2.source.rtsp.RtspMediaSource.RtspPlaybackException
+com.google.android.exoplayer2.source.rtsp.RtspMediaSource.RtspPlaybackException
+
+
com.google.android.exoplayer2.source.hls.SampleQueueMappingException
diff --git a/docs/doc/reference/package-search-index.zip b/docs/doc/reference/package-search-index.zip
index 6bba74cf923..6cc0f6f2036 100644
Binary files a/docs/doc/reference/package-search-index.zip and b/docs/doc/reference/package-search-index.zip differ
diff --git a/docs/doc/reference/serialized-form.html b/docs/doc/reference/serialized-form.html
index a349af4e7ac..ba2da532390 100644
--- a/docs/doc/reference/serialized-form.html
+++ b/docs/doc/reference/serialized-form.html
@@ -881,6 +881,11 @@ Package com.google.android.exoplayer2.source.rtsp
+
+
+
+
+
diff --git a/docs/doc/reference/type-search-index.js b/docs/doc/reference/type-search-index.js
index db2214010e1..efb94e11a90 100644
--- a/docs/doc/reference/type-search-index.js
+++ b/docs/doc/reference/type-search-index.js
@@ -1 +1,3033 @@
-typeSearchIndex = [{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.AacAudioObjectType"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AbsoluteSized"},{"p":"com.google.android.exoplayer2","l":"AbstractConcatenatedTimeline"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac3Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Extractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Ac4Reader"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util"},{"p":"com.google.android.exoplayer2.testutil","l":"Action"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.AdaptationCheckpoint"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"AdaptationSet"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.AdaptiveSupport"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil.AdaptiveTrackSelectionFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"AdditionalFailureInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.AddMediaItems"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdGroup"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState"},{"p":"com.google.android.exoplayer2.source.ads","l":"ServerSideAdInsertionMediaSource.AdPlaybackStateUpdater"},{"p":"com.google.android.exoplayer2","l":"MediaItem.AdsConfiguration"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaServerSideAdInsertionMediaSource.AdsLoader"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory.AdsLoaderProvider"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdPlaybackState.AdState"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsReader"},{"p":"com.google.android.exoplayer2.ui","l":"AdViewProvider"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSink"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesCipherDataSource"},{"p":"com.google.android.exoplayer2.upstream.crypto","l":"AesFlushingCipher"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Aligned"},{"l":"All Classes","url":"allclasses-index.html"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocation"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocator.AllocationNode"},{"p":"com.google.android.exoplayer2.upstream","l":"Allocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.AllowedCommandProvider"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsCollector"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener"},{"p":"com.google.android.exoplayer2.text","l":"Cue.AnchorType"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.AndSpanFlags"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ApicFrame"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTable"},{"p":"com.google.android.exoplayer2.metadata.dvbsi","l":"AppInfoTableDecoder"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.AppManagedProvider"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.AspectRatioListener"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig"},{"p":"com.google.android.exoplayer2.util","l":"Assertions"},{"p":"com.google.android.exoplayer2.testutil","l":"AssetContentProvider"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"AssetDataSource.AssetDataSourceException"},{"p":"com.google.android.exoplayer2.util","l":"AtomicFile"},{"p":"com.google.android.exoplayer2","l":"C.AudioAllowedCapturePolicy"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes.AudioAttributesV21"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.AudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilities"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioComponent"},{"p":"com.google.android.exoplayer2","l":"C.AudioContentType"},{"p":"com.google.android.exoplayer2","l":"C.AudioFlags"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.AudioFormat"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.AudioOffloadListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.AudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.AudioTrackBufferSizeProvider"},{"p":"com.google.android.exoplayer2","l":"C.AudioUsage"},{"p":"com.google.android.exoplayer2.audio","l":"AuxEffectInfo"},{"p":"com.google.android.exoplayer2.video","l":"AvcConfig"},{"p":"com.google.android.exoplayer2.extractor.avi","l":"AviExtractor"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter"},{"p":"com.google.android.exoplayer2.audio","l":"BaseAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"BaseDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.BaseFactory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkIterator"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BaseMediaChunkOutput"},{"p":"com.google.android.exoplayer2.source","l":"BaseMediaSource"},{"p":"com.google.android.exoplayer2","l":"BasePlayer"},{"p":"com.google.android.exoplayer2","l":"BaseRenderer"},{"p":"com.google.android.exoplayer2.trackselection","l":"BaseTrackSelection"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"BaseUrl"},{"p":"com.google.android.exoplayer2.source.dash","l":"BaseUrlExclusionList"},{"p":"com.google.android.exoplayer2.source","l":"BehindLiveWindowException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"BinaryFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.BinarySearchSeekMap"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.BitmapCallback"},{"p":"com.google.android.exoplayer2.transformer","l":"VideoEncoderSettings.BitrateMode"},{"p":"com.google.android.exoplayer2.decoder","l":"Buffer"},{"p":"com.google.android.exoplayer2","l":"C.BufferFlags"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.BufferReplacementMode"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl.Builder"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl.Builder"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.Builder"},{"p":"com.google.android.exoplayer2","l":"Format.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.AdsConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.ClippingConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.DrmConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.LiveConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.RequestMetadata.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.SubtitleConfiguration.Builder"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.Builder"},{"p":"com.google.android.exoplayer2","l":"Player.Commands.Builder"},{"p":"com.google.android.exoplayer2","l":"SimpleBasePlayer.MediaItemData.Builder"},{"p":"com.google.android.exoplayer2","l":"SimpleBasePlayer.PeriodData.Builder"},{"p":"com.google.android.exoplayer2","l":"SimpleBasePlayer.State.Builder"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer.Builder"},{"p":"com.google.android.exoplayer2.audio","l":"AudioAttributes.Builder"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.Builder"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioTrackBufferSizeProvider.Builder"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Builder"},{"p":"com.google.android.exoplayer2.effect","l":"HslAdjustment.Builder"},{"p":"com.google.android.exoplayer2.effect","l":"RgbAdjustment.Builder"},{"p":"com.google.android.exoplayer2.effect","l":"ScaleToFitTransformation.Builder"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader.Builder"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaServerSideAdInsertionMediaSource.AdsLoader.Builder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.Builder"},{"p":"com.google.android.exoplayer2.source","l":"ConcatenatingMediaSource2.Builder"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.AssertionConfig.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.Builder"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource.Builder"},{"p":"com.google.android.exoplayer2.text","l":"Cue.Builder"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.Parameters.Builder"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"DefaultEncoderFactory.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"TransformationRequest.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"TransformationResult.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Builder"},{"p":"com.google.android.exoplayer2.transformer","l":"VideoEncoderSettings.Builder"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo.Builder"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Builder"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter.Builder"},{"p":"com.google.android.exoplayer2.util","l":"FlagSet.Builder"},{"p":"com.google.android.exoplayer2","l":"Bundleable"},{"p":"com.google.android.exoplayer2.util","l":"BundleableUtil"},{"p":"com.google.android.exoplayer2.source.chunk","l":"BundledChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"BundledExtractorsAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"BundledHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2","l":"BundleListRetriever"},{"p":"com.google.android.exoplayer2.util","l":"BundleUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"ByteArrayDataSource"},{"p":"com.google.android.exoplayer2","l":"C"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.CacheDataSinkException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"CachedRegionTracker"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheEvictor"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.CacheException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.CacheIgnoredReason"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheKeyFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheSpan"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener.Callback"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.Callback"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod.Callback"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.Callback"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget.Callback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Callback"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionListener"},{"p":"com.google.android.exoplayer2.video.spherical","l":"CameraMotionRenderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.Capabilities"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CaptionCallback"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingAudioSink"},{"p":"com.google.android.exoplayer2.testutil","l":"CapturingRenderersFactory"},{"p":"com.google.android.exoplayer2.ext.cast","l":"CastPlayer"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea608Decoder"},{"p":"com.google.android.exoplayer2.text.cea","l":"Cea708Decoder"},{"p":"com.google.android.exoplayer2.extractor","l":"CeaUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterFrame"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"ChapterTocFrame"},{"p":"com.google.android.exoplayer2.source.chunk","l":"Chunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkHolder"},{"p":"com.google.android.exoplayer2.extractor","l":"ChunkIndex"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearMediaItems"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.CleartextNotPermittedException"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ClearVideoSurface"},{"p":"com.google.android.exoplayer2","l":"MediaItem.ClippingConfiguration"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource"},{"p":"com.google.android.exoplayer2","l":"MediaItem.ClippingProperties"},{"p":"com.google.android.exoplayer2.util","l":"Clock"},{"p":"com.google.android.exoplayer2.transformer","l":"Codec"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer.CodecMaxValues"},{"p":"com.google.android.exoplayer2.util","l":"CodecSpecificDataUtil"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Colored"},{"p":"com.google.android.exoplayer2.video","l":"ColorInfo"},{"p":"com.google.android.exoplayer2.effect","l":"ColorLut"},{"p":"com.google.android.exoplayer2.util","l":"ColorParser"},{"p":"com.google.android.exoplayer2","l":"C.ColorRange"},{"p":"com.google.android.exoplayer2","l":"C.ColorSpace"},{"p":"com.google.android.exoplayer2","l":"C.ColorTransfer"},{"p":"com.google.android.exoplayer2","l":"Player.Command"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CommandReceiver"},{"p":"com.google.android.exoplayer2","l":"Player.Commands"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"CommentFrame"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.CommentHeader"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.ComponentSplice"},{"p":"com.google.android.exoplayer2.source","l":"CompositeMediaSource"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoader"},{"p":"com.google.android.exoplayer2.source","l":"CompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.source","l":"ConcatenatingMediaSource"},{"p":"com.google.android.exoplayer2.source","l":"ConcatenatingMediaSource2"},{"p":"com.google.android.exoplayer2.util","l":"ConditionVariable"},{"p":"com.google.android.exoplayer2.audio","l":"AacUtil.Config"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Configuration"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.ConfigurationException"},{"p":"com.google.android.exoplayer2.extractor","l":"ConstantBitrateSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"Consumer"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ContainerMediaChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"ContentDataSource.ContentDataSourceException"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadata"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"ContentMetadataMutations"},{"p":"com.google.android.exoplayer2","l":"C.ContentType"},{"p":"com.google.android.exoplayer2.effect","l":"Contrast"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView.ControllerVisibilityListener"},{"p":"com.google.android.exoplayer2.util","l":"CopyOnWriteMultiset"},{"p":"com.google.android.exoplayer2","l":"Bundleable.Creator"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSourceFactory"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetEngineWrapper"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetUtil"},{"p":"com.google.android.exoplayer2.effect","l":"Crop"},{"p":"com.google.android.exoplayer2.decoder","l":"CryptoConfig"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.CryptoData"},{"p":"com.google.android.exoplayer2.decoder","l":"CryptoException"},{"p":"com.google.android.exoplayer2.decoder","l":"CryptoInfo"},{"p":"com.google.android.exoplayer2","l":"C.CryptoMode"},{"p":"com.google.android.exoplayer2","l":"C.CryptoType"},{"p":"com.google.android.exoplayer2.text","l":"Cue"},{"p":"com.google.android.exoplayer2.text","l":"CueDecoder"},{"p":"com.google.android.exoplayer2.text","l":"CueEncoder"},{"p":"com.google.android.exoplayer2.text","l":"CueGroup"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.CustomActionProvider"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.CustomActionReceiver"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.CustomCommandProvider"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource"},{"p":"com.google.android.exoplayer2.source.dash.offline","l":"DashDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifest"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashManifestStaleException"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashSegmentIndex"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashUtil"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashWrappingSegmentIndex"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseIOException"},{"p":"com.google.android.exoplayer2.database","l":"DatabaseProvider"},{"p":"com.google.android.exoplayer2.source.chunk","l":"DataChunk"},{"p":"com.google.android.exoplayer2.upstream","l":"DataReader"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSchemeDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceException"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceInputStream"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSourceUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec"},{"p":"com.google.android.exoplayer2","l":"C.DataType"},{"p":"com.google.android.exoplayer2.util","l":"DebugTextViewHelper"},{"p":"com.google.android.exoplayer2.util","l":"DebugViewProvider"},{"p":"com.google.android.exoplayer2.testutil","l":"DecodeOneFrameUtil"},{"p":"com.google.android.exoplayer2.decoder","l":"Decoder"},{"p":"com.google.android.exoplayer2.audio","l":"DecoderAudioRenderer"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderCounters"},{"p":"com.google.android.exoplayer2.testutil","l":"DecoderCountersUtil"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderDiscardReasons"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderException"},{"p":"com.google.android.exoplayer2.transformer","l":"Codec.DecoderFactory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer.DecoderInitializationException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderOutputBuffer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil.DecoderQueryException"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderReuseEvaluation.DecoderReuseResult"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.DecoderSupport"},{"p":"com.google.android.exoplayer2.video","l":"DecoderVideoRenderer"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultAllocator"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DefaultAllowedCommandProvider"},{"p":"com.google.android.exoplayer2.analytics","l":"DefaultAnalyticsCollector"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.DefaultAudioProcessorChain"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioTrackBufferSizeProvider"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultBandwidthMeter"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultCastOptionsProvider"},{"p":"com.google.android.exoplayer2.transformer","l":"DefaultCodec"},{"p":"com.google.android.exoplayer2.source","l":"DefaultCompositeSequenceableLoaderFactory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"DefaultContentMetadata"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource"},{"p":"com.google.android.exoplayer2.database","l":"DefaultDatabaseProvider"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSourceFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DefaultDownloadIndex"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.transformer","l":"DefaultEncoderFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"DefaultExtractorsFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"DefaultHlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"DefaultHlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource"},{"p":"com.google.android.exoplayer2","l":"DefaultLivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2","l":"DefaultLoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultLoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.mediacodec","l":"DefaultMediaCodecAdapterFactory"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultMediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.ext.cast","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"DefaultMediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.DefaultMediaMetadataProvider"},{"p":"com.google.android.exoplayer2.source","l":"DefaultMediaSourceFactory"},{"p":"com.google.android.exoplayer2.transformer","l":"DefaultMuxer"},{"p":"com.google.android.exoplayer2.analytics","l":"DefaultPlaybackSessionManager"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"DefaultRenderersFactoryAsserts"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"DefaultRtpPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.DefaultSeekTimestampConverter"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.DefaultShuffleOrder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTimeBar"},{"p":"com.google.android.exoplayer2.ui","l":"DefaultTrackNameProvider"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Definition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser.DeltaUpdateException"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Descriptor"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.DeviceComponent"},{"p":"com.google.android.exoplayer2","l":"DeviceInfo"},{"p":"com.google.android.exoplayer2.transformer","l":"DeviceMappedEncoderBitrateProvider"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder.DialogCallback"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.DisconnectedCallback"},{"p":"com.google.android.exoplayer2","l":"Player.DiscontinuityReason"},{"p":"com.google.android.exoplayer2.video","l":"DolbyVisionConfig"},{"p":"com.google.android.exoplayer2.offline","l":"Download"},{"p":"com.google.android.exoplayer2.testutil","l":"DownloadBuilder"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadCursor"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader"},{"p":"com.google.android.exoplayer2.offline","l":"DownloaderFactory"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadException"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadIndex"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager"},{"p":"com.google.android.exoplayer2.ui","l":"DownloadNotificationHelper"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadProgress"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadService"},{"p":"com.google.android.exoplayer2","l":"MediaItem.DrmConfiguration"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.DrmSessionException"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManagerProvider"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionManager.DrmSessionReference"},{"p":"com.google.android.exoplayer2.drm","l":"DrmUtil"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DtsReader"},{"p":"com.google.android.exoplayer2.audio","l":"DtsUtil"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower.Dummy"},{"p":"com.google.android.exoplayer2.drm","l":"DummyExoMediaDrm"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread"},{"p":"com.google.android.exoplayer2.extractor","l":"DummyTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper.Dumpable"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpableFormat"},{"p":"com.google.android.exoplayer2.testutil","l":"Dumper"},{"p":"com.google.android.exoplayer2.testutil","l":"DumpFileAsserts"},{"p":"com.google.android.exoplayer2.text.dvb","l":"DvbDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.DvbSubtitleInfo"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DvbSubtitleReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor"},{"p":"com.google.android.exoplayer2.ui","l":"CaptionStyleCompat.EdgeType"},{"p":"com.google.android.exoplayer2.util","l":"Effect"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"ElementaryStreamReader"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"EbmlProcessor.ElementType"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.EmbeddedSampleStream"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.EmphasizedText"},{"p":"com.google.android.exoplayer2.source","l":"EmptySampleStream"},{"p":"com.google.android.exoplayer2.transformer","l":"EncoderBitrateProvider"},{"p":"com.google.android.exoplayer2.transformer","l":"Codec.EncoderFactory"},{"p":"com.google.android.exoplayer2.transformer","l":"EncoderSelector"},{"p":"com.google.android.exoplayer2.transformer","l":"EncoderUtil"},{"p":"com.google.android.exoplayer2","l":"C.Encoding"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata.Entry"},{"p":"com.google.android.exoplayer2","l":"PlaybackException.ErrorCode"},{"p":"com.google.android.exoplayer2.transformer","l":"TransformationException.ErrorCode"},{"p":"com.google.android.exoplayer2.effect","l":"GlTextureProcessor.ErrorListener"},{"p":"com.google.android.exoplayer2.util","l":"ErrorMessageProvider"},{"p":"com.google.android.exoplayer2.drm","l":"DrmUtil.ErrorSource"},{"p":"com.google.android.exoplayer2.drm","l":"ErrorStateDrmSession"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.EsInfo"},{"p":"com.google.android.exoplayer2","l":"Player.Event"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand.Event"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.Event"},{"p":"com.google.android.exoplayer2.audio","l":"AudioRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSessionEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener.EventDispatcher"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventFlags"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader.EventListener"},{"p":"com.google.android.exoplayer2.upstream","l":"BandwidthMeter.EventListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.EventListener"},{"p":"com.google.android.exoplayer2.util","l":"EventLogger"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessage"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageDecoder"},{"p":"com.google.android.exoplayer2.metadata.emsg","l":"EventMessageEncoder"},{"p":"com.google.android.exoplayer2","l":"Player.Events"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.Events"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"EventStream"},{"p":"com.google.android.exoplayer2.analytics","l":"AnalyticsListener.EventTime"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndException"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndFormat"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats.EventTimeAndPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ExecuteRunnable"},{"p":"com.google.android.exoplayer2.database","l":"ExoDatabaseProvider"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoHostedTest"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer"},{"p":"com.google.android.exoplayer2.text","l":"ExoplayerCuesDecoder"},{"p":"com.google.android.exoplayer2","l":"ExoPlayerLibraryInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"ExoPlayerTestRunner"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection"},{"p":"com.google.android.exoplayer2","l":"DefaultRenderersFactory.ExtensionRendererMode"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.ExtractorFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorInput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorOutput"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorsFactory"},{"p":"com.google.android.exoplayer2.extractor","l":"ExtractorUtil"},{"p":"com.google.android.exoplayer2.effect","l":"GlEffectsFrameProcessor.Factory"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.Factory"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaServerSideAdInsertionMediaSource.Factory"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSource.Factory"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter.Factory"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor.Factory"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DashMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.Factory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"DefaultSsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource.Factory"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"AdaptiveTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"ExoTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection.Factory"},{"p":"com.google.android.exoplayer2.transformer","l":"DefaultMuxer.Factory"},{"p":"com.google.android.exoplayer2.transformer","l":"Muxer.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"DefaultHttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSink.Factory"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Factory"},{"p":"com.google.android.exoplayer2.util","l":"FrameProcessor.Factory"},{"p":"com.google.android.exoplayer2.testutil","l":"FailOnCloseDataSink"},{"p":"com.google.android.exoplayer2.offline","l":"Download.FailureReason"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAudioRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeChunkSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeCryptoConfig"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunk"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaChunkIterator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaClockRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSourceFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMetadataEntry"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeSampleStream.FakeSampleStreamItem"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackOutput"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelection"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTrackSelector"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.FakeTransferListener"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeVideoRenderer"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackOptions"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackSelection"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.FallbackType"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegDecoderException"},{"p":"com.google.android.exoplayer2.ext.ffmpeg","l":"FfmpegLibrary"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"FileDataSource.FileDataSourceException"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes"},{"p":"com.google.android.exoplayer2.offline","l":"FilterableManifest"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts.FilterableManifestMediaPeriodFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"FilteringHlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.offline","l":"FilteringManifestParser"},{"p":"com.google.android.exoplayer2.trackselection","l":"FixedTrackSelection"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacConstants"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacDecoderException"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacLibrary"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacSeekTableSeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacMetadataReader.FlacStreamMetadataHolder"},{"p":"com.google.android.exoplayer2.ext.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.amr","l":"AmrExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.flac","l":"FlacExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"AdtsExtractor.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"DefaultTsPayloadReaderFactory.Flags"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.Flags"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.Flags"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheDataSource.Flags"},{"p":"com.google.android.exoplayer2.util","l":"FlagSet"},{"p":"com.google.android.exoplayer2.extractor.flv","l":"FlvExtractor"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.FolderType"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.FontSizeUnit"},{"p":"com.google.android.exoplayer2","l":"Format"},{"p":"com.google.android.exoplayer2","l":"FormatHolder"},{"p":"com.google.android.exoplayer2","l":"C.FormatSupport"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.FormatSupport"},{"p":"com.google.android.exoplayer2.audio","l":"ForwardingAudioSink"},{"p":"com.google.android.exoplayer2.extractor","l":"ForwardingExtractorInput"},{"p":"com.google.android.exoplayer2","l":"ForwardingPlayer"},{"p":"com.google.android.exoplayer2.source","l":"ForwardingTimeline"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"FragmentedMp4Extractor"},{"p":"com.google.android.exoplayer2.util","l":"FrameInfo"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder.FramePredicate"},{"p":"com.google.android.exoplayer2.util","l":"FrameProcessingException"},{"p":"com.google.android.exoplayer2.util","l":"FrameProcessor"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkCryptoConfig"},{"p":"com.google.android.exoplayer2.drm","l":"FrameworkMediaDrm"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView.FullscreenButtonClickListener"},{"p":"com.google.android.exoplayer2.extractor","l":"GaplessInfoHolder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Decoder"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1DecoderException"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Gav1Library"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"GeobFrame"},{"p":"com.google.android.exoplayer2.effect","l":"GlEffect"},{"p":"com.google.android.exoplayer2.effect","l":"GlEffectsFrameProcessor"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil.GlException"},{"p":"com.google.android.exoplayer2.effect","l":"GlMatrixTransformation"},{"p":"com.google.android.exoplayer2.util","l":"GlProgram"},{"p":"com.google.android.exoplayer2.effect","l":"GlTextureProcessor"},{"p":"com.google.android.exoplayer2.util","l":"GlUtil"},{"p":"com.google.android.exoplayer2","l":"Tracks.Group"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H262Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H263Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H264Reader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"H265Reader"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.H265SpsData"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeClock.HandlerMessage"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.HardwareAccelerationSupport"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil.Header"},{"p":"com.google.android.exoplayer2","l":"HeartRating"},{"p":"com.google.android.exoplayer2.video","l":"HevcConfig"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.hls.offline","l":"HlsDownloader"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsExtractorFactory"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsManifest"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMasterPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaPeriod"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMultivariantPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylist"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParser"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistParserFactory"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry"},{"p":"com.google.android.exoplayer2.text.span","l":"HorizontalTextInVerticalContextSpan"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity"},{"p":"com.google.android.exoplayer2.testutil","l":"HostActivity.HostedTest"},{"p":"com.google.android.exoplayer2.effect","l":"HslAdjustment"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException"},{"p":"com.google.android.exoplayer2.testutil","l":"HttpDataSourceTestEnv"},{"p":"com.google.android.exoplayer2.drm","l":"HttpMediaDrmCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"DataSpec.HttpMethod"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpUtil"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyDecoder"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyHeaders"},{"p":"com.google.android.exoplayer2.metadata.icy","l":"IcyInfo"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Decoder"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"Id3Frame"},{"p":"com.google.android.exoplayer2.extractor","l":"Id3Peeker"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"Id3Reader"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException"},{"p":"com.google.android.exoplayer2","l":"IllegalSeekPositionException"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaAdsLoader"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaServerSideAdInsertionMediaSource"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaServerSideAdInsertionUriBuilder"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil.Importance"},{"p":"com.google.android.exoplayer2.extractor","l":"IndexSeekMap"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient.InitializationCallback"},{"p":"com.google.android.exoplayer2.source.chunk","l":"InitializationChunk"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.InitializationException"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaSource.InitialTimeline"},{"p":"com.google.android.exoplayer2.effect","l":"GlTextureProcessor.InputListener"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"InputReaderAdapterV30"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderInputBuffer.InsufficientCapacityException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"InternalFrame"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector.InvalidationListener"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.InvalidAudioTrackTimestampException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidContentTypeException"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.InvalidResponseCodeException"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet.IterationFinishedEvent"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeAdaptiveDataSet.Iterator"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"JpegExtractor"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest"},{"p":"com.google.android.exoplayer2.drm","l":"KeysExpiredException"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyStatus"},{"p":"com.google.android.exoplayer2.text.span","l":"LanguageFeatureSpan"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"LatmReader"},{"p":"com.google.android.exoplayer2.effect","l":"Presentation.Layout"},{"p":"com.google.android.exoplayer2.ext.leanback","l":"LeanbackPlayerAdapter"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"LeastRecentlyUsedCacheEvictor"},{"p":"com.google.android.exoplayer2","l":"LegacyMediaPlayerWrapper"},{"p":"com.google.android.exoplayer2.ext.flac","l":"LibflacAudioRenderer"},{"p":"com.google.android.exoplayer2.ext.av1","l":"Libgav1VideoRenderer"},{"p":"com.google.android.exoplayer2.ext.opus","l":"LibopusAudioRenderer"},{"p":"com.google.android.exoplayer2.util","l":"LibraryLoader"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"LibvpxVideoRenderer"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExoMediaDrm.LicenseServer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.LineType"},{"p":"com.google.android.exoplayer2","l":"Player.Listener"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioCapabilitiesReceiver.Listener"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.Listener"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadManager.Listener"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher.Listener"},{"p":"com.google.android.exoplayer2.testutil","l":"DecodeOneFrameUtil.Listener"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.Listener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"Cache.Listener"},{"p":"com.google.android.exoplayer2.util","l":"FrameProcessor.Listener"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver.Listener"},{"p":"com.google.android.exoplayer2.util","l":"ListenerSet"},{"p":"com.google.android.exoplayer2","l":"MediaItem.LiveConfiguration"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadHelper.LiveContentUnsupportedException"},{"p":"com.google.android.exoplayer2","l":"LivePlaybackSpeedControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.Loadable"},{"p":"com.google.android.exoplayer2","l":"LoadControl"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader"},{"p":"com.google.android.exoplayer2.upstream","l":"LoaderErrorThrower"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.LoadErrorAction"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy"},{"p":"com.google.android.exoplayer2.upstream","l":"LoadErrorHandlingPolicy.LoadErrorInfo"},{"p":"com.google.android.exoplayer2.source","l":"LoadEventInfo"},{"p":"com.google.android.exoplayer2","l":"MediaItem.LocalConfiguration"},{"p":"com.google.android.exoplayer2.drm","l":"LocalMediaDrmCallback"},{"p":"com.google.android.exoplayer2.util","l":"Log"},{"p":"com.google.android.exoplayer2.util","l":"Log.Logger"},{"p":"com.google.android.exoplayer2.util","l":"Log.LogLevel"},{"p":"com.google.android.exoplayer2.util","l":"LongArray"},{"p":"com.google.android.exoplayer2.source","l":"LoopingMediaSource"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector.MappedTrackInfo"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkFill"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan.MarkShape"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource"},{"p":"com.google.android.exoplayer2.effect","l":"MatrixTransformation"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MdtaMetadataEntry"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaButtonEventHandler"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunk"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaChunkIterator"},{"p":"com.google.android.exoplayer2.util","l":"MediaClock"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter"},{"p":"com.google.android.exoplayer2.audio","l":"MediaCodecAudioRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecDecoderException"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecRenderer"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecSelector"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecUtil"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoDecoderException"},{"p":"com.google.android.exoplayer2.video","l":"MediaCodecVideoRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.MediaDescriptionAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaDescriptionConverter"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallback"},{"p":"com.google.android.exoplayer2.drm","l":"MediaDrmCallbackException"},{"p":"com.google.android.exoplayer2.util","l":"MediaFormatUtil"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.MediaIdEqualityChecker"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaIdMediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"MediaItem"},{"p":"com.google.android.exoplayer2.ext.cast","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2.ext.media2","l":"MediaItemConverter"},{"p":"com.google.android.exoplayer2","l":"SimpleBasePlayer.MediaItemData"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.MediaItemProvider"},{"p":"com.google.android.exoplayer2","l":"Player.MediaItemTransitionReason"},{"p":"com.google.android.exoplayer2.source","l":"MediaLoadData"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.MediaMetadataProvider"},{"p":"com.google.android.exoplayer2.analytics","l":"MediaMetricsListener"},{"p":"com.google.android.exoplayer2.source.chunk","l":"MediaParserChunkExtractor"},{"p":"com.google.android.exoplayer2.source","l":"MediaParserExtractorAdapter"},{"p":"com.google.android.exoplayer2.source.hls","l":"MediaParserHlsMediaChunkExtractor"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"MediaParserUtil"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriod"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaPeriodAsserts"},{"p":"com.google.android.exoplayer2.source","l":"MediaPeriodId"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaPeriodId"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource"},{"p":"com.google.android.exoplayer2.source","l":"MediaSource.MediaSourceCaller"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceEventListener"},{"p":"com.google.android.exoplayer2.source","l":"MediaSourceFactory"},{"p":"com.google.android.exoplayer2.testutil","l":"MediaSourceTestRunner"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.MediaType"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource"},{"p":"com.google.android.exoplayer2.util","l":"HandlerWrapper.Message"},{"p":"com.google.android.exoplayer2","l":"Renderer.MessageType"},{"p":"com.google.android.exoplayer2.metadata","l":"Metadata"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoder"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataDecoderFactory"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataInputBuffer"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataOutput"},{"p":"com.google.android.exoplayer2.metadata","l":"MetadataRenderer"},{"p":"com.google.android.exoplayer2","l":"MetadataRetriever"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsMediaSource.MetadataType"},{"p":"com.google.android.exoplayer2.util","l":"MimeTypes"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser.MissingFieldException"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.MissingSchemeDataException"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"MlltFrame"},{"p":"com.google.android.exoplayer2.drm","l":"DefaultDrmSessionManager.Mode"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.Mode"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor.Mode"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"MotionPhotoMetadata"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.MoveMediaItem"},{"p":"com.google.android.exoplayer2.extractor.mp3","l":"Mp3Extractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Mp4Extractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"Mp4WebvttDecoder"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"MpegAudioReader"},{"p":"com.google.android.exoplayer2.audio","l":"MpegAudioUtil"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.MultiSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.MultiSegmentRepresentation"},{"p":"com.google.android.exoplayer2.transformer","l":"Muxer"},{"p":"com.google.android.exoplayer2.transformer","l":"Muxer.MuxerException"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil"},{"p":"com.google.android.exoplayer2","l":"C.NetworkType"},{"p":"com.google.android.exoplayer2.util","l":"NetworkTypeObserver"},{"p":"com.google.android.exoplayer2.util","l":"NonNullApi"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"NoOpCacheEvictor"},{"p":"com.google.android.exoplayer2","l":"NoSampleRenderer"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.NotificationListener"},{"p":"com.google.android.exoplayer2.util","l":"NotificationUtil"},{"p":"com.google.android.exoplayer2.drm","l":"OfflineLicenseHelper"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.OffloadMode"},{"p":"com.google.android.exoplayer2.extractor.ogg","l":"OggExtractor"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSource"},{"p":"com.google.android.exoplayer2.ext.okhttp","l":"OkHttpDataSourceFactory"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnEventListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnExpirationUpdateListener"},{"p":"com.google.android.exoplayer2.mediacodec","l":"MediaCodecAdapter.OnFrameRenderedListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.OnFullScreenModeChangedListener"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.OnKeyStatusChangeListener"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar.OnScrubListener"},{"p":"com.google.android.exoplayer2.ext.cronet","l":"CronetDataSource.OpenException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoder"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusDecoderException"},{"p":"com.google.android.exoplayer2.ext.opus","l":"OpusLibrary"},{"p":"com.google.android.exoplayer2.audio","l":"OpusUtil"},{"p":"com.google.android.exoplayer2.source.mediaparser","l":"OutputConsumerAdapterV30"},{"p":"com.google.android.exoplayer2.effect","l":"GlTextureProcessor.OutputListener"},{"p":"com.google.android.exoplayer2.audio","l":"DefaultAudioSink.OutputMode"},{"p":"com.google.android.exoplayer2.decoder","l":"DecoderOutputBuffer.Owner"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.Parameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.ParametersBuilder"},{"p":"com.google.android.exoplayer2.util","l":"ParsableBitArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableByteArray"},{"p":"com.google.android.exoplayer2.util","l":"ParsableNalUnitBitArray"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable.Parser"},{"p":"com.google.android.exoplayer2","l":"ParserException"},{"p":"com.google.android.exoplayer2.upstream","l":"ParsingLoadable"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Part"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PassthroughSectionPayloadReader"},{"p":"com.google.android.exoplayer2","l":"C.PcmEncoding"},{"p":"com.google.android.exoplayer2","l":"PercentageRating"},{"p":"com.google.android.exoplayer2","l":"Timeline.Period"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Period"},{"p":"com.google.android.exoplayer2","l":"SimpleBasePlayer.PeriodData"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PesReader"},{"p":"com.google.android.exoplayer2.text.pgs","l":"PgsDecoder"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"PictureFrame"},{"p":"com.google.android.exoplayer2","l":"MediaMetadata.PictureType"},{"p":"com.google.android.exoplayer2.upstream","l":"PlaceholderDataSource"},{"p":"com.google.android.exoplayer2.video","l":"PlaceholderSurface"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaSource.PlaceholderTimeline"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler"},{"p":"com.google.android.exoplayer2.scheduler","l":"PlatformScheduler.PlatformSchedulerService"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackActions"},{"p":"com.google.android.exoplayer2","l":"PlaybackException"},{"p":"com.google.android.exoplayer2.robolectric","l":"PlaybackOutput"},{"p":"com.google.android.exoplayer2","l":"PlaybackParameters"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.PlaybackPreparer"},{"p":"com.google.android.exoplayer2","l":"MediaItem.PlaybackProperties"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackSessionManager"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStats"},{"p":"com.google.android.exoplayer2.analytics","l":"PlaybackStatsListener"},{"p":"com.google.android.exoplayer2","l":"Player.PlaybackSuppressionReason"},{"p":"com.google.android.exoplayer2","l":"DeviceInfo.PlaybackType"},{"p":"com.google.android.exoplayer2","l":"Player"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerEmsgCallback"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler"},{"p":"com.google.android.exoplayer2.analytics","l":"PlayerId"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"ActionSchedule.PlayerTarget"},{"p":"com.google.android.exoplayer2.source.dash","l":"PlayerEmsgHandler.PlayerTrackEmsgHandler"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistEventListener"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistResetException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PlaylistStuckException"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.PlaylistType"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.PlayUntilPosition"},{"p":"com.google.android.exoplayer2","l":"Player.PlayWhenReadyChangeReason"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation.Position"},{"p":"com.google.android.exoplayer2.extractor","l":"PositionHolder"},{"p":"com.google.android.exoplayer2","l":"Player.PositionInfo"},{"p":"com.google.android.exoplayer2","l":"SimpleBasePlayer.PositionSupplier"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.PostConnectCallback"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.PpsData"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Prepare"},{"p":"com.google.android.exoplayer2.source","l":"MaskingMediaPeriod.PrepareListener"},{"p":"com.google.android.exoplayer2.effect","l":"Presentation"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsPlaylistTracker.PrimaryPlaylistListener"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Priority"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"PriorityDataSourceFactory"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager"},{"p":"com.google.android.exoplayer2.util","l":"PriorityTaskManager.PriorityTooLowException"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"PrivateCommand"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"PrivFrame"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ProgramInformation"},{"p":"com.google.android.exoplayer2.transformer","l":"ProgressHolder"},{"p":"com.google.android.exoplayer2.offline","l":"ProgressiveDownloader"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaExtractor"},{"p":"com.google.android.exoplayer2.source","l":"ProgressiveMediaSource"},{"p":"com.google.android.exoplayer2.offline","l":"Downloader.ProgressListener"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"CacheWriter.ProgressListener"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer.ProgressState"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.ProgressUpdateListener"},{"p":"com.google.android.exoplayer2","l":"C.Projection"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.ProtectionElement"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.Provider"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsLoader.Provider"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.ProvisionRequest"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"PsExtractor"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"PsshAtomUtil"},{"p":"com.google.android.exoplayer2.ui","l":"AdOverlayInfo.Purpose"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor.QueueDataAdapter"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.QueueNavigator"},{"p":"com.google.android.exoplayer2.robolectric","l":"RandomizedMp3Decoder"},{"p":"com.google.android.exoplayer2.trackselection","l":"RandomTrackSelection"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"RangedUri"},{"p":"com.google.android.exoplayer2","l":"Rating"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.RatingCallback"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"MediaSessionConnector.RatingCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"RawResourceDataSource.RawResourceDataSourceException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadDataResult"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream.ReadFlags"},{"p":"com.google.android.exoplayer2.extractor","l":"Extractor.ReadResult"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"ClippingMediaSource.IllegalClippingException.Reason"},{"p":"com.google.android.exoplayer2.source","l":"MergingMediaSource.IllegalMergeException.Reason"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RelativeSized"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkSampleStream.ReleaseCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.ReleaseCallback"},{"p":"com.google.android.exoplayer2","l":"Timeline.RemotableTimeline"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItem"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.RemoveMediaItems"},{"p":"com.google.android.exoplayer2","l":"Renderer"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities"},{"p":"com.google.android.exoplayer2","l":"RendererConfiguration"},{"p":"com.google.android.exoplayer2","l":"RenderersFactory"},{"p":"com.google.android.exoplayer2.trackselection","l":"MappingTrackSelector.MappedTrackInfo.RendererSupport"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMultivariantPlaylist.Rendition"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.RenditionReport"},{"p":"com.google.android.exoplayer2","l":"Player.RepeatMode"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"RepeatModeActionProvider"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil"},{"p":"com.google.android.exoplayer2.util","l":"RepeatModeUtil.RepeatToggleModes"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationHolder"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"DashManifestParser.RepresentationInfo"},{"p":"com.google.android.exoplayer2.source.dash","l":"DefaultDashChunkSource.RepresentationSegmentIterator"},{"p":"com.google.android.exoplayer2","l":"MediaItem.RequestMetadata"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.RequestProperties"},{"p":"com.google.android.exoplayer2.testutil","l":"CacheAsserts.RequestSet"},{"p":"com.google.android.exoplayer2.drm","l":"ExoMediaDrm.KeyRequest.RequestType"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements.RequirementFlags"},{"p":"com.google.android.exoplayer2.scheduler","l":"Requirements"},{"p":"com.google.android.exoplayer2.scheduler","l":"RequirementsWatcher"},{"p":"com.google.android.exoplayer2.ui","l":"AspectRatioFrameLayout.ResizeMode"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource.Resolver"},{"p":"com.google.android.exoplayer2.upstream","l":"ResolvingDataSource"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher.Resource"},{"p":"com.google.android.exoplayer2.effect","l":"RgbAdjustment"},{"p":"com.google.android.exoplayer2.effect","l":"RgbFilter"},{"p":"com.google.android.exoplayer2.effect","l":"RgbMatrix"},{"p":"com.google.android.exoplayer2.robolectric","l":"RobolectricUtil"},{"p":"com.google.android.exoplayer2","l":"C.RoleFlags"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSource"},{"p":"com.google.android.exoplayer2.ext.rtmp","l":"RtmpDataSourceFactory"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpAc3Reader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPacket"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpPayloadFormat"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPayloadReader"},{"p":"com.google.android.exoplayer2.source.rtsp.reader","l":"RtpPcmReader"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtpUtils"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource"},{"p":"com.google.android.exoplayer2.source.rtsp","l":"RtspMediaSource.RtspPlaybackException"},{"p":"com.google.android.exoplayer2.text.span","l":"RubySpan"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.RubyText"},{"p":"com.google.android.exoplayer2.util","l":"RunnableFutureTask"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput.SampleDataPart"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacFrameReader.SampleNumberHolder"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue"},{"p":"com.google.android.exoplayer2.source.hls","l":"SampleQueueMappingException"},{"p":"com.google.android.exoplayer2.source","l":"SampleStream"},{"p":"com.google.android.exoplayer2.effect","l":"ScaleToFitTransformation"},{"p":"com.google.android.exoplayer2.scheduler","l":"Scheduler"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler.SchedulerWorker"},{"p":"com.google.android.exoplayer2.drm","l":"DrmInitData.SchemeData"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SectionReader"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.SecureMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Seek"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekOperationParams"},{"p":"com.google.android.exoplayer2","l":"SeekParameters"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekPoint"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.SeekPoints"},{"p":"com.google.android.exoplayer2.extractor","l":"FlacStreamMetadata.SeekTable"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.SeekTimestampConverter"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData.Segment"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader.Segment"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.Segment"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeDataSet.FakeData.Segment"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.SegmentBase"},{"p":"com.google.android.exoplayer2.offline","l":"SegmentDownloader"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentList"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SegmentTimelineElement"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"SeiReader"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.SelectionEligibility"},{"p":"com.google.android.exoplayer2","l":"C.SelectionFlags"},{"p":"com.google.android.exoplayer2.trackselection","l":"DefaultTrackSelector.SelectionOverride"},{"p":"com.google.android.exoplayer2","l":"C.SelectionReason"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Sender"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SendMessages"},{"p":"com.google.android.exoplayer2.source","l":"SequenceableLoader"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMediaPlaylist.ServerControl"},{"p":"com.google.android.exoplayer2.source.ads","l":"ServerSideAdInsertionMediaSource"},{"p":"com.google.android.exoplayer2.source.ads","l":"ServerSideAdInsertionUtil"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"ServiceDescriptionElement"},{"p":"com.google.android.exoplayer2.ext.cast","l":"SessionAvailabilityListener"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionPlayerConnector"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetAudioAttributes"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItems"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetMediaItemsResetPosition"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlaybackParameters"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRendererDisabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetRepeatMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleModeEnabled"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetShuffleOrder"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.SetVideoSurface"},{"p":"com.google.android.exoplayer2.robolectric","l":"ShadowMediaCodecConfig"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView.ShowBuffering"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder"},{"p":"com.google.android.exoplayer2.source","l":"SilenceMediaSource"},{"p":"com.google.android.exoplayer2.audio","l":"SilenceSkippingAudioProcessor"},{"p":"com.google.android.exoplayer2","l":"SimpleBasePlayer"},{"p":"com.google.android.exoplayer2.upstream.cache","l":"SimpleCache"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleDecoder"},{"p":"com.google.android.exoplayer2.decoder","l":"SimpleDecoderOutputBuffer"},{"p":"com.google.android.exoplayer2","l":"SimpleExoPlayer"},{"p":"com.google.android.exoplayer2.metadata","l":"SimpleMetadataDecoder"},{"p":"com.google.android.exoplayer2.text","l":"SimpleSubtitleDecoder"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeExtractorInput.SimulatedIOException"},{"p":"com.google.android.exoplayer2.testutil","l":"ExtractorAsserts.SimulationConfig"},{"p":"com.google.android.exoplayer2.effect","l":"SingleColorLut"},{"p":"com.google.android.exoplayer2.effect","l":"SingleFrameGlTextureProcessor"},{"p":"com.google.android.exoplayer2.source.ads","l":"SinglePeriodAdTimeline"},{"p":"com.google.android.exoplayer2.source","l":"SinglePeriodTimeline"},{"p":"com.google.android.exoplayer2.source.chunk","l":"SingleSampleMediaChunk"},{"p":"com.google.android.exoplayer2.source","l":"SingleSampleMediaSource"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"SegmentBase.SingleSegmentBase"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"Representation.SingleSegmentRepresentation"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.SinkFormatSupport"},{"p":"com.google.android.exoplayer2.util","l":"Size"},{"p":"com.google.android.exoplayer2.ext.media2","l":"SessionCallbackBuilder.SkipCallback"},{"p":"com.google.android.exoplayer2.upstream","l":"SlidingPercentile"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SlowMotionData"},{"p":"com.google.android.exoplayer2.metadata.mp4","l":"SmtaMetadataEntry"},{"p":"com.google.android.exoplayer2.util","l":"SntpClient"},{"p":"com.google.android.exoplayer2.audio","l":"SonicAudioProcessor"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject"},{"p":"com.google.android.exoplayer2.text.span","l":"SpanUtil"},{"p":"com.google.android.exoplayer2","l":"C.SpatializationBehavior"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInfoDecoder"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceInsertCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceNullCommand"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"SpliceScheduleCommand"},{"p":"com.google.android.exoplayer2.util","l":"NalUnitUtil.SpsData"},{"p":"com.google.android.exoplayer2.text.ssa","l":"SsaDecoder"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsChunkSource"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.offline","l":"SsDownloader"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifestParser"},{"p":"com.google.android.exoplayer2.source.smoothstreaming","l":"SsMediaSource"},{"p":"com.google.android.exoplayer2.database","l":"StandaloneDatabaseProvider"},{"p":"com.google.android.exoplayer2.util","l":"StandaloneMediaClock"},{"p":"com.google.android.exoplayer2","l":"StarRating"},{"p":"com.google.android.exoplayer2.extractor.jpeg","l":"StartOffsetExtractorOutput"},{"p":"com.google.android.exoplayer2","l":"Player.State"},{"p":"com.google.android.exoplayer2","l":"Renderer.State"},{"p":"com.google.android.exoplayer2","l":"SimpleBasePlayer.State"},{"p":"com.google.android.exoplayer2.drm","l":"DrmSession.State"},{"p":"com.google.android.exoplayer2.ext.ima","l":"ImaServerSideAdInsertionMediaSource.AdsLoader.State"},{"p":"com.google.android.exoplayer2.offline","l":"Download.State"},{"p":"com.google.android.exoplayer2.upstream","l":"StatsDataSource"},{"p":"com.google.android.exoplayer2","l":"C.StereoMode"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.Stop"},{"p":"com.google.android.exoplayer2.source.smoothstreaming.manifest","l":"SsManifest.StreamElement"},{"p":"com.google.android.exoplayer2.offline","l":"StreamKey"},{"p":"com.google.android.exoplayer2","l":"C.StreamType"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo.StreamType"},{"p":"com.google.android.exoplayer2.testutil","l":"StubExoPlayer"},{"p":"com.google.android.exoplayer2.testutil","l":"StubPlayer"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerView"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle.StyleFlags"},{"p":"com.google.android.exoplayer2.text.subrip","l":"SubripDecoder"},{"p":"com.google.android.exoplayer2","l":"MediaItem.Subtitle"},{"p":"com.google.android.exoplayer2.text","l":"Subtitle"},{"p":"com.google.android.exoplayer2","l":"MediaItem.SubtitleConfiguration"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoder"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderException"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleDecoderFactory"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleExtractor"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleInputBuffer"},{"p":"com.google.android.exoplayer2.text","l":"SubtitleOutputBuffer"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView"},{"p":"com.google.android.exoplayer2.util","l":"SurfaceInfo"},{"p":"com.google.android.exoplayer2.audio","l":"Ac3Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.audio","l":"Ac4Util.SyncFrameInfo"},{"p":"com.google.android.exoplayer2.mediacodec","l":"SynchronousMediaCodecAdapter"},{"p":"com.google.android.exoplayer2.util","l":"SystemClock"},{"p":"com.google.android.exoplayer2","l":"PlayerMessage.Target"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor"},{"p":"com.google.android.exoplayer2.upstream","l":"TeeDataSource"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestDownloadManagerListener"},{"p":"com.google.android.exoplayer2.testutil","l":"TestExoPlayerBuilder"},{"p":"com.google.android.exoplayer2.robolectric","l":"TestPlayerRunHelper"},{"p":"com.google.android.exoplayer2.testutil","l":"DataSourceContractTest.TestResource"},{"p":"com.google.android.exoplayer2.testutil","l":"DummyMainThread.TestRunnable"},{"p":"com.google.android.exoplayer2.testutil","l":"TestUtil"},{"p":"com.google.android.exoplayer2.text.span","l":"TextAnnotation"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.TextComponent"},{"p":"com.google.android.exoplayer2.text.span","l":"TextEmphasisSpan"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"TextInformationFrame"},{"p":"com.google.android.exoplayer2.text","l":"TextOutput"},{"p":"com.google.android.exoplayer2.text","l":"TextRenderer"},{"p":"com.google.android.exoplayer2.text","l":"Cue.TextSizeType"},{"p":"com.google.android.exoplayer2.util","l":"EGLSurfaceTexture.TextureImageListener"},{"p":"com.google.android.exoplayer2.effect","l":"TextureInfo"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.ThrowPlaybackException"},{"p":"com.google.android.exoplayer2","l":"ThumbRating"},{"p":"com.google.android.exoplayer2.ui","l":"TimeBar"},{"p":"com.google.android.exoplayer2.util","l":"TimedValueQueue"},{"p":"com.google.android.exoplayer2","l":"Timeline"},{"p":"com.google.android.exoplayer2.testutil","l":"TimelineAsserts"},{"p":"com.google.android.exoplayer2","l":"Player.TimelineChangeReason"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueEditor"},{"p":"com.google.android.exoplayer2.ext.mediasession","l":"TimelineQueueNavigator"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeTimeline.TimelineWindowDefinition"},{"p":"com.google.android.exoplayer2","l":"ExoTimeoutException.TimeoutOperation"},{"p":"com.google.android.exoplayer2.metadata.scte35","l":"TimeSignalCommand"},{"p":"com.google.android.exoplayer2.util","l":"TimestampAdjuster"},{"p":"com.google.android.exoplayer2.source.hls","l":"TimestampAdjusterProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSearchResult"},{"p":"com.google.android.exoplayer2.extractor","l":"BinarySearchSeeker.TimestampSeeker"},{"p":"com.google.android.exoplayer2.upstream","l":"TimeToFirstByteEstimator"},{"p":"com.google.android.exoplayer2.util","l":"TraceUtil"},{"p":"com.google.android.exoplayer2.extractor.mkv","l":"MatroskaExtractor.Track"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track"},{"p":"com.google.android.exoplayer2.testutil","l":"FakeMediaPeriod.TrackDataFactory"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"TrackEncryptionBox"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroup"},{"p":"com.google.android.exoplayer2.source","l":"TrackGroupArray"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader.TrackIdGenerator"},{"p":"com.google.android.exoplayer2.ui","l":"TrackNameProvider"},{"p":"com.google.android.exoplayer2.extractor","l":"TrackOutput"},{"p":"com.google.android.exoplayer2.source.chunk","l":"ChunkExtractor.TrackOutputProvider"},{"p":"com.google.android.exoplayer2","l":"Tracks"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelection"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionArray"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionDialogBuilder"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView.TrackSelectionListener"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionOverride"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionParameters"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectionUtil"},{"p":"com.google.android.exoplayer2.ui","l":"TrackSelectionView"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelector"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelectorResult"},{"p":"com.google.android.exoplayer2","l":"C.TrackType"},{"p":"com.google.android.exoplayer2.upstream","l":"TransferListener"},{"p":"com.google.android.exoplayer2.extractor.mp4","l":"Track.Transformation"},{"p":"com.google.android.exoplayer2.transformer","l":"TransformationException"},{"p":"com.google.android.exoplayer2.transformer","l":"TransformationRequest"},{"p":"com.google.android.exoplayer2.transformer","l":"TransformationResult"},{"p":"com.google.android.exoplayer2.transformer","l":"Transformer"},{"p":"com.google.android.exoplayer2.extractor","l":"TrueHdSampleRechunker"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsExtractor"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsPayloadReader"},{"p":"com.google.android.exoplayer2.extractor.ts","l":"TsUtil"},{"p":"com.google.android.exoplayer2.text.ttml","l":"TtmlDecoder"},{"p":"com.google.android.exoplayer2","l":"RendererCapabilities.TunnelingSupport"},{"p":"com.google.android.exoplayer2.text.tx3g","l":"Tx3gDecoder"},{"p":"com.google.android.exoplayer2","l":"ExoPlaybackException.Type"},{"p":"com.google.android.exoplayer2.source.ads","l":"AdsMediaSource.AdLoadException.Type"},{"p":"com.google.android.exoplayer2.trackselection","l":"TrackSelection.Type"},{"p":"com.google.android.exoplayer2.upstream","l":"HttpDataSource.HttpDataSourceException.Type"},{"p":"com.google.android.exoplayer2.util","l":"FileTypes.Type"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.Typefaced"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource"},{"p":"com.google.android.exoplayer2.upstream","l":"UdpDataSource.UdpDataSourceException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.UnexpectedDiscontinuityException"},{"p":"com.google.android.exoplayer2.upstream","l":"Loader.UnexpectedLoaderException"},{"p":"com.google.android.exoplayer2.audio","l":"AudioProcessor.UnhandledAudioFormatException"},{"p":"com.google.android.exoplayer2.util","l":"UnknownNull"},{"p":"com.google.android.exoplayer2.source","l":"UnrecognizedInputFormatException"},{"p":"com.google.android.exoplayer2.extractor","l":"SeekMap.Unseekable"},{"p":"com.google.android.exoplayer2.source","l":"ShuffleOrder.UnshuffledShuffleOrder"},{"p":"com.google.android.exoplayer2.drm","l":"UnsupportedDrmException"},{"p":"com.google.android.exoplayer2.offline","l":"DownloadRequest.UnsupportedRequestException"},{"p":"com.google.android.exoplayer2.source","l":"SampleQueue.UpstreamFormatChangedListener"},{"p":"com.google.android.exoplayer2.util","l":"UriUtil"},{"p":"com.google.android.exoplayer2.metadata.id3","l":"UrlLinkFrame"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UrlTemplate"},{"p":"com.google.android.exoplayer2.source.dash.manifest","l":"UtcTimingElement"},{"p":"com.google.android.exoplayer2.util","l":"Util"},{"p":"com.google.android.exoplayer2.source.hls.playlist","l":"HlsMultivariantPlaylist.Variant"},{"p":"com.google.android.exoplayer2.source.hls","l":"HlsTrackMetadataEntry.VariantInfo"},{"p":"com.google.android.exoplayer2.database","l":"VersionTable"},{"p":"com.google.android.exoplayer2.text","l":"Cue.VerticalType"},{"p":"com.google.android.exoplayer2","l":"C.VideoChangeFrameRateStrategy"},{"p":"com.google.android.exoplayer2","l":"ExoPlayer.VideoComponent"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderGLSurfaceView"},{"p":"com.google.android.exoplayer2.decoder","l":"VideoDecoderOutputBuffer"},{"p":"com.google.android.exoplayer2.video","l":"VideoDecoderOutputBufferRenderer"},{"p":"com.google.android.exoplayer2.transformer","l":"VideoEncoderSettings"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameMetadataListener"},{"p":"com.google.android.exoplayer2.video","l":"VideoFrameReleaseHelper"},{"p":"com.google.android.exoplayer2","l":"C.VideoOutputMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoRendererEventListener"},{"p":"com.google.android.exoplayer2","l":"C.VideoScalingMode"},{"p":"com.google.android.exoplayer2.video","l":"VideoSize"},{"p":"com.google.android.exoplayer2.video.spherical","l":"SphericalGLSurfaceView.VideoSurfaceListener"},{"p":"com.google.android.exoplayer2.ui","l":"SubtitleView.ViewType"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerNotificationManager.Visibility"},{"p":"com.google.android.exoplayer2.ui","l":"PlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.ui","l":"StyledPlayerControlView.VisibilityListener"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisBitArray"},{"p":"com.google.android.exoplayer2.metadata.flac","l":"VorbisComment"},{"p":"com.google.android.exoplayer2.metadata.vorbis","l":"VorbisComment"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil.VorbisIdHeader"},{"p":"com.google.android.exoplayer2.extractor","l":"VorbisUtil"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoder"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxDecoderException"},{"p":"com.google.android.exoplayer2.ext.vp9","l":"VpxLibrary"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForIsLoading"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForMessage"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPendingPlayerCommands"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlaybackState"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPlayWhenReady"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForPositionDiscontinuity"},{"p":"com.google.android.exoplayer2.testutil","l":"Action.WaitForTimelineChanged"},{"p":"com.google.android.exoplayer2","l":"C.WakeMode"},{"p":"com.google.android.exoplayer2","l":"Renderer.WakeupListener"},{"p":"com.google.android.exoplayer2.extractor.wav","l":"WavExtractor"},{"p":"com.google.android.exoplayer2.audio","l":"TeeAudioProcessor.WavFileAudioBufferSink"},{"p":"com.google.android.exoplayer2.audio","l":"WavUtil"},{"p":"com.google.android.exoplayer2.testutil","l":"WebServerDispatcher"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCssStyle"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueInfo"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttCueParser"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttDecoder"},{"p":"com.google.android.exoplayer2.source.hls","l":"WebvttExtractor"},{"p":"com.google.android.exoplayer2.text.webvtt","l":"WebvttParserUtil"},{"p":"com.google.android.exoplayer2.drm","l":"WidevineUtil"},{"p":"com.google.android.exoplayer2","l":"Timeline.Window"},{"p":"com.google.android.exoplayer2.testutil.truth","l":"SpannedSubject.WithSpanFlags"},{"p":"com.google.android.exoplayer2.ext.workmanager","l":"WorkManagerScheduler"},{"p":"com.google.android.exoplayer2.source","l":"WrappingMediaSource"},{"p":"com.google.android.exoplayer2.offline","l":"WritableDownloadIndex"},{"p":"com.google.android.exoplayer2.audio","l":"AudioSink.WriteException"},{"p":"com.google.android.exoplayer2.util","l":"XmlPullParserUtil"}]
\ No newline at end of file
+typeSearchIndex = [
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AacUtil.AacAudioObjectType'
+ },
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AacUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil.truth',
+ 'l': 'SpannedSubject.AbsoluteSized'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'AbstractConcatenatedTimeline'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'Ac3Extractor'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'Ac3Reader'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'Ac3Util'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'Ac4Extractor'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'Ac4Reader'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'Ac4Util'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'ActionSchedule'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'AdaptiveTrackSelection.AdaptationCheckpoint'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'AdaptationSet'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'RendererCapabilities.AdaptiveSupport'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'AdaptiveTrackSelection'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'TrackSelectionUtil.AdaptiveTrackSelectionFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'AdditionalFailureInfo'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action.AddMediaItems'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.ads',
+ 'l': 'AdPlaybackState.AdGroup'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.ads',
+ 'l': 'AdsMediaSource.AdLoadException'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'AdOverlayInfo'},
+ {'p': 'com.google.android.exoplayer2.source.ads', 'l': 'AdPlaybackState'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.ads',
+ 'l': 'ServerSideAdInsertionMediaSource.AdPlaybackStateUpdater'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem.AdsConfiguration'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.ima',
+ 'l': 'ImaServerSideAdInsertionMediaSource.AdsLoader'
+ },
+ {'p': 'com.google.android.exoplayer2.source.ads', 'l': 'AdsLoader'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'DefaultMediaSourceFactory.AdsLoaderProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.source.ads', 'l': 'AdsMediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.ads',
+ 'l': 'AdPlaybackState.AdState'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'AdtsExtractor'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'AdtsReader'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'AdViewProvider'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.crypto',
+ 'l': 'AesCipherDataSink'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.crypto',
+ 'l': 'AesCipherDataSource'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.crypto',
+ 'l': 'AesFlushingCipher'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil.truth',
+ 'l': 'SpannedSubject.Aligned'
+ },
+ {'l': 'All Classes', 'url': 'allclasses-index.html'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'Allocation'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'Allocator.AllocationNode'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'Allocator'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder.AllowedCommandProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.amr', 'l': 'AmrExtractor'},
+ {'p': 'com.google.android.exoplayer2.analytics', 'l': 'AnalyticsCollector'},
+ {'p': 'com.google.android.exoplayer2.analytics', 'l': 'AnalyticsListener'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'Cue.AnchorType'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil.truth',
+ 'l': 'SpannedSubject.AndSpanFlags'
+ },
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'ApicFrame'},
+ {'p': 'com.google.android.exoplayer2.metadata.dvbsi', 'l': 'AppInfoTable'},
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.dvbsi',
+ 'l': 'AppInfoTableDecoder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'ExoMediaDrm.AppManagedProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'AspectRatioFrameLayout'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'AspectRatioFrameLayout.AspectRatioListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ExtractorAsserts.AssertionConfig'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'Assertions'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'AssetContentProvider'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'AssetDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'AssetDataSource.AssetDataSourceException'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'AtomicFile'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.AudioAllowedCapturePolicy'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AudioAttributes'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioAttributes.AudioAttributesV21'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'TeeAudioProcessor.AudioBufferSink'
+ },
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AudioCapabilities'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioCapabilitiesReceiver'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlayer.AudioComponent'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.AudioContentType'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.AudioFlags'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioProcessor.AudioFormat'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlayer.AudioOffloadListener'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AudioProcessor'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AudioProcessorChain'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'DefaultAudioSink.AudioProcessorChain'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioRendererEventListener'
+ },
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AudioSink'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'DefaultAudioSink.AudioTrackBufferSizeProvider'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.AudioUsage'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AuxEffectInfo'},
+ {'p': 'com.google.android.exoplayer2.video', 'l': 'AvcConfig'},
+ {'p': 'com.google.android.exoplayer2.extractor.avi', 'l': 'AviExtractor'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'BandwidthMeter'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'BaseAudioProcessor'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'BaseDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'HttpDataSource.BaseFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.source.chunk', 'l': 'BaseMediaChunk'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'BaseMediaChunkIterator'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'BaseMediaChunkOutput'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'BaseMediaSource'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'BasePlayer'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'BaseRenderer'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'BaseTrackSelection'
+ },
+ {'p': 'com.google.android.exoplayer2.source.dash.manifest', 'l': 'BaseUrl'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'BaseUrlExclusionList'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'BehindLiveWindowException'
+ },
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'BinaryFrame'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'BinarySearchSeeker'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'BinarySearchSeeker.BinarySearchSeekMap'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'PlayerNotificationManager.BitmapCallback'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'VideoEncoderSettings.BitrateMode'
+ },
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'Buffer'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.BufferFlags'},
+ {
+ 'p': 'com.google.android.exoplayer2.decoder',
+ 'l': 'DecoderInputBuffer.BufferReplacementMode'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'DefaultLivePlaybackSpeedControl.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'DefaultLoadControl.Builder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlayer.Builder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Format.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'MediaItem.AdsConfiguration.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'MediaItem.ClippingConfiguration.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'MediaItem.DrmConfiguration.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'MediaItem.LiveConfiguration.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'MediaItem.RequestMetadata.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'MediaItem.SubtitleConfiguration.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaMetadata.Builder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.Commands.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'SimpleBasePlayer.MediaItemData.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'SimpleBasePlayer.PeriodData.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'SimpleBasePlayer.State.Builder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'SimpleExoPlayer.Builder'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AudioAttributes.Builder'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'DefaultAudioSink.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'DefaultAudioTrackBufferSizeProvider.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'DefaultDrmSessionManager.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'HslAdjustment.Builder'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'RgbAdjustment.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2.effect',
+ 'l': 'ScaleToFitTransformation.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2.ext.ima', 'l': 'ImaAdsLoader.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.ima',
+ 'l': 'ImaServerSideAdInsertionMediaSource.AdsLoader.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.offline',
+ 'l': 'DownloadRequest.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ConcatenatingMediaSource2.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2.source.rtsp', 'l': 'RtpPacket.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ActionSchedule.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'DataSourceContractTest.TestResource.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ExoPlayerTestRunner.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ExtractorAsserts.AssertionConfig.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeExoMediaDrm.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeExtractorInput.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'WebServerDispatcher.Resource.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'Cue.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'DefaultTrackSelector.Parameters.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'TrackSelectionParameters.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'DefaultEncoderFactory.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'TransformationRequest.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'TransformationResult.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'Transformer.Builder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'VideoEncoderSettings.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'AdOverlayInfo.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'PlayerNotificationManager.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSpec.Builder'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'DefaultBandwidthMeter.Builder'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'FlagSet.Builder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Bundleable'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'BundleableUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'BundledChunkExtractor'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'BundledExtractorsAdapter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'BundledHlsMediaChunkExtractor'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'BundleListRetriever'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'BundleUtil'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'ByteArrayDataSink'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'ByteArrayDataSource'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C'},
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'Cache'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'CacheAsserts'},
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'CacheDataSink'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'CacheDataSink.CacheDataSinkException'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'CacheDataSource'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'CachedRegionTracker'},
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'CacheEvictor'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'Cache.CacheException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'CacheDataSource.CacheIgnoredReason'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'CacheKeyFactory'},
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'CacheSpan'},
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'CacheWriter'},
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'PlaybackStatsListener.Callback'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.offline',
+ 'l': 'DownloadHelper.Callback'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MediaPeriod.Callback'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'SequenceableLoader.Callback'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ActionSchedule.Callback'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ActionSchedule.PlayerTarget.Callback'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'Loader.Callback'},
+ {
+ 'p': 'com.google.android.exoplayer2.video.spherical',
+ 'l': 'CameraMotionListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.video.spherical',
+ 'l': 'CameraMotionRenderer'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'RendererCapabilities.Capabilities'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.CaptionCallback'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'CaptionStyleCompat'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'CapturingAudioSink'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'CapturingRenderersFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.ext.cast', 'l': 'CastPlayer'},
+ {'p': 'com.google.android.exoplayer2.text.cea', 'l': 'Cea608Decoder'},
+ {'p': 'com.google.android.exoplayer2.text.cea', 'l': 'Cea708Decoder'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'CeaUtil'},
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'ChapterFrame'},
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'ChapterTocFrame'},
+ {'p': 'com.google.android.exoplayer2.source.chunk', 'l': 'Chunk'},
+ {'p': 'com.google.android.exoplayer2.source.chunk', 'l': 'ChunkExtractor'},
+ {'p': 'com.google.android.exoplayer2.source.chunk', 'l': 'ChunkHolder'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'ChunkIndex'},
+ {'p': 'com.google.android.exoplayer2.source.chunk', 'l': 'ChunkSampleStream'},
+ {'p': 'com.google.android.exoplayer2.source.chunk', 'l': 'ChunkSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.ClearMediaItems'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'HttpDataSource.CleartextNotPermittedException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.ClearVideoSurface'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'MediaItem.ClippingConfiguration'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'ClippingMediaPeriod'},
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'ClippingMediaSource'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem.ClippingProperties'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'Clock'},
+ {'p': 'com.google.android.exoplayer2.transformer', 'l': 'Codec'},
+ {
+ 'p': 'com.google.android.exoplayer2.video',
+ 'l': 'MediaCodecVideoRenderer.CodecMaxValues'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'CodecSpecificDataUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil.truth',
+ 'l': 'SpannedSubject.Colored'
+ },
+ {'p': 'com.google.android.exoplayer2.video', 'l': 'ColorInfo'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'ColorLut'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'ColorParser'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.ColorRange'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.ColorSpace'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.ColorTransfer'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.Command'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.CommandReceiver'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.Commands'},
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'CommentFrame'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'VorbisUtil.CommentHeader'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.scte35',
+ 'l': 'SpliceInsertCommand.ComponentSplice'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.scte35',
+ 'l': 'SpliceScheduleCommand.ComponentSplice'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'CompositeMediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'CompositeSequenceableLoader'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'CompositeSequenceableLoaderFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ConcatenatingMediaSource'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ConcatenatingMediaSource2'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'ConditionVariable'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AacUtil.Config'},
+ {
+ 'p': 'com.google.android.exoplayer2.mediacodec',
+ 'l': 'MediaCodecAdapter.Configuration'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioSink.ConfigurationException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'ConstantBitrateSeekMap'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'Consumer'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'ContainerMediaChunk'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'ContentDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'ContentDataSource.ContentDataSourceException'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'ContentMetadata'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'ContentMetadataMutations'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.ContentType'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'Contrast'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'StyledPlayerView.ControllerVisibilityListener'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'CopyOnWriteMultiset'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Bundleable.Creator'},
+ {'p': 'com.google.android.exoplayer2.ext.cronet', 'l': 'CronetDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.cronet',
+ 'l': 'CronetDataSourceFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.ext.cronet', 'l': 'CronetEngineWrapper'},
+ {'p': 'com.google.android.exoplayer2.ext.cronet', 'l': 'CronetUtil'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'Crop'},
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'CryptoConfig'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'TrackOutput.CryptoData'
+ },
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'CryptoException'},
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'CryptoInfo'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.CryptoMode'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.CryptoType'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'Cue'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'CueDecoder'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'CueEncoder'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'CueGroup'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.CustomActionProvider'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'PlayerNotificationManager.CustomActionReceiver'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder.CustomCommandProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.source.dash', 'l': 'DashChunkSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.offline',
+ 'l': 'DashDownloader'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'DashManifest'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'DashManifestParser'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'DashManifestStaleException'
+ },
+ {'p': 'com.google.android.exoplayer2.source.dash', 'l': 'DashMediaSource'},
+ {'p': 'com.google.android.exoplayer2.source.dash', 'l': 'DashSegmentIndex'},
+ {'p': 'com.google.android.exoplayer2.source.dash', 'l': 'DashUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'DashWrappingSegmentIndex'
+ },
+ {'p': 'com.google.android.exoplayer2.database', 'l': 'DatabaseIOException'},
+ {'p': 'com.google.android.exoplayer2.database', 'l': 'DatabaseProvider'},
+ {'p': 'com.google.android.exoplayer2.source.chunk', 'l': 'DataChunk'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataReader'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSchemeDataSource'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSink'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'DataSourceContractTest'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSourceException'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSourceInputStream'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSourceUtil'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSpec'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.DataType'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'DebugTextViewHelper'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'DebugViewProvider'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'DecodeOneFrameUtil'},
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'Decoder'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'DecoderAudioRenderer'},
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'DecoderCounters'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'DecoderCountersUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.decoder',
+ 'l': 'DecoderReuseEvaluation.DecoderDiscardReasons'
+ },
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'DecoderException'},
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'Codec.DecoderFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.mediacodec',
+ 'l': 'MediaCodecRenderer.DecoderInitializationException'
+ },
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'DecoderInputBuffer'},
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'DecoderOutputBuffer'},
+ {
+ 'p': 'com.google.android.exoplayer2.mediacodec',
+ 'l': 'MediaCodecUtil.DecoderQueryException'
+ },
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'DecoderReuseEvaluation'},
+ {
+ 'p': 'com.google.android.exoplayer2.decoder',
+ 'l': 'DecoderReuseEvaluation.DecoderReuseResult'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'RendererCapabilities.DecoderSupport'
+ },
+ {'p': 'com.google.android.exoplayer2.video', 'l': 'DecoderVideoRenderer'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DefaultAllocator'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder.DefaultAllowedCommandProvider'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'DefaultAnalyticsCollector'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'DefaultAudioSink.DefaultAudioProcessorChain'
+ },
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'DefaultAudioSink'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'DefaultAudioTrackBufferSizeProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DefaultBandwidthMeter'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.cast',
+ 'l': 'DefaultCastOptionsProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.transformer', 'l': 'DefaultCodec'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'DefaultCompositeSequenceableLoaderFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'DefaultContentMetadata'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'DefaultDashChunkSource'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.database',
+ 'l': 'DefaultDatabaseProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DefaultDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'DefaultDataSourceFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.offline',
+ 'l': 'DefaultDownloaderFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DefaultDownloadIndex'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DefaultDrmSessionManager'},
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'DefaultDrmSessionManagerProvider'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'DefaultEncoderFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'DefaultExtractorInput'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'DefaultExtractorsFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'DefaultHlsDataSourceFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'DefaultHlsExtractorFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'DefaultHlsPlaylistParserFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'DefaultHlsPlaylistTracker'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DefaultHttpDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'DefaultLivePlaybackSpeedControl'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'DefaultLoadControl'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'DefaultLoadErrorHandlingPolicy'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.mediacodec',
+ 'l': 'DefaultMediaCodecAdapterFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'DefaultMediaDescriptionAdapter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.cast',
+ 'l': 'DefaultMediaItemConverter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'DefaultMediaItemConverter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.DefaultMediaMetadataProvider'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'DefaultMediaSourceFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.transformer', 'l': 'DefaultMuxer'},
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'DefaultPlaybackSessionManager'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'DefaultRenderersFactory'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'DefaultRenderersFactoryAsserts'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.rtsp.reader',
+ 'l': 'DefaultRtpPayloadReaderFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'BinarySearchSeeker.DefaultSeekTimestampConverter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ShuffleOrder.DefaultShuffleOrder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming',
+ 'l': 'DefaultSsChunkSource'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'DefaultTimeBar'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'DefaultTrackNameProvider'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'DefaultTrackSelector'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'DefaultTsPayloadReaderFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'ExoTrackSelection.Definition'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylistParser.DeltaUpdateException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'Descriptor'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlayer.DeviceComponent'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'DeviceInfo'},
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'DeviceMappedEncoderBitrateProvider'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'TrackSelectionDialogBuilder.DialogCallback'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder.DisconnectedCallback'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.DiscontinuityReason'},
+ {'p': 'com.google.android.exoplayer2.video', 'l': 'DolbyVisionConfig'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'Download'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'DownloadBuilder'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DownloadCursor'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'Downloader'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DownloaderFactory'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DownloadException'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DownloadHelper'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DownloadIndex'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DownloadManager'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'DownloadNotificationHelper'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DownloadProgress'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DownloadRequest'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'DownloadService'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem.DrmConfiguration'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DrmInitData'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DrmSession'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DrmSessionEventListener'},
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'DrmSession.DrmSessionException'
+ },
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DrmSessionManager'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DrmSessionManagerProvider'},
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'DrmSessionManager.DrmSessionReference'
+ },
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DrmUtil'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'DtsReader'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'DtsUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'LoaderErrorThrower.Dummy'
+ },
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DummyExoMediaDrm'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'DummyExtractorOutput'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'DummyMainThread'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'DummyTrackOutput'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Dumper.Dumpable'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'DumpableFormat'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Dumper'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'DumpFileAsserts'},
+ {'p': 'com.google.android.exoplayer2.text.dvb', 'l': 'DvbDecoder'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'TsPayloadReader.DvbSubtitleInfo'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'DvbSubtitleReader'},
+ {'p': 'com.google.android.exoplayer2.extractor.mkv', 'l': 'EbmlProcessor'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'CaptionStyleCompat.EdgeType'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'Effect'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'EGLSurfaceTexture'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'ElementaryStreamReader'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mkv',
+ 'l': 'EbmlProcessor.ElementType'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'ChunkSampleStream.EmbeddedSampleStream'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil.truth',
+ 'l': 'SpannedSubject.EmphasizedText'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'EmptySampleStream'},
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'EncoderBitrateProvider'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'Codec.EncoderFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.transformer', 'l': 'EncoderSelector'},
+ {'p': 'com.google.android.exoplayer2.transformer', 'l': 'EncoderUtil'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.Encoding'},
+ {'p': 'com.google.android.exoplayer2.metadata', 'l': 'Metadata.Entry'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'PlaybackException.ErrorCode'},
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'TransformationException.ErrorCode'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.effect',
+ 'l': 'GlTextureProcessor.ErrorListener'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'ErrorMessageProvider'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DrmUtil.ErrorSource'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'ErrorStateDrmSession'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'TsPayloadReader.EsInfo'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.Event'},
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.scte35',
+ 'l': 'SpliceScheduleCommand.Event'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'ListenerSet.Event'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioRendererEventListener.EventDispatcher'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'DrmSessionEventListener.EventDispatcher'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'MediaSourceEventListener.EventDispatcher'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'BandwidthMeter.EventListener.EventDispatcher'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.video',
+ 'l': 'VideoRendererEventListener.EventDispatcher'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'AnalyticsListener.EventFlags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.ads',
+ 'l': 'AdsLoader.EventListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'BandwidthMeter.EventListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'CacheDataSource.EventListener'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'EventLogger'},
+ {'p': 'com.google.android.exoplayer2.metadata.emsg', 'l': 'EventMessage'},
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.emsg',
+ 'l': 'EventMessageDecoder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.emsg',
+ 'l': 'EventMessageEncoder'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.Events'},
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'AnalyticsListener.Events'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'EventStream'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'AnalyticsListener.EventTime'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'PlaybackStats.EventTimeAndException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'PlaybackStats.EventTimeAndFormat'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'PlaybackStats.EventTimeAndPlaybackState'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.ExecuteRunnable'
+ },
+ {'p': 'com.google.android.exoplayer2.database', 'l': 'ExoDatabaseProvider'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'ExoHostedTest'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'ExoMediaDrm'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlaybackException'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlayer'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'ExoplayerCuesDecoder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlayerLibraryInfo'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'ExoPlayerTestRunner'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoTimeoutException'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'ExoTrackSelection'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'DefaultRenderersFactory.ExtensionRendererMode'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'Extractor'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'ExtractorAsserts'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ExtractorAsserts.ExtractorFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'ExtractorInput'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'ExtractorOutput'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'ExtractorsFactory'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'ExtractorUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.effect',
+ 'l': 'GlEffectsFrameProcessor.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.cronet',
+ 'l': 'CronetDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.ima',
+ 'l': 'ImaServerSideAdInsertionMediaSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.okhttp',
+ 'l': 'OkHttpDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.rtmp',
+ 'l': 'RtmpDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'TsPayloadReader.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.mediacodec',
+ 'l': 'MediaCodecAdapter.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.mediacodec',
+ 'l': 'SynchronousMediaCodecAdapter.Factory'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MediaSource.Factory'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ProgressiveMediaExtractor.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ProgressiveMediaSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'SilenceMediaSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'SingleSampleMediaSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'ChunkExtractor.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'DashChunkSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'DashMediaSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'DefaultDashChunkSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'HlsMediaSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylistTracker.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.rtsp',
+ 'l': 'RtspMediaSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.rtsp.reader',
+ 'l': 'RtpPayloadReader.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming',
+ 'l': 'DefaultSsChunkSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming',
+ 'l': 'SsChunkSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming',
+ 'l': 'SsMediaSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FailOnCloseDataSink.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeAdaptiveDataSet.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeChunkSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeTrackOutput.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'AdaptiveTrackSelection.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'ExoTrackSelection.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'RandomTrackSelection.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'DefaultMuxer.Factory'
+ },
+ {'p': 'com.google.android.exoplayer2.transformer', 'l': 'Muxer.Factory'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSink.Factory'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSource.Factory'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'DefaultDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'DefaultHttpDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'FileDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'HttpDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'PriorityDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'ResolvingDataSource.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'CacheDataSink.Factory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'CacheDataSource.Factory'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'FrameProcessor.Factory'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FailOnCloseDataSink'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'Download.FailureReason'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeAdaptiveDataSet'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeAdaptiveMediaPeriod'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeAdaptiveMediaSource'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeAudioRenderer'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeChunkSource'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeClock'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeCryptoConfig'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeDataSet.FakeData'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeDataSet'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeDataSource'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeExoMediaDrm'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeExtractorInput'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeExtractorOutput'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeMediaChunk'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeMediaChunkIterator'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeMediaClockRenderer'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeMediaPeriod'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeMediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeMediaSourceFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeMetadataEntry'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeRenderer'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeSampleStream'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeSampleStream.FakeSampleStreamItem'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeShuffleOrder'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeTimeline'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeTrackOutput'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeTrackSelection'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeTrackSelector'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'DataSourceContractTest.FakeTransferListener'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'FakeVideoRenderer'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'LoadErrorHandlingPolicy.FallbackOptions'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'LoadErrorHandlingPolicy.FallbackSelection'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'LoadErrorHandlingPolicy.FallbackType'
+ },
+ {'p': 'com.google.android.exoplayer2.ext.ffmpeg', 'l': 'FfmpegAudioRenderer'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.ffmpeg',
+ 'l': 'FfmpegDecoderException'
+ },
+ {'p': 'com.google.android.exoplayer2.ext.ffmpeg', 'l': 'FfmpegLibrary'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'FileDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'FileDataSource.FileDataSourceException'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'FileTypes'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'FilterableManifest'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'MediaPeriodAsserts.FilterableManifestMediaPeriodFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'FilteringHlsPlaylistParserFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.offline',
+ 'l': 'FilteringManifestParser'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'FixedTrackSelection'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.flac', 'l': 'FlacConstants'},
+ {'p': 'com.google.android.exoplayer2.ext.flac', 'l': 'FlacDecoder'},
+ {'p': 'com.google.android.exoplayer2.ext.flac', 'l': 'FlacDecoderException'},
+ {'p': 'com.google.android.exoplayer2.ext.flac', 'l': 'FlacExtractor'},
+ {'p': 'com.google.android.exoplayer2.extractor.flac', 'l': 'FlacExtractor'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'FlacFrameReader'},
+ {'p': 'com.google.android.exoplayer2.ext.flac', 'l': 'FlacLibrary'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'FlacMetadataReader'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'FlacSeekTableSeekMap'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'FlacStreamMetadata'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'FlacMetadataReader.FlacStreamMetadataHolder'
+ },
+ {'p': 'com.google.android.exoplayer2.ext.flac', 'l': 'FlacExtractor.Flags'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.amr',
+ 'l': 'AmrExtractor.Flags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.flac',
+ 'l': 'FlacExtractor.Flags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mkv',
+ 'l': 'MatroskaExtractor.Flags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mp3',
+ 'l': 'Mp3Extractor.Flags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mp4',
+ 'l': 'FragmentedMp4Extractor.Flags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mp4',
+ 'l': 'Mp4Extractor.Flags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'AdtsExtractor.Flags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'DefaultTsPayloadReaderFactory.Flags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'TsPayloadReader.Flags'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSpec.Flags'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'CacheDataSource.Flags'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'FlagSet'},
+ {'p': 'com.google.android.exoplayer2.extractor.flv', 'l': 'FlvExtractor'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaMetadata.FolderType'},
+ {
+ 'p': 'com.google.android.exoplayer2.text.webvtt',
+ 'l': 'WebvttCssStyle.FontSizeUnit'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Format'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'FormatHolder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.FormatSupport'},
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'RendererCapabilities.FormatSupport'
+ },
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'ForwardingAudioSink'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'ForwardingExtractorInput'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'ForwardingPlayer'},
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'ForwardingTimeline'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mp4',
+ 'l': 'FragmentedMp4Extractor'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'FrameInfo'},
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.id3',
+ 'l': 'Id3Decoder.FramePredicate'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'FrameProcessingException'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'FrameProcessor'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'FrameworkCryptoConfig'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'FrameworkMediaDrm'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'StyledPlayerView.FullscreenButtonClickListener'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'GaplessInfoHolder'},
+ {'p': 'com.google.android.exoplayer2.ext.av1', 'l': 'Gav1Decoder'},
+ {'p': 'com.google.android.exoplayer2.ext.av1', 'l': 'Gav1DecoderException'},
+ {'p': 'com.google.android.exoplayer2.ext.av1', 'l': 'Gav1Library'},
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'GeobFrame'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'GlEffect'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'GlEffectsFrameProcessor'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'GlUtil.GlException'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'GlMatrixTransformation'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'GlProgram'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'GlTextureProcessor'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'GlUtil'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Tracks.Group'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'H262Reader'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'H263Reader'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'H264Reader'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'H265Reader'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'NalUnitUtil.H265SpsData'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeClock.HandlerMessage'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'HandlerWrapper'},
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'RendererCapabilities.HardwareAccelerationSupport'
+ },
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'MpegAudioUtil.Header'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'HeartRating'},
+ {'p': 'com.google.android.exoplayer2.video', 'l': 'HevcConfig'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'HlsDataSourceFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.offline',
+ 'l': 'HlsDownloader'
+ },
+ {'p': 'com.google.android.exoplayer2.source.hls', 'l': 'HlsExtractorFactory'},
+ {'p': 'com.google.android.exoplayer2.source.hls', 'l': 'HlsManifest'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMasterPlaylist'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'HlsMediaChunkExtractor'
+ },
+ {'p': 'com.google.android.exoplayer2.source.hls', 'l': 'HlsMediaPeriod'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMediaPlaylist'
+ },
+ {'p': 'com.google.android.exoplayer2.source.hls', 'l': 'HlsMediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMultivariantPlaylist'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylist'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylistParser'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylistParserFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylistTracker'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'HlsTrackMetadataEntry'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.text.span',
+ 'l': 'HorizontalTextInVerticalContextSpan'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'HostActivity'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'HostActivity.HostedTest'
+ },
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'HslAdjustment'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'HttpDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'HttpDataSource.HttpDataSourceException'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'HttpDataSourceTestEnv'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'HttpMediaDrmCallback'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'DataSpec.HttpMethod'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'HttpUtil'},
+ {'p': 'com.google.android.exoplayer2.metadata.icy', 'l': 'IcyDecoder'},
+ {'p': 'com.google.android.exoplayer2.metadata.icy', 'l': 'IcyHeaders'},
+ {'p': 'com.google.android.exoplayer2.metadata.icy', 'l': 'IcyInfo'},
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'Id3Decoder'},
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'Id3Frame'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'Id3Peeker'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'Id3Reader'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ClippingMediaSource.IllegalClippingException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'MergingMediaSource.IllegalMergeException'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'IllegalSeekPositionException'},
+ {'p': 'com.google.android.exoplayer2.ext.ima', 'l': 'ImaAdsLoader'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.ima',
+ 'l': 'ImaServerSideAdInsertionMediaSource'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.ima',
+ 'l': 'ImaServerSideAdInsertionUriBuilder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.util',
+ 'l': 'NotificationUtil.Importance'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'IndexSeekMap'},
+ {
+ 'p': 'com.google.android.exoplayer2.util',
+ 'l': 'SntpClient.InitializationCallback'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'InitializationChunk'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioSink.InitializationException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeMediaSource.InitialTimeline'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.effect',
+ 'l': 'GlTextureProcessor.InputListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.mediaparser',
+ 'l': 'InputReaderAdapterV30'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.decoder',
+ 'l': 'DecoderInputBuffer.InsufficientCapacityException'
+ },
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'InternalFrame'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'TrackSelector.InvalidationListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'DefaultAudioSink.InvalidAudioTrackTimestampException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'HttpDataSource.InvalidContentTypeException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'HttpDataSource.InvalidResponseCodeException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.util',
+ 'l': 'ListenerSet.IterationFinishedEvent'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeAdaptiveDataSet.Iterator'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.jpeg', 'l': 'JpegExtractor'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'ExoMediaDrm.KeyRequest'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'KeysExpiredException'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'ExoMediaDrm.KeyStatus'},
+ {'p': 'com.google.android.exoplayer2.text.span', 'l': 'LanguageFeatureSpan'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'LatmReader'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'Presentation.Layout'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.leanback',
+ 'l': 'LeanbackPlayerAdapter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'LeastRecentlyUsedCacheEvictor'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'LegacyMediaPlayerWrapper'},
+ {'p': 'com.google.android.exoplayer2.ext.flac', 'l': 'LibflacAudioRenderer'},
+ {'p': 'com.google.android.exoplayer2.ext.av1', 'l': 'Libgav1VideoRenderer'},
+ {'p': 'com.google.android.exoplayer2.ext.opus', 'l': 'LibopusAudioRenderer'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'LibraryLoader'},
+ {'p': 'com.google.android.exoplayer2.ext.vp9', 'l': 'LibvpxVideoRenderer'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeExoMediaDrm.LicenseServer'
+ },
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'Cue.LineType'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.Listener'},
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'PlaybackSessionManager.Listener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioCapabilitiesReceiver.Listener'
+ },
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AudioSink.Listener'},
+ {
+ 'p': 'com.google.android.exoplayer2.offline',
+ 'l': 'DownloadManager.Listener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.scheduler',
+ 'l': 'RequirementsWatcher.Listener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'DecodeOneFrameUtil.Listener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'Transformer.Listener'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'Cache.Listener'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'FrameProcessor.Listener'},
+ {
+ 'p': 'com.google.android.exoplayer2.util',
+ 'l': 'NetworkTypeObserver.Listener'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'ListenerSet'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem.LiveConfiguration'},
+ {
+ 'p': 'com.google.android.exoplayer2.offline',
+ 'l': 'DownloadHelper.LiveContentUnsupportedException'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'LivePlaybackSpeedControl'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'Loader.Loadable'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'LoadControl'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'Loader'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'LoaderErrorThrower'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'Loader.LoadErrorAction'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'LoadErrorHandlingPolicy'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'LoadErrorHandlingPolicy.LoadErrorInfo'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'LoadEventInfo'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem.LocalConfiguration'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'LocalMediaDrmCallback'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'Log'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'Log.Logger'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'Log.LogLevel'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'LongArray'},
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'LoopingMediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'MappingTrackSelector.MappedTrackInfo'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'MappingTrackSelector'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.text.span',
+ 'l': 'TextEmphasisSpan.MarkFill'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.text.span',
+ 'l': 'TextEmphasisSpan.MarkShape'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MaskingMediaPeriod'},
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MaskingMediaSource'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'MatrixTransformation'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mkv',
+ 'l': 'MatroskaExtractor'
+ },
+ {'p': 'com.google.android.exoplayer2.metadata.mp4', 'l': 'MdtaMetadataEntry'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.MediaButtonEventHandler'
+ },
+ {'p': 'com.google.android.exoplayer2.source.chunk', 'l': 'MediaChunk'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'MediaChunkIterator'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'MediaClock'},
+ {'p': 'com.google.android.exoplayer2.mediacodec', 'l': 'MediaCodecAdapter'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'MediaCodecAudioRenderer'},
+ {
+ 'p': 'com.google.android.exoplayer2.mediacodec',
+ 'l': 'MediaCodecDecoderException'
+ },
+ {'p': 'com.google.android.exoplayer2.mediacodec', 'l': 'MediaCodecInfo'},
+ {'p': 'com.google.android.exoplayer2.mediacodec', 'l': 'MediaCodecRenderer'},
+ {'p': 'com.google.android.exoplayer2.mediacodec', 'l': 'MediaCodecSelector'},
+ {'p': 'com.google.android.exoplayer2.mediacodec', 'l': 'MediaCodecUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.video',
+ 'l': 'MediaCodecVideoDecoderException'
+ },
+ {'p': 'com.google.android.exoplayer2.video', 'l': 'MediaCodecVideoRenderer'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'PlayerNotificationManager.MediaDescriptionAdapter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'TimelineQueueEditor.MediaDescriptionConverter'
+ },
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'MediaDrmCallback'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'MediaDrmCallbackException'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'MediaFormatUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'TimelineQueueEditor.MediaIdEqualityChecker'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder.MediaIdMediaItemProvider'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem'},
+ {'p': 'com.google.android.exoplayer2.ext.cast', 'l': 'MediaItemConverter'},
+ {'p': 'com.google.android.exoplayer2.ext.media2', 'l': 'MediaItemConverter'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'SimpleBasePlayer.MediaItemData'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder.MediaItemProvider'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'Player.MediaItemTransitionReason'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MediaLoadData'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaMetadata'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.MediaMetadataProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.analytics', 'l': 'MediaMetricsListener'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'MediaParserChunkExtractor'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'MediaParserExtractorAdapter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'MediaParserHlsMediaChunkExtractor'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.mediaparser',
+ 'l': 'MediaParserUtil'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MediaPeriod'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'MediaPeriodAsserts'},
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MediaPeriodId'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'MediaSource.MediaPeriodId'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'MediaSource.MediaSourceCaller'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'MediaSourceEventListener'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MediaSourceFactory'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'MediaSourceTestRunner'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaMetadata.MediaType'},
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'MergingMediaSource'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'HandlerWrapper.Message'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Renderer.MessageType'},
+ {'p': 'com.google.android.exoplayer2.metadata', 'l': 'Metadata'},
+ {'p': 'com.google.android.exoplayer2.metadata', 'l': 'MetadataDecoder'},
+ {
+ 'p': 'com.google.android.exoplayer2.metadata',
+ 'l': 'MetadataDecoderFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.metadata', 'l': 'MetadataInputBuffer'},
+ {'p': 'com.google.android.exoplayer2.metadata', 'l': 'MetadataOutput'},
+ {'p': 'com.google.android.exoplayer2.metadata', 'l': 'MetadataRenderer'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MetadataRetriever'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'HlsMediaSource.MetadataType'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'MimeTypes'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming.manifest',
+ 'l': 'SsManifestParser.MissingFieldException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'DefaultDrmSessionManager.MissingSchemeDataException'
+ },
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'MlltFrame'},
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'DefaultDrmSessionManager.Mode'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'VorbisUtil.Mode'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'TsExtractor.Mode'},
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.mp4',
+ 'l': 'MotionPhotoMetadata'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action.MoveMediaItem'},
+ {'p': 'com.google.android.exoplayer2.extractor.mp3', 'l': 'Mp3Extractor'},
+ {'p': 'com.google.android.exoplayer2.extractor.mp4', 'l': 'Mp4Extractor'},
+ {'p': 'com.google.android.exoplayer2.text.webvtt', 'l': 'Mp4WebvttDecoder'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'MpegAudioReader'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'MpegAudioUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'SegmentBase.MultiSegmentBase'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'Representation.MultiSegmentRepresentation'
+ },
+ {'p': 'com.google.android.exoplayer2.transformer', 'l': 'Muxer'},
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'Muxer.MuxerException'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'NalUnitUtil'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.NetworkType'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'NetworkTypeObserver'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'NonNullApi'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'NoOpCacheEvictor'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'NoSampleRenderer'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'PlayerNotificationManager.NotificationListener'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'NotificationUtil'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'OfflineLicenseHelper'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'DefaultAudioSink.OffloadMode'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.ogg', 'l': 'OggExtractor'},
+ {'p': 'com.google.android.exoplayer2.ext.okhttp', 'l': 'OkHttpDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.okhttp',
+ 'l': 'OkHttpDataSourceFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'ExoMediaDrm.OnEventListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'ExoMediaDrm.OnExpirationUpdateListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.mediacodec',
+ 'l': 'MediaCodecAdapter.OnFrameRenderedListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'StyledPlayerControlView.OnFullScreenModeChangedListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'ExoMediaDrm.OnKeyStatusChangeListener'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'TimeBar.OnScrubListener'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.cronet',
+ 'l': 'CronetDataSource.OpenException'
+ },
+ {'p': 'com.google.android.exoplayer2.ext.opus', 'l': 'OpusDecoder'},
+ {'p': 'com.google.android.exoplayer2.ext.opus', 'l': 'OpusDecoderException'},
+ {'p': 'com.google.android.exoplayer2.ext.opus', 'l': 'OpusLibrary'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'OpusUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.mediaparser',
+ 'l': 'OutputConsumerAdapterV30'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.effect',
+ 'l': 'GlTextureProcessor.OutputListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'DefaultAudioSink.OutputMode'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.decoder',
+ 'l': 'DecoderOutputBuffer.Owner'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'DefaultTrackSelector.Parameters'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'DefaultTrackSelector.ParametersBuilder'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'ParsableBitArray'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'ParsableByteArray'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'ParsableNalUnitBitArray'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'ParsingLoadable.Parser'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'ParserException'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'ParsingLoadable'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMediaPlaylist.Part'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'PassthroughSectionPayloadReader'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.PcmEncoding'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'PercentageRating'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Timeline.Period'},
+ {'p': 'com.google.android.exoplayer2.source.dash.manifest', 'l': 'Period'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'SimpleBasePlayer.PeriodData'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'PesReader'},
+ {'p': 'com.google.android.exoplayer2.text.pgs', 'l': 'PgsDecoder'},
+ {'p': 'com.google.android.exoplayer2.metadata.flac', 'l': 'PictureFrame'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaMetadata.PictureType'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'PlaceholderDataSource'},
+ {'p': 'com.google.android.exoplayer2.video', 'l': 'PlaceholderSurface'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'MaskingMediaSource.PlaceholderTimeline'
+ },
+ {'p': 'com.google.android.exoplayer2.scheduler', 'l': 'PlatformScheduler'},
+ {
+ 'p': 'com.google.android.exoplayer2.scheduler',
+ 'l': 'PlatformScheduler.PlatformSchedulerService'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.PlaybackActions'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'PlaybackException'},
+ {'p': 'com.google.android.exoplayer2.robolectric', 'l': 'PlaybackOutput'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'PlaybackParameters'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.PlaybackPreparer'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem.PlaybackProperties'},
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'PlaybackSessionManager'
+ },
+ {'p': 'com.google.android.exoplayer2.analytics', 'l': 'PlaybackStats'},
+ {
+ 'p': 'com.google.android.exoplayer2.analytics',
+ 'l': 'PlaybackStatsListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'Player.PlaybackSuppressionReason'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'DeviceInfo.PlaybackType'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'PlayerControlView'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'PlayerEmsgHandler.PlayerEmsgCallback'
+ },
+ {'p': 'com.google.android.exoplayer2.source.dash', 'l': 'PlayerEmsgHandler'},
+ {'p': 'com.google.android.exoplayer2.analytics', 'l': 'PlayerId'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'PlayerMessage'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'PlayerNotificationManager'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ActionSchedule.PlayerRunnable'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ActionSchedule.PlayerTarget'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'PlayerEmsgHandler.PlayerTrackEmsgHandler'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'PlayerView'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylistTracker.PlaylistEventListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylistTracker.PlaylistResetException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylistTracker.PlaylistStuckException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMediaPlaylist.PlaylistType'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.PlayUntilPosition'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'Player.PlayWhenReadyChangeReason'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.text.span',
+ 'l': 'TextAnnotation.Position'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'PositionHolder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.PositionInfo'},
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'SimpleBasePlayer.PositionSupplier'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder.PostConnectCallback'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'NalUnitUtil.PpsData'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action.Prepare'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'MaskingMediaPeriod.PrepareListener'
+ },
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'Presentation'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsPlaylistTracker.PrimaryPlaylistListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'PlayerNotificationManager.Priority'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'PriorityDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'PriorityDataSourceFactory'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'PriorityTaskManager'},
+ {
+ 'p': 'com.google.android.exoplayer2.util',
+ 'l': 'PriorityTaskManager.PriorityTooLowException'
+ },
+ {'p': 'com.google.android.exoplayer2.metadata.scte35', 'l': 'PrivateCommand'},
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'PrivFrame'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'ProgramInformation'
+ },
+ {'p': 'com.google.android.exoplayer2.transformer', 'l': 'ProgressHolder'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'ProgressiveDownloader'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ProgressiveMediaExtractor'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'ProgressiveMediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.offline',
+ 'l': 'Downloader.ProgressListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream.cache',
+ 'l': 'CacheWriter.ProgressListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'Transformer.ProgressState'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'PlayerControlView.ProgressUpdateListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'StyledPlayerControlView.ProgressUpdateListener'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.Projection'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming.manifest',
+ 'l': 'SsManifest.ProtectionElement'
+ },
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'ExoMediaDrm.Provider'},
+ {'p': 'com.google.android.exoplayer2.source.ads', 'l': 'AdsLoader.Provider'},
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'ExoMediaDrm.ProvisionRequest'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'PsExtractor'},
+ {'p': 'com.google.android.exoplayer2.extractor.mp4', 'l': 'PsshAtomUtil'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'AdOverlayInfo.Purpose'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'TimelineQueueEditor.QueueDataAdapter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.QueueEditor'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.QueueNavigator'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.robolectric',
+ 'l': 'RandomizedMp3Decoder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'RandomTrackSelection'
+ },
+ {'p': 'com.google.android.exoplayer2.source.dash.manifest', 'l': 'RangedUri'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Rating'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder.RatingCallback'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'MediaSessionConnector.RatingCallback'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'RawResourceDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'RawResourceDataSource.RawResourceDataSourceException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'SampleStream.ReadDataResult'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'SampleStream.ReadFlags'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'Extractor.ReadResult'},
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'UnsupportedDrmException.Reason'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ClippingMediaSource.IllegalClippingException.Reason'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'MergingMediaSource.IllegalMergeException.Reason'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil.truth',
+ 'l': 'SpannedSubject.RelativeSized'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'ChunkSampleStream.ReleaseCallback'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'Loader.ReleaseCallback'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Timeline.RemotableTimeline'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.RemoveMediaItem'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.RemoveMediaItems'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Renderer'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'RendererCapabilities'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'RendererConfiguration'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'RenderersFactory'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'MappingTrackSelector.MappedTrackInfo.RendererSupport'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMultivariantPlaylist.Rendition'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMediaPlaylist.RenditionReport'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.RepeatMode'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'RepeatModeActionProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'RepeatModeUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.util',
+ 'l': 'RepeatModeUtil.RepeatToggleModes'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'Representation'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'DefaultDashChunkSource.RepresentationHolder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'DashManifestParser.RepresentationInfo'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash',
+ 'l': 'DefaultDashChunkSource.RepresentationSegmentIterator'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem.RequestMetadata'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'HttpDataSource.RequestProperties'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'CacheAsserts.RequestSet'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.drm',
+ 'l': 'ExoMediaDrm.KeyRequest.RequestType'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.scheduler',
+ 'l': 'Requirements.RequirementFlags'
+ },
+ {'p': 'com.google.android.exoplayer2.scheduler', 'l': 'Requirements'},
+ {'p': 'com.google.android.exoplayer2.scheduler', 'l': 'RequirementsWatcher'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'AspectRatioFrameLayout.ResizeMode'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'ResolvingDataSource.Resolver'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'ResolvingDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'WebServerDispatcher.Resource'
+ },
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'RgbAdjustment'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'RgbFilter'},
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'RgbMatrix'},
+ {'p': 'com.google.android.exoplayer2.robolectric', 'l': 'RobolectricUtil'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.RoleFlags'},
+ {'p': 'com.google.android.exoplayer2.ext.rtmp', 'l': 'RtmpDataSource'},
+ {'p': 'com.google.android.exoplayer2.ext.rtmp', 'l': 'RtmpDataSourceFactory'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.rtsp.reader',
+ 'l': 'RtpAc3Reader'
+ },
+ {'p': 'com.google.android.exoplayer2.source.rtsp', 'l': 'RtpPacket'},
+ {'p': 'com.google.android.exoplayer2.source.rtsp', 'l': 'RtpPayloadFormat'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.rtsp.reader',
+ 'l': 'RtpPayloadReader'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.rtsp.reader',
+ 'l': 'RtpPcmReader'
+ },
+ {'p': 'com.google.android.exoplayer2.source.rtsp', 'l': 'RtpUtils'},
+ {'p': 'com.google.android.exoplayer2.source.rtsp', 'l': 'RtspMediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.rtsp',
+ 'l': 'RtspMediaSource.RtspPlaybackException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.rtsp',
+ 'l': 'RtspMediaSource.RtspUdpUnsupportedTransportException'
+ },
+ {'p': 'com.google.android.exoplayer2.text.span', 'l': 'RubySpan'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil.truth',
+ 'l': 'SpannedSubject.RubyText'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'RunnableFutureTask'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'TrackOutput.SampleDataPart'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'FlacFrameReader.SampleNumberHolder'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'SampleQueue'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'SampleQueueMappingException'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'SampleStream'},
+ {
+ 'p': 'com.google.android.exoplayer2.effect',
+ 'l': 'ScaleToFitTransformation'
+ },
+ {'p': 'com.google.android.exoplayer2.scheduler', 'l': 'Scheduler'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.workmanager',
+ 'l': 'WorkManagerScheduler.SchedulerWorker'
+ },
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DrmInitData.SchemeData'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'SectionPayloadReader'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'SectionReader'},
+ {
+ 'p': 'com.google.android.exoplayer2.util',
+ 'l': 'EGLSurfaceTexture.SecureMode'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action.Seek'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'SeekMap'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'BinarySearchSeeker.SeekOperationParams'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'SeekParameters'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'SeekPoint'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'SeekMap.SeekPoints'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'FlacStreamMetadata.SeekTable'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'BinarySearchSeeker.SeekTimestampConverter'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.mp4',
+ 'l': 'SlowMotionData.Segment'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.offline',
+ 'l': 'SegmentDownloader.Segment'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMediaPlaylist.Segment'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeDataSet.FakeData.Segment'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'SegmentBase'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMediaPlaylist.SegmentBase'
+ },
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'SegmentDownloader'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'SegmentBase.SegmentList'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'SegmentBase.SegmentTemplate'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'SegmentBase.SegmentTimelineElement'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'SeiReader'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'DefaultTrackSelector.SelectionEligibility'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.SelectionFlags'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'DefaultTrackSelector.SelectionOverride'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.SelectionReason'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'PlayerMessage.Sender'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action.SendMessages'},
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'SequenceableLoader'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMediaPlaylist.ServerControl'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.ads',
+ 'l': 'ServerSideAdInsertionMediaSource'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.ads',
+ 'l': 'ServerSideAdInsertionUtil'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'ServiceDescriptionElement'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.cast',
+ 'l': 'SessionAvailabilityListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionPlayerConnector'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.SetAudioAttributes'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action.SetMediaItems'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.SetMediaItemsResetPosition'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.SetPlaybackParameters'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.SetPlayWhenReady'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.SetRendererDisabled'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action.SetRepeatMode'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.SetShuffleModeEnabled'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.SetShuffleOrder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.SetVideoSurface'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.robolectric',
+ 'l': 'ShadowMediaCodecConfig'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'PlayerView.ShowBuffering'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'StyledPlayerView.ShowBuffering'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'ShuffleOrder'},
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'SilenceMediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'SilenceSkippingAudioProcessor'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'SimpleBasePlayer'},
+ {'p': 'com.google.android.exoplayer2.upstream.cache', 'l': 'SimpleCache'},
+ {'p': 'com.google.android.exoplayer2.decoder', 'l': 'SimpleDecoder'},
+ {
+ 'p': 'com.google.android.exoplayer2.decoder',
+ 'l': 'SimpleDecoderOutputBuffer'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'SimpleExoPlayer'},
+ {'p': 'com.google.android.exoplayer2.metadata', 'l': 'SimpleMetadataDecoder'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'SimpleSubtitleDecoder'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeExtractorInput.SimulatedIOException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'ExtractorAsserts.SimulationConfig'
+ },
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'SingleColorLut'},
+ {
+ 'p': 'com.google.android.exoplayer2.effect',
+ 'l': 'SingleFrameGlTextureProcessor'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.ads',
+ 'l': 'SinglePeriodAdTimeline'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'SinglePeriodTimeline'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'SingleSampleMediaChunk'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'SingleSampleMediaSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'SegmentBase.SingleSegmentBase'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'Representation.SingleSegmentRepresentation'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioSink.SinkFormatSupport'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'Size'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.media2',
+ 'l': 'SessionCallbackBuilder.SkipCallback'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'SlidingPercentile'},
+ {'p': 'com.google.android.exoplayer2.metadata.mp4', 'l': 'SlowMotionData'},
+ {'p': 'com.google.android.exoplayer2.metadata.mp4', 'l': 'SmtaMetadataEntry'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'SntpClient'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'SonicAudioProcessor'},
+ {'p': 'com.google.android.exoplayer2.testutil.truth', 'l': 'SpannedSubject'},
+ {'p': 'com.google.android.exoplayer2.text.span', 'l': 'SpanUtil'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.SpatializationBehavior'},
+ {
+ 'p': 'com.google.android.exoplayer2.video.spherical',
+ 'l': 'SphericalGLSurfaceView'
+ },
+ {'p': 'com.google.android.exoplayer2.metadata.scte35', 'l': 'SpliceCommand'},
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.scte35',
+ 'l': 'SpliceInfoDecoder'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.scte35',
+ 'l': 'SpliceInsertCommand'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.scte35',
+ 'l': 'SpliceNullCommand'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.scte35',
+ 'l': 'SpliceScheduleCommand'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'NalUnitUtil.SpsData'},
+ {'p': 'com.google.android.exoplayer2.text.ssa', 'l': 'SsaDecoder'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming',
+ 'l': 'SsChunkSource'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming.offline',
+ 'l': 'SsDownloader'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming.manifest',
+ 'l': 'SsManifest'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming.manifest',
+ 'l': 'SsManifestParser'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming',
+ 'l': 'SsMediaSource'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.database',
+ 'l': 'StandaloneDatabaseProvider'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'StandaloneMediaClock'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'StarRating'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.jpeg',
+ 'l': 'StartOffsetExtractorOutput'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.State'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Renderer.State'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'SimpleBasePlayer.State'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'DrmSession.State'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.ima',
+ 'l': 'ImaServerSideAdInsertionMediaSource.AdsLoader.State'
+ },
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'Download.State'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'StatsDataSource'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.StereoMode'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action.Stop'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.smoothstreaming.manifest',
+ 'l': 'SsManifest.StreamElement'
+ },
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'StreamKey'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.StreamType'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'Ac3Util.SyncFrameInfo.StreamType'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'StubExoPlayer'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'StubPlayer'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'StyledPlayerControlView'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'StyledPlayerView'},
+ {
+ 'p': 'com.google.android.exoplayer2.text.webvtt',
+ 'l': 'WebvttCssStyle.StyleFlags'
+ },
+ {'p': 'com.google.android.exoplayer2.text.subrip', 'l': 'SubripDecoder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'MediaItem.Subtitle'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'Subtitle'},
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'MediaItem.SubtitleConfiguration'
+ },
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'SubtitleDecoder'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'SubtitleDecoderException'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'SubtitleDecoderFactory'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'SubtitleExtractor'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'SubtitleInputBuffer'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'SubtitleOutputBuffer'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'SubtitleView'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'SurfaceInfo'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'Ac3Util.SyncFrameInfo'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'Ac4Util.SyncFrameInfo'},
+ {
+ 'p': 'com.google.android.exoplayer2.mediacodec',
+ 'l': 'SynchronousMediaCodecAdapter'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'SystemClock'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'PlayerMessage.Target'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'TeeAudioProcessor'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'TeeDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.robolectric',
+ 'l': 'TestDownloadManagerListener'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'TestExoPlayerBuilder'},
+ {
+ 'p': 'com.google.android.exoplayer2.robolectric',
+ 'l': 'TestPlayerRunHelper'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'DataSourceContractTest.TestResource'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'DummyMainThread.TestRunnable'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'TestUtil'},
+ {'p': 'com.google.android.exoplayer2.text.span', 'l': 'TextAnnotation'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlayer.TextComponent'},
+ {'p': 'com.google.android.exoplayer2.text.span', 'l': 'TextEmphasisSpan'},
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.id3',
+ 'l': 'TextInformationFrame'
+ },
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'TextOutput'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'TextRenderer'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'Cue.TextSizeType'},
+ {
+ 'p': 'com.google.android.exoplayer2.util',
+ 'l': 'EGLSurfaceTexture.TextureImageListener'
+ },
+ {'p': 'com.google.android.exoplayer2.effect', 'l': 'TextureInfo'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.ThrowPlaybackException'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'ThumbRating'},
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'TimeBar'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'TimedValueQueue'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Timeline'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'TimelineAsserts'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Player.TimelineChangeReason'},
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'TimelineQueueEditor'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.mediasession',
+ 'l': 'TimelineQueueNavigator'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeTimeline.TimelineWindowDefinition'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'ExoTimeoutException.TimeoutOperation'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.metadata.scte35',
+ 'l': 'TimeSignalCommand'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'TimestampAdjuster'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'TimestampAdjusterProvider'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'BinarySearchSeeker.TimestampSearchResult'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'BinarySearchSeeker.TimestampSeeker'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'TimeToFirstByteEstimator'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'TraceUtil'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mkv',
+ 'l': 'MatroskaExtractor.Track'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.mp4', 'l': 'Track'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'FakeMediaPeriod.TrackDataFactory'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mp4',
+ 'l': 'TrackEncryptionBox'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'TrackGroup'},
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'TrackGroupArray'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.ts',
+ 'l': 'TsPayloadReader.TrackIdGenerator'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'TrackNameProvider'},
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'TrackOutput'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.chunk',
+ 'l': 'ChunkExtractor.TrackOutputProvider'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'Tracks'},
+ {'p': 'com.google.android.exoplayer2.trackselection', 'l': 'TrackSelection'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'TrackSelectionArray'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'TrackSelectionDialogBuilder'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'TrackSelectionView.TrackSelectionListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'TrackSelectionOverride'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'TrackSelectionParameters'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'TrackSelectionUtil'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'TrackSelectionView'},
+ {'p': 'com.google.android.exoplayer2.trackselection', 'l': 'TrackSelector'},
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'TrackSelectorResult'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.TrackType'},
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'TransferListener'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor.mp4',
+ 'l': 'Track.Transformation'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'TransformationException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'TransformationRequest'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'TransformationResult'
+ },
+ {'p': 'com.google.android.exoplayer2.transformer', 'l': 'Transformer'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'TrueHdSampleRechunker'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'TsExtractor'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'TsPayloadReader'},
+ {'p': 'com.google.android.exoplayer2.extractor.ts', 'l': 'TsUtil'},
+ {'p': 'com.google.android.exoplayer2.text.ttml', 'l': 'TtmlDecoder'},
+ {
+ 'p': 'com.google.android.exoplayer2',
+ 'l': 'RendererCapabilities.TunnelingSupport'
+ },
+ {'p': 'com.google.android.exoplayer2.text.tx3g', 'l': 'Tx3gDecoder'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlaybackException.Type'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.ads',
+ 'l': 'AdsMediaSource.AdLoadException.Type'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.trackselection',
+ 'l': 'TrackSelection.Type'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'HttpDataSource.HttpDataSourceException.Type'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'FileTypes.Type'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil.truth',
+ 'l': 'SpannedSubject.Typefaced'
+ },
+ {'p': 'com.google.android.exoplayer2.upstream', 'l': 'UdpDataSource'},
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'UdpDataSource.UdpDataSourceException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioSink.UnexpectedDiscontinuityException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.upstream',
+ 'l': 'Loader.UnexpectedLoaderException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'AudioProcessor.UnhandledAudioFormatException'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'UnknownNull'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'UnrecognizedInputFormatException'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'SeekMap.Unseekable'},
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'ShuffleOrder.UnshuffledShuffleOrder'
+ },
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'UnsupportedDrmException'},
+ {
+ 'p': 'com.google.android.exoplayer2.offline',
+ 'l': 'DownloadRequest.UnsupportedRequestException'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source',
+ 'l': 'SampleQueue.UpstreamFormatChangedListener'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'UriUtil'},
+ {'p': 'com.google.android.exoplayer2.metadata.id3', 'l': 'UrlLinkFrame'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'UrlTemplate'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.dash.manifest',
+ 'l': 'UtcTimingElement'
+ },
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'Util'},
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls.playlist',
+ 'l': 'HlsMultivariantPlaylist.Variant'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.source.hls',
+ 'l': 'HlsTrackMetadataEntry.VariantInfo'
+ },
+ {'p': 'com.google.android.exoplayer2.database', 'l': 'VersionTable'},
+ {'p': 'com.google.android.exoplayer2.text', 'l': 'Cue.VerticalType'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.VideoChangeFrameRateStrategy'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'ExoPlayer.VideoComponent'},
+ {
+ 'p': 'com.google.android.exoplayer2.video',
+ 'l': 'VideoDecoderGLSurfaceView'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.decoder',
+ 'l': 'VideoDecoderOutputBuffer'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.video',
+ 'l': 'VideoDecoderOutputBufferRenderer'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.transformer',
+ 'l': 'VideoEncoderSettings'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.video',
+ 'l': 'VideoFrameMetadataListener'
+ },
+ {'p': 'com.google.android.exoplayer2.video', 'l': 'VideoFrameReleaseHelper'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.VideoOutputMode'},
+ {
+ 'p': 'com.google.android.exoplayer2.video',
+ 'l': 'VideoRendererEventListener'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.VideoScalingMode'},
+ {'p': 'com.google.android.exoplayer2.video', 'l': 'VideoSize'},
+ {
+ 'p': 'com.google.android.exoplayer2.video.spherical',
+ 'l': 'SphericalGLSurfaceView.VideoSurfaceListener'
+ },
+ {'p': 'com.google.android.exoplayer2.ui', 'l': 'SubtitleView.ViewType'},
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'PlayerNotificationManager.Visibility'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'PlayerControlView.VisibilityListener'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ui',
+ 'l': 'StyledPlayerControlView.VisibilityListener'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'VorbisBitArray'},
+ {'p': 'com.google.android.exoplayer2.metadata.flac', 'l': 'VorbisComment'},
+ {'p': 'com.google.android.exoplayer2.metadata.vorbis', 'l': 'VorbisComment'},
+ {
+ 'p': 'com.google.android.exoplayer2.extractor',
+ 'l': 'VorbisUtil.VorbisIdHeader'
+ },
+ {'p': 'com.google.android.exoplayer2.extractor', 'l': 'VorbisUtil'},
+ {'p': 'com.google.android.exoplayer2.ext.vp9', 'l': 'VpxDecoder'},
+ {'p': 'com.google.android.exoplayer2.ext.vp9', 'l': 'VpxDecoderException'},
+ {'p': 'com.google.android.exoplayer2.ext.vp9', 'l': 'VpxLibrary'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.WaitForIsLoading'
+ },
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'Action.WaitForMessage'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.WaitForPendingPlayerCommands'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.WaitForPlaybackState'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.WaitForPlayWhenReady'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.WaitForPositionDiscontinuity'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.testutil',
+ 'l': 'Action.WaitForTimelineChanged'
+ },
+ {'p': 'com.google.android.exoplayer2', 'l': 'C.WakeMode'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Renderer.WakeupListener'},
+ {'p': 'com.google.android.exoplayer2.extractor.wav', 'l': 'WavExtractor'},
+ {
+ 'p': 'com.google.android.exoplayer2.audio',
+ 'l': 'TeeAudioProcessor.WavFileAudioBufferSink'
+ },
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'WavUtil'},
+ {'p': 'com.google.android.exoplayer2.testutil', 'l': 'WebServerDispatcher'},
+ {'p': 'com.google.android.exoplayer2.text.webvtt', 'l': 'WebvttCssStyle'},
+ {'p': 'com.google.android.exoplayer2.text.webvtt', 'l': 'WebvttCueInfo'},
+ {'p': 'com.google.android.exoplayer2.text.webvtt', 'l': 'WebvttCueParser'},
+ {'p': 'com.google.android.exoplayer2.text.webvtt', 'l': 'WebvttDecoder'},
+ {'p': 'com.google.android.exoplayer2.source.hls', 'l': 'WebvttExtractor'},
+ {'p': 'com.google.android.exoplayer2.text.webvtt', 'l': 'WebvttParserUtil'},
+ {'p': 'com.google.android.exoplayer2.drm', 'l': 'WidevineUtil'},
+ {'p': 'com.google.android.exoplayer2', 'l': 'Timeline.Window'},
+ {
+ 'p': 'com.google.android.exoplayer2.testutil.truth',
+ 'l': 'SpannedSubject.WithSpanFlags'
+ },
+ {
+ 'p': 'com.google.android.exoplayer2.ext.workmanager',
+ 'l': 'WorkManagerScheduler'
+ },
+ {'p': 'com.google.android.exoplayer2.source', 'l': 'WrappingMediaSource'},
+ {'p': 'com.google.android.exoplayer2.offline', 'l': 'WritableDownloadIndex'},
+ {'p': 'com.google.android.exoplayer2.audio', 'l': 'AudioSink.WriteException'},
+ {'p': 'com.google.android.exoplayer2.util', 'l': 'XmlPullParserUtil'}
+]
\ No newline at end of file
diff --git a/docs/doc/reference/type-search-index.zip b/docs/doc/reference/type-search-index.zip
index 4c621f88a02..716d0e93bf9 100644
Binary files a/docs/doc/reference/type-search-index.zip and b/docs/doc/reference/type-search-index.zip differ
diff --git a/docs/issues/cleartext-not-permitted.md b/docs/issues/cleartext-not-permitted.md
index f3c7b849bc3..2d19e0f535e 100644
--- a/docs/issues/cleartext-not-permitted.md
+++ b/docs/issues/cleartext-not-permitted.md
@@ -1,5 +1,5 @@
---
permalink: /issues/cleartext-not-permitted.html
redirect_to:
- - https://exoplayer.dev/troubleshooting.html#fixing-cleartext-http-traffic-not-permitted-errors
+ - https://developer.android.com/guide/topics/media/issues/cleartext-not-permitted
---
diff --git a/docs/issues/player-accessed-on-wrong-thread.md b/docs/issues/player-accessed-on-wrong-thread.md
index 955c7933622..5878fe0838f 100644
--- a/docs/issues/player-accessed-on-wrong-thread.md
+++ b/docs/issues/player-accessed-on-wrong-thread.md
@@ -1,5 +1,5 @@
---
permalink: /issues/player-accessed-on-wrong-thread.html
redirect_to:
- - https://exoplayer.dev/hello-world.html#a-note-on-threading
+ - https://developer.android.com/guide/topics/media/issues/player-accessed-on-wrong-thread
---
diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java
index 9d1105d7571..e327d761d36 100644
--- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java
+++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java
@@ -264,7 +264,7 @@ public Builder setEnableContinuousPlayback(boolean enableContinuousPlayback) {
/**
* Sets the duration in milliseconds for which the player must buffer while preloading an ad
* group before that ad group is skipped and marked as having failed to load. Pass {@link
- * C#TIME_UNSET} if there should be no such timeout. The default value is {@value
+ * C#TIME_UNSET} if there should be no such timeout. The default value is {@link
* #DEFAULT_AD_PRELOAD_TIMEOUT_MS} ms.
*
* The purpose of this timeout is to avoid playback getting stuck in the unexpected case that
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java
index 943a1a094c2..856600655ae 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java
@@ -27,11 +27,11 @@ public final class ExoPlayerLibraryInfo {
/** The version of the library expressed as a string, for example "1.2.3". */
// Intentionally hardcoded. Do not derive from other constants (e.g. VERSION_INT) or vice versa.
- public static final String VERSION = "2.18.5";
+ public static final String VERSION = "2.18.6";
/** The version of the library expressed as {@code TAG + "/" + VERSION}. */
// Intentionally hardcoded. Do not derive from other constants (e.g. VERSION) or vice versa.
- public static final String VERSION_SLASHY = "ExoPlayerLib/2.18.5";
+ public static final String VERSION_SLASHY = "ExoPlayerLib/2.18.6";
/**
* The version of the library expressed as an integer, for example 1002003.
@@ -41,7 +41,7 @@ public final class ExoPlayerLibraryInfo {
* integer version 123045006 (123-045-006).
*/
// Intentionally hardcoded. Do not derive from other constants (e.g. VERSION) or vice versa.
- public static final int VERSION_INT = 2_018_005;
+ public static final int VERSION_INT = 2_018_006;
/** Whether the library was compiled with {@link Assertions} checks enabled. */
public static final boolean ASSERTIONS_ENABLED = true;
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Format.java b/library/common/src/main/java/com/google/android/exoplayer2/Format.java
index 4e15771f9a3..24de0b135f2 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/Format.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/Format.java
@@ -38,7 +38,8 @@
*
*
When building formats, populate all fields whose values are known and relevant to the type of
* format being constructed. For information about different types of format, see ExoPlayer's Supported formats page .
+ * href="https://developer.android.com/guide/topics/media/exoplayer/supported-formats">Supported
+ * formats page.
*
*
Fields commonly relevant to all formats
*
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java
index 014ce116e74..4b835d32d95 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java
@@ -20,6 +20,7 @@
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.TextureView;
+import androidx.annotation.CallSuper;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.audio.AudioAttributes;
import com.google.android.exoplayer2.metadata.Metadata;
@@ -49,14 +50,29 @@ public Looper getApplicationLooper() {
return player.getApplicationLooper();
}
- /** Calls {@link Player#addListener(Listener)} on the delegate. */
+ /**
+ * Calls {@link Player#addListener(Listener)} on the delegate.
+ *
+ * Overrides of this method must delegate to {@code super.addListener} and not {@code
+ * delegate.addListener}, in order to ensure the correct {@link Player} instance is passed to
+ * {@link Player.Listener#onEvents(Player, Events)} (i.e. this forwarding instance, and not the
+ * underlying {@code delegate} instance).
+ */
@Override
+ @CallSuper
public void addListener(Listener listener) {
player.addListener(new ForwardingListener(this, listener));
}
- /** Calls {@link Player#removeListener(Listener)} on the delegate. */
+ /**
+ * Calls {@link Player#removeListener(Listener)} on the delegate.
+ *
+ *
Overrides of this method must delegate to {@code super.removeListener} and not {@code
+ * delegate.removeListener}, in order to ensure the listener 'matches' the listener added via
+ * {@link #addListener} (otherwise the listener registered on the delegate won't be removed).
+ */
@Override
+ @CallSuper
public void removeListener(Listener listener) {
player.removeListener(new ForwardingListener(this, listener));
}
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java
index b2950639e0c..8ddf65d418f 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java
@@ -151,8 +151,9 @@ public class PlaybackException extends Exception implements Bundleable {
* Caused by the player trying to access cleartext HTTP traffic (meaning http:// rather than
* https://) when the app's Network Security Configuration does not permit it.
*
- *
See this corresponding
- * troubleshooting topic .
+ *
See this
+ * corresponding troubleshooting topic .
*/
public static final int ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED = 2007;
/** Caused by reading data out of the data bound. */
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java b/library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java
index ebb0f250616..a462943071c 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java
@@ -3358,7 +3358,8 @@ private void verifyApplicationThreadAndInitState() {
"Player is accessed on the wrong thread.\n"
+ "Current thread: '%s'\n"
+ "Expected thread: '%s'\n"
- + "See https://exoplayer.dev/issues/player-accessed-on-wrong-thread",
+ + "See https://developer.android.com/guide/topics/media/issues/"
+ + "player-accessed-on-wrong-thread",
Thread.currentThread().getName(), applicationLooper.getThread().getName());
throw new IllegalStateException(message);
}
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Timeline.java b/library/common/src/main/java/com/google/android/exoplayer2/Timeline.java
index 209b1de832b..2377492c350 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/Timeline.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/Timeline.java
@@ -61,8 +61,9 @@
*
*
Single media file or on-demand stream
*
- *
+ *
*
*
A timeline for a single media file or on-demand stream consists of a single period and window.
* The window spans the whole period, indicating that all parts of the media are available for
@@ -71,8 +72,9 @@
*
*
Playlist of media files or on-demand streams
*
- *
+ *
*
*
A timeline for a playlist of media files or on-demand streams consists of multiple periods,
* each with its own window. Each window spans the whole of the corresponding period, and typically
@@ -82,8 +84,9 @@
*
*
Live stream with limited availability
*
- *
+ *
*
*
A timeline for a live stream consists of a period whose duration is unknown, since it's
* continually extending as more content is broadcast. If content only remains available for a
@@ -95,8 +98,9 @@
*
*
Live stream with indefinite availability
*
- *
+ *
*
*
A timeline for a live stream with indefinite availability is similar to the Live stream with limited availability case, except that the window
@@ -105,8 +109,9 @@
*
*
Live stream with multiple periods
*
- *
+ *
*
*
This case arises when a live stream is explicitly divided into separate periods, for example
* at content boundaries. This case is similar to the Live stream with
@@ -115,8 +120,9 @@
*
* On-demand stream followed by live stream
*
- *
+ *
*
*
This case is the concatenation of the Single media file or on-demand
* stream and Live stream with multiple periods cases. When playback
@@ -125,12 +131,15 @@
*
*
On-demand stream with mid-roll ads
*
- *
+ *
*
*
This case includes mid-roll ad groups, which are defined as part of the timeline's single
* period. The period can be queried for information about the ad groups and the ads they contain.
*/
+// TODO(b/276289331): Revert to media3-hosted SVG links above once they're available on
+// developer.android.com.
public abstract class Timeline implements Bundleable {
/**
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java b/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java
index b88ab1c2cef..bfb2d2e5e37 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/Tracks.java
@@ -189,6 +189,17 @@ public boolean isTrackSelected(int trackIndex) {
return mediaTrackGroup.type;
}
+ /**
+ * Copies the {@code Group} with a new {@link TrackGroup#id}.
+ *
+ * @param groupId The new {@link TrackGroup#id}
+ * @return The copied {@code Group}.
+ */
+ public Group copyWithId(String groupId) {
+ return new Group(
+ mediaTrackGroup.copyWithId(groupId), adaptiveSupported, trackSupport, trackSelected);
+ }
+
@Override
public boolean equals(@Nullable Object other) {
if (this == other) {
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/AuxEffectInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/AuxEffectInfo.java
index f3ea686210f..78565d04406 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/audio/AuxEffectInfo.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/audio/AuxEffectInfo.java
@@ -50,12 +50,12 @@ public final class AuxEffectInfo {
* Creates an instance with the given effect identifier and send level.
*
* @param effectId The effect identifier. This is the value returned by {@link
- * AudioEffect#getId()} on the effect, or {@value #NO_AUX_EFFECT_ID} which represents no
+ * AudioEffect#getId()} on the effect, or {@link #NO_AUX_EFFECT_ID} which represents no
* effect. This value is passed to {@link AudioTrack#attachAuxEffect(int)} on the underlying
* audio track.
* @param sendLevel The send level for the effect, where 0 represents no effect and a value of 1
- * is full send. If {@code effectId} is not {@value #NO_AUX_EFFECT_ID}, this value is passed
- * to {@link AudioTrack#setAuxEffectSendLevel(float)} on the underlying audio track.
+ * is full send. If {@code effectId} is not {@link #NO_AUX_EFFECT_ID}, this value is passed to
+ * {@link AudioTrack#setAuxEffectSendLevel(float)} on the underlying audio track.
*/
public AuxEffectInfo(int effectId, float sendLevel) {
this.effectId = effectId;
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java
index ca0968e8238..d45c0800d6a 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java
@@ -141,7 +141,7 @@ public static float[] createVertexBuffer(List vertexList) {
}
/**
- * Returns whether creating a GL context with {@value #EXTENSION_PROTECTED_CONTENT} is possible.
+ * Returns whether creating a GL context with {@link #EXTENSION_PROTECTED_CONTENT} is possible.
*
* If {@code true}, the device supports a protected output path for DRM content when using GL.
*/
@@ -170,7 +170,7 @@ public static boolean isProtectedContentExtensionSupported(Context context) {
}
/**
- * Returns whether the {@value #EXTENSION_SURFACELESS_CONTEXT} extension is supported.
+ * Returns whether the {@link #EXTENSION_SURFACELESS_CONTEXT} extension is supported.
*
*
This extension allows passing {@link EGL14#EGL_NO_SURFACE} for both the write and read
* surfaces in a call to {@link EGL14#eglMakeCurrent(EGLDisplay, EGLSurface, EGLSurface,
@@ -186,7 +186,7 @@ public static boolean isSurfacelessContextExtensionSupported() {
}
/**
- * Returns whether the {@value #EXTENSION_YUV_TARGET} extension is supported.
+ * Returns whether the {@link #EXTENSION_YUV_TARGET} extension is supported.
*
*
This extension allows sampling raw YUV values from an external texture, which is required
* for HDR.
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java
index 9960f6c4ae2..cc09ecce458 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java
@@ -121,8 +121,9 @@
*
*
The figure below shows ExoPlayer's threading model.
*
- *
+ *
*
*
* ExoPlayer instances must be accessed from a single application thread unless indicated
@@ -151,6 +152,8 @@
* may use background threads to load data. These are implementation specific.
*
*/
+// TODO(b/276289331): Revert to media3-hosted SVG links above once they're available on
+// developer.android.com.
public interface ExoPlayer extends Player {
/**
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java
index ce7bf4eff46..f603826045c 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java
@@ -2662,7 +2662,8 @@ private void verifyApplicationThread() {
"Player is accessed on the wrong thread.\n"
+ "Current thread: '%s'\n"
+ "Expected thread: '%s'\n"
- + "See https://exoplayer.dev/issues/player-accessed-on-wrong-thread",
+ + "See https://developer.android.com/guide/topics/media/issues/"
+ + "player-accessed-on-wrong-thread",
Thread.currentThread().getName(), getApplicationLooper().getThread().getName());
if (throwsWhenUsingWrongThread) {
throw new IllegalStateException(message);
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java
index 180c7be9fa0..71f8880b3ee 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java
@@ -1231,7 +1231,8 @@ private void seekToInternal(SeekPosition seekPosition) throws ExoPlaybackExcepti
/* newPeriodId= */ periodId,
/* oldTimeline= */ playbackInfo.timeline,
/* oldPeriodId= */ playbackInfo.periodId,
- /* positionForTargetOffsetOverrideUs= */ requestedContentPositionUs);
+ /* positionForTargetOffsetOverrideUs= */ requestedContentPositionUs,
+ /* forceSetTargetOffsetOverride= */ true);
}
} finally {
playbackInfo =
@@ -1874,7 +1875,8 @@ timeline, rendererPositionUs, getMaxRendererReadPositionUs())) {
/* oldPeriodId= */ playbackInfo.periodId,
/* positionForTargetOffsetOverrideUs */ positionUpdate.setTargetLiveOffset
? newPositionUs
- : C.TIME_UNSET);
+ : C.TIME_UNSET,
+ /* forceSetTargetOffsetOverride= */ false);
if (periodPositionChanged
|| newRequestedContentPositionUs != playbackInfo.requestedContentPositionUs) {
Object oldPeriodUid = playbackInfo.periodId.periodUid;
@@ -1912,7 +1914,8 @@ private void updatePlaybackSpeedSettingsForNewPeriod(
MediaPeriodId newPeriodId,
Timeline oldTimeline,
MediaPeriodId oldPeriodId,
- long positionForTargetOffsetOverrideUs)
+ long positionForTargetOffsetOverrideUs,
+ boolean forceSetTargetOffsetOverride)
throws ExoPlaybackException {
if (!shouldUseLivePlaybackSpeedControl(newTimeline, newPeriodId)) {
// Live playback speed control is unused for the current period, reset speed to user-defined
@@ -1942,8 +1945,9 @@ private void updatePlaybackSpeedSettingsForNewPeriod(
int oldWindowIndex = oldTimeline.getPeriodByUid(oldPeriodId.periodUid, period).windowIndex;
oldWindowUid = oldTimeline.getWindow(oldWindowIndex, window).uid;
}
- if (!Util.areEqual(oldWindowUid, windowUid)) {
- // Reset overridden target live offset to media values if window changes.
+ if (!Util.areEqual(oldWindowUid, windowUid) || forceSetTargetOffsetOverride) {
+ // Reset overridden target live offset to media values if window changes or if seekTo
+ // default live position.
livePlaybackSpeedControl.setTargetLiveOffsetOverrideUs(C.TIME_UNSET);
}
}
@@ -2066,7 +2070,8 @@ private void maybeUpdateReadingPeriod() throws ExoPlaybackException {
/* newPeriodId= */ readingPeriodHolder.info.id,
/* oldTimeline= */ playbackInfo.timeline,
/* oldPeriodId= */ oldReadingPeriodHolder.info.id,
- /* positionForTargetOffsetOverrideUs= */ C.TIME_UNSET);
+ /* positionForTargetOffsetOverrideUs= */ C.TIME_UNSET,
+ /* forceSetTargetOffsetOverride= */ false);
if (readingPeriodHolder.prepared
&& readingPeriodHolder.mediaPeriod.readDiscontinuity() != C.TIME_UNSET) {
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java
index f8ffe47ef3c..efb180be3dc 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/Renderer.java
@@ -44,9 +44,12 @@
* valid state transitions are shown below, annotated with the methods that are called during each
* transition.
*
- *
+ *
*/
+// TODO(b/276289331): Revert to media3-hosted SVG links above once they're available on
+// developer.android.com.
public interface Renderer extends PlayerMessage.Target {
/**
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java
index c51a3ddd8eb..6c65f50b147 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java
@@ -185,6 +185,8 @@ public InitializationException(
+ audioTrackState
+ " "
+ ("Config(" + sampleRate + ", " + channelConfig + ", " + bufferSize + ")")
+ + " "
+ + format
+ (isRecoverable ? " (recoverable)" : ""),
audioTrackException);
this.audioTrackState = audioTrackState;
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioTrackBufferSizeProvider.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioTrackBufferSizeProvider.java
index 2e774551fad..b4e03a8df85 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioTrackBufferSizeProvider.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioTrackBufferSizeProvider.java
@@ -72,7 +72,7 @@ public Builder() {
/**
* Sets the minimum length for PCM {@link AudioTrack} buffers, in microseconds. Default is
- * {@value #MIN_PCM_BUFFER_DURATION_US}.
+ * {@link #MIN_PCM_BUFFER_DURATION_US}.
*/
@CanIgnoreReturnValue
public Builder setMinPcmBufferDurationUs(int minPcmBufferDurationUs) {
@@ -82,7 +82,7 @@ public Builder setMinPcmBufferDurationUs(int minPcmBufferDurationUs) {
/**
* Sets the maximum length for PCM {@link AudioTrack} buffers, in microseconds. Default is
- * {@value #MAX_PCM_BUFFER_DURATION_US}.
+ * {@link #MAX_PCM_BUFFER_DURATION_US}.
*/
@CanIgnoreReturnValue
public Builder setMaxPcmBufferDurationUs(int maxPcmBufferDurationUs) {
@@ -92,7 +92,7 @@ public Builder setMaxPcmBufferDurationUs(int maxPcmBufferDurationUs) {
/**
* Sets the multiplication factor to apply to the minimum buffer size requested. Default is
- * {@value #PCM_BUFFER_MULTIPLICATION_FACTOR}.
+ * {@link #PCM_BUFFER_MULTIPLICATION_FACTOR}.
*/
@CanIgnoreReturnValue
public Builder setPcmBufferMultiplicationFactor(int pcmBufferMultiplicationFactor) {
@@ -102,7 +102,7 @@ public Builder setPcmBufferMultiplicationFactor(int pcmBufferMultiplicationFacto
/**
* Sets the length for passthrough {@link AudioTrack} buffers, in microseconds. Default is
- * {@value #PASSTHROUGH_BUFFER_DURATION_US}.
+ * {@link #PASSTHROUGH_BUFFER_DURATION_US}.
*/
@CanIgnoreReturnValue
public Builder setPassthroughBufferDurationUs(int passthroughBufferDurationUs) {
@@ -111,7 +111,7 @@ public Builder setPassthroughBufferDurationUs(int passthroughBufferDurationUs) {
}
/**
- * The length for offload {@link AudioTrack} buffers, in microseconds. Default is {@value
+ * The length for offload {@link AudioTrack} buffers, in microseconds. Default is {@link
* #OFFLOAD_BUFFER_DURATION_US}.
*/
@CanIgnoreReturnValue
@@ -122,7 +122,7 @@ public Builder setOffloadBufferDurationUs(int offloadBufferDurationUs) {
/**
* Sets the multiplication factor to apply to the passthrough buffer for AC3 to avoid underruns
- * on some devices (e.g., Broadcom 7271). Default is {@value #AC3_BUFFER_MULTIPLICATION_FACTOR}.
+ * on some devices (e.g., Broadcom 7271). Default is {@link #AC3_BUFFER_MULTIPLICATION_FACTOR}.
*/
@CanIgnoreReturnValue
public Builder setAc3BufferMultiplicationFactor(int ac3BufferMultiplicationFactor) {
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java
index d76edd8840f..1bb0cdf771a 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java
@@ -100,6 +100,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
private int codecMaxInputSize;
private boolean codecNeedsDiscardChannelsWorkaround;
+ @Nullable private Format inputFormat;
/** Codec used for DRM decryption only in passthrough and offload. */
@Nullable private Format decryptOnlyCodecFormat;
@@ -495,8 +496,9 @@ protected void onCodecError(Exception codecError) {
@Nullable
protected DecoderReuseEvaluation onInputFormatChanged(FormatHolder formatHolder)
throws ExoPlaybackException {
+ inputFormat = checkNotNull(formatHolder.format);
@Nullable DecoderReuseEvaluation evaluation = super.onInputFormatChanged(formatHolder);
- eventDispatcher.inputFormatChanged(formatHolder.format, evaluation);
+ eventDispatcher.inputFormatChanged(inputFormat, evaluation);
return evaluation;
}
@@ -599,6 +601,7 @@ protected void onStopped() {
@Override
protected void onDisabled() {
audioSinkNeedsReset = true;
+ inputFormat = null;
try {
audioSink.flush();
} finally {
@@ -706,7 +709,7 @@ protected boolean processOutputBuffer(
fullyConsumed = audioSink.handleBuffer(buffer, bufferPresentationTimeUs, sampleCount);
} catch (InitializationException e) {
throw createRendererException(
- e, e.format, e.isRecoverable, PlaybackException.ERROR_CODE_AUDIO_TRACK_INIT_FAILED);
+ e, inputFormat, e.isRecoverable, PlaybackException.ERROR_CODE_AUDIO_TRACK_INIT_FAILED);
} catch (WriteException e) {
throw createRendererException(
e, format, e.isRecoverable, PlaybackException.ERROR_CODE_AUDIO_TRACK_WRITE_FAILED);
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java
index 4e2db30ac53..59997c79b6b 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java
@@ -136,9 +136,10 @@ public interface ReferenceCountListener {
private final LoadErrorHandlingPolicy loadErrorHandlingPolicy;
private final PlayerId playerId;
- /* package */ final MediaDrmCallback callback;
- /* package */ final UUID uuid;
- /* package */ final ResponseHandler responseHandler;
+ private final MediaDrmCallback callback;
+ private final UUID uuid;
+ private final Looper playbackLooper;
+ private final ResponseHandler responseHandler;
private @DrmSession.State int state;
private int referenceCount;
@@ -209,10 +210,12 @@ public DefaultDrmSession(
this.loadErrorHandlingPolicy = loadErrorHandlingPolicy;
this.playerId = playerId;
state = STATE_OPENING;
+ this.playbackLooper = playbackLooper;
responseHandler = new ResponseHandler(playbackLooper);
}
public boolean hasSessionId(byte[] sessionId) {
+ verifyPlaybackThread();
return Arrays.equals(this.sessionId, sessionId);
}
@@ -255,50 +258,59 @@ public void onProvisionError(Exception error, boolean thrownByExoMediaDrm) {
@Override
public final @DrmSession.State int getState() {
+ verifyPlaybackThread();
return state;
}
@Override
public boolean playClearSamplesWithoutKeys() {
+ verifyPlaybackThread();
return playClearSamplesWithoutKeys;
}
@Override
@Nullable
public final DrmSessionException getError() {
+ verifyPlaybackThread();
return state == STATE_ERROR ? lastException : null;
}
@Override
public final UUID getSchemeUuid() {
+ verifyPlaybackThread();
return uuid;
}
@Override
@Nullable
public final CryptoConfig getCryptoConfig() {
+ verifyPlaybackThread();
return cryptoConfig;
}
@Override
@Nullable
public Map queryKeyStatus() {
+ verifyPlaybackThread();
return sessionId == null ? null : mediaDrm.queryKeyStatus(sessionId);
}
@Override
@Nullable
public byte[] getOfflineLicenseKeySetId() {
+ verifyPlaybackThread();
return offlineLicenseKeySetId;
}
@Override
public boolean requiresSecureDecoder(String mimeType) {
+ verifyPlaybackThread();
return mediaDrm.requiresSecureDecoder(checkStateNotNull(sessionId), mimeType);
}
@Override
public void acquire(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) {
+ verifyPlaybackThread();
if (referenceCount < 0) {
Log.e(TAG, "Session reference count less than zero: " + referenceCount);
referenceCount = 0;
@@ -326,6 +338,7 @@ && isOpen()
@Override
public void release(@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher) {
+ verifyPlaybackThread();
if (referenceCount <= 0) {
Log.e(TAG, "release() called on a session that's already fully released.");
return;
@@ -561,6 +574,18 @@ private void dispatchEvent(Consumer eve
}
}
+ private void verifyPlaybackThread() {
+ if (Thread.currentThread() != playbackLooper.getThread()) {
+ Log.w(
+ TAG,
+ "DefaultDrmSession accessed on the wrong thread.\nCurrent thread: "
+ + Thread.currentThread().getName()
+ + "\nExpected thread: "
+ + playbackLooper.getThread().getName(),
+ new IllegalStateException());
+ }
+ }
+
// Internal classes.
@SuppressLint("HandlerLeak")
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java
index 60c71fa152c..a7162be9c0a 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java
@@ -468,6 +468,7 @@ public void setMode(@Mode int mode, @Nullable byte[] offlineLicenseKeySetId) {
@Override
public final void prepare() {
+ verifyPlaybackThread(/* allowBeforeSetPlayer= */ true);
if (prepareCallsCount++ != 0) {
return;
}
@@ -484,6 +485,7 @@ public final void prepare() {
@Override
public final void release() {
+ verifyPlaybackThread(/* allowBeforeSetPlayer= */ true);
if (--prepareCallsCount != 0) {
return;
}
@@ -510,6 +512,7 @@ public void setPlayer(Looper playbackLooper, PlayerId playerId) {
@Override
public DrmSessionReference preacquireSession(
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) {
+ // Don't verify the playback thread, preacquireSession can be called from any thread.
checkState(prepareCallsCount > 0);
checkStateNotNull(playbackLooper);
PreacquiredSessionReference preacquiredSessionReference =
@@ -522,6 +525,7 @@ public DrmSessionReference preacquireSession(
@Nullable
public DrmSession acquireSession(
@Nullable DrmSessionEventListener.EventDispatcher eventDispatcher, Format format) {
+ verifyPlaybackThread(/* allowBeforeSetPlayer= */ false);
checkState(prepareCallsCount > 0);
checkStateNotNull(playbackLooper);
return acquireSession(
@@ -596,6 +600,7 @@ private DrmSession acquireSession(
@Override
public @C.CryptoType int getCryptoType(Format format) {
+ verifyPlaybackThread(/* allowBeforeSetPlayer= */ false);
@C.CryptoType int cryptoType = checkNotNull(exoMediaDrm).getCryptoType();
if (format.drmInitData == null) {
int trackType = MimeTypes.getTrackType(format.sampleMimeType);
@@ -814,6 +819,23 @@ private void maybeReleaseMediaDrm() {
}
}
+ private void verifyPlaybackThread(boolean allowBeforeSetPlayer) {
+ if (allowBeforeSetPlayer && playbackLooper == null) {
+ Log.w(
+ TAG,
+ "DefaultDrmSessionManager accessed before setPlayer(), possibly on the wrong thread.",
+ new IllegalStateException());
+ } else if (Thread.currentThread() != checkNotNull(playbackLooper).getThread()) {
+ Log.w(
+ TAG,
+ "DefaultDrmSessionManager accessed on the wrong thread.\nCurrent thread: "
+ + Thread.currentThread().getName()
+ + "\nExpected thread: "
+ + playbackLooper.getThread().getName(),
+ new IllegalStateException());
+ }
+ }
+
/**
* Extracts {@link SchemeData} instances suitable for the given DRM scheme {@link UUID}.
*
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java
index c1d1b907d1e..d6b55710d2a 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java
@@ -19,6 +19,7 @@
import android.os.ConditionVariable;
import android.os.Handler;
import android.os.HandlerThread;
+import android.os.Looper;
import android.util.Pair;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
@@ -29,8 +30,11 @@
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.util.Assertions;
+import com.google.common.util.concurrent.SettableFuture;
import java.util.Map;
import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import org.checkerframework.checker.nullness.compatqual.NullableType;
/** Helper class to download, renew and release offline licenses. */
@RequiresApi(18)
@@ -39,9 +43,10 @@ public final class OfflineLicenseHelper {
private static final Format FORMAT_WITH_EMPTY_DRM_INIT_DATA =
new Format.Builder().setDrmInitData(new DrmInitData()).build();
- private final ConditionVariable conditionVariable;
+ private final ConditionVariable drmListenerConditionVariable;
private final DefaultDrmSessionManager drmSessionManager;
private final HandlerThread handlerThread;
+ private final Handler handler;
private final DrmSessionEventListener.EventDispatcher eventDispatcher;
/**
@@ -153,28 +158,29 @@ public OfflineLicenseHelper(
this.eventDispatcher = eventDispatcher;
handlerThread = new HandlerThread("ExoPlayer:OfflineLicenseHelper");
handlerThread.start();
- conditionVariable = new ConditionVariable();
+ handler = new Handler(handlerThread.getLooper());
+ drmListenerConditionVariable = new ConditionVariable();
DrmSessionEventListener eventListener =
new DrmSessionEventListener() {
@Override
public void onDrmKeysLoaded(int windowIndex, @Nullable MediaPeriodId mediaPeriodId) {
- conditionVariable.open();
+ drmListenerConditionVariable.open();
}
@Override
public void onDrmSessionManagerError(
int windowIndex, @Nullable MediaPeriodId mediaPeriodId, Exception e) {
- conditionVariable.open();
+ drmListenerConditionVariable.open();
}
@Override
public void onDrmKeysRestored(int windowIndex, @Nullable MediaPeriodId mediaPeriodId) {
- conditionVariable.open();
+ drmListenerConditionVariable.open();
}
@Override
public void onDrmKeysRemoved(int windowIndex, @Nullable MediaPeriodId mediaPeriodId) {
- conditionVariable.open();
+ drmListenerConditionVariable.open();
}
};
eventDispatcher.addEventListener(new Handler(handlerThread.getLooper()), eventListener);
@@ -190,7 +196,8 @@ public void onDrmKeysRemoved(int windowIndex, @Nullable MediaPeriodId mediaPerio
*/
public synchronized byte[] downloadLicense(Format format) throws DrmSessionException {
Assertions.checkArgument(format.drmInitData != null);
- return blockingKeyRequest(DefaultDrmSessionManager.MODE_DOWNLOAD, null, format);
+ return acquireSessionAndGetOfflineLicenseKeySetIdOnHandlerThread(
+ DefaultDrmSessionManager.MODE_DOWNLOAD, /* offlineLicenseKeySetId= */ null, format);
}
/**
@@ -203,7 +210,7 @@ public synchronized byte[] downloadLicense(Format format) throws DrmSessionExcep
public synchronized byte[] renewLicense(byte[] offlineLicenseKeySetId)
throws DrmSessionException {
Assertions.checkNotNull(offlineLicenseKeySetId);
- return blockingKeyRequest(
+ return acquireSessionAndGetOfflineLicenseKeySetIdOnHandlerThread(
DefaultDrmSessionManager.MODE_DOWNLOAD,
offlineLicenseKeySetId,
FORMAT_WITH_EMPTY_DRM_INIT_DATA);
@@ -218,7 +225,7 @@ public synchronized byte[] renewLicense(byte[] offlineLicenseKeySetId)
public synchronized void releaseLicense(byte[] offlineLicenseKeySetId)
throws DrmSessionException {
Assertions.checkNotNull(offlineLicenseKeySetId);
- blockingKeyRequest(
+ acquireSessionAndGetOfflineLicenseKeySetIdOnHandlerThread(
DefaultDrmSessionManager.MODE_RELEASE,
offlineLicenseKeySetId,
FORMAT_WITH_EMPTY_DRM_INIT_DATA);
@@ -234,25 +241,39 @@ public synchronized void releaseLicense(byte[] offlineLicenseKeySetId)
public synchronized Pair getLicenseDurationRemainingSec(byte[] offlineLicenseKeySetId)
throws DrmSessionException {
Assertions.checkNotNull(offlineLicenseKeySetId);
- drmSessionManager.setPlayer(handlerThread.getLooper(), PlayerId.UNSET);
- drmSessionManager.prepare();
- DrmSession drmSession =
- openBlockingKeyRequest(
- DefaultDrmSessionManager.MODE_QUERY,
- offlineLicenseKeySetId,
- FORMAT_WITH_EMPTY_DRM_INIT_DATA);
- DrmSessionException error = drmSession.getError();
- Pair licenseDurationRemainingSec =
- WidevineUtil.getLicenseDurationRemainingSec(drmSession);
- drmSession.release(eventDispatcher);
- drmSessionManager.release();
- if (error != null) {
- if (error.getCause() instanceof KeysExpiredException) {
+ DrmSession drmSession;
+ try {
+ drmSession =
+ acquireFirstSessionOnHandlerThread(
+ DefaultDrmSessionManager.MODE_QUERY,
+ offlineLicenseKeySetId,
+ FORMAT_WITH_EMPTY_DRM_INIT_DATA);
+ } catch (DrmSessionException e) {
+ if (e.getCause() instanceof KeysExpiredException) {
return Pair.create(0L, 0L);
}
- throw error;
+ throw e;
+ }
+
+ SettableFuture> licenseDurationRemainingSec = SettableFuture.create();
+ handler.post(
+ () -> {
+ try {
+ licenseDurationRemainingSec.set(
+ Assertions.checkNotNull(WidevineUtil.getLicenseDurationRemainingSec(drmSession)));
+ } catch (Throwable e) {
+ licenseDurationRemainingSec.setException(e);
+ } finally {
+ drmSession.release(eventDispatcher);
+ }
+ });
+ try {
+ return licenseDurationRemainingSec.get();
+ } catch (ExecutionException | InterruptedException e) {
+ throw new IllegalStateException(e);
+ } finally {
+ releaseManagerOnHandlerThread();
}
- return Assertions.checkNotNull(licenseDurationRemainingSec);
}
/** Releases the helper. Should be called when the helper is no longer required. */
@@ -260,30 +281,146 @@ public void release() {
handlerThread.quit();
}
- private byte[] blockingKeyRequest(
+ /**
+ * Returns the result of {@link DrmSession#getOfflineLicenseKeySetId()}, or throws {@link
+ * NullPointerException} if it's null.
+ *
+ * This method takes care of acquiring and releasing the {@link DrmSessionManager} and {@link
+ * DrmSession} instances needed.
+ */
+ private byte[] acquireSessionAndGetOfflineLicenseKeySetIdOnHandlerThread(
@Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, Format format)
throws DrmSessionException {
- drmSessionManager.setPlayer(handlerThread.getLooper(), PlayerId.UNSET);
- drmSessionManager.prepare();
- DrmSession drmSession = openBlockingKeyRequest(licenseMode, offlineLicenseKeySetId, format);
- DrmSessionException error = drmSession.getError();
- byte[] keySetId = drmSession.getOfflineLicenseKeySetId();
- drmSession.release(eventDispatcher);
- drmSessionManager.release();
- if (error != null) {
- throw error;
+ DrmSession drmSession =
+ acquireFirstSessionOnHandlerThread(licenseMode, offlineLicenseKeySetId, format);
+
+ SettableFuture keySetId = SettableFuture.create();
+ handler.post(
+ () -> {
+ try {
+ keySetId.set(drmSession.getOfflineLicenseKeySetId());
+ } catch (Throwable e) {
+ keySetId.setException(e);
+ } finally {
+ drmSession.release(eventDispatcher);
+ }
+ });
+
+ try {
+ return Assertions.checkNotNull(keySetId.get());
+ } catch (ExecutionException | InterruptedException e) {
+ throw new IllegalStateException(e);
+ } finally {
+ releaseManagerOnHandlerThread();
}
- return Assertions.checkNotNull(keySetId);
}
- private DrmSession openBlockingKeyRequest(
- @Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, Format format) {
+ /**
+ * Calls {@link DrmSessionManager#acquireSession(DrmSessionEventListener.EventDispatcher, Format)}
+ * on {@link #handlerThread} and blocks until a callback is received via {@link
+ * DrmSessionEventListener}.
+ *
+ * If key loading failed and {@link DrmSession#getState()} returns {@link
+ * DrmSession#STATE_ERROR} then this method releases the session and throws {@link
+ * DrmSession#getError()}.
+ *
+ *
Callers are responsible for the following:
+ *
+ *
+ * Ensuring the {@link
+ * DrmSessionManager#acquireSession(DrmSessionEventListener.EventDispatcher, Format)} call
+ * will trigger a callback to {@link DrmSessionEventListener} (e.g. it will load new keys).
+ * If not, this method will block forever.
+ * Releasing the returned {@link DrmSession} instance (on {@link #handlerThread}).
+ * Releasing {@link #drmSessionManager} if a {@link DrmSession} instance is returned (the
+ * manager will be released before an exception is thrown).
+ *
+ */
+ private DrmSession acquireFirstSessionOnHandlerThread(
+ @Mode int licenseMode, @Nullable byte[] offlineLicenseKeySetId, Format format)
+ throws DrmSessionException {
Assertions.checkNotNull(format.drmInitData);
- drmSessionManager.setMode(licenseMode, offlineLicenseKeySetId);
- conditionVariable.close();
- DrmSession drmSession = drmSessionManager.acquireSession(eventDispatcher, format);
- // Block current thread until key loading is finished
- conditionVariable.block();
- return Assertions.checkNotNull(drmSession);
+ SettableFuture drmSessionFuture = SettableFuture.create();
+ drmListenerConditionVariable.close();
+ handler.post(
+ () -> {
+ try {
+ drmSessionManager.setPlayer(Assertions.checkNotNull(Looper.myLooper()), PlayerId.UNSET);
+ drmSessionManager.prepare();
+ try {
+ drmSessionManager.setMode(licenseMode, offlineLicenseKeySetId);
+ drmSessionFuture.set(
+ Assertions.checkNotNull(
+ drmSessionManager.acquireSession(eventDispatcher, format)));
+ } catch (Throwable e) {
+ drmSessionManager.release();
+ throw e;
+ }
+ } catch (Throwable e) {
+ drmSessionFuture.setException(e);
+ }
+ });
+
+ DrmSession drmSession;
+ try {
+ drmSession = drmSessionFuture.get();
+ } catch (ExecutionException | InterruptedException e) {
+ throw new IllegalStateException(e);
+ }
+
+ // drmListenerConditionVariable will be opened by a callback to this.eventDispatcher when key
+ // loading is complete (drmSession.state == STATE_OPENED_WITH_KEYS) or has failed
+ // (drmSession.state == STATE_ERROR).
+ drmListenerConditionVariable.block();
+
+ SettableFuture<@NullableType DrmSessionException> drmSessionErrorFuture =
+ SettableFuture.create();
+ handler.post(
+ () -> {
+ try {
+ DrmSessionException drmSessionError = drmSession.getError();
+ if (drmSession.getState() == DrmSession.STATE_ERROR) {
+ drmSession.release(eventDispatcher);
+ drmSessionManager.release();
+ }
+ drmSessionErrorFuture.set(drmSessionError);
+ } catch (Throwable e) {
+ drmSessionErrorFuture.setException(e);
+ drmSession.release(eventDispatcher);
+ drmSessionManager.release();
+ }
+ });
+ try {
+ DrmSessionException drmSessionError = drmSessionErrorFuture.get();
+ if (drmSessionError != null) {
+ throw drmSessionError;
+ } else {
+ return drmSession;
+ }
+ } catch (InterruptedException | ExecutionException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ /**
+ * Calls {@link DrmSessionManager#release()} on {@link #handlerThread} and blocks until it's
+ * complete.
+ */
+ private void releaseManagerOnHandlerThread() {
+ SettableFuture result = SettableFuture.create();
+ handler.post(
+ () -> {
+ try {
+ drmSessionManager.release();
+ result.set(null);
+ } catch (Throwable e) {
+ result.setException(e);
+ }
+ });
+ try {
+ result.get();
+ } catch (InterruptedException | ExecutionException e) {
+ throw new IllegalStateException(e);
+ }
}
}
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java
index 0fc528bd69b..ef978015070 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java
@@ -640,14 +640,22 @@ protected void onEnabled(boolean joining, boolean mayRenderStartOfStream)
@Override
protected void onStreamChanged(Format[] formats, long startPositionUs, long offsetUs)
throws ExoPlaybackException {
- if (outputStreamInfo.streamOffsetUs == C.TIME_UNSET
- || (pendingOutputStreamChanges.isEmpty()
- && lastProcessedOutputBufferTimeUs != C.TIME_UNSET
- && lastProcessedOutputBufferTimeUs >= largestQueuedPresentationTimeUs)) {
- // This is the first stream, or the previous has been fully output already.
+ if (outputStreamInfo.streamOffsetUs == C.TIME_UNSET) {
+ // This is the first stream.
setOutputStreamInfo(
new OutputStreamInfo(
/* previousStreamLastBufferTimeUs= */ C.TIME_UNSET, startPositionUs, offsetUs));
+ } else if (pendingOutputStreamChanges.isEmpty()
+ && (largestQueuedPresentationTimeUs == C.TIME_UNSET
+ || (lastProcessedOutputBufferTimeUs != C.TIME_UNSET
+ && lastProcessedOutputBufferTimeUs >= largestQueuedPresentationTimeUs))) {
+ // All previous streams have never queued any samples or have been fully output already.
+ setOutputStreamInfo(
+ new OutputStreamInfo(
+ /* previousStreamLastBufferTimeUs= */ C.TIME_UNSET, startPositionUs, offsetUs));
+ if (outputStreamInfo.streamOffsetUs != C.TIME_UNSET) {
+ onProcessedStreamChange();
+ }
} else {
pendingOutputStreamChanges.add(
new OutputStreamInfo(largestQueuedPresentationTimeUs, startPositionUs, offsetUs));
@@ -1579,7 +1587,7 @@ protected void onQueueInputBuffer(DecoderInputBuffer buffer) throws ExoPlaybackE
@CallSuper
protected void onProcessedOutputBuffer(long presentationTimeUs) {
lastProcessedOutputBufferTimeUs = presentationTimeUs;
- if (!pendingOutputStreamChanges.isEmpty()
+ while (!pendingOutputStreamChanges.isEmpty()
&& presentationTimeUs >= pendingOutputStreamChanges.peek().previousStreamLastBufferTimeUs) {
setOutputStreamInfo(pendingOutputStreamChanges.poll());
onProcessedStreamChange();
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java
index 275f98db7ab..691bc71ba26 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java
@@ -70,17 +70,17 @@
* {@code DashMediaSource.Factory} if the item's {@link MediaItem.LocalConfiguration#uri uri}
* ends in '.mpd' or if its {@link MediaItem.LocalConfiguration#mimeType mimeType field} is
* explicitly set to {@link MimeTypes#APPLICATION_MPD} (Requires the exoplayer-dash module
- * to be added to the app).
+ * href="https://developer.android.com/guide/topics/media/exoplayer/hello-world#add-exoplayer-modules">exoplayer-dash
+ * module to be added
to the app).
*
{@code HlsMediaSource.Factory} if the item's {@link MediaItem.LocalConfiguration#uri uri}
* ends in '.m3u8' or if its {@link MediaItem.LocalConfiguration#mimeType mimeType field} is
* explicitly set to {@link MimeTypes#APPLICATION_M3U8} (Requires the exoplayer-hls module to
- * be added to the app).
+ * href="https://developer.android.com/guide/topics/media/exoplayer/hello-world#add-exoplayer-modules">exoplayer-hls
+ * module to be added to the app).
* {@code SsMediaSource.Factory} if the item's {@link MediaItem.LocalConfiguration#uri uri}
* ends in '.ism', '.ism/Manifest' or if its {@link MediaItem.LocalConfiguration#mimeType
* mimeType field} is explicitly set to {@link MimeTypes#APPLICATION_SS} (Requires the
+ * href="https://developer.android.com/guide/topics/media/exoplayer/hello-world#add-exoplayer-modules">
* exoplayer-smoothstreaming module to be added to the app).
* {@link ProgressiveMediaSource.Factory} serves as a fallback if the item's {@link
* MediaItem.LocalConfiguration#uri uri} doesn't match one of the above. It tries to infer the
diff --git a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/MediaCodecRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/MediaCodecRendererTest.java
index cb247789094..b07f09478f7 100644
--- a/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/MediaCodecRendererTest.java
+++ b/library/core/src/test/java/com/google/android/exoplayer2/mediacodec/MediaCodecRendererTest.java
@@ -214,6 +214,115 @@ public void render_withReplaceStream_triggersOutputCallbacksInCorrectOrder() thr
inOrder.verify(renderer).onProcessedOutputBuffer(600);
}
+ @Test
+ public void
+ render_withReplaceStreamAfterInitialEmptySampleStream_triggersOutputCallbacksInCorrectOrder()
+ throws Exception {
+ Format format1 =
+ new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).setAverageBitrate(1000).build();
+ Format format2 =
+ new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).setAverageBitrate(1500).build();
+ FakeSampleStream fakeSampleStream1 = createFakeSampleStream(format1 /* no samples */);
+ FakeSampleStream fakeSampleStream2 =
+ createFakeSampleStream(format2, /* sampleTimesUs...= */ 0, 100, 200);
+ MediaCodecRenderer renderer = spy(new TestRenderer());
+ renderer.init(/* index= */ 0, PlayerId.UNSET);
+
+ renderer.enable(
+ RendererConfiguration.DEFAULT,
+ new Format[] {format1},
+ fakeSampleStream1,
+ /* positionUs= */ 0,
+ /* joining= */ false,
+ /* mayRenderStartOfStream= */ true,
+ /* startPositionUs= */ 0,
+ /* offsetUs= */ 0);
+ renderer.start();
+ long positionUs = 0;
+ while (!renderer.hasReadStreamToEnd()) {
+ renderer.render(positionUs, SystemClock.elapsedRealtime());
+ positionUs += 100;
+ }
+ renderer.replaceStream(
+ new Format[] {format2}, fakeSampleStream2, /* startPositionUs= */ 0, /* offsetUs= */ 0);
+ renderer.setCurrentStreamFinal();
+ while (!renderer.isEnded()) {
+ renderer.render(positionUs, SystemClock.elapsedRealtime());
+ positionUs += 100;
+ }
+
+ InOrder inOrder = inOrder(renderer);
+ inOrder.verify(renderer).onOutputStreamOffsetUsChanged(0);
+ inOrder.verify(renderer).onOutputStreamOffsetUsChanged(0);
+ inOrder.verify(renderer).onProcessedStreamChange();
+ inOrder.verify(renderer).onOutputFormatChanged(eq(format2), any());
+ inOrder.verify(renderer).onProcessedOutputBuffer(0);
+ inOrder.verify(renderer).onProcessedOutputBuffer(100);
+ inOrder.verify(renderer).onProcessedOutputBuffer(200);
+ }
+
+ @Test
+ public void
+ render_withReplaceStreamAfterIntermittentEmptySampleStream_triggersOutputCallbacksInCorrectOrder()
+ throws Exception {
+ Format format1 =
+ new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).setAverageBitrate(1000).build();
+ Format format2 =
+ new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).setAverageBitrate(1500).build();
+ Format format3 =
+ new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).setAverageBitrate(2000).build();
+ FakeSampleStream fakeSampleStream1 =
+ createFakeSampleStream(format1, /* sampleTimesUs...= */ 0, 100);
+ FakeSampleStream fakeSampleStream2 = createFakeSampleStream(format2 /* no samples */);
+ FakeSampleStream fakeSampleStream3 =
+ createFakeSampleStream(format3, /* sampleTimesUs...= */ 0, 100, 200);
+ MediaCodecRenderer renderer = spy(new TestRenderer());
+ renderer.init(/* index= */ 0, PlayerId.UNSET);
+
+ renderer.enable(
+ RendererConfiguration.DEFAULT,
+ new Format[] {format1},
+ fakeSampleStream1,
+ /* positionUs= */ 0,
+ /* joining= */ false,
+ /* mayRenderStartOfStream= */ true,
+ /* startPositionUs= */ 0,
+ /* offsetUs= */ 0);
+ renderer.start();
+ long positionUs = 0;
+ while (!renderer.hasReadStreamToEnd()) {
+ renderer.render(positionUs, SystemClock.elapsedRealtime());
+ positionUs += 100;
+ }
+ renderer.replaceStream(
+ new Format[] {format2}, fakeSampleStream2, /* startPositionUs= */ 200, /* offsetUs= */ 200);
+ while (!renderer.hasReadStreamToEnd()) {
+ renderer.render(positionUs, SystemClock.elapsedRealtime());
+ positionUs += 100;
+ }
+ renderer.replaceStream(
+ new Format[] {format3}, fakeSampleStream3, /* startPositionUs= */ 200, /* offsetUs= */ 200);
+ renderer.setCurrentStreamFinal();
+ while (!renderer.isEnded()) {
+ renderer.render(positionUs, SystemClock.elapsedRealtime());
+ positionUs += 100;
+ }
+
+ InOrder inOrder = inOrder(renderer);
+ inOrder.verify(renderer).onOutputStreamOffsetUsChanged(0);
+ inOrder.verify(renderer).onOutputFormatChanged(eq(format1), any());
+ inOrder.verify(renderer).onProcessedOutputBuffer(0);
+ inOrder.verify(renderer).onProcessedOutputBuffer(100);
+ inOrder.verify(renderer).onOutputStreamOffsetUsChanged(200);
+ inOrder.verify(renderer).onProcessedStreamChange();
+ inOrder.verify(renderer).onOutputStreamOffsetUsChanged(200);
+ inOrder.verify(renderer).onProcessedStreamChange();
+ inOrder.verify(renderer).onOutputFormatChanged(eq(format3), any());
+ inOrder.verify(renderer).onProcessedOutputBuffer(200);
+ inOrder.verify(renderer).onProcessedOutputBuffer(300);
+ inOrder.verify(renderer).onProcessedOutputBuffer(400);
+ }
+
private FakeSampleStream createFakeSampleStream(Format format, long... sampleTimesUs) {
ImmutableList.Builder sampleListBuilder =
ImmutableList.builder();
diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java
index 0bdc49d76d1..84860cb5253 100644
--- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java
+++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java
@@ -234,9 +234,12 @@ public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParame
// Segments are aligned across representations, so any segment index will do.
for (RepresentationHolder representationHolder : representationHolders) {
if (representationHolder.segmentIndex != null) {
+ long segmentCount = representationHolder.getSegmentCount();
+ if (segmentCount == 0) {
+ continue;
+ }
long segmentNum = representationHolder.getSegmentNum(positionUs);
long firstSyncUs = representationHolder.getSegmentStartTimeUs(segmentNum);
- long segmentCount = representationHolder.getSegmentCount();
long secondSyncUs =
firstSyncUs < positionUs
&& (segmentCount == DashSegmentIndex.INDEX_UNBOUNDED
@@ -592,7 +595,7 @@ private ArrayList getRepresentations() {
}
private long getAvailableLiveDurationUs(long nowUnixTimeUs, long playbackPositionUs) {
- if (!manifest.dynamic) {
+ if (!manifest.dynamic || representationHolders[0].getSegmentCount() == 0) {
return C.TIME_UNSET;
}
long lastSegmentNum = representationHolders[0].getLastAvailableSegmentNum(nowUnixTimeUs);
diff --git a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java
index 7de2702664b..29613754304 100644
--- a/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java
+++ b/library/datasource/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java
@@ -360,15 +360,15 @@ public HttpDataSourceException(
/**
* Thrown when cleartext HTTP traffic is not permitted. For more information including how to
* enable cleartext traffic, see the corresponding troubleshooting
- * topic .
+ * href="https://developer.android.com/guide/topics/media/issues/cleartext-not-permitted">corresponding
+ * troubleshooting topic.
*/
final class CleartextNotPermittedException extends HttpDataSourceException {
public CleartextNotPermittedException(IOException cause, DataSpec dataSpec) {
super(
"Cleartext HTTP traffic not permitted. See"
- + " https://exoplayer.dev/issues/cleartext-not-permitted",
+ + " https://developer.android.com/guide/topics/media/issues/cleartext-not-permitted",
cause,
dataSpec,
PlaybackException.ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED,
diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java
index 9c5de24b702..06eb14fbbd1 100644
--- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java
+++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Atom.java
@@ -176,6 +176,9 @@
@SuppressWarnings("ConstantCaseForConstants")
public static final int TYPE_ddts = 0x64647473;
+ @SuppressWarnings("ConstantCaseForConstants")
+ public static final int TYPE_udts = 0x75647473;
+
@SuppressWarnings("ConstantCaseForConstants")
public static final int TYPE_tfdt = 0x74666474;
diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java
index 3a9cedf98a7..9cca0e9191c 100644
--- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java
+++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java
@@ -1164,6 +1164,9 @@ private static void parseVideoSampleEntry(
pixelWidthHeightRatio = hevcConfig.pixelWidthHeightRatio;
}
codecs = hevcConfig.codecs;
+ colorSpace = hevcConfig.colorSpace;
+ colorRange = hevcConfig.colorRange;
+ colorTransfer = hevcConfig.colorTransfer;
} else if (childAtomType == Atom.TYPE_dvcC || childAtomType == Atom.TYPE_dvvC) {
@Nullable DolbyVisionConfig dolbyVisionConfig = DolbyVisionConfig.parse(parent);
if (dolbyVisionConfig != null) {
@@ -1173,6 +1176,16 @@ private static void parseVideoSampleEntry(
} else if (childAtomType == Atom.TYPE_vpcC) {
ExtractorUtil.checkContainerInput(mimeType == null, /* message= */ null);
mimeType = (atomType == Atom.TYPE_vp08) ? MimeTypes.VIDEO_VP8 : MimeTypes.VIDEO_VP9;
+ parent.setPosition(childStartPosition + Atom.FULL_HEADER_SIZE);
+ // See vpcC atom syntax: https://www.webmproject.org/vp9/mp4/#syntax_1
+ parent.skipBytes(2); // profile(8), level(8)
+ boolean fullRangeFlag = (parent.readUnsignedByte() & 1) != 0;
+ int colorPrimaries = parent.readUnsignedByte();
+ int transferCharacteristics = parent.readUnsignedByte();
+ colorSpace = ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries);
+ colorRange = fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED;
+ colorTransfer =
+ ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics);
} else if (childAtomType == Atom.TYPE_av1C) {
ExtractorUtil.checkContainerInput(mimeType == null, /* message= */ null);
mimeType = MimeTypes.VIDEO_AV1;
@@ -1252,26 +1265,33 @@ private static void parseVideoSampleEntry(
}
}
} else if (childAtomType == Atom.TYPE_colr) {
- int colorType = parent.readInt();
- if (colorType == TYPE_nclx || colorType == TYPE_nclc) {
- // For more info on syntax, see Section 8.5.2.2 in ISO/IEC 14496-12:2012(E) and
- // https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html.
- int colorPrimaries = parent.readUnsignedShort();
- int transferCharacteristics = parent.readUnsignedShort();
- parent.skipBytes(2); // matrix_coefficients.
-
- // Only try and read full_range_flag if the box is long enough. It should be present in
- // all colr boxes with type=nclx (Section 8.5.2.2 in ISO/IEC 14496-12:2012(E)) but some
- // device cameras record videos with type=nclx without this final flag (and therefore
- // size=18): https://github.com/google/ExoPlayer/issues/9332
- boolean fullRangeFlag =
- childAtomSize == 19 && (parent.readUnsignedByte() & 0b10000000) != 0;
- colorSpace = ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries);
- colorRange = fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED;
- colorTransfer =
- ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics);
- } else {
- Log.w(TAG, "Unsupported color type: " + Atom.getAtomTypeString(colorType));
+ // Only modify these values if they have not been previously established by the bitstream.
+ // If 'Atom.TYPE_hvcC' atom or 'Atom.TYPE_vpcC' is available, they will take precedence and
+ // overwrite any existing values.
+ if (colorSpace == Format.NO_VALUE
+ && colorRange == Format.NO_VALUE
+ && colorTransfer == Format.NO_VALUE) {
+ int colorType = parent.readInt();
+ if (colorType == TYPE_nclx || colorType == TYPE_nclc) {
+ // For more info on syntax, see Section 8.5.2.2 in ISO/IEC 14496-12:2012(E) and
+ // https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html.
+ int colorPrimaries = parent.readUnsignedShort();
+ int transferCharacteristics = parent.readUnsignedShort();
+ parent.skipBytes(2); // matrix_coefficients.
+
+ // Only try and read full_range_flag if the box is long enough. It should be present in
+ // all colr boxes with type=nclx (Section 8.5.2.2 in ISO/IEC 14496-12:2012(E)) but some
+ // device cameras record videos with type=nclx without this final flag (and therefore
+ // size=18): https://github.com/google/ExoPlayer/issues/9332
+ boolean fullRangeFlag =
+ childAtomSize == 19 && (parent.readUnsignedByte() & 0b10000000) != 0;
+ colorSpace = ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries);
+ colorRange = fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED;
+ colorTransfer =
+ ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics);
+ } else {
+ Log.w(TAG, "Unsupported color type: " + Atom.getAtomTypeString(colorType));
+ }
}
}
childPosition += childAtomSize;
@@ -1560,7 +1580,7 @@ private static void parseAudioSampleEntry(
// because these streams can carry simultaneously multiple representations of the same
// audio. Use stereo by default.
channelCount = 2;
- } else if (childAtomType == Atom.TYPE_ddts) {
+ } else if (childAtomType == Atom.TYPE_ddts || childAtomType == Atom.TYPE_udts) {
out.format =
new Format.Builder()
.setId(trackId)
diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java b/library/extractor/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java
index b2232b0a5e7..7f854579e76 100644
--- a/library/extractor/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java
+++ b/library/extractor/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java
@@ -19,6 +19,8 @@
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
+import com.google.android.exoplayer2.Format;
+import com.google.android.exoplayer2.video.ColorInfo;
import java.nio.ByteBuffer;
import java.util.Arrays;
@@ -105,6 +107,9 @@ public static final class H265SpsData {
public final int width;
public final int height;
public final float pixelWidthHeightRatio;
+ public final @C.ColorSpace int colorSpace;
+ public final @C.ColorRange int colorRange;
+ public final @C.ColorTransfer int colorTransfer;
public H265SpsData(
int generalProfileSpace,
@@ -116,7 +121,10 @@ public H265SpsData(
int seqParameterSetId,
int width,
int height,
- float pixelWidthHeightRatio) {
+ float pixelWidthHeightRatio,
+ @C.ColorSpace int colorSpace,
+ @C.ColorRange int colorRange,
+ @C.ColorTransfer int colorTransfer) {
this.generalProfileSpace = generalProfileSpace;
this.generalTierFlag = generalTierFlag;
this.generalProfileIdc = generalProfileIdc;
@@ -127,6 +135,9 @@ public H265SpsData(
this.width = width;
this.height = height;
this.pixelWidthHeightRatio = pixelWidthHeightRatio;
+ this.colorSpace = colorSpace;
+ this.colorRange = colorRange;
+ this.colorTransfer = colorTransfer;
}
}
@@ -483,6 +494,10 @@ public static H265SpsData parseH265SpsNalUnit(byte[] nalData, int nalOffset, int
public static H265SpsData parseH265SpsNalUnitPayload(
byte[] nalData, int nalOffset, int nalLimit) {
ParsableNalUnitBitArray data = new ParsableNalUnitBitArray(nalData, nalOffset, nalLimit);
+ // HDR related metadata.
+ @C.ColorSpace int colorSpace = Format.NO_VALUE;
+ @C.ColorRange int colorRange = Format.NO_VALUE;
+ @C.ColorTransfer int colorTransfer = Format.NO_VALUE;
data.skipBits(4); // sps_video_parameter_set_id
int maxSubLayersMinus1 = data.readBits(3);
data.skipBit(); // sps_temporal_id_nesting_flag
@@ -589,10 +604,17 @@ public static H265SpsData parseH265SpsNalUnitPayload(
data.skipBit(); // overscan_appropriate_flag
}
if (data.readBit()) { // video_signal_type_present_flag
- data.skipBits(4); // video_format, video_full_range_flag
+ data.skipBits(3); // video_format
+ boolean fullRangeFlag = data.readBit(); // video_full_range_flag
if (data.readBit()) { // colour_description_present_flag
- // colour_primaries, transfer_characteristics, matrix_coeffs
- data.skipBits(24);
+ int colorPrimaries = data.readBits(8); // colour_primaries
+ int transferCharacteristics = data.readBits(8); // transfer_characteristics
+ data.skipBits(8); // matrix_coeffs
+
+ colorSpace = ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries);
+ colorRange = fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED;
+ colorTransfer =
+ ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics);
}
}
if (data.readBit()) { // chroma_loc_info_present_flag
@@ -617,7 +639,10 @@ public static H265SpsData parseH265SpsNalUnitPayload(
seqParameterSetId,
frameWidth,
frameHeight,
- pixelWidthHeightRatio);
+ pixelWidthHeightRatio,
+ colorSpace,
+ colorRange,
+ colorTransfer);
}
/**
diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java
index 6b8e633555a..79d16c83478 100644
--- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java
+++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java
@@ -16,6 +16,7 @@
package com.google.android.exoplayer2.video;
import androidx.annotation.Nullable;
+import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.util.CodecSpecificDataUtil;
@@ -60,6 +61,9 @@ public static HevcConfig parse(ParsableByteArray data) throws ParserException {
int bufferPosition = 0;
int width = Format.NO_VALUE;
int height = Format.NO_VALUE;
+ @C.ColorSpace int colorSpace = Format.NO_VALUE;
+ @C.ColorRange int colorRange = Format.NO_VALUE;
+ @C.ColorTransfer int colorTransfer = Format.NO_VALUE;
float pixelWidthHeightRatio = 1;
@Nullable String codecs = null;
for (int i = 0; i < numberOfArrays; i++) {
@@ -83,6 +87,9 @@ public static HevcConfig parse(ParsableByteArray data) throws ParserException {
buffer, bufferPosition, bufferPosition + nalUnitLength);
width = spsData.width;
height = spsData.height;
+ colorSpace = spsData.colorSpace;
+ colorRange = spsData.colorRange;
+ colorTransfer = spsData.colorTransfer;
pixelWidthHeightRatio = spsData.pixelWidthHeightRatio;
codecs =
CodecSpecificDataUtil.buildHevcCodecString(
@@ -101,7 +108,15 @@ public static HevcConfig parse(ParsableByteArray data) throws ParserException {
List initializationData =
csdLength == 0 ? Collections.emptyList() : Collections.singletonList(buffer);
return new HevcConfig(
- initializationData, lengthSizeMinusOne + 1, width, height, pixelWidthHeightRatio, codecs);
+ initializationData,
+ lengthSizeMinusOne + 1,
+ width,
+ height,
+ pixelWidthHeightRatio,
+ codecs,
+ colorSpace,
+ colorRange,
+ colorTransfer);
} catch (ArrayIndexOutOfBoundsException e) {
throw ParserException.createForMalformedContainer("Error parsing HEVC config", e);
}
@@ -128,6 +143,22 @@ public static HevcConfig parse(ParsableByteArray data) throws ParserException {
/** The pixel width to height ratio. */
public final float pixelWidthHeightRatio;
+ /**
+ * The {@link C.ColorSpace} of the video or {@link Format#NO_VALUE} if unknown or not applicable.
+ */
+ public final @C.ColorSpace int colorSpace;
+
+ /**
+ * The {@link C.ColorRange} of the video or {@link Format#NO_VALUE} if unknown or not applicable.
+ */
+ public final @C.ColorRange int colorRange;
+
+ /**
+ * The {@link C.ColorTransfer} of the video or {@link Format#NO_VALUE} if unknown or not
+ * applicable.
+ */
+ public final @C.ColorTransfer int colorTransfer;
+
/**
* An RFC 6381 codecs string representing the video format, or {@code null} if not known.
*
@@ -141,12 +172,18 @@ private HevcConfig(
int width,
int height,
float pixelWidthHeightRatio,
- @Nullable String codecs) {
+ @Nullable String codecs,
+ @C.ColorSpace int colorSpace,
+ @C.ColorRange int colorRange,
+ @C.ColorTransfer int colorTransfer) {
this.initializationData = initializationData;
this.nalUnitLengthFieldLength = nalUnitLengthFieldLength;
this.width = width;
this.height = height;
this.pixelWidthHeightRatio = pixelWidthHeightRatio;
this.codecs = codecs;
+ this.colorSpace = colorSpace;
+ this.colorRange = colorRange;
+ this.colorTransfer = colorTransfer;
}
}
diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java
index 5b7958638c7..f4b774bcd3a 100644
--- a/library/extractor/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java
+++ b/library/extractor/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java
@@ -192,6 +192,9 @@ public void parseH265SpsNalUnitPayload_exoghi_10316() {
assertThat(spsData.pixelWidthHeightRatio).isEqualTo(1);
assertThat(spsData.seqParameterSetId).isEqualTo(0);
assertThat(spsData.width).isEqualTo(3840);
+ assertThat(spsData.colorSpace).isEqualTo(6);
+ assertThat(spsData.colorRange).isEqualTo(2);
+ assertThat(spsData.colorTransfer).isEqualTo(6);
}
private static byte[] buildTestData() {
diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java
index 3d079fd774d..f8189b1ebf0 100644
--- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java
+++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java
@@ -47,6 +47,7 @@
import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.source.rtsp.RtspMediaPeriod.RtpLoadInfo;
import com.google.android.exoplayer2.source.rtsp.RtspMediaSource.RtspPlaybackException;
+import com.google.android.exoplayer2.source.rtsp.RtspMediaSource.RtspUdpUnsupportedTransportException;
import com.google.android.exoplayer2.source.rtsp.RtspMessageChannel.InterleavedBinaryDataListener;
import com.google.android.exoplayer2.source.rtsp.RtspMessageUtil.RtspAuthUserInfo;
import com.google.android.exoplayer2.source.rtsp.RtspMessageUtil.RtspSessionHeader;
@@ -577,8 +578,24 @@ private void handleRtspResponse(List message) {
receivedAuthorizationRequest = true;
return;
}
- // fall through: if unauthorized and no userInfo present, or previous authentication
- // unsuccessful.
+ // if unauthorized and no userInfo present, or previous authentication
+ // unsuccessful, then dispatch RtspPlaybackException
+ dispatchRtspError(
+ new RtspPlaybackException(
+ RtspMessageUtil.toMethodString(requestMethod) + " " + response.status));
+ return;
+ case 461:
+ String exceptionMessage =
+ RtspMessageUtil.toMethodString(requestMethod) + " " + response.status;
+ // If request was SETUP with UDP transport protocol, then throw
+ // RtspUdpUnsupportedTransportException.
+ String transportHeaderValue =
+ checkNotNull(matchingRequest.headers.get(RtspHeaders.TRANSPORT));
+ dispatchRtspError(
+ requestMethod == METHOD_SETUP && !transportHeaderValue.contains("TCP")
+ ? new RtspUdpUnsupportedTransportException(exceptionMessage)
+ : new RtspPlaybackException(exceptionMessage));
+ return;
default:
dispatchRtspError(
new RtspPlaybackException(
diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java
index 7e8eab668ec..77902a71206 100644
--- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java
+++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java
@@ -516,7 +516,6 @@ public void onLoadCompleted(
// using TCP. Retrying will setup new loadables, so will not retry with the current
// loadables.
retryWithRtpTcp();
- isUsingRtpTcp = true;
}
return;
}
@@ -642,7 +641,13 @@ public void onPlaybackStarted(
@Override
public void onPlaybackError(RtspPlaybackException error) {
- playbackException = error;
+ if (error instanceof RtspMediaSource.RtspUdpUnsupportedTransportException && !isUsingRtpTcp) {
+ // Retry playback with TCP if we receive RtspUdpUnsupportedTransportException, and we are
+ // not already using TCP. Retrying will setup new loadables.
+ retryWithRtpTcp();
+ } else {
+ playbackException = error;
+ }
}
@Override
@@ -666,6 +671,9 @@ public void onSessionTimelineRequestFailed(String message, @Nullable Throwable c
}
private void retryWithRtpTcp() {
+ // Retry should only run once.
+ isUsingRtpTcp = true;
+
rtspClient.retryWithRtpTcp();
@Nullable
diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java
index 747bb36daa1..9c7575d74b4 100644
--- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java
+++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java
@@ -190,7 +190,7 @@ public RtspMediaSource createMediaSource(MediaItem mediaItem) {
}
/** Thrown when an exception or error is encountered during loading an RTSP stream. */
- public static final class RtspPlaybackException extends IOException {
+ public static class RtspPlaybackException extends IOException {
public RtspPlaybackException(String message) {
super(message);
}
@@ -204,6 +204,13 @@ public RtspPlaybackException(String message, Throwable e) {
}
}
+ /** Thrown when an RTSP Unsupported Transport error (461) is encountered during RTSP Setup. */
+ public static final class RtspUdpUnsupportedTransportException extends RtspPlaybackException {
+ public RtspUdpUnsupportedTransportException(String message) {
+ super(message);
+ }
+ }
+
private final MediaItem mediaItem;
private final RtpDataChannel.Factory rtpDataChannelFactory;
private final String userAgent;
diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java
index f53d1ee30d8..028e016eb40 100644
--- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java
+++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspClientTest.java
@@ -453,4 +453,77 @@ public void onSessionTimelineRequestFailed(
RobolectricUtil.runMainLooperUntil(timelineRequestFailed::get);
assertThat(rtspClient.getState()).isEqualTo(RtspClient.RTSP_STATE_UNINITIALIZED);
}
+
+ @Test
+ public void connectServerAndClient_describeResponseRequiresAuthentication_doesNotUpdateTimeline()
+ throws Exception {
+ class ResponseProvider implements RtspServer.ResponseProvider {
+ @Override
+ public RtspResponse getOptionsResponse() {
+ return new RtspResponse(
+ /* status= */ 200,
+ new RtspHeaders.Builder().add(RtspHeaders.PUBLIC, "OPTIONS, DESCRIBE").build());
+ }
+
+ @Override
+ public RtspResponse getDescribeResponse(Uri requestedUri, RtspHeaders headers) {
+ String authorizationHeader = headers.get(RtspHeaders.AUTHORIZATION);
+ if (authorizationHeader == null) {
+ return new RtspResponse(
+ /* status= */ 401,
+ new RtspHeaders.Builder()
+ .add(RtspHeaders.CSEQ, headers.get(RtspHeaders.CSEQ))
+ .add(
+ RtspHeaders.WWW_AUTHENTICATE,
+ "Digest realm=\"RTSP server\","
+ + " nonce=\"0cdfe9719e7373b7d5bb2913e2115f3f\","
+ + " opaque=\"5ccc069c403ebaf9f0171e9517f40e41\"")
+ .add(RtspHeaders.WWW_AUTHENTICATE, "BASIC realm=\"WallyWorld\"")
+ .build());
+ }
+ if (!authorizationHeader.contains("Digest")) {
+ return new RtspResponse(
+ 401,
+ new RtspHeaders.Builder()
+ .add(RtspHeaders.CSEQ, headers.get(RtspHeaders.CSEQ))
+ .build());
+ }
+
+ return RtspTestUtils.newDescribeResponseWithSdpMessage(
+ "v=0\r\n"
+ + "o=- 1606776316530225 1 IN IP4 127.0.0.1\r\n"
+ + "s=Exoplayer test\r\n"
+ + "t=0 0\r\n"
+ // The session is 50.46s long.
+ + "a=range:npt=0-50.46\r\n",
+ rtpPacketStreamDumps,
+ requestedUri);
+ }
+ }
+ rtspServer = new RtspServer(new ResponseProvider());
+
+ AtomicBoolean timelineRequestFailed = new AtomicBoolean();
+ rtspClient =
+ new RtspClient(
+ new SessionInfoListener() {
+ @Override
+ public void onSessionTimelineUpdated(
+ RtspSessionTiming timing, ImmutableList tracks) {}
+
+ @Override
+ public void onSessionTimelineRequestFailed(
+ String message, @Nullable Throwable cause) {
+ timelineRequestFailed.set(true);
+ }
+ },
+ EMPTY_PLAYBACK_LISTENER,
+ /* userAgent= */ "ExoPlayer:RtspClientTest",
+ RtspTestUtils.getTestUri(rtspServer.startAndGetPortNumber()),
+ SocketFactory.getDefault(),
+ /* debugLoggingEnabled= */ false);
+ rtspClient.start();
+
+ RobolectricUtil.runMainLooperUntil(timelineRequestFailed::get);
+ assertThat(rtspClient.getState()).isEqualTo(RtspClient.RTSP_STATE_UNINITIALIZED);
+ }
}
diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java
index 1ddba06c11b..d352e92dbf8 100644
--- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java
+++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspPlaybackTest.java
@@ -15,6 +15,7 @@
*/
package com.google.android.exoplayer2.source.rtsp;
+import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull;
import static com.google.common.truth.Truth.assertThat;
import static java.lang.Math.min;
@@ -42,11 +43,13 @@
import com.google.android.exoplayer2.util.Clock;
import com.google.android.exoplayer2.util.Util;
import com.google.common.collect.ImmutableList;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicReference;
import javax.net.SocketFactory;
+import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -58,30 +61,20 @@
@RunWith(AndroidJUnit4.class)
public final class RtspPlaybackTest {
+ private static final long DEFAULT_TIMEOUT_MS = 8000;
private static final String SESSION_DESCRIPTION =
"v=0\r\n"
+ "o=- 1606776316530225 1 IN IP4 127.0.0.1\r\n"
+ "s=Exoplayer test\r\n"
+ "t=0 0\r\n";
- private final Context applicationContext;
- private final CapturingRenderersFactory capturingRenderersFactory;
- private final Clock clock;
- private final FakeUdpDataSourceRtpDataChannel fakeRtpDataChannel;
- private final RtpDataChannel.Factory rtpDataChannelFactory;
-
+ private Context applicationContext;
+ private CapturingRenderersFactory capturingRenderersFactory;
+ private Clock clock;
private RtpPacketStreamDump aacRtpPacketStreamDump;
// ExoPlayer does not support extracting MP4A-LATM RTP payload at the moment.
private RtpPacketStreamDump mpeg2tsRtpPacketStreamDump;
-
- /** Creates a new instance. */
- public RtspPlaybackTest() {
- applicationContext = ApplicationProvider.getApplicationContext();
- capturingRenderersFactory = new CapturingRenderersFactory(applicationContext);
- clock = new FakeClock(/* isAutoAdvancing= */ true);
- fakeRtpDataChannel = new FakeUdpDataSourceRtpDataChannel();
- rtpDataChannelFactory = (trackId) -> fakeRtpDataChannel;
- }
+ private RtspServer rtspServer;
@Rule
public ShadowMediaCodecConfig mediaCodecConfig =
@@ -89,61 +82,162 @@ public RtspPlaybackTest() {
@Before
public void setUp() throws Exception {
+ applicationContext = ApplicationProvider.getApplicationContext();
+ capturingRenderersFactory = new CapturingRenderersFactory(applicationContext);
+ clock = new FakeClock(/* isAutoAdvancing= */ true);
aacRtpPacketStreamDump = RtspTestUtils.readRtpPacketStreamDump("media/rtsp/aac-dump.json");
mpeg2tsRtpPacketStreamDump =
RtspTestUtils.readRtpPacketStreamDump("media/rtsp/mpeg2ts-dump.json");
}
+ @After
+ public void tearDown() {
+ Util.closeQuietly(rtspServer);
+ }
+
@Test
public void prepare_withSupportedTrack_playsTrackUntilEnded() throws Exception {
+ FakeUdpDataSourceRtpDataChannel fakeRtpDataChannel = new FakeUdpDataSourceRtpDataChannel();
+ RtpDataChannel.Factory rtpDataChannelFactory = (trackId) -> fakeRtpDataChannel;
ResponseProvider responseProvider =
new ResponseProvider(
clock,
ImmutableList.of(aacRtpPacketStreamDump, mpeg2tsRtpPacketStreamDump),
fakeRtpDataChannel);
-
- try (RtspServer rtspServer = new RtspServer(responseProvider)) {
- ExoPlayer player = createExoPlayer(rtspServer.startAndGetPortNumber(), rtpDataChannelFactory);
-
- PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory);
- player.prepare();
- player.play();
- TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED);
- player.release();
-
- // Only setup the supported track (aac).
- assertThat(responseProvider.getDumpsForSetUpTracks()).containsExactly(aacRtpPacketStreamDump);
- DumpFileAsserts.assertOutput(
- applicationContext, playbackOutput, "playbackdumps/rtsp/aac.dump");
- }
+ rtspServer = new RtspServer(responseProvider);
+ ExoPlayer player = createExoPlayer(rtspServer.startAndGetPortNumber(), rtpDataChannelFactory);
+
+ PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory);
+ player.prepare();
+ player.play();
+ TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED);
+ player.release();
+
+ // Only setup the supported track (aac).
+ assertThat(responseProvider.getDumpsForSetUpTracks()).containsExactly(aacRtpPacketStreamDump);
+ DumpFileAsserts.assertOutput(applicationContext, playbackOutput, "playbackdumps/rtsp/aac.dump");
}
@Test
public void prepare_noSupportedTrack_throwsPreparationError() throws Exception {
-
- try (RtspServer rtspServer =
+ FakeUdpDataSourceRtpDataChannel fakeRtpDataChannel = new FakeUdpDataSourceRtpDataChannel();
+ RtpDataChannel.Factory rtpDataChannelFactory = (trackId) -> fakeRtpDataChannel;
+ rtspServer =
new RtspServer(
new ResponseProvider(
- clock, ImmutableList.of(mpeg2tsRtpPacketStreamDump), fakeRtpDataChannel))) {
- ExoPlayer player = createExoPlayer(rtspServer.startAndGetPortNumber(), rtpDataChannelFactory);
-
- AtomicReference playbackError = new AtomicReference<>();
- player.prepare();
- player.addListener(
- new Listener() {
- @Override
- public void onPlayerError(PlaybackException error) {
- playbackError.set(error);
- }
- });
- RobolectricUtil.runMainLooperUntil(() -> playbackError.get() != null);
- player.release();
-
- assertThat(playbackError.get())
- .hasCauseThat()
- .hasMessageThat()
- .contains("No playable track.");
- }
+ clock, ImmutableList.of(mpeg2tsRtpPacketStreamDump), fakeRtpDataChannel));
+ ExoPlayer player = createExoPlayer(rtspServer.startAndGetPortNumber(), rtpDataChannelFactory);
+
+ AtomicReference playbackError = new AtomicReference<>();
+ player.prepare();
+ player.addListener(
+ new Listener() {
+ @Override
+ public void onPlayerError(PlaybackException error) {
+ playbackError.set(error);
+ }
+ });
+ RobolectricUtil.runMainLooperUntil(() -> playbackError.get() != null);
+ player.release();
+
+ assertThat(playbackError.get()).hasCauseThat().hasMessageThat().contains("No playable track.");
+ }
+
+ @Test
+ public void prepare_withUdpUnsupportedWithFallback_fallsbackToTcpAndPlaysUntilEnd()
+ throws Exception {
+ FakeTcpDataSourceRtpDataChannel fakeTcpRtpDataChannel = new FakeTcpDataSourceRtpDataChannel();
+ RtpDataChannel.Factory rtpTcpDataChannelFactory = (trackId) -> fakeTcpRtpDataChannel;
+ ResponseProviderSupportingOnlyTcp responseProviderSupportingOnlyTcp =
+ new ResponseProviderSupportingOnlyTcp(
+ clock,
+ ImmutableList.of(aacRtpPacketStreamDump, mpeg2tsRtpPacketStreamDump),
+ fakeTcpRtpDataChannel);
+ ForwardingRtpDataChannelFactory forwardingRtpDataChannelFactory =
+ new ForwardingRtpDataChannelFactory(
+ new UdpDataSourceRtpDataChannelFactory(DEFAULT_TIMEOUT_MS), rtpTcpDataChannelFactory);
+ rtspServer = new RtspServer(responseProviderSupportingOnlyTcp);
+ ExoPlayer player =
+ createExoPlayer(rtspServer.startAndGetPortNumber(), forwardingRtpDataChannelFactory);
+
+ PlaybackOutput playbackOutput = PlaybackOutput.register(player, capturingRenderersFactory);
+ player.prepare();
+ player.play();
+ TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_ENDED);
+ player.release();
+
+ // Only setup the supported track (aac).
+ assertThat(responseProviderSupportingOnlyTcp.getDumpsForSetUpTracks())
+ .containsExactly(aacRtpPacketStreamDump);
+ DumpFileAsserts.assertOutput(applicationContext, playbackOutput, "playbackdumps/rtsp/aac.dump");
+ }
+
+ @Test
+ public void prepare_withUdpUnsupportedWithoutFallback_throwsRtspPlaybackException()
+ throws Exception {
+ FakeUdpDataSourceRtpDataChannel fakeUdpRtpDataChannel = new FakeUdpDataSourceRtpDataChannel();
+ RtpDataChannel.Factory rtpDataChannelFactory = (trackId) -> fakeUdpRtpDataChannel;
+ ResponseProviderSupportingOnlyTcp responseProvider =
+ new ResponseProviderSupportingOnlyTcp(
+ clock,
+ ImmutableList.of(aacRtpPacketStreamDump, mpeg2tsRtpPacketStreamDump),
+ fakeUdpRtpDataChannel);
+ rtspServer = new RtspServer(responseProvider);
+ ExoPlayer player = createExoPlayer(rtspServer.startAndGetPortNumber(), rtpDataChannelFactory);
+
+ AtomicReference playbackError = new AtomicReference<>();
+ player.prepare();
+ player.addListener(
+ new Listener() {
+ @Override
+ public void onPlayerError(PlaybackException error) {
+ playbackError.set(error);
+ }
+ });
+ RobolectricUtil.runMainLooperUntil(() -> playbackError.get() != null);
+ player.release();
+
+ assertThat(playbackError.get())
+ .hasCauseThat()
+ .isInstanceOf(RtspMediaSource.RtspPlaybackException.class);
+ assertThat(playbackError.get())
+ .hasCauseThat()
+ .hasMessageThat()
+ .contains("No fallback data channel factory for TCP retry");
+ }
+
+ @Test
+ public void prepare_withUdpUnsupportedWithUdpFallback_throwsRtspUdpUnsupportedTransportException()
+ throws Exception {
+ FakeUdpDataSourceRtpDataChannel fakeUdpRtpDataChannel = new FakeUdpDataSourceRtpDataChannel();
+ RtpDataChannel.Factory rtpDataChannelFactory = (trackId) -> fakeUdpRtpDataChannel;
+ ResponseProviderSupportingOnlyTcp responseProviderSupportingOnlyTcp =
+ new ResponseProviderSupportingOnlyTcp(
+ clock,
+ ImmutableList.of(aacRtpPacketStreamDump, mpeg2tsRtpPacketStreamDump),
+ fakeUdpRtpDataChannel);
+ ForwardingRtpDataChannelFactory forwardingRtpDataChannelFactory =
+ new ForwardingRtpDataChannelFactory(rtpDataChannelFactory, rtpDataChannelFactory);
+ rtspServer = new RtspServer(responseProviderSupportingOnlyTcp);
+ ExoPlayer player =
+ createExoPlayer(rtspServer.startAndGetPortNumber(), forwardingRtpDataChannelFactory);
+
+ AtomicReference playbackError = new AtomicReference<>();
+ player.prepare();
+ player.addListener(
+ new Listener() {
+ @Override
+ public void onPlayerError(PlaybackException error) {
+ playbackError.set(error);
+ }
+ });
+ RobolectricUtil.runMainLooperUntil(() -> playbackError.get() != null);
+ player.release();
+
+ assertThat(playbackError.get())
+ .hasCauseThat()
+ .isInstanceOf(RtspMediaSource.RtspUdpUnsupportedTransportException.class);
+ assertThat(playbackError.get()).hasCauseThat().hasMessageThat().isEqualTo("SETUP 461");
}
private ExoPlayer createExoPlayer(
@@ -163,16 +257,16 @@ private ExoPlayer createExoPlayer(
return player;
}
- private static final class ResponseProvider implements RtspServer.ResponseProvider {
+ private static class ResponseProvider implements RtspServer.ResponseProvider {
- private static final String SESSION_ID = "00000000";
+ protected static final String SESSION_ID = "00000000";
- private final Clock clock;
- private final ArrayList dumpsForSetUpTracks;
- private final ImmutableList rtpPacketStreamDumps;
+ protected final Clock clock;
+ protected final ArrayList dumpsForSetUpTracks;
+ protected final ImmutableList rtpPacketStreamDumps;
private final RtspMessageChannel.InterleavedBinaryDataListener binaryDataListener;
- private RtpPacketTransmitter packetTransmitter;
+ protected RtpPacketTransmitter packetTransmitter;
/**
* Creates a new instance.
@@ -240,22 +334,54 @@ public RtspResponse getPlayResponse() {
}
}
- private static final class FakeUdpDataSourceRtpDataChannel extends BaseDataSource
- implements RtpDataChannel, RtspMessageChannel.InterleavedBinaryDataListener {
+ private static final class ResponseProviderSupportingOnlyTcp extends ResponseProvider {
- private static final int LOCAL_PORT = 40000;
+ /**
+ * Creates a new instance.
+ *
+ * @param clock The {@link Clock} used in the test.
+ * @param rtpPacketStreamDumps A list of {@link RtpPacketStreamDump}.
+ * @param binaryDataListener A {@link RtspMessageChannel.InterleavedBinaryDataListener} to send
+ * RTP data.
+ */
+ public ResponseProviderSupportingOnlyTcp(
+ Clock clock,
+ List rtpPacketStreamDumps,
+ RtspMessageChannel.InterleavedBinaryDataListener binaryDataListener) {
+ super(clock, rtpPacketStreamDumps, binaryDataListener);
+ }
+
+ @Override
+ public RtspResponse getSetupResponse(Uri requestedUri, RtspHeaders headers) {
+ String transportHeaderValue = checkNotNull(headers.get(RtspHeaders.TRANSPORT));
+ if (!transportHeaderValue.contains("TCP")) {
+ return new RtspResponse(
+ /* status= */ 461, headers.buildUpon().add(RtspHeaders.SESSION, SESSION_ID).build());
+ }
+ for (RtpPacketStreamDump rtpPacketStreamDump : rtpPacketStreamDumps) {
+ if (requestedUri.toString().contains(rtpPacketStreamDump.trackName)) {
+ dumpsForSetUpTracks.add(rtpPacketStreamDump);
+ packetTransmitter = new RtpPacketTransmitter(rtpPacketStreamDump, clock);
+ }
+ }
+ return new RtspResponse(
+ /* status= */ 200, headers.buildUpon().add(RtspHeaders.SESSION, SESSION_ID).build());
+ }
+ }
+
+ private abstract static class FakeBaseDataSourceRtpDataChannel extends BaseDataSource
+ implements RtpDataChannel, RtspMessageChannel.InterleavedBinaryDataListener {
+ protected static final int LOCAL_PORT = 40000;
private final ConcurrentLinkedQueue packetQueue;
- public FakeUdpDataSourceRtpDataChannel() {
+ public FakeBaseDataSourceRtpDataChannel() {
super(/* isNetwork= */ false);
packetQueue = new ConcurrentLinkedQueue<>();
}
@Override
- public String getTransport() {
- return Util.formatInvariant("RTP/AVP;unicast;client_port=%d-%d", LOCAL_PORT, LOCAL_PORT + 1);
- }
+ public abstract String getTransport();
@Override
public int getLocalPort() {
@@ -307,4 +433,49 @@ public int read(byte[] buffer, int offset, int length) {
return byteToRead;
}
}
+
+ private static final class FakeUdpDataSourceRtpDataChannel
+ extends FakeBaseDataSourceRtpDataChannel {
+ @Override
+ public String getTransport() {
+ return Util.formatInvariant("RTP/AVP;unicast;client_port=%d-%d", LOCAL_PORT, LOCAL_PORT + 1);
+ }
+
+ @Override
+ public RtspMessageChannel.InterleavedBinaryDataListener getInterleavedBinaryDataListener() {
+ return null;
+ }
+ }
+
+ private static final class FakeTcpDataSourceRtpDataChannel
+ extends FakeBaseDataSourceRtpDataChannel {
+ @Override
+ public String getTransport() {
+ return Util.formatInvariant(
+ "RTP/AVP/TCP;unicast;interleaved=%d-%d", LOCAL_PORT + 2, LOCAL_PORT + 3);
+ }
+ }
+
+ private static class ForwardingRtpDataChannelFactory implements RtpDataChannel.Factory {
+
+ private final RtpDataChannel.Factory rtpChannelFactory;
+ private final RtpDataChannel.Factory rtpFallbackChannelFactory;
+
+ public ForwardingRtpDataChannelFactory(
+ RtpDataChannel.Factory rtpChannelFactory,
+ RtpDataChannel.Factory rtpFallbackChannelFactory) {
+ this.rtpChannelFactory = rtpChannelFactory;
+ this.rtpFallbackChannelFactory = rtpFallbackChannelFactory;
+ }
+
+ @Override
+ public RtpDataChannel createAndOpenDataChannel(int trackId) throws IOException {
+ return rtpChannelFactory.createAndOpenDataChannel(trackId);
+ }
+
+ @Override
+ public RtpDataChannel.Factory createFallbackDataChannelFactory() {
+ return rtpFallbackChannelFactory;
+ }
+ }
}
diff --git a/media3-migration.sh b/media3-migration.sh
index 58b0f70dbd6..45a08d24b61 100644
--- a/media3-migration.sh
+++ b/media3-migration.sh
@@ -77,8 +77,8 @@ CLASS_MAPPINGS='com.google.android.exoplayer2.text.span androidx.media3.common.t
com.google.android.exoplayer2.text androidx.media3.common.text CueGroup Cue
com.google.android.exoplayer2.text com.google.android.exoplayer2.text ExoplayerCuesDecoder SubtitleDecoderFactory TextOutput TextRenderer
com.google.android.exoplayer2.upstream.crypto com.google.android.exoplayer2.upstream AesCipherDataSource AesCipherDataSink AesFlushingCipher
-com.google.android.exoplayer2.util com.google.android.exoplayer2.util AtomicFile Assertions BundleableUtil BundleUtil Clock ClosedSource CodecSpecificDataUtil ColorParser ConditionVariable Consumer CopyOnWriteMultiset EGLSurfaceTexture GlProgram GlUtil HandlerWrapper LibraryLoader ListenerSet Log LongArray MediaFormatUtil NetworkTypeObserver NonNullApi NotificationUtil ParsableBitArray ParsableByteArray RepeatModeUtil RunnableFutureTask Size SystemClock SystemHandlerWrapper TimedValueQueue TimestampAdjuster TraceUtil UnknownNull UnstableApi UriUtil Util XmlPullParserUtil
-com.google.android.exoplayer2.util androidx.media3.common DebugViewProvider Effect ErrorMessageProvider FlagSet FileTypes FrameInfo FrameProcessingException FrameProcessor MimeTypes PriorityTaskManager SurfaceInfo
+com.google.android.exoplayer2.util com.google.android.exoplayer2.util AtomicFile Assertions BitmapLoader BundleableUtil BundleUtil Clock ClosedSource CodecSpecificDataUtil ColorParser ConditionVariable Consumer CopyOnWriteMultiset EGLSurfaceTexture GlProgram GlUtil HandlerWrapper LibraryLoader ListenerSet Log LongArray MediaFormatUtil NalUnitUtil NetworkTypeObserver NonNullApi NotificationUtil ParsableBitArray ParsableByteArray ParsableNalUnitBitArray RepeatModeUtil RunnableFutureTask Size SystemClock SystemHandlerWrapper TimedValueQueue TimestampAdjuster TraceUtil UnknownNull UnstableApi UriUtil Util XmlPullParserUtil
+com.google.android.exoplayer2.util androidx.media3.common DebugViewProvider Effect ErrorMessageProvider FlagSet FileTypes FrameInfo GlObjectsProvider GlTextureInfo VideoFrameProcessingException VideoFrameProcessor MimeTypes PriorityTaskManager SurfaceInfo
com.google.android.exoplayer2.metadata androidx.media3.common Metadata
com.google.android.exoplayer2.metadata com.google.android.exoplayer2.metadata MetadataDecoderFactory MetadataOutput MetadataRenderer
com.google.android.exoplayer2.audio androidx.media3.common AudioAttributes AuxEffectInfo
@@ -128,8 +128,8 @@ extension-workmanager media3-exoplayer-workmanager'
# Rewrites classes, packages and dependencies from the legacy ExoPlayer package structure
# to androidx.media3 structure.
-MEDIA3_VERSION="1.0.0"
-LEGACY_PEER_VERSION="2.18.5"
+MEDIA3_VERSION="1.0.1"
+LEGACY_PEER_VERSION="2.18.6"
function usage() {
echo "usage: $0 [-p|-c|-d|-v]|[-m|-l [-x ] [-f] PROJECT_ROOT]"
diff --git a/missing_aar_type_workaround.gradle b/missing_aar_type_workaround.gradle
index 276743ca603..bf8e7a93ff8 100644
--- a/missing_aar_type_workaround.gradle
+++ b/missing_aar_type_workaround.gradle
@@ -24,6 +24,7 @@ def addMissingAarTypeToXml(xml) {
"com.google.ads.interactivemedia.v3:interactivemedia",
"com.google.guava:guava",
"com.google.truth:truth",
+ "com.google.truth.extensions:truth-java8-extension",
"com.squareup.okhttp3:okhttp",
"com.squareup.okhttp3:mockwebserver",
"org.mockito:mockito-core",
@@ -77,6 +78,11 @@ def addMissingAarTypeToXml(xml) {
(isProjectLibrary
|| aar_dependencies.contains(dependencyName))
if (!hasJar && !hasAar) {
+ // To look for what kind of dependency it is i.e. aar or jar type,
+ // please expand the External Libraries in Project view in Android Studio
+ // and search for your dependency inside Gradle Script dependencies.
+ // .aar files have @aar suffix at the end of their name,
+ // while .jar files have nothing.
throw new IllegalStateException(
dependencyName + " is not on the JAR or AAR list in missing_aar_type_workaround.gradle")
}
diff --git a/testutils/build.gradle b/testutils/build.gradle
index 11a8d1b76e7..7f46a7cc1a3 100644
--- a/testutils/build.gradle
+++ b/testutils/build.gradle
@@ -20,6 +20,7 @@ dependencies {
api 'androidx.test.ext:truth:' + androidxTestTruthVersion
api 'junit:junit:' + junitVersion
api 'com.google.truth:truth:' + truthVersion
+ api 'com.google.truth.extensions:truth-java8-extension:' + truthVersion
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion
compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion