From be5a40bfe3c9cce08f0ef8fcda69751b0b0c9d9f Mon Sep 17 00:00:00 2001 From: root Date: Sun, 27 Sep 2026 16:31:00 +0800 Subject: [PATCH] Initial hlsmplayer application --- .gitignore | 16 + LICENSE | 202 + README.md | 17 + app/build.gradle.kts | 35 + app/proguard-rules.txt | 1 + app/src/main/AndroidManifest.xml | 56 + .../java/com/hlsmplayer/MediaCatalogUrl.java | 77 + .../java/com/hlsmplayer/PlayerActivity.java | 1278 +++++ .../drawable/media_browser_item_selector.xml | 18 + .../res/drawable/media_cover_placeholder.xml | 5 + .../res/drawable/player_focus_indicator.xml | 4 + app/src/main/res/drawable/tv_banner.xml | 17 + .../main/res/layout/media_browser_item.xml | 29 + app/src/main/res/layout/player_activity.xml | 128 + app/src/main/res/layout/player_pane.xml | 53 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3394 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2184 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4886 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7492 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10801 bytes app/src/main/res/values/strings.xml | 32 + app/src/main/res/values/styles.xml | 22 + .../com/hlsmplayer/MediaCatalogUrlTest.java | 59 + build.gradle.kts | 7 + gradle.properties | 3 + gradle/libs.versions.toml | 28 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 234 + gradlew.bat | 89 + libraries/common/build.gradle.kts | 23 + libraries/common/src/main/AndroidManifest.xml | 20 + .../androidx/media3/common/AdOverlayInfo.java | 128 + .../media3/common/AdPlaybackState.java | 1945 +++++++ .../media3/common/AdViewProvider.java | 48 + .../media3/common/AudioAttributes.java | 449 ++ .../androidx/media3/common/AuxEffectInfo.java | 88 + .../androidx/media3/common/BasePlayer.java | 469 ++ .../media3/common/BundleListRetriever.java | 129 + .../media3/common/BundleableByteArray.java | 235 + .../main/java/androidx/media3/common/C.java | 1883 +++++++ .../androidx/media3/common/ColorInfo.java | 559 ++ .../androidx/media3/common/DataReader.java | 41 + .../media3/common/DebugViewProvider.java | 41 + .../androidx/media3/common/DeviceInfo.java | 231 + .../androidx/media3/common/DrmInitData.java | 406 ++ .../java/androidx/media3/common/Effect.java | 32 + .../media3/common/ErrorMessageProvider.java | 31 + .../androidx/media3/common/FileTypes.java | 341 ++ .../java/androidx/media3/common/FlagSet.java | 269 + .../java/androidx/media3/common/Format.java | 2010 +++++++ .../media3/common/ForwardingPlayer.java | 1097 ++++ .../common/ForwardingSimpleBasePlayer.java | 535 ++ .../androidx/media3/common/FrameInfo.java | 51 + .../media3/common/GlObjectsProvider.java | 91 + .../androidx/media3/common/GlTextureInfo.java | 85 + .../androidx/media3/common/HeartRating.java | 99 + .../common/IllegalSeekPositionException.java | 46 + .../java/androidx/media3/common/Label.java | 92 + .../androidx/media3/common/MediaItem.java | 2528 +++++++++ .../media3/common/MediaLibraryInfo.java | 112 + .../androidx/media3/common/MediaMetadata.java | 1720 ++++++ .../java/androidx/media3/common/Metadata.java | 241 + .../androidx/media3/common/MimeTypes.java | 925 ++++ .../common/OnInputFrameProcessedListener.java | 36 + .../media3/common/OverlaySettings.java | 133 + .../media3/common/ParserException.java | 136 + .../media3/common/PercentageRating.java | 93 + .../media3/common/PlaybackException.java | 670 +++ .../media3/common/PlaybackParameters.java | 147 + .../java/androidx/media3/common/Player.java | 3631 +++++++++++++ .../media3/common/PlayerTransferState.java | 332 ++ .../media3/common/PriorityTaskManager.java | 127 + .../java/androidx/media3/common/Rating.java | 87 + .../media3/common/SimpleBasePlayer.java | 4384 ++++++++++++++++ .../media3/common/SpeedParameters.java | 39 + .../androidx/media3/common/StarRating.java | 125 + .../androidx/media3/common/StreamKey.java | 178 + .../androidx/media3/common/SurfaceInfo.java | 102 + .../androidx/media3/common/ThumbRating.java | 96 + .../java/androidx/media3/common/Timeline.java | 1755 +++++++ .../androidx/media3/common/TrackGroup.java | 253 + .../media3/common/TrackSelectionOverride.java | 122 + .../common/TrackSelectionParameters.java | 1676 ++++++ .../java/androidx/media3/common/Tracks.java | 404 ++ .../common/VideoCompositorSettings.java | 61 + .../common/VideoFrameProcessingException.java | 119 + .../media3/common/VideoFrameProcessor.java | 416 ++ .../androidx/media3/common/VideoGraph.java | 285 + .../androidx/media3/common/VideoSize.java | 155 + .../androidx/media3/common/ViewProvider.java | 40 + .../audio/AudioBecomingNoisyManager.java | 119 + .../common/audio/AudioFocusManager.java | 405 ++ .../common/audio/AudioFocusRequestCompat.java | 379 ++ .../common/audio/AudioManagerCompat.java | 241 + .../media3/common/audio/AudioMixingUtil.java | 167 + .../common/audio/AudioProcessingPipeline.java | 380 ++ .../media3/common/audio/AudioProcessor.java | 366 ++ .../common/audio/AudioProcessorChain.java | 74 + .../common/audio/BaseAudioProcessor.java | 164 + .../audio/ChannelMixingAudioProcessor.java | 94 + .../common/audio/ChannelMixingMatrix.java | 342 ++ .../common/audio/DefaultGainProvider.java | 225 + .../media3/common/audio/GainProcessor.java | 156 + .../androidx/media3/common/audio/Sonic.java | 1164 ++++ .../common/audio/SonicAudioProcessor.java | 314 ++ .../audio/SpeedChangingAudioProcessor.java | 429 ++ .../media3/common/audio/SpeedProvider.java | 59 + .../SynchronizedSonicAudioProcessor.java | 131 + .../audio/ToInt16PcmAudioProcessor.java | 206 + .../media3/common/audio/package-info.java | 19 + .../androidx/media3/common/package-info.java | 19 + .../java/androidx/media3/common/text/Cue.java | 1035 ++++ .../androidx/media3/common/text/CueGroup.java | 106 + .../media3/common/text/CustomSpanBundler.java | 133 + .../HorizontalTextInVerticalContextSpan.java | 35 + .../common/text/LanguageFeatureSpan.java | 22 + .../androidx/media3/common/text/RubySpan.java | 68 + .../androidx/media3/common/text/SpanUtil.java | 96 + .../media3/common/text/TextAnnotation.java | 67 + .../media3/common/text/TextEmphasisSpan.java | 121 + .../media3/common/text/VoiceSpan.java | 52 + .../media3/common/text/package-info.java | 19 + .../media3/common/util/Assertions.java | 188 + .../media3/common/util/AtomicFile.java | 202 + .../common/util/BackgroundExecutor.java | 58 + .../util/BackgroundThreadStateHandler.java | 184 + .../media3/common/util/BitmapLoader.java | 58 + .../common/util/BundleCollectionUtil.java | 181 + .../media3/common/util/CircularIntArray.java | 88 + .../androidx/media3/common/util/Clock.java | 69 + .../common/util/CodecSpecificDataUtil.java | 2433 +++++++++ .../media3/common/util/ColorParser.java | 283 + .../media3/common/util/ConditionVariable.java | 183 + .../util/ConstantRateTimestampIterator.java | 110 + .../androidx/media3/common/util/Consumer.java | 27 + .../common/util/CopyOnWriteMultiset.java | 149 + .../media3/common/util/EGLSurfaceTexture.java | 298 ++ .../common/util/ElapsedRealtimeTicker.java | 34 + .../media3/common/util/ExperimentalApi.java | 44 + .../media3/common/util/GlProgram.java | 571 ++ .../androidx/media3/common/util/GlRect.java | 48 + .../androidx/media3/common/util/GlUtil.java | 1170 +++++ .../media3/common/util/HandlerWrapper.java | 86 + .../media3/common/util/LibraryLoader.java | 79 + .../media3/common/util/ListenerSet.java | 497 ++ .../java/androidx/media3/common/util/Log.java | 369 ++ .../media3/common/util/LongArray.java | 96 + .../media3/common/util/LongArrayQueue.java | 146 + .../media3/common/util/MediaFormatUtil.java | 604 +++ .../common/util/NetworkTypeObserver.java | 325 ++ .../media3/common/util/NonNullApi.java | 37 + .../media3/common/util/NotificationUtil.java | 153 + .../media3/common/util/NullableType.java | 40 + .../media3/common/util/ParsableBitArray.java | 348 ++ .../media3/common/util/ParsableByteArray.java | 1024 ++++ .../media3/common/util/RepeatModeUtil.java | 105 + .../common/util/RunnableFutureTask.java | 175 + .../androidx/media3/common/util/Size.java | 107 + .../media3/common/util/SpeedProviderUtil.java | 177 + .../common/util/StuckPlayerDetector.java | 393 ++ .../common/util/StuckPlayerException.java | 141 + .../media3/common/util/SystemClock.java | 64 + .../common/util/SystemHandlerWrapper.java | 180 + .../media3/common/util/ThrowingRunnable.java | 29 + .../media3/common/util/TimedValueQueue.java | 178 + .../media3/common/util/TimestampAdjuster.java | 300 ++ .../media3/common/util/TimestampConsumer.java | 28 + .../media3/common/util/TimestampIterator.java | 42 + .../media3/common/util/TraceUtil.java | 52 + .../media3/common/util/UnknownNull.java | 33 + .../media3/common/util/UnstableApi.java | 68 + .../androidx/media3/common/util/UriUtil.java | 342 ++ .../androidx/media3/common/util/Util.java | 4661 +++++++++++++++++ .../media3/common/util/WakeLockManager.java | 179 + .../androidx/media3/common/util/WavUtil.java | 144 + .../media3/common/util/WifiLockManager.java | 175 + .../media3/common/util/XmlPullParserUtil.java | 131 + .../media3/common/util/package-info.java | 17 + .../media3/common/video/AsyncFrame.java | 50 + .../video/DefaultHardwareBufferFrame.java | 140 + .../androidx/media3/common/video/Frame.java | 117 + .../media3/common/video/FrameProcessor.java | 95 + .../media3/common/video/FrameWriter.java | 101 + .../common/video/HardwareBufferFrame.java | 71 + .../video/HardwareBufferNativeHelpers.java | 60 + .../common/video/HardwareBufferPool.java | 238 + .../video/SurfaceHolderFrameWriter.java | 640 +++ .../media3/common/video/SyncFenceWrapper.java | 82 + .../media3/common/video/package-info.java | 19 + libraries/container/build.gradle.kts | 18 + .../container/src/main/AndroidManifest.xml | 19 + .../media3/container/DolbyVisionConfig.java | 73 + .../media3/container/MdtaMetadataEntry.java | 214 + .../container/Mp4AlternateGroupData.java | 54 + .../androidx/media3/container/Mp4Box.java | 647 +++ .../media3/container/Mp4LocationData.java | 81 + .../media3/container/Mp4OrientationData.java | 72 + .../media3/container/Mp4TimestampData.java | 119 + .../media3/container/NalUnitUtil.java | 2606 +++++++++ .../androidx/media3/container/ObuParser.java | 565 ++ .../androidx/media3/container/OpusUtil.java | 208 + .../container/ParsableNalUnitBitArray.java | 227 + .../container/ReorderingBufferQueue.java | 217 + .../media3/container/VorbisBitArray.java | 128 + .../androidx/media3/container/VorbisUtil.java | 612 +++ .../androidx/media3/container/XmpData.java | 55 + .../media3/container/package-info.java | 19 + libraries/database/build.gradle.kts | 16 + .../database/src/main/AndroidManifest.xml | 19 + .../media3/database/DatabaseIOException.java | 33 + .../media3/database/DatabaseProvider.java | 58 + .../database/DefaultDatabaseProvider.java | 44 + .../media3/database/ExoDatabaseProvider.java | 31 + .../database/StandaloneDatabaseProvider.java | 99 + .../media3/database/VersionTable.java | 183 + .../media3/database/package-info.java | 19 + libraries/datasource/build.gradle.kts | 20 + .../datasource/src/main/AndroidManifest.xml | 19 + .../media3/datasource/AesCipherDataSink.java | 101 + .../datasource/AesCipherDataSource.java | 91 + .../media3/datasource/AesFlushingCipher.java | 151 + .../media3/datasource/AssetDataSource.java | 170 + .../media3/datasource/BaseDataSource.java | 107 + .../media3/datasource/BitmapUtil.java | 115 + .../media3/datasource/ByteArrayDataSink.java | 62 + .../datasource/ByteArrayDataSource.java | 126 + .../ByteArrayUploadDataProvider.java | 57 + .../media3/datasource/ContentDataSource.java | 230 + .../datasource/DataSchemeDataSource.java | 116 + .../androidx/media3/datasource/DataSink.java | 62 + .../media3/datasource/DataSource.java | 110 + .../datasource/DataSourceBitmapLoader.java | 280 + .../datasource/DataSourceException.java | 115 + .../datasource/DataSourceInputStream.java | 106 + .../media3/datasource/DataSourceUtil.java | 93 + .../androidx/media3/datasource/DataSpec.java | 627 +++ .../media3/datasource/DefaultDataSource.java | 393 ++ .../datasource/DefaultDataSourceFactory.java | 106 + .../datasource/DefaultHttpDataSource.java | 874 ++++ .../media3/datasource/FileDataSource.java | 210 + .../datasource/FileDescriptorDataSource.java | 197 + .../media3/datasource/HttpDataSource.java | 507 ++ .../datasource/HttpEngineDataSource.java | 1151 ++++ .../androidx/media3/datasource/HttpUtil.java | 192 + .../datasource/MediaDataSourceAdapter.java | 124 + .../datasource/PlaceholderDataSource.java | 59 + .../media3/datasource/PriorityDataSource.java | 127 + .../datasource/PriorityDataSourceFactory.java | 52 + .../datasource/RawResourceDataSource.java | 376 ++ .../datasource/ResolvingDataSource.java | 137 + .../media3/datasource/StatsDataSource.java | 126 + .../media3/datasource/TeeDataSource.java | 106 + .../media3/datasource/TransferListener.java | 80 + .../media3/datasource/UdpDataSource.java | 196 + .../media3/datasource/cache/Cache.java | 320 ++ .../datasource/cache/CacheDataSink.java | 284 + .../datasource/cache/CacheDataSource.java | 894 ++++ .../media3/datasource/cache/CacheEvictor.java | 47 + .../datasource/cache/CacheFileMetadata.java | 28 + .../cache/CacheFileMetadataIndex.java | 255 + .../datasource/cache/CacheKeyFactory.java | 41 + .../media3/datasource/cache/CacheSpan.java | 104 + .../media3/datasource/cache/CacheWriter.java | 236 + .../datasource/cache/CachedContent.java | 329 ++ .../datasource/cache/CachedContentIndex.java | 975 ++++ .../datasource/cache/ContentMetadata.java | 89 + .../cache/ContentMetadataMutations.java | 152 + .../cache/DefaultContentMetadata.java | 175 + .../cache/LeastRecentlyUsedCacheEvictor.java | 86 + .../datasource/cache/NoOpCacheEvictor.java | 58 + .../cache/ReusableBufferedOutputStream.java | 76 + .../media3/datasource/cache/SimpleCache.java | 825 +++ .../datasource/cache/SimpleCacheSpan.java | 208 + .../media3/datasource/cache/package-info.java | 19 + .../media3/datasource/package-info.java | 19 + libraries/decoder/build.gradle.kts | 18 + .../decoder/src/main/AndroidManifest.xml | 19 + .../java/androidx/media3/decoder/Buffer.java | 106 + .../androidx/media3/decoder/CryptoConfig.java | 26 + .../media3/decoder/CryptoException.java | 35 + .../androidx/media3/decoder/CryptoInfo.java | 182 + .../java/androidx/media3/decoder/Decoder.java | 105 + .../media3/decoder/DecoderException.java | 52 + .../media3/decoder/DecoderInputBuffer.java | 247 + .../media3/decoder/DecoderOutputBuffer.java | 61 + .../media3/decoder/SimpleDecoder.java | 379 ++ .../decoder/SimpleDecoderOutputBuffer.java | 88 + .../decoder/VideoDecoderOutputBuffer.java | 231 + .../androidx/media3/decoder/package-info.java | 19 + libraries/exoplayer/build.gradle.kts | 24 + .../exoplayer/src/main/AndroidManifest.xml | 21 + .../AbstractConcatenatedTimeline.java | 330 ++ .../media3/exoplayer/BaseRenderer.java | 707 +++ .../media3/exoplayer/CodecParameters.java | 283 + .../CodecParametersChangeListener.java | 35 + .../media3/exoplayer/DecoderCounters.java | 202 + .../exoplayer/DecoderReuseEvaluation.java | 211 + .../DefaultLivePlaybackSpeedControl.java | 462 ++ .../media3/exoplayer/DefaultLoadControl.java | 1112 ++++ .../media3/exoplayer/DefaultMediaClock.java | 208 + .../DefaultRendererCapabilitiesList.java | 98 + .../exoplayer/DefaultRenderersFactory.java | 1027 ++++ .../DefaultSuitableOutputChecker.java | 269 + .../exoplayer/ExoPlaybackException.java | 423 ++ .../androidx/media3/exoplayer/ExoPlayer.java | 2213 ++++++++ .../media3/exoplayer/ExoPlayerImpl.java | 3807 ++++++++++++++ .../exoplayer/ExoPlayerImplInternal.java | 4576 ++++++++++++++++ .../media3/exoplayer/ExoTimeoutException.java | 93 + .../media3/exoplayer/FormatHolder.java | 38 + .../media3/exoplayer/ForwardingRenderer.java | 214 + .../exoplayer/LivePlaybackSpeedControl.java | 70 + .../media3/exoplayer/LoadControl.java | 429 ++ .../media3/exoplayer/LoadingInfo.java | 157 + .../androidx/media3/exoplayer/MediaClock.java | 43 + .../media3/exoplayer/MediaPeriodHolder.java | 511 ++ .../media3/exoplayer/MediaPeriodInfo.java | 176 + .../media3/exoplayer/MediaPeriodQueue.java | 1548 ++++++ .../exoplayer/MediaSourceInfoHolder.java | 29 + .../media3/exoplayer/MediaSourceList.java | 778 +++ .../media3/exoplayer/NoSampleRenderer.java | 302 ++ .../media3/exoplayer/PlaybackInfo.java | 621 +++ .../exoplayer/PlaybackLooperProvider.java | 111 + .../media3/exoplayer/PlayerMessage.java | 366 ++ .../media3/exoplayer/PlaylistTimeline.java | 185 + .../androidx/media3/exoplayer/Renderer.java | 797 +++ .../exoplayer/RendererCapabilities.java | 505 ++ .../exoplayer/RendererCapabilitiesList.java | 39 + .../exoplayer/RendererConfiguration.java | 79 + .../media3/exoplayer/RendererHolder.java | 1032 ++++ .../media3/exoplayer/RenderersFactory.java | 71 + .../exoplayer/ScrubbingModeParameters.java | 357 ++ .../media3/exoplayer/SeekParameters.java | 135 + .../media3/exoplayer/SimpleExoPlayer.java | 1431 +++++ .../exoplayer/StandaloneMediaClock.java | 104 + .../media3/exoplayer/StreamVolumeManager.java | 330 ++ .../exoplayer/SuitableOutputChecker.java | 77 + .../analytics/AnalyticsCollector.java | 318 ++ .../analytics/AnalyticsListener.java | 1491 ++++++ .../analytics/DefaultAnalyticsCollector.java | 1239 +++++ .../DefaultPlaybackSessionManager.java | 467 ++ .../analytics/MediaMetricsListener.java | 906 ++++ .../analytics/PlaybackSessionManager.java | 148 + .../exoplayer/analytics/PlaybackStats.java | 1156 ++++ .../analytics/PlaybackStatsListener.java | 876 ++++ .../media3/exoplayer/analytics/PlayerId.java | 91 + .../exoplayer/analytics/package-info.java | 19 + .../exoplayer/audio/AudioCapabilities.java | 756 +++ .../audio/AudioCapabilitiesReceiver.java | 281 + .../exoplayer/audio/AudioDescriptorUtil.java | 229 + .../exoplayer/audio/AudioOffloadSupport.java | 138 + .../media3/exoplayer/audio/AudioOutput.java | 190 + .../exoplayer/audio/AudioOutputProvider.java | 703 +++ .../audio/AudioRendererEventListener.java | 314 ++ .../media3/exoplayer/audio/AudioSink.java | 908 ++++ .../exoplayer/audio/AudioTimestampPoller.java | 416 ++ .../audio/AudioTrackAudioOutput.java | 693 +++ .../audio/AudioTrackAudioOutputProvider.java | 597 +++ .../audio/AudioTrackPositionTracker.java | 561 ++ .../audio/ChannelMappingAudioProcessor.java | 147 + .../exoplayer/audio/DecoderAudioRenderer.java | 1036 ++++ .../DefaultAudioOffloadSupportProvider.java | 192 + .../exoplayer/audio/DefaultAudioSink.java | 2233 ++++++++ .../DefaultAudioTrackBufferSizeProvider.java | 352 ++ .../audio/DefaultAudioTrackProvider.java | 97 + .../exoplayer/audio/DeviceTypeUtil.java | 78 + .../audio/ForwardingAudioOutput.java | 164 + .../audio/ForwardingAudioOutputProvider.java | 76 + .../exoplayer/audio/ForwardingAudioSink.java | 246 + .../media3/exoplayer/audio/IamfUtil.java | 444 ++ .../audio/MediaCodecAudioRenderer.java | 1347 +++++ .../audio/OggOpusAudioPacketizer.java | 289 + .../media3/exoplayer/audio/PcmAudioUtil.java | 219 + .../audio/SilenceSkippingAudioProcessor.java | 765 +++ .../exoplayer/audio/SpeakerLayoutUtil.java | 183 + .../exoplayer/audio/TeeAudioProcessor.java | 247 + .../audio/ToFloatPcmAudioProcessor.java | 165 + .../audio/TrimmingAudioProcessor.java | 195 + .../audio/WaveformAudioBufferSink.java | 157 + .../media3/exoplayer/audio/package-info.java | 19 + .../media3/exoplayer/drm/ClearKeyUtil.java | 96 + .../exoplayer/drm/DefaultDrmSession.java | 791 +++ .../drm/DefaultDrmSessionManager.java | 998 ++++ .../drm/DefaultDrmSessionManagerProvider.java | 132 + .../media3/exoplayer/drm/DrmSession.java | 186 + .../drm/DrmSessionEventListener.java | 245 + .../exoplayer/drm/DrmSessionManager.java | 176 + .../drm/DrmSessionManagerProvider.java | 36 + .../media3/exoplayer/drm/DrmUtil.java | 245 + .../exoplayer/drm/DummyExoMediaDrm.java | 157 + .../exoplayer/drm/ErrorStateDrmSession.java | 90 + .../media3/exoplayer/drm/ExoMediaDrm.java | 620 +++ .../exoplayer/drm/FrameworkCryptoConfig.java | 78 + .../exoplayer/drm/FrameworkMediaDrm.java | 596 +++ .../exoplayer/drm/HttpMediaDrmCallback.java | 174 + .../media3/exoplayer/drm/KeyRequestInfo.java | 88 + .../exoplayer/drm/KeysExpiredException.java | 22 + .../exoplayer/drm/LocalMediaDrmCallback.java | 52 + .../exoplayer/drm/MediaDrmCallback.java | 114 + .../drm/MediaDrmCallbackException.java | 68 + .../exoplayer/drm/OfflineLicenseHelper.java | 456 ++ .../drm/UnsupportedDrmException.java | 74 + .../media3/exoplayer/drm/WidevineUtil.java | 67 + .../media3/exoplayer/drm/package-info.java | 19 + .../image/BitmapFactoryImageDecoder.java | 190 + .../image/ExternallyLoadedImageDecoder.java | 208 + .../media3/exoplayer/image/ImageDecoder.java | 73 + .../image/ImageDecoderException.java | 53 + .../image/ImageMetadataListener.java | 34 + .../media3/exoplayer/image/ImageOutput.java | 57 + .../exoplayer/image/ImageOutputBuffer.java | 37 + .../media3/exoplayer/image/ImageRenderer.java | 667 +++ .../media3/exoplayer/image/package-info.java | 19 + .../AsynchronousMediaCodecAdapter.java | 410 ++ .../AsynchronousMediaCodecBufferEnqueuer.java | 362 ++ .../AsynchronousMediaCodecCallback.java | 379 ++ .../exoplayer/mediacodec/BatchBuffer.java | 133 + .../DefaultMediaCodecAdapterFactory.java | 203 + .../ForwardingMediaCodecAdapter.java | 164 + .../mediacodec/LoudnessCodecController.java | 132 + .../mediacodec/MediaCodecAdapter.java | 361 ++ .../mediacodec/MediaCodecBufferEnqueuer.java | 72 + .../MediaCodecDecoderException.java | 52 + .../exoplayer/mediacodec/MediaCodecInfo.java | 1099 ++++ ...CodecPerformancePointCoverageProvider.java | 200 + .../mediacodec/MediaCodecRenderer.java | 3015 +++++++++++ .../mediacodec/MediaCodecSelector.java | 55 + .../exoplayer/mediacodec/MediaCodecUtil.java | 958 ++++ .../SynchronousMediaCodecAdapter.java | 229 + .../SynchronousMediaCodecBufferEnqueuer.java | 72 + .../exoplayer/mediacodec/package-info.java | 19 + .../metadata/MetadataDecoderFactory.java | 99 + .../exoplayer/metadata/MetadataOutput.java | 31 + .../exoplayer/metadata/MetadataRenderer.java | 325 ++ .../exoplayer/metadata/package-info.java | 19 + .../offline/DefaultDownloadIndex.java | 585 +++ .../offline/DefaultDownloaderFactory.java | 176 + .../media3/exoplayer/offline/Download.java | 195 + .../exoplayer/offline/DownloadCursor.java | 131 + .../exoplayer/offline/DownloadException.java | 38 + .../exoplayer/offline/DownloadHelper.java | 1518 ++++++ .../exoplayer/offline/DownloadIndex.java | 51 + .../exoplayer/offline/DownloadManager.java | 1413 +++++ .../offline/DownloadNotificationHelper.java | 237 + .../exoplayer/offline/DownloadProgress.java | 30 + .../exoplayer/offline/DownloadRequest.java | 517 ++ .../exoplayer/offline/DownloadService.java | 1146 ++++ .../media3/exoplayer/offline/Downloader.java | 78 + .../exoplayer/offline/DownloaderFactory.java | 31 + .../exoplayer/offline/FilterableManifest.java | 39 + .../offline/FilteringManifestParser.java | 52 + .../offline/ProgressiveDownloader.java | 222 + .../exoplayer/offline/SegmentDownloader.java | 650 +++ .../offline/SegmentDownloaderFactory.java | 55 + .../offline/WritableDownloadIndex.java | 89 + .../exoplayer/offline/package-info.java | 19 + .../media3/exoplayer/package-info.java | 19 + .../scheduler/PlatformScheduler.java | 162 + .../exoplayer/scheduler/Requirements.java | 280 + .../scheduler/RequirementsWatcher.java | 233 + .../media3/exoplayer/scheduler/Scheduler.java | 60 + .../exoplayer/scheduler/package-info.java | 19 + .../exoplayer/source/BaseMediaSource.java | 318 ++ .../source/BehindLiveWindowException.java | 28 + .../source/BundledExtractorsAdapter.java | 158 + .../exoplayer/source/ClippingMediaPeriod.java | 496 ++ .../exoplayer/source/ClippingMediaSource.java | 609 +++ .../source/CompositeMediaSource.java | 401 ++ .../source/CompositeSequenceableLoader.java | 191 + .../CompositeSequenceableLoaderFactory.java | 47 + .../source/ConcatenatingMediaSource.java | 1050 ++++ .../source/ConcatenatingMediaSource2.java | 681 +++ ...ultCompositeSequenceableLoaderFactory.java | 46 + .../source/DefaultMediaSourceFactory.java | 965 ++++ .../exoplayer/source/EmptySampleStream.java | 48 + .../exoplayer/source/ExternalLoader.java | 45 + .../source/ExternallyLoadedMediaPeriod.java | 244 + .../source/ExternallyLoadedMediaSource.java | 163 + .../source/FilteringMediaSource.java | 205 + .../source/ForwardingMediaSourceFactory.java | 98 + .../exoplayer/source/ForwardingTimeline.java | 109 + .../exoplayer/source/IcyDataSource.java | 153 + .../exoplayer/source/LoadEventInfo.java | 286 + .../exoplayer/source/LoopingMediaSource.java | 226 + .../exoplayer/source/MaskingMediaPeriod.java | 281 + .../exoplayer/source/MaskingMediaSource.java | 408 ++ .../exoplayer/source/MediaLoadData.java | 108 + .../source/MediaParserExtractorAdapter.java | 185 + .../media3/exoplayer/source/MediaPeriod.java | 292 ++ .../media3/exoplayer/source/MediaSource.java | 636 +++ .../source/MediaSourceEventListener.java | 531 ++ .../exoplayer/source/MediaSourceFactory.java | 62 + .../exoplayer/source/MergingMediaPeriod.java | 385 ++ .../exoplayer/source/MergingMediaSource.java | 422 ++ .../source/MergingMetadataSampleStream.java | 262 + .../source/ProgressiveMediaExtractor.java | 112 + .../source/ProgressiveMediaPeriod.java | 1542 ++++++ .../source/ProgressiveMediaSource.java | 539 ++ .../exoplayer/source/SampleDataQueue.java | 556 ++ .../media3/exoplayer/source/SampleQueue.java | 1270 +++++ .../media3/exoplayer/source/SampleStream.java | 170 + .../exoplayer/source/SequenceableLoader.java | 71 + .../media3/exoplayer/source/ShuffleOrder.java | 318 ++ .../exoplayer/source/SilenceMediaSource.java | 349 ++ .../source/SinglePeriodTimeline.java | 374 ++ .../source/SingleSampleMediaPeriod.java | 470 ++ .../source/SingleSampleMediaSource.java | 271 + .../media3/exoplayer/source/SpannedData.java | 157 + .../source/TimeOffsetMediaPeriod.java | 239 + .../source/TimelineWithUpdatedMediaItem.java | 60 + .../exoplayer/source/TrackGroupArray.java | 157 + .../UnrecognizedInputFormatException.java | 76 + .../exoplayer/source/WrappingMediaSource.java | 258 + .../exoplayer/source/ads/AdsLoader.java | 230 + .../exoplayer/source/ads/AdsMediaSource.java | 802 +++ .../ads/ServerSideAdInsertionMediaSource.java | 1346 +++++ .../source/ads/ServerSideAdInsertionUtil.java | 315 ++ .../source/ads/SinglePeriodAdTimeline.java | 63 + .../exoplayer/source/ads/package-info.java | 19 + .../source/chunk/BaseMediaChunk.java | 109 + .../source/chunk/BaseMediaChunkIterator.java | 77 + .../source/chunk/BaseMediaChunkOutput.java | 76 + .../source/chunk/BundledChunkExtractor.java | 405 ++ .../media3/exoplayer/source/chunk/Chunk.java | 152 + .../source/chunk/ChunkExtractor.java | 193 + .../exoplayer/source/chunk/ChunkHolder.java | 36 + .../source/chunk/ChunkSampleStream.java | 1072 ++++ .../exoplayer/source/chunk/ChunkSource.java | 123 + .../source/chunk/ContainerMediaChunk.java | 194 + .../exoplayer/source/chunk/DataChunk.java | 129 + .../source/chunk/InitializationChunk.java | 125 + .../exoplayer/source/chunk/MediaChunk.java | 76 + .../source/chunk/MediaChunkIterator.java | 106 + .../chunk/MediaParserChunkExtractor.java | 275 + .../source/chunk/SingleSampleMediaChunk.java | 128 + .../exoplayer/source/chunk/package-info.java | 19 + .../mediaparser/InputReaderAdapterV30.java | 87 + .../source/mediaparser/MediaParserUtil.java | 88 + .../mediaparser/OutputConsumerAdapterV30.java | 667 +++ .../source/mediaparser/package-info.java | 19 + .../media3/exoplayer/source/package-info.java | 19 + .../source/preload/BasePreloadManager.java | 706 +++ .../source/preload/DefaultPreloadManager.java | 1006 ++++ .../preload/MediaSourceFactorySupplier.java | 46 + .../source/preload/PreCacheHelper.java | 677 +++ .../source/preload/PreloadException.java | 72 + .../preload/PreloadManagerListener.java | 34 + .../source/preload/PreloadMediaPeriod.java | 335 ++ .../source/preload/PreloadMediaSource.java | 719 +++ .../source/preload/RankingDataComparator.java | 41 + .../preload/TargetPreloadStatusControl.java | 26 + .../source/preload/package-info.java | 19 + .../media3/exoplayer/text/CuesResolver.java | 73 + .../text/DelegatingSubtitleDecoder.java | 62 + .../exoplayer/text/MergingCuesResolver.java | 158 + .../exoplayer/text/ReplacingCuesResolver.java | 163 + .../text/SubtitleDecoderFactory.java | 101 + .../media3/exoplayer/text/TextOutput.java | 45 + .../media3/exoplayer/text/TextRenderer.java | 687 +++ .../media3/exoplayer/text/package-info.java | 19 + .../AdaptiveTrackSelection.java | 946 ++++ .../trackselection/BaseTrackSelection.java | 254 + .../trackselection/DefaultTrackSelector.java | 4534 ++++++++++++++++ .../trackselection/ExoTrackSelection.java | 311 ++ .../trackselection/FixedTrackSelection.java | 93 + .../ForwardingTrackSelection.java | 196 + .../trackselection/MappingTrackSelector.java | 566 ++ .../trackselection/RandomTrackSelection.java | 129 + .../trackselection/TrackSelection.java | 112 + .../trackselection/TrackSelectionArray.java | 80 + .../trackselection/TrackSelectionUtil.java | 208 + .../trackselection/TrackSelector.java | 301 ++ .../trackselection/TrackSelectorResult.java | 139 + .../trackselection/package-info.java | 19 + .../media3/exoplayer/upstream/Allocation.java | 46 + .../media3/exoplayer/upstream/Allocator.java | 72 + .../exoplayer/upstream/BandwidthMeter.java | 160 + .../upstream/CachedRegionTracker.java | 210 + .../exoplayer/upstream/CmcdConfiguration.java | 404 ++ .../media3/exoplayer/upstream/CmcdData.java | 1233 +++++ .../exoplayer/upstream/DefaultAllocator.java | 189 + .../upstream/DefaultBandwidthMeter.java | 1810 +++++++ .../DefaultLoadErrorHandlingPolicy.java | 183 + .../upstream/LoadErrorHandlingPolicy.java | 230 + .../media3/exoplayer/upstream/Loader.java | 579 ++ .../upstream/LoaderErrorThrower.java | 59 + .../exoplayer/upstream/ParsingLoadable.java | 266 + .../upstream/PlayerIdAwareAllocator.java | 40 + .../exoplayer/upstream/SlidingPercentile.java | 158 + .../upstream/TimeToFirstByteEstimator.java | 47 + .../ContentSteeringTracker.java | 60 + .../contentsteering/SteeringManifest.java | 216 + .../SteeringManifestParser.java | 253 + .../SteeringManifestTracker.java | 325 ++ .../contentsteering/package-info.java | 19 + .../experimental/BandwidthEstimator.java | 85 + .../experimental/BandwidthStatistic.java | 43 + ...binedParallelSampleBandwidthEstimator.java | 212 + .../ExperimentalBandwidthMeter.java | 865 +++ .../ExponentialWeightedAverageStatistic.java | 69 + ...ightedAverageTimeToFirstByteEstimator.java | 120 + .../PercentileTimeToFirstByteEstimator.java | 133 + .../SlidingPercentileBandwidthStatistic.java | 143 + ...dingWeightedAverageBandwidthStatistic.java | 160 + ...SplitParallelSampleBandwidthEstimator.java | 210 + .../upstream/experimental/package-info.java | 19 + .../exoplayer/upstream/package-info.java | 19 + .../exoplayer/util/DebugTextViewHelper.java | 253 + .../media3/exoplayer/util/EventLogger.java | 813 +++ .../exoplayer/util/ReleasableExecutor.java | 58 + .../media3/exoplayer/util/SntpClient.java | 433 ++ .../exoplayer/util/SpatializerWrapper.java | 205 + .../media3/exoplayer/util/package-info.java | 19 + .../media3/exoplayer/video/Av1ObuUtil.java | 110 + .../video/Av1SampleDependencyParser.java | 180 + .../exoplayer/video/DecoderVideoRenderer.java | 1131 ++++ .../exoplayer/video/DefaultVideoSink.java | 319 ++ .../video/FixedFrameRateEstimator.java | 276 + .../media3/exoplayer/video/HevcSeiUtil.java | 162 + .../MediaCodecVideoDecoderException.java | 41 + .../video/MediaCodecVideoRenderer.java | 3296 ++++++++++++ .../exoplayer/video/PlaceholderSurface.java | 235 + .../video/PlaybackVideoGraphWrapper.java | 1380 +++++ .../video/VideoDecoderGLSurfaceView.java | 327 ++ .../VideoDecoderOutputBufferRenderer.java | 31 + .../video/VideoFrameMetadataListener.java | 44 + .../video/VideoFrameReleaseControl.java | 555 ++ .../VideoFrameReleaseEarlyTimeForecaster.java | 152 + .../video/VideoFrameReleaseHelper.java | 578 ++ .../video/VideoFrameRenderControl.java | 304 ++ .../video/VideoRendererEventListener.java | 276 + .../media3/exoplayer/video/VideoSink.java | 324 ++ .../media3/exoplayer/video/package-info.java | 19 + .../video/spherical/CameraMotionListener.java | 35 + .../video/spherical/CameraMotionRenderer.java | 144 + .../video/spherical/FrameRotationQueue.java | 125 + .../video/spherical/OrientationListener.java | 125 + .../exoplayer/video/spherical/Projection.java | 250 + .../video/spherical/ProjectionDecoder.java | 246 + .../video/spherical/ProjectionRenderer.java | 242 + .../video/spherical/SceneRenderer.java | 208 + .../spherical/SphericalGLSurfaceView.java | 373 ++ .../video/spherical/TouchTracker.java | 134 + .../video/spherical/package-info.java | 19 + .../src/main/res/values-af/strings.xml | 12 + .../src/main/res/values-am/strings.xml | 12 + .../src/main/res/values-ar/strings.xml | 12 + .../src/main/res/values-as/strings.xml | 12 + .../src/main/res/values-az/strings.xml | 12 + .../src/main/res/values-b+sr+Latn/strings.xml | 12 + .../src/main/res/values-be/strings.xml | 12 + .../src/main/res/values-bg/strings.xml | 12 + .../src/main/res/values-bn/strings.xml | 12 + .../src/main/res/values-bs/strings.xml | 12 + .../src/main/res/values-ca/strings.xml | 12 + .../src/main/res/values-cs/strings.xml | 12 + .../src/main/res/values-da/strings.xml | 12 + .../src/main/res/values-de/strings.xml | 12 + .../src/main/res/values-el/strings.xml | 12 + .../src/main/res/values-en-rAU/strings.xml | 12 + .../src/main/res/values-en-rGB/strings.xml | 12 + .../src/main/res/values-en-rIN/strings.xml | 12 + .../src/main/res/values-es-rUS/strings.xml | 12 + .../src/main/res/values-es/strings.xml | 12 + .../src/main/res/values-et/strings.xml | 12 + .../src/main/res/values-eu/strings.xml | 12 + .../src/main/res/values-fa/strings.xml | 12 + .../src/main/res/values-fi/strings.xml | 12 + .../src/main/res/values-fr-rCA/strings.xml | 12 + .../src/main/res/values-fr/strings.xml | 12 + .../src/main/res/values-gl/strings.xml | 12 + .../src/main/res/values-gu/strings.xml | 12 + .../src/main/res/values-hi/strings.xml | 12 + .../src/main/res/values-hr/strings.xml | 12 + .../src/main/res/values-hu/strings.xml | 12 + .../src/main/res/values-hy/strings.xml | 12 + .../src/main/res/values-in/strings.xml | 12 + .../src/main/res/values-is/strings.xml | 12 + .../src/main/res/values-it/strings.xml | 12 + .../src/main/res/values-iw/strings.xml | 12 + .../src/main/res/values-ja/strings.xml | 12 + .../src/main/res/values-ka/strings.xml | 12 + .../src/main/res/values-kk/strings.xml | 12 + .../src/main/res/values-km/strings.xml | 12 + .../src/main/res/values-kn/strings.xml | 12 + .../src/main/res/values-ko/strings.xml | 12 + .../src/main/res/values-ky/strings.xml | 12 + .../src/main/res/values-lo/strings.xml | 12 + .../src/main/res/values-lt/strings.xml | 12 + .../src/main/res/values-lv/strings.xml | 12 + .../src/main/res/values-mk/strings.xml | 12 + .../src/main/res/values-ml/strings.xml | 12 + .../src/main/res/values-mn/strings.xml | 12 + .../src/main/res/values-mr/strings.xml | 12 + .../src/main/res/values-ms/strings.xml | 12 + .../src/main/res/values-my/strings.xml | 12 + .../src/main/res/values-nb/strings.xml | 12 + .../src/main/res/values-ne/strings.xml | 12 + .../src/main/res/values-nl/strings.xml | 12 + .../src/main/res/values-or/strings.xml | 12 + .../src/main/res/values-pa/strings.xml | 12 + .../src/main/res/values-pl/strings.xml | 12 + .../src/main/res/values-pt-rPT/strings.xml | 12 + .../src/main/res/values-pt/strings.xml | 12 + .../src/main/res/values-ro/strings.xml | 12 + .../src/main/res/values-ru/strings.xml | 12 + .../src/main/res/values-si/strings.xml | 12 + .../src/main/res/values-sk/strings.xml | 12 + .../src/main/res/values-sl/strings.xml | 12 + .../src/main/res/values-sq/strings.xml | 12 + .../src/main/res/values-sr/strings.xml | 12 + .../src/main/res/values-sv/strings.xml | 12 + .../src/main/res/values-sw/strings.xml | 12 + .../src/main/res/values-ta/strings.xml | 12 + .../src/main/res/values-te/strings.xml | 12 + .../src/main/res/values-th/strings.xml | 12 + .../src/main/res/values-tl/strings.xml | 12 + .../src/main/res/values-tr/strings.xml | 12 + .../src/main/res/values-uk/strings.xml | 12 + .../src/main/res/values-ur/strings.xml | 12 + .../src/main/res/values-uz/strings.xml | 12 + .../src/main/res/values-vi/strings.xml | 12 + .../src/main/res/values-zh-rCN/strings.xml | 12 + .../src/main/res/values-zh-rHK/strings.xml | 12 + .../src/main/res/values-zh-rTW/strings.xml | 12 + .../src/main/res/values-zu/strings.xml | 12 + .../exoplayer/src/main/res/values/strings.xml | 35 + libraries/exoplayer_hls/build.gradle.kts | 19 + .../src/main/AndroidManifest.xml | 19 + .../exoplayer/hls/Aes128DataSource.java | 131 + .../media3/exoplayer/hls/AssetListParser.java | 111 + .../hls/BundledHlsMediaChunkExtractor.java | 162 + .../hls/DefaultHlsDataSourceFactory.java | 39 + .../hls/DefaultHlsExtractorFactory.java | 356 ++ .../hls/FullSegmentEncryptionKeyCache.java | 86 + .../media3/exoplayer/hls/HlsChunkSource.java | 1410 +++++ .../hls/HlsContentSteeringTracker.java | 353 ++ .../exoplayer/hls/HlsDataSourceFactory.java | 33 + .../exoplayer/hls/HlsExtractorFactory.java | 146 + .../hls/HlsInterstitialsAdsLoader.java | 2694 ++++++++++ .../media3/exoplayer/hls/HlsManifest.java | 41 + .../media3/exoplayer/hls/HlsMediaChunk.java | 703 +++ .../exoplayer/hls/HlsMediaChunkExtractor.java | 75 + .../media3/exoplayer/hls/HlsMediaPeriod.java | 1051 ++++ .../media3/exoplayer/hls/HlsMediaSource.java | 803 +++ .../media3/exoplayer/hls/HlsSampleStream.java | 97 + .../exoplayer/hls/HlsSampleStreamWrapper.java | 2056 ++++++++ .../exoplayer/hls/HlsTrackMetadataEntry.java | 180 + .../MediaParserHlsMediaChunkExtractor.java | 311 ++ .../hls/SampleQueueMappingException.java | 34 + .../hls/TimestampAdjusterProvider.java | 57 + .../UnexpectedSampleTimestampException.java | 66 + .../media3/exoplayer/hls/WebvttExtractor.java | 234 + .../exoplayer/hls/offline/HlsDownloader.java | 305 ++ .../exoplayer/hls/offline/package-info.java | 19 + .../media3/exoplayer/hls/package-info.java | 19 + .../DefaultHlsPlaylistParserFactory.java | 37 + .../playlist/DefaultHlsPlaylistTracker.java | 1404 +++++ .../FilteringHlsPlaylistParserFactory.java | 60 + .../hls/playlist/HlsMediaPlaylist.java | 1622 ++++++ .../hls/playlist/HlsMultivariantPlaylist.java | 395 ++ .../exoplayer/hls/playlist/HlsPlaylist.java | 49 + .../hls/playlist/HlsPlaylistParser.java | 1909 +++++++ .../playlist/HlsPlaylistParserFactory.java | 46 + .../hls/playlist/HlsPlaylistTracker.java | 305 ++ .../hls/playlist/HlsRedundantGroup.java | 588 +++ .../exoplayer/hls/playlist/package-info.java | 19 + libraries/extractor/build.gradle.kts | 20 + .../extractor/src/main/AndroidManifest.xml | 19 + .../androidx/media3/extractor/AacUtil.java | 393 ++ .../androidx/media3/extractor/Ac3Util.java | 636 +++ .../androidx/media3/extractor/Ac4Util.java | 841 +++ .../androidx/media3/extractor/Av1Config.java | 249 + .../androidx/media3/extractor/AvcConfig.java | 194 + .../media3/extractor/BinarySearchSeeker.java | 547 ++ .../androidx/media3/extractor/CeaUtil.java | 141 + .../androidx/media3/extractor/ChunkIndex.java | 111 + .../media3/extractor/ChunkIndexMerger.java | 87 + .../media3/extractor/ChunkIndexProvider.java | 38 + .../extractor/ConstantBitrateSeekMap.java | 222 + .../extractor/DefaultExtractorInput.java | 318 ++ .../extractor/DefaultExtractorsFactory.java | 722 +++ .../extractor/DiscardingTrackOutput.java | 77 + .../androidx/media3/extractor/DtsUtil.java | 1026 ++++ .../androidx/media3/extractor/Extractor.java | 153 + .../media3/extractor/ExtractorInput.java | 269 + .../media3/extractor/ExtractorOutput.java | 72 + .../media3/extractor/ExtractorUtil.java | 185 + .../media3/extractor/ExtractorsFactory.java | 118 + .../media3/extractor/FlacFrameReader.java | 385 ++ .../media3/extractor/FlacMetadataReader.java | 287 + .../extractor/FlacSeekTableSeekMap.java | 86 + .../media3/extractor/FlacStreamMetadata.java | 386 ++ .../media3/extractor/ForwardingExtractor.java | 69 + .../extractor/ForwardingExtractorInput.java | 112 + .../extractor/ForwardingExtractorOutput.java | 47 + .../ForwardingExtractorsFactory.java | 76 + .../media3/extractor/ForwardingSeekMap.java | 53 + .../extractor/ForwardingTrackOutput.java | 80 + .../media3/extractor/GaplessInfoHolder.java | 112 + .../androidx/media3/extractor/HevcConfig.java | 312 ++ .../androidx/media3/extractor/Id3Peeker.java | 165 + .../media3/extractor/IndexSeekMap.java | 147 + .../media3/extractor/MpegAudioUtil.java | 287 + .../media3/extractor/NoOpExtractorOutput.java | 38 + .../media3/extractor/PositionHolder.java | 26 + .../androidx/media3/extractor/SeekMap.java | 158 + .../androidx/media3/extractor/SeekPoint.java | 66 + .../extractor/SingleSampleExtractor.java | 150 + .../media3/extractor/SingleSampleSeekMap.java | 67 + .../media3/extractor/SniffFailure.java | 22 + .../extractor/StartOffsetExtractorInput.java | 70 + .../extractor/StartOffsetExtractorOutput.java | 65 + .../media3/extractor/TrackAwareSeekMap.java | 49 + .../media3/extractor/TrackOutput.java | 220 + .../extractor/TrueHdSampleRechunker.java | 94 + .../androidx/media3/extractor/VorbisUtil.java | 164 + .../androidx/media3/extractor/VvcConfig.java | 170 + .../media3/extractor/amr/AmrExtractor.java | 501 ++ .../media3/extractor/amr/package-info.java | 19 + .../media3/extractor/avi/AviChunk.java | 27 + .../media3/extractor/avi/AviExtractor.java | 605 +++ .../extractor/avi/AviMainHeaderChunk.java | 56 + .../extractor/avi/AviStreamHeaderChunk.java | 97 + .../media3/extractor/avi/ChunkReader.java | 234 + .../media3/extractor/avi/ListChunk.java | 94 + .../extractor/avi/StreamFormatChunk.java | 149 + .../media3/extractor/avi/StreamNameChunk.java | 37 + .../media3/extractor/avi/package-info.java | 19 + .../media3/extractor/avif/AvifExtractor.java | 85 + .../media3/extractor/avif/package-info.java | 19 + .../media3/extractor/bmp/BmpExtractor.java | 67 + .../media3/extractor/bmp/package-info.java | 19 + .../flac/FlacBinarySearchSeeker.java | 130 + .../media3/extractor/flac/FlacConstants.java | 75 + .../media3/extractor/flac/FlacExtractor.java | 447 ++ .../media3/extractor/flac/package-info.java | 19 + .../extractor/flv/AudioTagPayloadReader.java | 130 + .../media3/extractor/flv/FlvExtractor.java | 324 ++ .../extractor/flv/ScriptTagPayloadReader.java | 271 + .../extractor/flv/TagPayloadReader.java | 83 + .../extractor/flv/VideoTagPayloadReader.java | 145 + .../media3/extractor/flv/package-info.java | 19 + .../heif/HeicMotionPhotoExtractor.java | 246 + .../media3/extractor/heif/HeifExtractor.java | 145 + .../media3/extractor/heif/HeifSniffer.java | 106 + .../media3/extractor/heif/package-info.java | 19 + .../media3/extractor/jpeg/JpegExtractor.java | 147 + .../jpeg/JpegMotionPhotoExtractor.java | 338 ++ .../jpeg/MotionPhotoDescription.java | 130 + .../jpeg/XmpMotionPhotoDescriptionParser.java | 211 + .../media3/extractor/jpeg/package-info.java | 19 + .../media3/extractor/metadata/Chapter.java | 133 + .../extractor/metadata/ChapterImpl.java | 105 + .../extractor/metadata/MetadataDecoder.java | 39 + .../metadata/MetadataInputBuffer.java | 35 + .../metadata/MotionPhotoMetadata.java | 100 + .../metadata/SimpleMetadataDecoder.java | 51 + .../extractor/metadata/ThumbnailMetadata.java | 62 + .../metadata/dvbsi/AppInfoTable.java | 54 + .../metadata/dvbsi/AppInfoTableDecoder.java | 139 + .../metadata/dvbsi/package-info.java | 20 + .../extractor/metadata/emsg/EventMessage.java | 150 + .../metadata/emsg/EventMessageDecoder.java | 47 + .../metadata/emsg/EventMessageEncoder.java | 66 + .../extractor/metadata/emsg/package-info.java | 19 + .../extractor/metadata/flac/PictureFrame.java | 147 + .../extractor/metadata/flac/package-info.java | 19 + .../extractor/metadata/icy/IcyDecoder.java | 103 + .../extractor/metadata/icy/IcyHeaders.java | 219 + .../extractor/metadata/icy/IcyInfo.java | 82 + .../extractor/metadata/icy/package-info.java | 19 + .../extractor/metadata/id3/ApicFrame.java | 78 + .../extractor/metadata/id3/BinaryFrame.java | 52 + .../extractor/metadata/id3/ChapterFrame.java | 140 + .../metadata/id3/ChapterTocFrame.java | 83 + .../extractor/metadata/id3/CommentFrame.java | 66 + .../extractor/metadata/id3/GeobFrame.java | 77 + .../extractor/metadata/id3/Id3Decoder.java | 926 ++++ .../extractor/metadata/id3/Id3Frame.java | 36 + .../extractor/metadata/id3/Id3Util.java | 242 + .../extractor/metadata/id3/InternalFrame.java | 66 + .../extractor/metadata/id3/MlltFrame.java | 74 + .../extractor/metadata/id3/PrivFrame.java | 62 + .../metadata/id3/TextInformationFrame.java | 251 + .../extractor/metadata/id3/UrlLinkFrame.java | 62 + .../extractor/metadata/id3/package-info.java | 19 + .../metadata/mp4/SlowMotionData.java | 148 + .../metadata/mp4/SmtaMetadataEntry.java | 76 + .../extractor/metadata/mp4/package-info.java | 19 + .../extractor/metadata/package-info.java | 19 + .../metadata/scte35/PrivateCommand.java | 56 + .../metadata/scte35/SpliceCommand.java | 29 + .../metadata/scte35/SpliceInfoDecoder.java | 98 + .../metadata/scte35/SpliceInsertCommand.java | 209 + .../metadata/scte35/SpliceNullCommand.java | 22 + .../scte35/SpliceScheduleCommand.java | 191 + .../metadata/scte35/TimeSignalCommand.java | 74 + .../metadata/scte35/package-info.java | 19 + .../metadata/vorbis/VorbisComment.java | 127 + .../metadata/vorbis/package-info.java | 19 + .../extractor/mkv/DefaultEbmlReader.java | 259 + .../media3/extractor/mkv/EbmlProcessor.java | 159 + .../media3/extractor/mkv/EbmlReader.java | 55 + .../extractor/mkv/MatroskaExtractor.java | 3380 ++++++++++++ .../media3/extractor/mkv/Sniffer.java | 112 + .../media3/extractor/mkv/VarintReader.java | 150 + .../media3/extractor/mkv/package-info.java | 19 + .../extractor/mp3/ConstantBitrateSeeker.java | 150 + .../media3/extractor/mp3/IndexSeeker.java | 112 + .../media3/extractor/mp3/MlltSeeker.java | 140 + .../media3/extractor/mp3/Mp3Extractor.java | 780 +++ .../extractor/mp3/Mp3InfoReplayGain.java | 255 + .../media3/extractor/mp3/Mp3Util.java | 37 + .../androidx/media3/extractor/mp3/Seeker.java | 82 + .../media3/extractor/mp3/VbriSeeker.java | 175 + .../media3/extractor/mp3/XingFrame.java | 191 + .../media3/extractor/mp3/XingSeeker.java | 183 + .../media3/extractor/mp3/package-info.java | 19 + .../mp4/AtomSizeTooSmallSniffFailure.java | 48 + .../media3/extractor/mp4/BoxParser.java | 2960 +++++++++++ .../extractor/mp4/DefaultSampleValues.java | 31 + .../mp4/FixedSampleSizeRechunker.java | 122 + .../extractor/mp4/FragmentedMp4Extractor.java | 2605 +++++++++ .../IncorrectFragmentationSniffFailure.java | 44 + .../media3/extractor/mp4/MetadataUtil.java | 448 ++ .../extractor/mp4/MimeTypeResolver.java | 114 + .../media3/extractor/mp4/Mp4Extractor.java | 1533 ++++++ .../mp4/NoDeclaredBrandSniffFailure.java | 33 + .../media3/extractor/mp4/PsshAtomUtil.java | 227 + .../media3/extractor/mp4/SefReader.java | 282 + .../media3/extractor/mp4/SmtaAtomUtil.java | 142 + .../media3/extractor/mp4/Sniffer.java | 269 + .../androidx/media3/extractor/mp4/Track.java | 432 ++ .../extractor/mp4/TrackEncryptionBox.java | 104 + .../media3/extractor/mp4/TrackFragment.java | 196 + .../extractor/mp4/TrackSampleTable.java | 199 + .../mp4/UnsupportedBrandsSniffFailure.java | 59 + .../media3/extractor/mp4/package-info.java | 19 + .../extractor/ogg/DefaultOggSeeker.java | 280 + .../media3/extractor/ogg/FlacReader.java | 164 + .../media3/extractor/ogg/OggExtractor.java | 121 + .../media3/extractor/ogg/OggPacket.java | 153 + .../media3/extractor/ogg/OggPageHeader.java | 171 + .../media3/extractor/ogg/OggSeeker.java | 57 + .../media3/extractor/ogg/OpusReader.java | 143 + .../media3/extractor/ogg/StreamReader.java | 301 ++ .../media3/extractor/ogg/VorbisReader.java | 202 + .../media3/extractor/ogg/package-info.java | 19 + .../media3/extractor/package-info.java | 19 + .../media3/extractor/png/PngExtractor.java | 69 + .../media3/extractor/png/package-info.java | 19 + .../media3/extractor/text/CueDecoder.java | 60 + .../media3/extractor/text/CueEncoder.java | 51 + .../media3/extractor/text/CuesWithTiming.java | 79 + .../text/CuesWithTimingSubtitle.java | 131 + .../text/DefaultSubtitleParserFactory.java | 126 + .../extractor/text/LegacySubtitleUtil.java | 110 + .../extractor/text/SimpleSubtitleDecoder.java | 100 + .../media3/extractor/text/Subtitle.java | 59 + .../extractor/text/SubtitleDecoder.java | 34 + .../text/SubtitleDecoderException.java | 47 + .../extractor/text/SubtitleExtractor.java | 335 ++ .../extractor/text/SubtitleInputBuffer.java | 35 + .../extractor/text/SubtitleOutputBuffer.java | 75 + .../media3/extractor/text/SubtitleParser.java | 225 + .../text/SubtitleTranscodingExtractor.java | 81 + .../SubtitleTranscodingExtractorOutput.java | 98 + .../text/SubtitleTranscodingTrackOutput.java | 230 + .../extractor/text/cea/Cea608Decoder.java | 1162 ++++ .../extractor/text/cea/Cea708Decoder.java | 1467 ++++++ .../media3/extractor/text/cea/CeaDecoder.java | 221 + .../extractor/text/cea/CeaSubtitle.java | 58 + .../extractor/text/cea/package-info.java | 19 + .../media3/extractor/text/dvb/DvbParser.java | 1162 ++++ .../extractor/text/dvb/package-info.java | 19 + .../media3/extractor/text/package-info.java | 19 + .../media3/extractor/text/pgs/PgsParser.java | 276 + .../extractor/text/pgs/package-info.java | 19 + .../extractor/text/ssa/SsaDialogueFormat.java | 97 + .../media3/extractor/text/ssa/SsaParser.java | 591 +++ .../media3/extractor/text/ssa/SsaStyle.java | 538 ++ .../extractor/text/ssa/package-info.java | 19 + .../extractor/text/subrip/SubripParser.java | 311 ++ .../extractor/text/subrip/package-info.java | 19 + .../extractor/text/ttml/DeleteTextSpan.java | 30 + .../extractor/text/ttml/TextEmphasis.java | 222 + .../media3/extractor/text/ttml/TtmlNode.java | 473 ++ .../extractor/text/ttml/TtmlParser.java | 935 ++++ .../extractor/text/ttml/TtmlRegion.java | 70 + .../extractor/text/ttml/TtmlRenderUtil.java | 322 ++ .../media3/extractor/text/ttml/TtmlStyle.java | 430 ++ .../extractor/text/ttml/TtmlSubtitle.java | 79 + .../extractor/text/ttml/package-info.java | 19 + .../extractor/text/tx3g/Tx3gParser.java | 291 + .../extractor/text/tx3g/package-info.java | 19 + .../extractor/text/vobsub/VobsubParser.java | 479 ++ .../extractor/text/vobsub/package-info.java | 19 + .../text/webvtt/Mp4WebvttParser.java | 129 + .../text/webvtt/WebvttCssParser.java | 401 ++ .../extractor/text/webvtt/WebvttCssStyle.java | 324 ++ .../extractor/text/webvtt/WebvttCueInfo.java | 34 + .../text/webvtt/WebvttCueParser.java | 998 ++++ .../extractor/text/webvtt/WebvttParser.java | 140 + .../text/webvtt/WebvttParserUtil.java | 124 + .../extractor/text/webvtt/WebvttSubtitle.java | 91 + .../extractor/text/webvtt/package-info.java | 20 + .../media3/extractor/ts/Ac3Extractor.java | 149 + .../media3/extractor/ts/Ac3Reader.java | 241 + .../media3/extractor/ts/Ac4Extractor.java | 159 + .../media3/extractor/ts/Ac4Reader.java | 237 + .../media3/extractor/ts/AdtsExtractor.java | 377 ++ .../media3/extractor/ts/AdtsReader.java | 562 ++ .../ts/DefaultTsPayloadReaderFactory.java | 329 ++ .../media3/extractor/ts/DtsReader.java | 457 ++ .../extractor/ts/DvbSubtitleReader.java | 135 + .../extractor/ts/ElementaryStreamReader.java | 84 + .../media3/extractor/ts/H262Reader.java | 362 ++ .../media3/extractor/ts/H263Reader.java | 502 ++ .../media3/extractor/ts/H264Reader.java | 642 +++ .../media3/extractor/ts/H265Reader.java | 420 ++ .../media3/extractor/ts/Id3Reader.java | 138 + .../media3/extractor/ts/LatmReader.java | 336 ++ .../media3/extractor/ts/MpegAudioReader.java | 245 + .../media3/extractor/ts/MpeghReader.java | 383 ++ .../media3/extractor/ts/MpeghUtil.java | 739 +++ .../extractor/ts/NalUnitTargetBuffer.java | 113 + .../ts/PassthroughSectionPayloadReader.java | 95 + .../media3/extractor/ts/PesReader.java | 286 + .../extractor/ts/PsBinarySearchSeeker.java | 211 + .../media3/extractor/ts/PsDurationReader.java | 262 + .../media3/extractor/ts/PsExtractor.java | 423 ++ .../extractor/ts/SectionPayloadReader.java | 50 + .../media3/extractor/ts/SectionReader.java | 144 + .../media3/extractor/ts/SeiReader.java | 107 + .../extractor/ts/TsBinarySearchSeeker.java | 148 + .../media3/extractor/ts/TsDurationReader.java | 202 + .../media3/extractor/ts/TsExtractor.java | 926 ++++ .../media3/extractor/ts/TsPayloadReader.java | 288 + .../androidx/media3/extractor/ts/TsUtil.java | 130 + .../media3/extractor/ts/UserDataReader.java | 93 + .../media3/extractor/ts/package-info.java | 19 + .../media3/extractor/wav/WavExtractor.java | 666 +++ .../media3/extractor/wav/WavFormat.java | 69 + .../media3/extractor/wav/WavHeaderReader.java | 277 + .../media3/extractor/wav/WavSeekMap.java | 74 + .../media3/extractor/wav/package-info.java | 19 + .../media3/extractor/webp/WebpExtractor.java | 84 + .../media3/extractor/webp/package-info.java | 19 + libraries/ui/build.gradle.kts | 20 + libraries/ui/src/main/AndroidManifest.xml | 19 + .../media3/ui/AspectRatioFrameLayout.java | 249 + .../java/androidx/media3/ui/BidiUtils.java | 186 + .../media3/ui/CanvasSubtitleOutput.java | 172 + .../media3/ui/CaptionStyleCompat.java | 148 + .../ui/DefaultMediaDescriptionAdapter.java | 97 + .../androidx/media3/ui/DefaultTimeBar.java | 994 ++++ .../media3/ui/DefaultTrackNameProvider.java | 187 + .../java/androidx/media3/ui/HtmlUtils.java | 43 + .../media3/ui/LegacyPlayerControlView.java | 1355 +++++ .../androidx/media3/ui/PlayerControlView.java | 2537 +++++++++ .../ui/PlayerControlViewLayoutManager.java | 752 +++ .../media3/ui/PlayerNotificationManager.java | 1617 ++++++ .../java/androidx/media3/ui/PlayerView.java | 2035 +++++++ .../media3/ui/SpannedToHtmlConverter.java | 384 ++ .../androidx/media3/ui/SubtitlePainter.java | 474 ++ .../java/androidx/media3/ui/SubtitleView.java | 385 ++ .../androidx/media3/ui/SubtitleViewUtils.java | 106 + .../main/java/androidx/media3/ui/TimeBar.java | 138 + .../androidx/media3/ui/TrackNameProvider.java | 27 + .../ui/TrackSelectionDialogBuilder.java | 321 ++ .../media3/ui/TrackSelectionView.java | 437 ++ ...utPlaybackSuppressionResolverListener.java | 248 + .../media3/ui/WebViewSubtitleOutput.java | 438 ++ .../java/androidx/media3/ui/package-info.java | 19 + .../drawable-anydpi/exo_edit_mode_logo.xml | 44 + .../res/drawable-anydpi/exo_ic_audiotrack.xml | 31 + .../main/res/drawable-anydpi/exo_ic_check.xml | 28 + .../drawable-anydpi/exo_ic_chevron_left.xml | 24 + .../drawable-anydpi/exo_ic_chevron_right.xml | 24 + .../exo_ic_default_album_image.xml | 29 + .../res/drawable-anydpi/exo_ic_forward.xml | 31 + .../exo_ic_fullscreen_enter.xml | 25 + .../exo_ic_fullscreen_exit.xml | 25 + .../exo_ic_pause_circle_filled.xml | 25 + .../exo_ic_play_circle_filled.xml | 25 + .../res/drawable-anydpi/exo_ic_rewind.xml | 31 + .../res/drawable-anydpi/exo_ic_settings.xml | 25 + .../res/drawable-anydpi/exo_ic_skip_next.xml | 25 + .../drawable-anydpi/exo_ic_skip_previous.xml | 25 + .../main/res/drawable-anydpi/exo_ic_speed.xml | 25 + .../drawable-anydpi/exo_ic_subtitle_off.xml | 34 + .../drawable-anydpi/exo_ic_subtitle_on.xml | 28 + .../exo_icon_circular_play.xml | 25 + .../drawable-anydpi/exo_icon_fastforward.xml | 25 + .../exo_icon_fullscreen_enter.xml | 24 + .../exo_icon_fullscreen_exit.xml | 24 + .../res/drawable-anydpi/exo_icon_next.xml | 25 + .../res/drawable-anydpi/exo_icon_pause.xml | 25 + .../res/drawable-anydpi/exo_icon_play.xml | 25 + .../res/drawable-anydpi/exo_icon_previous.xml | 25 + .../drawable-anydpi/exo_icon_repeat_all.xml | 23 + .../drawable-anydpi/exo_icon_repeat_off.xml | 23 + .../drawable-anydpi/exo_icon_repeat_one.xml | 23 + .../res/drawable-anydpi/exo_icon_rewind.xml | 25 + .../drawable-anydpi/exo_icon_shuffle_off.xml | 26 + .../drawable-anydpi/exo_icon_shuffle_on.xml | 26 + .../res/drawable-anydpi/exo_icon_stop.xml | 27 + .../main/res/drawable-anydpi/exo_icon_vr.xml | 25 + .../res/drawable/exo_rounded_rectangle.xml | 19 + .../main/res/font/roboto_medium_numbers.ttf | Bin 0 -> 3316 bytes .../layout/exo_legacy_player_control_view.xml | 96 + .../src/main/res/layout/exo_list_divider.xml | 19 + .../layout/exo_player_control_ffwd_button.xml | 25 + .../exo_player_control_rewind_button.xml | 25 + .../res/layout/exo_player_control_view.xml | 166 + .../src/main/res/layout/exo_player_view.xml | 81 + .../res/layout/exo_styled_settings_list.xml | 22 + .../layout/exo_styled_settings_list_item.xml | 62 + .../exo_styled_sub_settings_list_item.xml | 47 + .../res/layout/exo_track_selection_dialog.xml | 24 + .../ui/src/main/res/values-af/strings.xml | 61 + .../ui/src/main/res/values-am/strings.xml | 61 + .../ui/src/main/res/values-ar/strings.xml | 69 + .../ui/src/main/res/values-as/strings.xml | 61 + .../ui/src/main/res/values-az/strings.xml | 61 + .../src/main/res/values-b+sr+Latn/strings.xml | 63 + .../ui/src/main/res/values-be/strings.xml | 65 + .../ui/src/main/res/values-bg/strings.xml | 61 + .../ui/src/main/res/values-bn/strings.xml | 61 + .../ui/src/main/res/values-bs/strings.xml | 63 + .../ui/src/main/res/values-ca/strings.xml | 61 + .../ui/src/main/res/values-cs/strings.xml | 65 + .../ui/src/main/res/values-da/strings.xml | 61 + .../ui/src/main/res/values-de/strings.xml | 61 + .../ui/src/main/res/values-el/strings.xml | 61 + .../ui/src/main/res/values-en-rAU/strings.xml | 61 + .../ui/src/main/res/values-en-rGB/strings.xml | 61 + .../ui/src/main/res/values-en-rIN/strings.xml | 61 + .../ui/src/main/res/values-es-rUS/strings.xml | 61 + .../ui/src/main/res/values-es/strings.xml | 61 + .../ui/src/main/res/values-et/strings.xml | 61 + .../ui/src/main/res/values-eu/strings.xml | 61 + .../ui/src/main/res/values-fa/strings.xml | 61 + .../ui/src/main/res/values-fi/strings.xml | 61 + .../ui/src/main/res/values-fr-rCA/strings.xml | 61 + .../ui/src/main/res/values-fr/strings.xml | 61 + .../ui/src/main/res/values-gl/strings.xml | 61 + .../ui/src/main/res/values-gu/strings.xml | 61 + .../ui/src/main/res/values-hi/strings.xml | 61 + .../ui/src/main/res/values-hr/strings.xml | 63 + .../ui/src/main/res/values-hu/strings.xml | 61 + .../ui/src/main/res/values-hy/strings.xml | 61 + .../ui/src/main/res/values-in/strings.xml | 61 + .../ui/src/main/res/values-is/strings.xml | 61 + .../ui/src/main/res/values-it/strings.xml | 61 + .../ui/src/main/res/values-iw/strings.xml | 63 + .../ui/src/main/res/values-ja/strings.xml | 61 + .../ui/src/main/res/values-ka/strings.xml | 61 + .../ui/src/main/res/values-kk/strings.xml | 61 + .../ui/src/main/res/values-km/strings.xml | 61 + .../ui/src/main/res/values-kn/strings.xml | 61 + .../ui/src/main/res/values-ko/strings.xml | 61 + .../ui/src/main/res/values-ky/strings.xml | 61 + .../ui/src/main/res/values-lo/strings.xml | 61 + .../ui/src/main/res/values-lt/strings.xml | 65 + .../ui/src/main/res/values-lv/strings.xml | 63 + .../ui/src/main/res/values-mk/strings.xml | 61 + .../ui/src/main/res/values-ml/strings.xml | 61 + .../ui/src/main/res/values-mn/strings.xml | 61 + .../ui/src/main/res/values-mr/strings.xml | 61 + .../ui/src/main/res/values-ms/strings.xml | 61 + .../ui/src/main/res/values-my/strings.xml | 61 + .../ui/src/main/res/values-nb/strings.xml | 61 + .../ui/src/main/res/values-ne/strings.xml | 61 + .../ui/src/main/res/values-nl/strings.xml | 61 + .../ui/src/main/res/values-or/strings.xml | 61 + .../ui/src/main/res/values-pa/strings.xml | 61 + .../ui/src/main/res/values-pl/strings.xml | 65 + .../ui/src/main/res/values-pt-rPT/strings.xml | 61 + .../ui/src/main/res/values-pt/strings.xml | 61 + .../ui/src/main/res/values-ro/strings.xml | 63 + .../ui/src/main/res/values-ru/strings.xml | 65 + .../ui/src/main/res/values-si/strings.xml | 61 + .../ui/src/main/res/values-sk/strings.xml | 65 + .../ui/src/main/res/values-sl/strings.xml | 65 + .../ui/src/main/res/values-sq/strings.xml | 61 + .../ui/src/main/res/values-sr/strings.xml | 63 + .../ui/src/main/res/values-sv/strings.xml | 61 + .../ui/src/main/res/values-sw/strings.xml | 61 + .../ui/src/main/res/values-ta/strings.xml | 61 + .../ui/src/main/res/values-te/strings.xml | 61 + .../ui/src/main/res/values-th/strings.xml | 61 + .../ui/src/main/res/values-tl/strings.xml | 61 + .../ui/src/main/res/values-tr/strings.xml | 61 + .../ui/src/main/res/values-uk/strings.xml | 65 + .../ui/src/main/res/values-ur/strings.xml | 61 + .../ui/src/main/res/values-uz/strings.xml | 61 + .../ui/src/main/res/values-vi/strings.xml | 61 + .../ui/src/main/res/values-zh-rCN/strings.xml | 61 + .../ui/src/main/res/values-zh-rHK/strings.xml | 61 + .../ui/src/main/res/values-zh-rTW/strings.xml | 61 + .../ui/src/main/res/values-zu/strings.xml | 61 + libraries/ui/src/main/res/values/attrs.xml | 274 + libraries/ui/src/main/res/values/colors.xml | 24 + .../ui/src/main/res/values/constants.xml | 26 + libraries/ui/src/main/res/values/dimens.xml | 55 + .../ui/src/main/res/values/drawables.xml | 65 + libraries/ui/src/main/res/values/ids.xml | 64 + libraries/ui/src/main/res/values/public.xml | 16 + libraries/ui/src/main/res/values/strings.xml | 126 + libraries/ui/src/main/res/values/styles.xml | 177 + .../ui/src/main/res/values/styles_legacy.xml | 58 + settings.gradle.kts | 41 + 1214 files changed, 315753 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.txt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/hlsmplayer/MediaCatalogUrl.java create mode 100644 app/src/main/java/com/hlsmplayer/PlayerActivity.java create mode 100644 app/src/main/res/drawable/media_browser_item_selector.xml create mode 100644 app/src/main/res/drawable/media_cover_placeholder.xml create mode 100644 app/src/main/res/drawable/player_focus_indicator.xml create mode 100644 app/src/main/res/drawable/tv_banner.xml create mode 100644 app/src/main/res/layout/media_browser_item.xml create mode 100644 app/src/main/res/layout/player_activity.xml create mode 100644 app/src/main/res/layout/player_pane.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/test/java/com/hlsmplayer/MediaCatalogUrlTest.java create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 libraries/common/build.gradle.kts create mode 100644 libraries/common/src/main/AndroidManifest.xml create mode 100644 libraries/common/src/main/java/androidx/media3/common/AdOverlayInfo.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/AdPlaybackState.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/AdViewProvider.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/AudioAttributes.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/AuxEffectInfo.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/BasePlayer.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/BundleListRetriever.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/BundleableByteArray.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/C.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/ColorInfo.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/DataReader.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/DebugViewProvider.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/DeviceInfo.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/DrmInitData.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/Effect.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/ErrorMessageProvider.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/FileTypes.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/FlagSet.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/Format.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/ForwardingPlayer.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/ForwardingSimpleBasePlayer.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/FrameInfo.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/GlObjectsProvider.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/GlTextureInfo.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/HeartRating.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/IllegalSeekPositionException.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/Label.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/MediaItem.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/MediaLibraryInfo.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/MediaMetadata.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/Metadata.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/MimeTypes.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/OnInputFrameProcessedListener.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/OverlaySettings.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/ParserException.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/PercentageRating.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/PlaybackException.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/PlaybackParameters.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/Player.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/PlayerTransferState.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/PriorityTaskManager.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/Rating.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/SimpleBasePlayer.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/SpeedParameters.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/StarRating.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/StreamKey.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/SurfaceInfo.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/ThumbRating.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/Timeline.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/TrackGroup.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/TrackSelectionOverride.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/Tracks.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/VideoCompositorSettings.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/VideoFrameProcessingException.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/VideoFrameProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/VideoGraph.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/VideoSize.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/ViewProvider.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/AudioBecomingNoisyManager.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/AudioFocusManager.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/AudioFocusRequestCompat.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/AudioManagerCompat.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/AudioMixingUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessingPipeline.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/AudioProcessorChain.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/BaseAudioProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/ChannelMixingAudioProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/ChannelMixingMatrix.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/DefaultGainProvider.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/GainProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/Sonic.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/SonicAudioProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/SpeedChangingAudioProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/SpeedProvider.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/SynchronizedSonicAudioProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/ToInt16PcmAudioProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/audio/package-info.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/package-info.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/Cue.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/CueGroup.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/CustomSpanBundler.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/HorizontalTextInVerticalContextSpan.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/LanguageFeatureSpan.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/RubySpan.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/SpanUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/TextAnnotation.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/TextEmphasisSpan.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/VoiceSpan.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/text/package-info.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/Assertions.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/AtomicFile.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/BackgroundExecutor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/BackgroundThreadStateHandler.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/BitmapLoader.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/BundleCollectionUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/CircularIntArray.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/Clock.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/CodecSpecificDataUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/ColorParser.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/ConditionVariable.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/ConstantRateTimestampIterator.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/Consumer.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/CopyOnWriteMultiset.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/EGLSurfaceTexture.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/ElapsedRealtimeTicker.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/ExperimentalApi.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/GlProgram.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/GlRect.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/GlUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/HandlerWrapper.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/LibraryLoader.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/ListenerSet.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/Log.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/LongArray.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/LongArrayQueue.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/MediaFormatUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/NetworkTypeObserver.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/NonNullApi.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/NotificationUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/NullableType.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/ParsableBitArray.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/ParsableByteArray.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/RepeatModeUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/RunnableFutureTask.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/Size.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/SpeedProviderUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/StuckPlayerDetector.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/StuckPlayerException.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/SystemClock.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/SystemHandlerWrapper.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/ThrowingRunnable.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/TimedValueQueue.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/TimestampAdjuster.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/TimestampConsumer.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/TimestampIterator.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/TraceUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/UnknownNull.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/UnstableApi.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/UriUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/Util.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/WakeLockManager.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/WavUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/WifiLockManager.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/XmlPullParserUtil.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/util/package-info.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/AsyncFrame.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/DefaultHardwareBufferFrame.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/Frame.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/FrameProcessor.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/FrameWriter.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/HardwareBufferFrame.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/HardwareBufferNativeHelpers.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/HardwareBufferPool.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/SurfaceHolderFrameWriter.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/SyncFenceWrapper.java create mode 100644 libraries/common/src/main/java/androidx/media3/common/video/package-info.java create mode 100644 libraries/container/build.gradle.kts create mode 100644 libraries/container/src/main/AndroidManifest.xml create mode 100644 libraries/container/src/main/java/androidx/media3/container/DolbyVisionConfig.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/MdtaMetadataEntry.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/Mp4AlternateGroupData.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/Mp4Box.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/Mp4LocationData.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/Mp4OrientationData.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/Mp4TimestampData.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/NalUnitUtil.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/ObuParser.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/OpusUtil.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/ParsableNalUnitBitArray.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/ReorderingBufferQueue.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/VorbisBitArray.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/VorbisUtil.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/XmpData.java create mode 100644 libraries/container/src/main/java/androidx/media3/container/package-info.java create mode 100644 libraries/database/build.gradle.kts create mode 100644 libraries/database/src/main/AndroidManifest.xml create mode 100644 libraries/database/src/main/java/androidx/media3/database/DatabaseIOException.java create mode 100644 libraries/database/src/main/java/androidx/media3/database/DatabaseProvider.java create mode 100644 libraries/database/src/main/java/androidx/media3/database/DefaultDatabaseProvider.java create mode 100644 libraries/database/src/main/java/androidx/media3/database/ExoDatabaseProvider.java create mode 100644 libraries/database/src/main/java/androidx/media3/database/StandaloneDatabaseProvider.java create mode 100644 libraries/database/src/main/java/androidx/media3/database/VersionTable.java create mode 100644 libraries/database/src/main/java/androidx/media3/database/package-info.java create mode 100644 libraries/datasource/build.gradle.kts create mode 100644 libraries/datasource/src/main/AndroidManifest.xml create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/AesCipherDataSink.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/AesCipherDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/AesFlushingCipher.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/AssetDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/BaseDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/BitmapUtil.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/ByteArrayDataSink.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/ByteArrayDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/ByteArrayUploadDataProvider.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/ContentDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DataSchemeDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DataSink.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DataSourceBitmapLoader.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DataSourceException.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DataSourceInputStream.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DataSourceUtil.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DataSpec.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DefaultDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DefaultDataSourceFactory.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/DefaultHttpDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/FileDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/FileDescriptorDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/HttpDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/HttpEngineDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/HttpUtil.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/MediaDataSourceAdapter.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/PlaceholderDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/PriorityDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/PriorityDataSourceFactory.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/RawResourceDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/ResolvingDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/StatsDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/TeeDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/TransferListener.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/UdpDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/Cache.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSink.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheDataSource.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheEvictor.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheFileMetadata.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheFileMetadataIndex.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheKeyFactory.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheSpan.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CacheWriter.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContent.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/CachedContentIndex.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/ContentMetadata.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/ContentMetadataMutations.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/DefaultContentMetadata.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/LeastRecentlyUsedCacheEvictor.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/NoOpCacheEvictor.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/ReusableBufferedOutputStream.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/SimpleCache.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/SimpleCacheSpan.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/cache/package-info.java create mode 100644 libraries/datasource/src/main/java/androidx/media3/datasource/package-info.java create mode 100644 libraries/decoder/build.gradle.kts create mode 100644 libraries/decoder/src/main/AndroidManifest.xml create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/Buffer.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/CryptoConfig.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/CryptoException.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/CryptoInfo.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/Decoder.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/DecoderException.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/DecoderInputBuffer.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/DecoderOutputBuffer.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/SimpleDecoder.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/SimpleDecoderOutputBuffer.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/VideoDecoderOutputBuffer.java create mode 100644 libraries/decoder/src/main/java/androidx/media3/decoder/package-info.java create mode 100644 libraries/exoplayer/build.gradle.kts create mode 100644 libraries/exoplayer/src/main/AndroidManifest.xml create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/AbstractConcatenatedTimeline.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/BaseRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/CodecParameters.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/CodecParametersChangeListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderCounters.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderReuseEvaluation.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultLivePlaybackSpeedControl.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultLoadControl.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultMediaClock.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRendererCapabilitiesList.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultSuitableOutputChecker.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlaybackException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoTimeoutException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/FormatHolder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ForwardingRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/LivePlaybackSpeedControl.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/LoadControl.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/LoadingInfo.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaClock.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodHolder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodInfo.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaPeriodQueue.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceInfoHolder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/NoSampleRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/PlaybackInfo.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/PlaybackLooperProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/PlayerMessage.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/PlaylistTimeline.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/Renderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilities.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilitiesList.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererConfiguration.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererHolder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RenderersFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ScrubbingModeParameters.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SeekParameters.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SimpleExoPlayer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/StandaloneMediaClock.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/StreamVolumeManager.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/SuitableOutputChecker.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsCollector.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultPlaybackSessionManager.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/MediaMetricsListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/PlaybackSessionManager.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/PlaybackStats.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/PlaybackStatsListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/PlayerId.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioCapabilities.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioCapabilitiesReceiver.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioDescriptorUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioOffloadSupport.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioOutput.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioOutputProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioRendererEventListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioSink.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTimestampPoller.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackAudioOutput.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackAudioOutputProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackPositionTracker.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ChannelMappingAudioProcessor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DecoderAudioRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioOffloadSupportProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DeviceTypeUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ForwardingAudioOutput.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ForwardingAudioOutputProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ForwardingAudioSink.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/IamfUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/MediaCodecAudioRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/OggOpusAudioPacketizer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/PcmAudioUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/SilenceSkippingAudioProcessor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/SpeakerLayoutUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/TeeAudioProcessor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/TrimmingAudioProcessor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/WaveformAudioBufferSink.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/ClearKeyUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSession.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManager.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DefaultDrmSessionManagerProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSession.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionEventListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionManager.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmSessionManagerProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DrmUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/DummyExoMediaDrm.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/ErrorStateDrmSession.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/ExoMediaDrm.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkCryptoConfig.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/FrameworkMediaDrm.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/HttpMediaDrmCallback.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/KeyRequestInfo.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/KeysExpiredException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/LocalMediaDrmCallback.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/MediaDrmCallback.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/MediaDrmCallbackException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/OfflineLicenseHelper.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/UnsupportedDrmException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/WidevineUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/drm/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/BitmapFactoryImageDecoder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ExternallyLoadedImageDecoder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageDecoder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageDecoderException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageMetadataListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageOutput.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageOutputBuffer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/ImageRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapter.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecCallback.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/BatchBuffer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/DefaultMediaCodecAdapterFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/ForwardingMediaCodecAdapter.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/LoudnessCodecController.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecAdapter.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecBufferEnqueuer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecDecoderException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecInfo.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecPerformancePointCoverageProvider.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecSelector.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/SynchronousMediaCodecAdapter.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/SynchronousMediaCodecBufferEnqueuer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/metadata/MetadataDecoderFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/metadata/MetadataOutput.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/metadata/MetadataRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/metadata/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DefaultDownloadIndex.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DefaultDownloaderFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/Download.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadCursor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadIndex.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadManager.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadNotificationHelper.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadProgress.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadRequest.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadService.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/Downloader.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloaderFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/FilterableManifest.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/FilteringManifestParser.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/ProgressiveDownloader.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/SegmentDownloader.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/SegmentDownloaderFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/WritableDownloadIndex.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/scheduler/PlatformScheduler.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/scheduler/Requirements.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/scheduler/RequirementsWatcher.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/scheduler/Scheduler.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/scheduler/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/BaseMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/BehindLiveWindowException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/BundledExtractorsAdapter.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ClippingMediaPeriod.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ClippingMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoader.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeSequenceableLoaderFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ConcatenatingMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ConcatenatingMediaSource2.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultCompositeSequenceableLoaderFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/DefaultMediaSourceFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/EmptySampleStream.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ExternalLoader.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ExternallyLoadedMediaPeriod.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ExternallyLoadedMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/FilteringMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ForwardingMediaSourceFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ForwardingTimeline.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/IcyDataSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/LoadEventInfo.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/LoopingMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MaskingMediaPeriod.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MaskingMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaLoadData.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaParserExtractorAdapter.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaPeriod.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMetadataSampleStream.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaExtractor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleDataQueue.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleQueue.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SampleStream.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SequenceableLoader.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ShuffleOrder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SilenceMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SinglePeriodTimeline.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SpannedData.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TimeOffsetMediaPeriod.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TimelineWithUpdatedMediaItem.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/TrackGroupArray.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/UnrecognizedInputFormatException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/WrappingMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/AdsLoader.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/AdsMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/SinglePeriodAdTimeline.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BaseMediaChunk.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BaseMediaChunkIterator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BaseMediaChunkOutput.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/BundledChunkExtractor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/Chunk.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkExtractor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkHolder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ContainerMediaChunk.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/DataChunk.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/InitializationChunk.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/MediaChunk.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/MediaChunkIterator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/MediaParserChunkExtractor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/SingleSampleMediaChunk.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/mediaparser/InputReaderAdapterV30.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/mediaparser/MediaParserUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/mediaparser/OutputConsumerAdapterV30.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/mediaparser/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/BasePreloadManager.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/DefaultPreloadManager.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/MediaSourceFactorySupplier.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/PreCacheHelper.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/PreloadException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/PreloadManagerListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/PreloadMediaPeriod.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/PreloadMediaSource.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/RankingDataComparator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/TargetPreloadStatusControl.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/preload/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/CuesResolver.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/DelegatingSubtitleDecoder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/MergingCuesResolver.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/ReplacingCuesResolver.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/SubtitleDecoderFactory.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextOutput.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/TextRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/text/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/AdaptiveTrackSelection.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/BaseTrackSelection.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ExoTrackSelection.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/FixedTrackSelection.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/ForwardingTrackSelection.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/MappingTrackSelector.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/RandomTrackSelection.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelection.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectionArray.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectionUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelector.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelectorResult.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Allocation.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Allocator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/BandwidthMeter.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CachedRegionTracker.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdConfiguration.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdData.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultAllocator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultBandwidthMeter.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/DefaultLoadErrorHandlingPolicy.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/LoadErrorHandlingPolicy.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/Loader.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/LoaderErrorThrower.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/ParsingLoadable.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/PlayerIdAwareAllocator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/SlidingPercentile.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/TimeToFirstByteEstimator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/contentsteering/ContentSteeringTracker.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/contentsteering/SteeringManifest.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/contentsteering/SteeringManifestParser.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/contentsteering/SteeringManifestTracker.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/contentsteering/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/BandwidthEstimator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/BandwidthStatistic.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/CombinedParallelSampleBandwidthEstimator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/ExperimentalBandwidthMeter.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/ExponentialWeightedAverageStatistic.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/ExponentialWeightedAverageTimeToFirstByteEstimator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/PercentileTimeToFirstByteEstimator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/SlidingPercentileBandwidthStatistic.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/SlidingWeightedAverageBandwidthStatistic.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/SplitParallelSampleBandwidthEstimator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/experimental/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/DebugTextViewHelper.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/ReleasableExecutor.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/SntpClient.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/SpatializerWrapper.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/Av1ObuUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/Av1SampleDependencyParser.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DecoderVideoRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DefaultVideoSink.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/FixedFrameRateEstimator.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/HevcSeiUtil.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoDecoderException.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaceholderSurface.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaybackVideoGraphWrapper.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoDecoderGLSurfaceView.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoDecoderOutputBufferRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameMetadataListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseControl.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseEarlyTimeForecaster.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseHelper.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameRenderControl.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoRendererEventListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/package-info.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/CameraMotionListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/CameraMotionRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/FrameRotationQueue.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/OrientationListener.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/Projection.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/ProjectionDecoder.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/ProjectionRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/SceneRenderer.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/SphericalGLSurfaceView.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/TouchTracker.java create mode 100644 libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/spherical/package-info.java create mode 100644 libraries/exoplayer/src/main/res/values-af/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-am/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ar/strings.xml create mode 100755 libraries/exoplayer/src/main/res/values-as/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-az/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-b+sr+Latn/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-be/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-bg/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-bn/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-bs/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ca/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-cs/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-da/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-de/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-el/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-en-rAU/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-en-rGB/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-en-rIN/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-es-rUS/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-es/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-et/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-eu/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-fa/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-fi/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-fr-rCA/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-fr/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-gl/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-gu/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-hi/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-hr/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-hu/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-hy/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-in/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-is/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-it/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-iw/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ja/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ka/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-kk/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-km/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-kn/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ko/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ky/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-lo/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-lt/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-lv/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-mk/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ml/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-mn/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-mr/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ms/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-my/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-nb/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ne/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-nl/strings.xml create mode 100755 libraries/exoplayer/src/main/res/values-or/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-pa/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-pl/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-pt-rPT/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-pt/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ro/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ru/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-si/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-sk/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-sl/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-sq/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-sr/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-sv/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-sw/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ta/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-te/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-th/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-tl/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-tr/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-uk/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-ur/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-uz/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-vi/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-zh-rCN/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-zh-rHK/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-zh-rTW/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values-zu/strings.xml create mode 100644 libraries/exoplayer/src/main/res/values/strings.xml create mode 100644 libraries/exoplayer_hls/build.gradle.kts create mode 100644 libraries/exoplayer_hls/src/main/AndroidManifest.xml create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/Aes128DataSource.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/AssetListParser.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/BundledHlsMediaChunkExtractor.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/DefaultHlsDataSourceFactory.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/DefaultHlsExtractorFactory.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/FullSegmentEncryptionKeyCache.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsChunkSource.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsContentSteeringTracker.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsDataSourceFactory.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsExtractorFactory.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsInterstitialsAdsLoader.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsManifest.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaChunk.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaChunkExtractor.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaPeriod.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsMediaSource.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStream.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsTrackMetadataEntry.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/MediaParserHlsMediaChunkExtractor.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/SampleQueueMappingException.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/TimestampAdjusterProvider.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/UnexpectedSampleTimestampException.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/WebvttExtractor.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/offline/HlsDownloader.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/offline/package-info.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/package-info.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistParserFactory.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/FilteringHlsPlaylistParserFactory.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMediaPlaylist.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsMultivariantPlaylist.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylist.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParser.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistParserFactory.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsPlaylistTracker.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/HlsRedundantGroup.java create mode 100644 libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/package-info.java create mode 100644 libraries/extractor/build.gradle.kts create mode 100644 libraries/extractor/src/main/AndroidManifest.xml create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/AacUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/Ac3Util.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/Ac4Util.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/Av1Config.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/AvcConfig.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/BinarySearchSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/CeaUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ChunkIndex.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ChunkIndexMerger.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ChunkIndexProvider.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ConstantBitrateSeekMap.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/DefaultExtractorInput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/DefaultExtractorsFactory.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/DiscardingTrackOutput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/DtsUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/Extractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ExtractorInput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ExtractorOutput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ExtractorUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ExtractorsFactory.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/FlacFrameReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/FlacMetadataReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/FlacSeekTableSeekMap.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/FlacStreamMetadata.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingExtractorInput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingExtractorOutput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingExtractorsFactory.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingSeekMap.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ForwardingTrackOutput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/GaplessInfoHolder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/HevcConfig.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/Id3Peeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/IndexSeekMap.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/MpegAudioUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/NoOpExtractorOutput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/PositionHolder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/SeekMap.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/SeekPoint.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/SingleSampleExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/SingleSampleSeekMap.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/SniffFailure.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/StartOffsetExtractorInput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/StartOffsetExtractorOutput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/TrackAwareSeekMap.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/TrackOutput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/TrueHdSampleRechunker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/VorbisUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/VvcConfig.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/amr/AmrExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/amr/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avi/AviChunk.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avi/AviExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avi/AviMainHeaderChunk.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avi/AviStreamHeaderChunk.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avi/ChunkReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avi/ListChunk.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avi/StreamFormatChunk.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avi/StreamNameChunk.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avi/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avif/AvifExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/avif/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/bmp/BmpExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/bmp/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flac/FlacBinarySearchSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flac/FlacConstants.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flac/FlacExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flac/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flv/AudioTagPayloadReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flv/FlvExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flv/ScriptTagPayloadReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flv/TagPayloadReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flv/VideoTagPayloadReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/flv/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/heif/HeicMotionPhotoExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/heif/HeifExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/heif/HeifSniffer.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/heif/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/jpeg/JpegExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/jpeg/JpegMotionPhotoExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/jpeg/MotionPhotoDescription.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/jpeg/XmpMotionPhotoDescriptionParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/jpeg/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/Chapter.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/ChapterImpl.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/MetadataDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/MetadataInputBuffer.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/MotionPhotoMetadata.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/SimpleMetadataDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/ThumbnailMetadata.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTable.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/AppInfoTableDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/dvbsi/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/emsg/EventMessage.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/emsg/EventMessageDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/emsg/EventMessageEncoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/emsg/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/flac/PictureFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/flac/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyHeaders.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/IcyInfo.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/icy/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/ApicFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/BinaryFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/ChapterFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/ChapterTocFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/CommentFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/GeobFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Decoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Frame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/Id3Util.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/InternalFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/MlltFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/PrivFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/TextInformationFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/UrlLinkFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/id3/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SlowMotionData.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/SmtaMetadataEntry.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/mp4/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/PrivateCommand.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceCommand.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceInfoDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceInsertCommand.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceNullCommand.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/SpliceScheduleCommand.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/TimeSignalCommand.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/scte35/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/vorbis/VorbisComment.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/metadata/vorbis/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mkv/DefaultEbmlReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mkv/EbmlProcessor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mkv/EbmlReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mkv/Sniffer.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mkv/VarintReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mkv/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/ConstantBitrateSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/IndexSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/MlltSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Extractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3InfoReplayGain.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Mp3Util.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/Seeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/VbriSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingFrame.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/XingSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp3/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomSizeTooSmallSniffFailure.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/DefaultSampleValues.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FixedSampleSizeRechunker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/IncorrectFragmentationSniffFailure.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/MetadataUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/MimeTypeResolver.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Mp4Extractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/NoDeclaredBrandSniffFailure.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/PsshAtomUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/SefReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/SmtaAtomUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Sniffer.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Track.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackEncryptionBox.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackFragment.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/TrackSampleTable.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/UnsupportedBrandsSniffFailure.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/mp4/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/DefaultOggSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/FlacReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OggExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OggPacket.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OggPageHeader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OggSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/OpusReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/StreamReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/VorbisReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ogg/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/png/PngExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/png/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/CueDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/CueEncoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTiming.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/CuesWithTimingSubtitle.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/DefaultSubtitleParserFactory.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/LegacySubtitleUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SimpleSubtitleDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/Subtitle.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleDecoderException.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleInputBuffer.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleOutputBuffer.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleTranscodingExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleTranscodingExtractorOutput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/SubtitleTranscodingTrackOutput.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea608Decoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/Cea708Decoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/CeaDecoder.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/CeaSubtitle.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/cea/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/dvb/DvbParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/dvb/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/pgs/PgsParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/pgs/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaDialogueFormat.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/SsaStyle.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ssa/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/subrip/SubripParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/subrip/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ttml/DeleteTextSpan.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ttml/TextEmphasis.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ttml/TtmlNode.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ttml/TtmlParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ttml/TtmlRegion.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ttml/TtmlRenderUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ttml/TtmlStyle.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ttml/TtmlSubtitle.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/ttml/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/tx3g/Tx3gParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/tx3g/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/vobsub/VobsubParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/vobsub/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/Mp4WebvttParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCssParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCssStyle.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueInfo.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttCueParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttParser.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttParserUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/WebvttSubtitle.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/text/webvtt/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac3Extractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac3Reader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac4Extractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/Ac4Reader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/AdtsReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/DefaultTsPayloadReaderFactory.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/DtsReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/DvbSubtitleReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/ElementaryStreamReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/H262Reader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/H263Reader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/Id3Reader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/LatmReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpegAudioReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpeghReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/MpeghUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/NalUnitTargetBuffer.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/PassthroughSectionPayloadReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/PesReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/PsBinarySearchSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/PsDurationReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/PsExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/SectionPayloadReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/SectionReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/SeiReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsBinarySearchSeeker.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsDurationReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsPayloadReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/TsUtil.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/UserDataReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/ts/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavFormat.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavHeaderReader.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/wav/WavSeekMap.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/wav/package-info.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/webp/WebpExtractor.java create mode 100644 libraries/extractor/src/main/java/androidx/media3/extractor/webp/package-info.java create mode 100644 libraries/ui/build.gradle.kts create mode 100644 libraries/ui/src/main/AndroidManifest.xml create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/AspectRatioFrameLayout.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/BidiUtils.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/CanvasSubtitleOutput.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/CaptionStyleCompat.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/DefaultMediaDescriptionAdapter.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/DefaultTimeBar.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/DefaultTrackNameProvider.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/HtmlUtils.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/LegacyPlayerControlView.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/PlayerControlViewLayoutManager.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/PlayerNotificationManager.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/PlayerView.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/SpannedToHtmlConverter.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/SubtitlePainter.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/SubtitleView.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/SubtitleViewUtils.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/TimeBar.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/TrackNameProvider.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/TrackSelectionDialogBuilder.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/TrackSelectionView.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/WearUnsuitableOutputPlaybackSuppressionResolverListener.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/WebViewSubtitleOutput.java create mode 100644 libraries/ui/src/main/java/androidx/media3/ui/package-info.java create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_edit_mode_logo.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_audiotrack.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_check.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_chevron_left.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_chevron_right.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_default_album_image.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_forward.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_fullscreen_enter.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_fullscreen_exit.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_pause_circle_filled.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_play_circle_filled.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_rewind.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_settings.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_skip_next.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_skip_previous.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_speed.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_subtitle_off.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_ic_subtitle_on.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_circular_play.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_fastforward.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_fullscreen_enter.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_fullscreen_exit.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_next.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_pause.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_play.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_previous.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_repeat_all.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_repeat_off.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_repeat_one.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_rewind.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_shuffle_off.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_shuffle_on.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_stop.xml create mode 100644 libraries/ui/src/main/res/drawable-anydpi/exo_icon_vr.xml create mode 100644 libraries/ui/src/main/res/drawable/exo_rounded_rectangle.xml create mode 100644 libraries/ui/src/main/res/font/roboto_medium_numbers.ttf create mode 100644 libraries/ui/src/main/res/layout/exo_legacy_player_control_view.xml create mode 100644 libraries/ui/src/main/res/layout/exo_list_divider.xml create mode 100644 libraries/ui/src/main/res/layout/exo_player_control_ffwd_button.xml create mode 100644 libraries/ui/src/main/res/layout/exo_player_control_rewind_button.xml create mode 100644 libraries/ui/src/main/res/layout/exo_player_control_view.xml create mode 100644 libraries/ui/src/main/res/layout/exo_player_view.xml create mode 100644 libraries/ui/src/main/res/layout/exo_styled_settings_list.xml create mode 100644 libraries/ui/src/main/res/layout/exo_styled_settings_list_item.xml create mode 100644 libraries/ui/src/main/res/layout/exo_styled_sub_settings_list_item.xml create mode 100644 libraries/ui/src/main/res/layout/exo_track_selection_dialog.xml create mode 100644 libraries/ui/src/main/res/values-af/strings.xml create mode 100644 libraries/ui/src/main/res/values-am/strings.xml create mode 100644 libraries/ui/src/main/res/values-ar/strings.xml create mode 100755 libraries/ui/src/main/res/values-as/strings.xml create mode 100644 libraries/ui/src/main/res/values-az/strings.xml create mode 100644 libraries/ui/src/main/res/values-b+sr+Latn/strings.xml create mode 100644 libraries/ui/src/main/res/values-be/strings.xml create mode 100644 libraries/ui/src/main/res/values-bg/strings.xml create mode 100644 libraries/ui/src/main/res/values-bn/strings.xml create mode 100644 libraries/ui/src/main/res/values-bs/strings.xml create mode 100644 libraries/ui/src/main/res/values-ca/strings.xml create mode 100644 libraries/ui/src/main/res/values-cs/strings.xml create mode 100644 libraries/ui/src/main/res/values-da/strings.xml create mode 100644 libraries/ui/src/main/res/values-de/strings.xml create mode 100644 libraries/ui/src/main/res/values-el/strings.xml create mode 100644 libraries/ui/src/main/res/values-en-rAU/strings.xml create mode 100644 libraries/ui/src/main/res/values-en-rGB/strings.xml create mode 100644 libraries/ui/src/main/res/values-en-rIN/strings.xml create mode 100644 libraries/ui/src/main/res/values-es-rUS/strings.xml create mode 100644 libraries/ui/src/main/res/values-es/strings.xml create mode 100644 libraries/ui/src/main/res/values-et/strings.xml create mode 100644 libraries/ui/src/main/res/values-eu/strings.xml create mode 100644 libraries/ui/src/main/res/values-fa/strings.xml create mode 100644 libraries/ui/src/main/res/values-fi/strings.xml create mode 100644 libraries/ui/src/main/res/values-fr-rCA/strings.xml create mode 100644 libraries/ui/src/main/res/values-fr/strings.xml create mode 100644 libraries/ui/src/main/res/values-gl/strings.xml create mode 100644 libraries/ui/src/main/res/values-gu/strings.xml create mode 100644 libraries/ui/src/main/res/values-hi/strings.xml create mode 100644 libraries/ui/src/main/res/values-hr/strings.xml create mode 100644 libraries/ui/src/main/res/values-hu/strings.xml create mode 100644 libraries/ui/src/main/res/values-hy/strings.xml create mode 100644 libraries/ui/src/main/res/values-in/strings.xml create mode 100644 libraries/ui/src/main/res/values-is/strings.xml create mode 100644 libraries/ui/src/main/res/values-it/strings.xml create mode 100644 libraries/ui/src/main/res/values-iw/strings.xml create mode 100644 libraries/ui/src/main/res/values-ja/strings.xml create mode 100644 libraries/ui/src/main/res/values-ka/strings.xml create mode 100644 libraries/ui/src/main/res/values-kk/strings.xml create mode 100644 libraries/ui/src/main/res/values-km/strings.xml create mode 100644 libraries/ui/src/main/res/values-kn/strings.xml create mode 100644 libraries/ui/src/main/res/values-ko/strings.xml create mode 100644 libraries/ui/src/main/res/values-ky/strings.xml create mode 100644 libraries/ui/src/main/res/values-lo/strings.xml create mode 100644 libraries/ui/src/main/res/values-lt/strings.xml create mode 100644 libraries/ui/src/main/res/values-lv/strings.xml create mode 100644 libraries/ui/src/main/res/values-mk/strings.xml create mode 100644 libraries/ui/src/main/res/values-ml/strings.xml create mode 100644 libraries/ui/src/main/res/values-mn/strings.xml create mode 100644 libraries/ui/src/main/res/values-mr/strings.xml create mode 100644 libraries/ui/src/main/res/values-ms/strings.xml create mode 100644 libraries/ui/src/main/res/values-my/strings.xml create mode 100644 libraries/ui/src/main/res/values-nb/strings.xml create mode 100644 libraries/ui/src/main/res/values-ne/strings.xml create mode 100644 libraries/ui/src/main/res/values-nl/strings.xml create mode 100755 libraries/ui/src/main/res/values-or/strings.xml create mode 100644 libraries/ui/src/main/res/values-pa/strings.xml create mode 100644 libraries/ui/src/main/res/values-pl/strings.xml create mode 100644 libraries/ui/src/main/res/values-pt-rPT/strings.xml create mode 100644 libraries/ui/src/main/res/values-pt/strings.xml create mode 100644 libraries/ui/src/main/res/values-ro/strings.xml create mode 100644 libraries/ui/src/main/res/values-ru/strings.xml create mode 100644 libraries/ui/src/main/res/values-si/strings.xml create mode 100644 libraries/ui/src/main/res/values-sk/strings.xml create mode 100644 libraries/ui/src/main/res/values-sl/strings.xml create mode 100644 libraries/ui/src/main/res/values-sq/strings.xml create mode 100644 libraries/ui/src/main/res/values-sr/strings.xml create mode 100644 libraries/ui/src/main/res/values-sv/strings.xml create mode 100644 libraries/ui/src/main/res/values-sw/strings.xml create mode 100644 libraries/ui/src/main/res/values-ta/strings.xml create mode 100644 libraries/ui/src/main/res/values-te/strings.xml create mode 100644 libraries/ui/src/main/res/values-th/strings.xml create mode 100644 libraries/ui/src/main/res/values-tl/strings.xml create mode 100644 libraries/ui/src/main/res/values-tr/strings.xml create mode 100644 libraries/ui/src/main/res/values-uk/strings.xml create mode 100644 libraries/ui/src/main/res/values-ur/strings.xml create mode 100644 libraries/ui/src/main/res/values-uz/strings.xml create mode 100644 libraries/ui/src/main/res/values-vi/strings.xml create mode 100644 libraries/ui/src/main/res/values-zh-rCN/strings.xml create mode 100644 libraries/ui/src/main/res/values-zh-rHK/strings.xml create mode 100644 libraries/ui/src/main/res/values-zh-rTW/strings.xml create mode 100644 libraries/ui/src/main/res/values-zu/strings.xml create mode 100644 libraries/ui/src/main/res/values/attrs.xml create mode 100644 libraries/ui/src/main/res/values/colors.xml create mode 100644 libraries/ui/src/main/res/values/constants.xml create mode 100644 libraries/ui/src/main/res/values/dimens.xml create mode 100644 libraries/ui/src/main/res/values/drawables.xml create mode 100644 libraries/ui/src/main/res/values/ids.xml create mode 100644 libraries/ui/src/main/res/values/public.xml create mode 100644 libraries/ui/src/main/res/values/strings.xml create mode 100644 libraries/ui/src/main/res/values/styles.xml create mode 100644 libraries/ui/src/main/res/values/styles_legacy.xml create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6276901 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +.gradle/ +.idea/ +build/ +**/build/ +local.properties +*.iml +*.apk +*.aab +*.keystore +*.jks +*.p12 +keystore.properties +captures/ +externalNativeBuild/ +.cxx/ +.DS_Store diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1963199 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# hlsmplayer + +hlsmplayer is an Android TV client for an nginx-hls VOD service. It loads the +media catalog from a configured server, displays server-generated covers, and +plays published HLS playlists in four independently controlled panes. + +## Build + +Use JDK 17 and an Android SDK with platform 36 installed. + +```sh +./gradlew :hlsmplayer:assembleDebug +./gradlew :hlsmplayer:installDebug +``` + +The release variant is minified and uses the Debug signing key for internal +installation, matching the previous project behavior. diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..e83f92d --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,35 @@ +plugins { id("com.android.application") } + +android { + namespace = "com.hlsmplayer" + compileSdk = 36 + + defaultConfig { + applicationId = "com.hlsmplayer" + minSdk = 23 + targetSdk = 34 + versionCode = 1011001300 + versionName = "1.11.1" + } + + buildTypes { + getByName("release") { + isShrinkResources = true + isMinifyEnabled = true + proguardFiles("proguard-rules.txt", getDefaultProguardFile("proguard-android-optimize.txt")) + signingConfig = signingConfigs.getByName("debug") + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation(project(":lib-exoplayer")) + implementation(project(":lib-exoplayer-hls")) + implementation(project(":lib-ui")) + testImplementation(libs.junit) +} diff --git a/app/proguard-rules.txt b/app/proguard-rules.txt new file mode 100644 index 0000000..5ca0811 --- /dev/null +++ b/app/proguard-rules.txt @@ -0,0 +1 @@ +# Proguard rules specific to hlsmplayer. diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..51ec1be --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/hlsmplayer/MediaCatalogUrl.java b/app/src/main/java/com/hlsmplayer/MediaCatalogUrl.java new file mode 100644 index 0000000..4c66141 --- /dev/null +++ b/app/src/main/java/com/hlsmplayer/MediaCatalogUrl.java @@ -0,0 +1,77 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hlsmplayer; + +import java.net.URI; +import java.net.URISyntaxException; + +/** Validates and resolves the relative endpoints published by the VOD catalog. */ +final class MediaCatalogUrl { + + private static final String PLAYLIST_PREFIX = "/hls/"; + private static final String COVER_PREFIX = "/api/media/covers/"; + + private MediaCatalogUrl() {} + + public static boolean isValidPlaylistUrl(String value) { + return isValidRelativePath(value, PLAYLIST_PREFIX) && value.endsWith("/master.m3u8"); + } + + public static boolean isValidCoverUrl(String value) { + return isValidRelativePath(value, COVER_PREFIX) && value.endsWith(".jpg"); + } + + public static String resolve(String serverBase, String relativePath) { + if (serverBase == null || relativePath == null) { + throw new IllegalArgumentException("Missing server base or relative path"); + } + try { + URI base = new URI(serverBase + "/"); + URI endpoint = new URI(relativePath); + return base.resolve(endpoint).toASCIIString(); + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Invalid server endpoint", e); + } + } + + private static boolean isValidRelativePath(String value, String requiredPrefix) { + if (value == null || !value.startsWith(requiredPrefix)) { + return false; + } + try { + URI uri = new URI(value); + String rawPath = uri.getRawPath(); + return !uri.isAbsolute() + && uri.getRawAuthority() == null + && uri.getRawQuery() == null + && uri.getRawFragment() == null + && rawPath != null + && rawPath.equals(value) + && !containsDotSegment(rawPath); + } catch (URISyntaxException e) { + return false; + } + } + + private static boolean containsDotSegment(String path) { + for (String segment : path.split("/")) { + if (".".equals(segment) || "..".equals(segment)) { + return true; + } + } + return false; + } +} diff --git a/app/src/main/java/com/hlsmplayer/PlayerActivity.java b/app/src/main/java/com/hlsmplayer/PlayerActivity.java new file mode 100644 index 0000000..261e1b2 --- /dev/null +++ b/app/src/main/java/com/hlsmplayer/PlayerActivity.java @@ -0,0 +1,1278 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.hlsmplayer; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.text.InputType; +import android.util.JsonReader; +import android.util.LruCache; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; +import androidx.media3.common.AudioAttributes; +import androidx.media3.common.C; +import androidx.media3.common.MediaItem; +import androidx.media3.common.MimeTypes; +import androidx.media3.common.Player; +import androidx.media3.exoplayer.ExoPlayer; +import androidx.media3.ui.DefaultTimeBar; +import androidx.media3.ui.PlayerView; +import androidx.media3.ui.TimeBar; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** A four-pane HLS video-on-demand player with a shared media browser. */ +public final class PlayerActivity extends Activity { + + private static final int DEFAULT_SERVER_PORT = 8124; + private static final String PREFERENCES_NAME = "media_player_settings"; + private static final String PREFERENCE_SERVER_CONFIGURED = "server_configured"; + private static final String PREFERENCE_SERVER_HOST = "server_host"; + private static final String PREFERENCE_SERVER_PORT = "server_port"; + private static final long PROGRESS_UPDATE_INTERVAL_MS = 250; + private static final long LONG_PRESS_TIMEOUT_MS = 600; + private static final long SEEK_ACCELERATION_STEP_MS = 3_000; + private static final double SINGLE_SEEK_PERCENT = 0.02; + private static final int COVER_STATE_LOADING = 1; + private static final int COVER_STATE_FAILED = 2; + + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + private final ExecutorService catalogExecutor = Executors.newSingleThreadExecutor(); + private final ExecutorService coverExecutor = Executors.newFixedThreadPool(4); + private final Runnable closeBrowserAction = + () -> { + backLongPressTriggered = true; + closeMediaBrowser(); + }; + private final List browserEntries = new ArrayList<>(); + private final Map coverStates = new HashMap<>(); + private final LruCache coverCache = + new LruCache(getCoverCacheSizeKilobytes()) { + @Override + protected int sizeOf(String key, Bitmap bitmap) { + return Math.max(1, bitmap.getByteCount() / 1024); + } + }; + private final PaneState[] panes = new PaneState[4]; + + private TextView browserPathView; + private TextView browserMessageView; + private FrameLayout browserOverlay; + private ImageView browserCoverPreview; + private ListView browserList; + private Button browserRetryButton; + private BrowserAdapter browserAdapter; + private MediaDirectory mediaRoot; + private PaneState activePane; + private boolean catalogLoaded; + private boolean catalogLoading; + private String catalogError; + private String mediaServerBase; + private int catalogGeneration; + private boolean backLongPressTriggered; + private boolean suppressBrowserCenterKeyUp; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.player_activity); + + readServerSettings(); + browserPathView = findViewById(R.id.browser_path); + browserMessageView = findViewById(R.id.browser_message); + browserOverlay = findViewById(R.id.media_browser_overlay); + browserCoverPreview = findViewById(R.id.browser_cover_preview); + browserRetryButton = findViewById(R.id.browser_retry); + browserList = findViewById(R.id.browser_list); + browserAdapter = new BrowserAdapter(); + + int[] paneIds = { + R.id.player_pane_0, R.id.player_pane_1, R.id.player_pane_2, R.id.player_pane_3 + }; + for (int i = 0; i < paneIds.length; i++) { + panes[i] = new PaneState(i, findViewById(paneIds[i])); + } + setActivePane(panes[0]); + + browserList.setAdapter(browserAdapter); + browserList.setOnItemClickListener((parent, view, position, id) -> activateBrowserEntry(position)); + browserList.setOnItemSelectedListener( + new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + rememberFocusedEntry(position); + updateCoverPreview(); + } + + @Override + public void onNothingSelected(AdapterView parent) { + hideCoverPreview(); + } + }); + browserList.setOnKeyListener((view, keyCode, event) -> handleBrowserKeyEvent(keyCode, event)); + browserRetryButton.setOnClickListener(view -> loadMediaCatalog()); + browserRetryButton.setOnKeyListener( + (view, keyCode, event) -> handleBrowserKeyEvent(keyCode, event)); + + if (mediaServerBase == null) { + showServerSettingsDialog(/* requireConfiguration= */ true); + } else { + loadMediaCatalog(); + } + } + + @Override + public void onStart() { + super.onStart(); + for (PaneState pane : panes) { + if (pane.player != null) { + pane.player.play(); + } + } + } + + @Override + public void onResume() { + super.onResume(); + for (PaneState pane : panes) { + pane.playerView.onResume(); + } + } + + @Override + public void onPause() { + for (PaneState pane : panes) { + pane.playerView.onPause(); + } + super.onPause(); + } + + @Override + public void onStop() { + for (PaneState pane : panes) { + if (pane.player != null) { + pane.player.pause(); + } + } + super.onStop(); + } + + @Override + public void onDestroy() { + mainHandler.removeCallbacksAndMessages(null); + catalogExecutor.shutdownNow(); + coverExecutor.shutdownNow(); + for (PaneState pane : panes) { + releasePlayer(pane); + } + super.onDestroy(); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + int keyCode = event.getKeyCode(); + if (keyCode == KeyEvent.KEYCODE_BACK + && event.getAction() == KeyEvent.ACTION_UP + && backLongPressTriggered) { + backLongPressTriggered = false; + return true; + } + if (isBrowserOpen()) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + return handleBrowserKeyEvent(keyCode, event); + } + return super.dispatchKeyEvent(event); + } + if (keyCode == KeyEvent.KEYCODE_MENU) { + if (event.getAction() == KeyEvent.ACTION_UP) { + showServerSettingsDialog(); + } + return true; + } + return handlePlayerKeyEvent(activePane, keyCode, event) || super.dispatchKeyEvent(event); + } + + private void readServerSettings() { + SharedPreferences preferences = getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); + if (!preferences.getBoolean(PREFERENCE_SERVER_CONFIGURED, false)) { + mediaServerBase = null; + return; + } + String host = preferences.getString(PREFERENCE_SERVER_HOST, ""); + int port = preferences.getInt(PREFERENCE_SERVER_PORT, DEFAULT_SERVER_PORT); + if (!isValidHost(host) || !isValidPort(port)) { + mediaServerBase = null; + return; + } + mediaServerBase = buildServerBase(host, port); + } + + private void showServerSettingsDialog() { + showServerSettingsDialog(/* requireConfiguration= */ false); + } + + private void showServerSettingsDialog(boolean requireConfiguration) { + SharedPreferences preferences = getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); + String currentHost = preferences.getString(PREFERENCE_SERVER_HOST, ""); + int currentPort = preferences.getInt(PREFERENCE_SERVER_PORT, DEFAULT_SERVER_PORT); + + int horizontalPadding = dpToPixels(24); + LinearLayout form = new LinearLayout(this); + form.setOrientation(LinearLayout.VERTICAL); + form.setPadding(horizontalPadding, 0, horizontalPadding, 0); + EditText hostInput = new EditText(this); + hostInput.setHint(R.string.server_host); + hostInput.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI); + hostInput.setSingleLine(true); + hostInput.setText(currentHost); + EditText portInput = new EditText(this); + portInput.setHint(R.string.server_port); + portInput.setInputType(InputType.TYPE_CLASS_NUMBER); + portInput.setSingleLine(true); + portInput.setText(String.valueOf(currentPort)); + form.addView(hostInput); + form.addView(portInput); + + AlertDialog dialog = + new AlertDialog.Builder(this) + .setTitle(R.string.server_settings) + .setView(form) + .setPositiveButton(R.string.server_save, null) + .create(); + if (!requireConfiguration) { + dialog.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.server_cancel), (dialogInterface, which) -> {}); + } + dialog.setCancelable(!requireConfiguration); + dialog.setCanceledOnTouchOutside(!requireConfiguration); + dialog.setOnShowListener( + unused -> + dialog + .getButton(AlertDialog.BUTTON_POSITIVE) + .setOnClickListener( + view -> { + String host = hostInput.getText().toString().trim(); + int port = parsePort(portInput.getText().toString()); + if (!isValidHost(host) || !isValidPort(port)) { + Toast.makeText(this, R.string.server_invalid, Toast.LENGTH_SHORT).show(); + return; + } + preferences + .edit() + .putBoolean(PREFERENCE_SERVER_CONFIGURED, true) + .putString(PREFERENCE_SERVER_HOST, host) + .putInt(PREFERENCE_SERVER_PORT, port) + .apply(); + mediaServerBase = buildServerBase(host, port); + catalogLoaded = false; + mediaRoot = null; + clearCoverCache(); + dialog.dismiss(); + catalogGeneration++; + catalogLoading = false; + loadMediaCatalog(); + })); + dialog.show(); + } + + private void loadMediaCatalog() { + if (catalogLoading || mediaServerBase == null) { + return; + } + catalogLoading = true; + catalogError = null; + int generation = ++catalogGeneration; + String catalogUrl = mediaServerBase + "/api/media"; + if (isBrowserOpen()) { + showBrowserLoading(); + } + catalogExecutor.execute( + () -> { + try { + MediaDirectory loadedRoot = fetchMediaCatalog(catalogUrl); + mainHandler.post( + () -> { + if (generation == catalogGeneration) { + onMediaCatalogLoaded(loadedRoot, generation); + } + }); + } catch (CatalogResponseException e) { + mainHandler.post( + () -> { + if (generation == catalogGeneration) { + onMediaCatalogFailed(e.statusCode); + } + }); + } catch (IOException e) { + mainHandler.post( + () -> { + if (generation == catalogGeneration) { + onMediaCatalogFailed(/* statusCode= */ -1); + } + }); + } + }); + } + + private static MediaDirectory fetchMediaCatalog(String catalogUrl) throws IOException { + HttpURLConnection connection = (HttpURLConnection) new URL(catalogUrl).openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(5_000); + connection.setReadTimeout(10_000); + connection.setUseCaches(false); + try { + int responseCode = connection.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK) { + throw new CatalogResponseException(responseCode); + } + MediaDirectory root = new MediaDirectory(/* name= */ "", /* parent= */ null); + try (JsonReader reader = + new JsonReader( + new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { + readMediaCatalog(reader, root); + } + return root; + } finally { + connection.disconnect(); + } + } + + private static void readMediaCatalog(JsonReader reader, MediaDirectory root) throws IOException { + reader.beginArray(); + while (reader.hasNext()) { + readMediaItem(reader, root); + } + reader.endArray(); + } + + private static void readMediaItem(JsonReader reader, MediaDirectory root) throws IOException { + String path = null; + String name = null; + String playlistUrl = null; + String coverUrl = null; + reader.beginObject(); + while (reader.hasNext()) { + String fieldName = reader.nextName(); + if (reader.peek() == android.util.JsonToken.NULL) { + reader.nextNull(); + } else if ("path".equals(fieldName)) { + path = reader.nextString(); + } else if ("name".equals(fieldName)) { + name = reader.nextString(); + } else if ("playlistUrl".equals(fieldName)) { + playlistUrl = reader.nextString(); + } else if ("coverUrl".equals(fieldName)) { + coverUrl = reader.nextString(); + } else { + reader.skipValue(); + } + } + reader.endObject(); + if (!isValidMediaItem(path, name, playlistUrl)) { + return; + } + MediaDirectory directory = root; + String[] pathSegments = path.split("/"); + for (int i = 0; i < pathSegments.length - 1; i++) { + directory = directory.getOrCreateChild(pathSegments[i]); + } + directory.files.add( + new MediaFile( + name, + playlistUrl, + MediaCatalogUrl.isValidCoverUrl(coverUrl) ? coverUrl : null, + directory)); + } + + private static boolean isValidMediaItem(String path, String name, String playlistUrl) { + if (path == null || path.isEmpty() || name == null || name.isEmpty() || playlistUrl == null) { + return false; + } + String[] pathSegments = path.split("/"); + for (String segment : pathSegments) { + if (segment.isEmpty() || ".".equals(segment) || "..".equals(segment)) { + return false; + } + } + return MediaCatalogUrl.isValidPlaylistUrl(playlistUrl); + } + + private void onMediaCatalogLoaded(MediaDirectory root, int generation) { + catalogLoading = false; + if (root.children.isEmpty() && root.files.isEmpty()) { + catalogLoaded = false; + catalogError = getString(R.string.media_empty); + if (isBrowserOpen()) { + showBrowserError(); + } + return; + } + mediaRoot = root; + catalogLoaded = true; + coverStates.clear(); + for (PaneState pane : panes) { + String directoryPath = pane.currentDirectory == null ? "/" : pane.currentDirectory.getDisplayPath(); + String playlistUrl = pane.currentMedia == null ? null : pane.currentMedia.playlistUrl; + pane.currentDirectory = mediaRoot.findDirectory(directoryPath); + if (pane.currentDirectory == null) { + pane.currentDirectory = mediaRoot; + } + pane.currentMedia = playlistUrl == null ? null : mediaRoot.findFileByPlaylistUrl(playlistUrl); + } + if (isBrowserOpen()) { + showMediaDirectory(); + } + } + + private void onMediaCatalogFailed(int statusCode) { + catalogLoading = false; + catalogError = + statusCode == HttpURLConnection.HTTP_UNAVAILABLE + ? getString(R.string.media_building) + : getString(R.string.media_load_error); + if (isBrowserOpen()) { + showBrowserError(); + } + } + + private void requestCover(MediaFile file, int generation) { + String coverUrl = resolveCoverUrl(file); + if (coverUrl != null) { + requestCoverUrl(coverUrl, generation); + } + } + + private void requestCoverUrl(String coverUrl, int generation) { + if (coverCache.get(coverUrl) != null) { + return; + } + Integer state = coverStates.get(coverUrl); + if (state != null) { + return; + } + coverStates.put(coverUrl, COVER_STATE_LOADING); + coverExecutor.execute( + () -> { + Bitmap cover = downloadCover(coverUrl); + mainHandler.post( + () -> { + if (generation != catalogGeneration) { + return; + } + if (cover != null) { + coverCache.put(coverUrl, cover); + coverStates.remove(coverUrl); + browserAdapter.notifyDataSetChanged(); + updateCoverPreview(); + } else { + coverStates.put(coverUrl, COVER_STATE_FAILED); + } + }); + }); + } + + private static Bitmap downloadCover(String coverUrl) { + HttpURLConnection connection = null; + try { + connection = (HttpURLConnection) new URL(coverUrl).openConnection(); + connection.setConnectTimeout(5_000); + connection.setReadTimeout(10_000); + connection.setUseCaches(false); + if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { + return null; + } + try (InputStream inputStream = connection.getInputStream()) { + return BitmapFactory.decodeStream(inputStream); + } + } catch (IOException e) { + return null; + } finally { + if (connection != null) { + connection.disconnect(); + } + } + } + + private void clearCoverCache() { + coverCache.evictAll(); + coverStates.clear(); + } + + private String resolveCoverUrl(MediaFile file) { + return file.coverUrl == null ? null : MediaCatalogUrl.resolve(mediaServerBase, file.coverUrl); + } + + private void openMediaBrowser(PaneState pane) { + activePane = pane; + browserOverlay.setVisibility(View.VISIBLE); + if (catalogLoading) { + showBrowserLoading(); + } else if (!catalogLoaded) { + showBrowserError(); + } else { + showMediaDirectory(); + } + } + + private void closeMediaBrowser() { + mainHandler.removeCallbacks(closeBrowserAction); + for (PaneState pane : panes) { + scheduleProgressUpdate(pane); + } + browserOverlay.setVisibility(View.GONE); + hideCoverPreview(); + } + + private boolean isBrowserOpen() { + return browserOverlay.getVisibility() == View.VISIBLE; + } + + private void showBrowserLoading() { + hideCoverPreview(); + browserPathView.setText(R.string.media_browser_title); + browserList.setVisibility(View.GONE); + browserRetryButton.setVisibility(View.GONE); + browserMessageView.setText(R.string.media_loading); + browserMessageView.setVisibility(View.VISIBLE); + } + + private void showBrowserError() { + hideCoverPreview(); + browserPathView.setText(R.string.media_browser_title); + browserList.setVisibility(View.GONE); + browserMessageView.setText(catalogError == null ? getString(R.string.media_loading) : catalogError); + browserMessageView.setVisibility(View.VISIBLE); + browserRetryButton.setVisibility(View.VISIBLE); + browserRetryButton.requestFocus(); + } + + private void showMediaDirectory() { + if (mediaRoot == null || activePane == null) { + showBrowserError(); + return; + } + if (activePane.currentDirectory == null) { + activePane.currentDirectory = mediaRoot; + } + browserPathView.setText(activePane.currentDirectory.getDisplayPath()); + browserMessageView.setVisibility(View.GONE); + browserRetryButton.setVisibility(View.GONE); + browserList.setVisibility(View.VISIBLE); + browserEntries.clear(); + if (activePane.currentDirectory.parent != null) { + browserEntries.add(BrowserEntry.parent(activePane.currentDirectory.parent)); + } + for (MediaDirectory directory : activePane.currentDirectory.getSortedChildren()) { + browserEntries.add(BrowserEntry.directory(directory)); + } + for (MediaFile file : activePane.currentDirectory.getSortedFiles()) { + browserEntries.add(BrowserEntry.file(file)); + } + browserAdapter.notifyDataSetChanged(); + int selection = findSavedSelection(); + browserList.setSelection(selection); + browserList.post( + () -> { + if (isBrowserOpen()) { + browserList.requestFocus(); + if (!browserEntries.isEmpty()) { + browserList.setItemChecked(selection, true); + updateCoverPreview(); + } + } + }); + } + + private int findSavedSelection() { + if (activePane == null || activePane.currentDirectory == null) { + return browserEntries.isEmpty() ? ListView.INVALID_POSITION : 0; + } + String key = activePane.focusedEntryKeys.get(activePane.currentDirectory.getDisplayPath()); + if (key != null) { + for (int i = 0; i < browserEntries.size(); i++) { + if (key.equals(browserEntries.get(i).key)) { + return i; + } + } + } + return browserEntries.isEmpty() ? ListView.INVALID_POSITION : 0; + } + + private void rememberFocusedEntry(int position) { + if (activePane != null + && activePane.currentDirectory != null + && position >= 0 + && position < browserEntries.size()) { + activePane.focusedEntryKeys.put( + activePane.currentDirectory.getDisplayPath(), browserEntries.get(position).key); + } + } + + private boolean handleBrowserKeyEvent(int keyCode, KeyEvent event) { + if (isCenterKey(keyCode)) { + if (event.getAction() == KeyEvent.ACTION_UP) { + if (suppressBrowserCenterKeyUp) { + suppressBrowserCenterKeyUp = false; + return true; + } + activateBrowserEntry(browserList.getSelectedItemPosition()); + } + return true; + } + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { + backLongPressTriggered = false; + mainHandler.postDelayed(closeBrowserAction, LONG_PRESS_TIMEOUT_MS); + } else if (event.getAction() == KeyEvent.ACTION_UP) { + mainHandler.removeCallbacks(closeBrowserAction); + if (!backLongPressTriggered) { + navigateToParentOrClose(); + } + } + return true; + } + if (event.getAction() != KeyEvent.ACTION_DOWN) { + return keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT; + } + if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT && event.getRepeatCount() == 0) { + navigateToParentOrClose(); + return true; + } + if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT && event.getRepeatCount() == 0) { + BrowserEntry entry = getSelectedBrowserEntry(); + if (entry != null && entry.type == BrowserEntry.TYPE_DIRECTORY) { + activePane.currentDirectory = entry.directory; + showMediaDirectory(); + } + return true; + } + return false; + } + + private void activateBrowserEntry(int position) { + if (activePane == null || position < 0 || position >= browserEntries.size()) { + return; + } + BrowserEntry entry = browserEntries.get(position); + rememberFocusedEntry(position); + if (entry.type == BrowserEntry.TYPE_PARENT || entry.type == BrowserEntry.TYPE_DIRECTORY) { + activePane.currentDirectory = entry.directory; + showMediaDirectory(); + return; + } + activePane.currentDirectory = entry.file.parent; + activePane.currentMedia = entry.file; + activePane.focusedEntryKeys.put(activePane.currentDirectory.getDisplayPath(), entry.key); + PaneState targetPane = activePane; + closeMediaBrowser(); + playMedia(targetPane, entry.file); + } + + private BrowserEntry getSelectedBrowserEntry() { + int position = browserList.getSelectedItemPosition(); + return position >= 0 && position < browserEntries.size() ? browserEntries.get(position) : null; + } + + private void navigateToParentOrClose() { + if (activePane != null && activePane.currentDirectory != null && activePane.currentDirectory.parent != null) { + activePane.currentDirectory = activePane.currentDirectory.parent; + showMediaDirectory(); + } else { + closeMediaBrowser(); + } + } + + private boolean handlePlayerKeyEvent(PaneState pane, int keyCode, KeyEvent event) { + if (pane == null) { + return false; + } + if (isCenterKey(keyCode)) { + if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { + pane.centerLongPressTriggered = false; + mainHandler.postDelayed(pane.openBrowserAction, LONG_PRESS_TIMEOUT_MS); + } else if (event.getAction() == KeyEvent.ACTION_UP) { + mainHandler.removeCallbacks(pane.openBrowserAction); + if (!pane.centerLongPressTriggered) { + cycleActivePane(); + } + } + return true; + } + if (event.getAction() != KeyEvent.ACTION_DOWN) { + return keyCode == KeyEvent.KEYCODE_DPAD_LEFT + || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT + || keyCode == KeyEvent.KEYCODE_DPAD_UP + || keyCode == KeyEvent.KEYCODE_DPAD_DOWN; + } + if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { + seekByPercent(pane, -1, event.getRepeatCount(), event.getEventTime() - event.getDownTime()); + return true; + } + if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { + seekByPercent(pane, 1, event.getRepeatCount(), event.getEventTime() - event.getDownTime()); + return true; + } + if (keyCode == KeyEvent.KEYCODE_DPAD_UP && event.getRepeatCount() == 0) { + switchVideoInCurrentDirectory(pane, -1); + return true; + } + if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && event.getRepeatCount() == 0) { + switchVideoInCurrentDirectory(pane, 1); + return true; + } + return false; + } + + private static boolean isCenterKey(int keyCode) { + return keyCode == KeyEvent.KEYCODE_DPAD_CENTER + || keyCode == KeyEvent.KEYCODE_ENTER + || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER; + } + + private void cycleActivePane() { + setActivePane(panes[(activePane.index + 1) % panes.length]); + } + + private void setActivePane(PaneState pane) { + activePane = pane; + for (PaneState candidate : panes) { + if (candidate != null) { + candidate.focusIndicator.setVisibility(candidate == pane ? View.VISIBLE : View.GONE); + } + } + } + + private void switchVideoInCurrentDirectory(PaneState pane, int direction) { + if (pane.currentDirectory == null || pane.currentMedia == null) { + return; + } + List files = pane.currentDirectory.getSortedFiles(); + int currentIndex = files.indexOf(pane.currentMedia); + if (currentIndex < 0 || files.size() < 2) { + return; + } + MediaFile next = files.get((currentIndex + direction + files.size()) % files.size()); + pane.currentMedia = next; + pane.focusedEntryKeys.put(pane.currentDirectory.getDisplayPath(), BrowserEntry.file(next).key); + playMedia(pane, next); + } + + private void playMedia(PaneState pane, MediaFile file) { + releasePlayer(pane); + ExoPlayer newPlayer = new ExoPlayer.Builder(this).setWakeMode(C.WAKE_MODE_NONE).build(); + pane.player = newPlayer; + newPlayer.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ false); + newPlayer.addListener(new PlaybackListener(pane, newPlayer)); + pane.playerView.setPlayer(newPlayer); + MediaItem mediaItem = + new MediaItem.Builder() + .setUri(MediaCatalogUrl.resolve(mediaServerBase, file.playlistUrl)) + .setMimeType(MimeTypes.APPLICATION_M3U8) + .build(); + newPlayer.setMediaItem(mediaItem); + newPlayer.prepare(); + showPaneTitle(pane, file.name); + scheduleProgressUpdate(pane); + } + + private void releasePlayer(PaneState pane) { + mainHandler.removeCallbacks(pane.progressUpdateAction); + if (pane.player != null) { + ExoPlayer playerToRelease = pane.player; + pane.player = null; + playerToRelease.release(); + } + pane.playerView.setPlayer(null); + pane.timeBar.setDuration(C.TIME_UNSET); + pane.timeBar.setPosition(0); + pane.timeBar.setBufferedPosition(0); + pane.scrubbing = false; + } + + private void showPaneTitle(PaneState pane, String title) { + mainHandler.removeCallbacks(pane.titleFadeAction); + pane.titleView.clearAnimation(); + pane.titleView.setText(title); + pane.titleView.setAlpha(1f); + pane.titleView.setVisibility(View.VISIBLE); + mainHandler.postDelayed(pane.titleFadeAction, 1_000); + } + + private void startPaneTitleFade(PaneState pane) { + AlphaAnimation fade = new AlphaAnimation(1f, 0f); + fade.setDuration(1_000); + fade.setFillAfter(true); + fade.setAnimationListener( + new android.view.animation.Animation.AnimationListener() { + @Override + public void onAnimationStart(android.view.animation.Animation animation) {} + + @Override + public void onAnimationEnd(android.view.animation.Animation animation) { + pane.titleView.setVisibility(View.GONE); + pane.titleView.setAlpha(1f); + } + + @Override + public void onAnimationRepeat(android.view.animation.Animation animation) {} + }); + pane.titleView.startAnimation(fade); + } + + private void seekByPercent(PaneState pane, int direction, int repeatCount, long heldDurationMs) { + if (pane.player == null) { + return; + } + long duration = pane.player.getDuration(); + if (duration == C.TIME_UNSET || duration <= 0) { + return; + } + long amount = Math.round(duration * getSeekPercent(repeatCount, heldDurationMs)); + long target = + Math.max(0, Math.min(duration, pane.player.getCurrentPosition() + direction * amount)); + pane.player.seekTo(target); + updateProgress(pane); + } + + private static double getSeekPercent(int repeatCount, long heldDurationMs) { + if (repeatCount == 0) { + return SINGLE_SEEK_PERCENT; + } + if (heldDurationMs < SEEK_ACCELERATION_STEP_MS) { + return 0.04; + } + if (heldDurationMs < 2 * SEEK_ACCELERATION_STEP_MS) { + return 0.06; + } + return 0.10; + } + + private void scheduleProgressUpdate(PaneState pane) { + mainHandler.removeCallbacks(pane.progressUpdateAction); + if (pane.player != null) { + mainHandler.post(pane.progressUpdateAction); + } + } + + private void updateProgress(PaneState pane) { + if (pane.player == null) { + return; + } + if (!pane.scrubbing) { + pane.timeBar.setDuration(pane.player.getDuration()); + pane.timeBar.setPosition(pane.player.getCurrentPosition()); + pane.timeBar.setBufferedPosition(pane.player.getBufferedPosition()); + } + mainHandler.removeCallbacks(pane.progressUpdateAction); + mainHandler.postDelayed(pane.progressUpdateAction, PROGRESS_UPDATE_INTERVAL_MS); + } + + private void updateCoverPreview() { + if (!isBrowserOpen()) { + return; + } + BrowserEntry entry = getSelectedBrowserEntry(); + if (entry == null || entry.file == null) { + hideCoverPreview(); + return; + } + String coverUrl = resolveCoverUrl(entry.file); + if (coverUrl == null) { + hideCoverPreview(); + return; + } + Bitmap cover = coverCache.get(coverUrl); + if (cover == null) { + requestCover(entry.file, catalogGeneration); + hideCoverPreview(); + return; + } + browserOverlay.post( + () -> { + BrowserEntry selectedEntry = getSelectedBrowserEntry(); + if (!isBrowserOpen() + || selectedEntry == null + || selectedEntry.file == null + || !coverUrl.equals(resolveCoverUrl(selectedEntry.file))) { + return; + } + int width = browserOverlay.getWidth() / 2; + FrameLayout.LayoutParams params = + new FrameLayout.LayoutParams(width, Math.max(1, width * 9 / 16), Gravity.TOP | Gravity.END); + browserCoverPreview.setLayoutParams(params); + browserCoverPreview.setImageBitmap(cover); + browserCoverPreview.setVisibility(View.VISIBLE); + }); + } + + private void hideCoverPreview() { + browserCoverPreview.setVisibility(View.GONE); + browserCoverPreview.setImageDrawable(null); + } + + private static int getCoverCacheSizeKilobytes() { + long maxKilobytes = Runtime.getRuntime().maxMemory() / 1024; + return (int) Math.max(8 * 1024, Math.min(64 * 1024, maxKilobytes / 16)); + } + + private int dpToPixels(int dp) { + return Math.round(dp * getResources().getDisplayMetrics().density); + } + + private static int parsePort(String value) { + try { + return Integer.parseInt(value.trim()); + } catch (NumberFormatException e) { + return -1; + } + } + + private static boolean isValidHost(String host) { + return host != null + && !host.isEmpty() + && !host.contains("://") + && !host.contains("/") + && !host.contains(" "); + } + + private static boolean isValidPort(int port) { + return port >= 1 && port <= 65_535; + } + + private static String buildServerBase(String host, int port) { + return "http://" + host + ":" + port; + } + + private final class PlaybackListener implements Player.Listener { + + private final PaneState pane; + private final ExoPlayer owner; + + public PlaybackListener(PaneState pane, ExoPlayer owner) { + this.pane = pane; + this.owner = owner; + } + + @Override + public void onPlaybackStateChanged(@Player.State int playbackState) { + if (pane.player == owner && playbackState == Player.STATE_READY) { + owner.play(); + } + } + } + + private final class PaneTimeBarListener implements TimeBar.OnScrubListener { + + private final PaneState pane; + + public PaneTimeBarListener(PaneState pane) { + this.pane = pane; + } + + @Override + public void onScrubStart(TimeBar timeBar, long position) { + pane.scrubbing = true; + } + + @Override + public void onScrubMove(TimeBar timeBar, long position) {} + + @Override + public void onScrubStop(TimeBar timeBar, long position, boolean canceled) { + pane.scrubbing = false; + if (!canceled && pane.player != null) { + pane.player.seekTo(position); + } + updateProgress(pane); + } + } + + private final class BrowserAdapter extends BaseAdapter { + + @Override + public int getCount() { + return browserEntries.size(); + } + + @Override + public BrowserEntry getItem(int position) { + return browserEntries.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + BrowserItemHolder holder; + if (convertView == null) { + convertView = getLayoutInflater().inflate(R.layout.media_browser_item, parent, false); + holder = + new BrowserItemHolder( + convertView.findViewById(R.id.browser_item_cover), + convertView.findViewById(R.id.browser_item_name)); + convertView.setTag(holder); + } else { + holder = (BrowserItemHolder) convertView.getTag(); + } + BrowserEntry entry = getItem(position); + holder.nameView.setText(entry.label); + if (entry.file == null) { + holder.coverView.setImageResource(R.drawable.media_cover_placeholder); + } else { + String coverUrl = resolveCoverUrl(entry.file); + if (coverUrl == null) { + holder.coverView.setImageResource(R.drawable.media_cover_placeholder); + return convertView; + } + Bitmap cover = coverCache.get(coverUrl); + if (cover == null) { + holder.coverView.setImageResource(R.drawable.media_cover_placeholder); + requestCover(entry.file, catalogGeneration); + } else { + holder.coverView.setImageBitmap(cover); + } + } + return convertView; + } + } + + private final class PaneState { + + private final int index; + private final PlayerView playerView; + private final DefaultTimeBar timeBar; + private final View focusIndicator; + private final TextView titleView; + private final Map focusedEntryKeys = new HashMap<>(); + private final Runnable progressUpdateAction = () -> updateProgress(this); + private final Runnable titleFadeAction = () -> startPaneTitleFade(this); + private final Runnable openBrowserAction = + () -> { + centerLongPressTriggered = true; + suppressBrowserCenterKeyUp = true; + openMediaBrowser(this); + }; + private ExoPlayer player; + private MediaDirectory currentDirectory; + private MediaFile currentMedia; + private boolean scrubbing; + private boolean centerLongPressTriggered; + + public PaneState(int index, View root) { + this.index = index; + playerView = root.findViewById(R.id.pane_player_view); + timeBar = root.findViewById(R.id.pane_time_bar); + focusIndicator = root.findViewById(R.id.pane_focus_indicator); + titleView = root.findViewById(R.id.pane_title); + timeBar.addListener(new PaneTimeBarListener(this)); + } + } + + private static final class BrowserItemHolder { + + private final ImageView coverView; + private final TextView nameView; + + public BrowserItemHolder(ImageView coverView, TextView nameView) { + this.coverView = coverView; + this.nameView = nameView; + } + } + + private static final class MediaDirectory { + + private final String name; + private final MediaDirectory parent; + private final Map children = new HashMap<>(); + private final List files = new ArrayList<>(); + + public MediaDirectory(String name, MediaDirectory parent) { + this.name = name; + this.parent = parent; + } + + public MediaDirectory getOrCreateChild(String childName) { + MediaDirectory child = children.get(childName); + if (child == null) { + child = new MediaDirectory(childName, this); + children.put(childName, child); + } + return child; + } + + public List getSortedChildren() { + List sorted = new ArrayList<>(children.values()); + sorted.sort(Comparator.comparing(directory -> directory.name, String.CASE_INSENSITIVE_ORDER)); + return sorted; + } + + public List getSortedFiles() { + List sorted = new ArrayList<>(files); + sorted.sort(Comparator.comparing(file -> file.name, String.CASE_INSENSITIVE_ORDER)); + return sorted; + } + + public String getDisplayPath() { + if (parent == null) { + return "/"; + } + List segments = new ArrayList<>(); + MediaDirectory cursor = this; + while (cursor.parent != null) { + segments.add(cursor.name); + cursor = cursor.parent; + } + Collections.reverse(segments); + StringBuilder path = new StringBuilder(); + for (String segment : segments) { + path.append('/').append(segment); + } + return path.toString(); + } + + public MediaDirectory findDirectory(String path) { + if ("/".equals(path)) { + return this; + } + MediaDirectory directory = this; + String[] segments = path.split("/"); + for (String segment : segments) { + if (segment.isEmpty()) { + continue; + } + directory = directory.children.get(segment); + if (directory == null) { + return null; + } + } + return directory; + } + + public MediaFile findFileByPlaylistUrl(String playlistUrl) { + for (MediaFile file : files) { + if (playlistUrl.equals(file.playlistUrl)) { + return file; + } + } + for (MediaDirectory child : children.values()) { + MediaFile file = child.findFileByPlaylistUrl(playlistUrl); + if (file != null) { + return file; + } + } + return null; + } + + } + + private static final class MediaFile { + + private final String name; + private final String playlistUrl; + private final String coverUrl; + private final MediaDirectory parent; + + public MediaFile(String name, String playlistUrl, String coverUrl, MediaDirectory parent) { + this.name = name; + this.playlistUrl = playlistUrl; + this.coverUrl = coverUrl; + this.parent = parent; + } + } + + private static final class CatalogResponseException extends IOException { + + private final int statusCode; + + public CatalogResponseException(int statusCode) { + super("Unexpected catalog response: " + statusCode); + this.statusCode = statusCode; + } + } + + private static final class BrowserEntry { + + private static final int TYPE_PARENT = 0; + private static final int TYPE_DIRECTORY = 1; + private static final int TYPE_FILE = 2; + + private final int type; + private final MediaDirectory directory; + private final MediaFile file; + private final String key; + private final String label; + + private BrowserEntry(int type, MediaDirectory directory, MediaFile file, String key, String label) { + this.type = type; + this.directory = directory; + this.file = file; + this.key = key; + this.label = label; + } + + public static BrowserEntry parent(MediaDirectory directory) { + return new BrowserEntry(TYPE_PARENT, directory, null, "parent", ".."); + } + + public static BrowserEntry directory(MediaDirectory directory) { + return new BrowserEntry( + TYPE_DIRECTORY, + directory, + null, + "directory:" + directory.getDisplayPath(), + directory.name + "/"); + } + + public static BrowserEntry file(MediaFile file) { + return new BrowserEntry( + TYPE_FILE, null, file, "file:" + file.playlistUrl, file.name); + } + } +} diff --git a/app/src/main/res/drawable/media_browser_item_selector.xml b/app/src/main/res/drawable/media_browser_item_selector.xml new file mode 100644 index 0000000..95ca244 --- /dev/null +++ b/app/src/main/res/drawable/media_browser_item_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/media_cover_placeholder.xml b/app/src/main/res/drawable/media_cover_placeholder.xml new file mode 100644 index 0000000..cb03be0 --- /dev/null +++ b/app/src/main/res/drawable/media_cover_placeholder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/player_focus_indicator.xml b/app/src/main/res/drawable/player_focus_indicator.xml new file mode 100644 index 0000000..81069cf --- /dev/null +++ b/app/src/main/res/drawable/player_focus_indicator.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable/tv_banner.xml b/app/src/main/res/drawable/tv_banner.xml new file mode 100644 index 0000000..ee28539 --- /dev/null +++ b/app/src/main/res/drawable/tv_banner.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/app/src/main/res/layout/media_browser_item.xml b/app/src/main/res/layout/media_browser_item.xml new file mode 100644 index 0000000..250baaf --- /dev/null +++ b/app/src/main/res/layout/media_browser_item.xml @@ -0,0 +1,29 @@ + + + + + + + diff --git a/app/src/main/res/layout/player_activity.xml b/app/src/main/res/layout/player_activity.xml new file mode 100644 index 0000000..4733bcd --- /dev/null +++ b/app/src/main/res/layout/player_activity.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +