Skip to content
CAI
Software that uses CAICheck a score

google/ExoPlayer

48.7

Weak · 24 September 2026

300.8k

lines of production code

Java

with JavaScript

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a comprehensive media playback and processing library for Android, designed to handle a wide variety of audio, video, and container formats. It provides core playback capabilities including streaming, offline downloads, and ad insertion, while also supporting advanced features like video post-processing, 360-degree video stabilization, and hardware-accelerated decoding for codecs such as AV1, VP9, and Opus. The codebase has been significantly refactored to migrate from the legacy ExoPlayer API to the modern AndroidX Media3 namespace, emphasizing modularity, testability, and robust session management.

How it got here

2014–2016 — ExoPlayer V2 cleanup and Media3 migration

38 changes.

This period focused on stripping out legacy ExoPlayer V2 components, including the old chunk-based architecture, deprecated utilities, and Eclipse build files, while simultaneously introducing native C++ extensions for VP9, Opus, and FLAC. The work also involved migrating the codebase to the AndroidX Media3 namespace and updating the Gradle build system, signaling a transition toward a more modular and modern API structure.

2017–2018 — ExoPlayer 2 refactoring and modularization

41 changes.

This period focused on a comprehensive architectural refactoring of the ExoPlayer 2 codebase, introducing new interfaces and base classes for core components like the player, audio, video, and DRM systems. The team also modularized the library by splitting out UI, HLS, and DASH support into separate artifacts, while simultaneously laying the groundwork for the eventual migration to AndroidX Media3.

2019–2020 — Media3 migration and test coverage

38 changes.

This period focused on preparing the codebase for the androidx.media3 migration by deprecating legacy packages and introducing new utility classes and interfaces. Significant effort was dedicated to expanding unit and instrumentation test coverage across core components, extensions, and utility modules. Additionally, new features such as AV1 decoding, WorkManager integration, and GL demo applications were added.

2021–2023 — Media3 migration and feature expansion

30 changes.

This period focused on expanding ExoPlayer's capabilities with new modules for RTSP playback, video effects, and MP4 muxing, while simultaneously introducing the foundational classes for the Media3 migration. The work also included significant additions of test coverage across these new and existing components to ensure stability.

Features

AV1 video decoding via libgav1

The AV1 extension now includes a new libgav1-based video decoder and renderer, enabling playback of AV1 content on devices that support it. The implementation automatically detects the optimal number of decoding threads based on the device's CPU capabilities, and the decoder is marked as deprecated in favor of the androidx.media3 migration path.

extensions/av1/src/main/java · high confidence

Add GL demo app with video post-processing

A new GL demo application has been added to the codebase, featuring a custom GLSurfaceView that renders video frames with post-processing effects. The demo includes a main activity that sets up an ExoPlayer instance and a video processor that overlays a bitmap on the video output using GL shaders. This provides a concrete example of integrating OpenGL ES with ExoPlayer's video rendering pipeline.

demos/gl/src/main/java · high confidence

Add GLSL shaders for HDR and SDR color transfer and tone-mapping

The effect library now includes new GLSL fragment and vertex shaders to support high dynamic range (HDR) and standard dynamic range (SDR) video processing. These shaders implement color transfer functions (OETF/EOTF) for HLG and PQ (ST2084) color spaces, enabling the conversion between optical linear, electrical, and display-referred colors. The changes add support for HLG and PQ tone-mapping from BT.2020 to BT.709, as well as SDR video (SMPTE 170M) and sRGB color space handling. These assets are used by the \lib-effect\ module to process video frames with accurate color space conversions and tone-mapping.

library/effect/src/main/assets · high confidence

Add MediaPipe-based frame processing demo

A new demo application is added at demos/transformer/src/withMediaPipe that demonstrates running a MediaPipe graph (specifically an edge detection graph) on video frames. The demo includes an AndroidManifest, a MediaPipe graph configuration file (edge\_detector\_mediapipe\_graph.pbtxt), and a Java implementation (MediaPipeShaderProgram) that integrates with ExoPlayer's effect system to process video frames using MediaPipe's FrameProcessor.

demos/transformer/src/withMediaPipe · high confidence

Add RTMP (Real-Time Messaging Protocol) data source extension

A new RTMP data source implementation is now available in the ExoPlayer extensions, allowing applications to stream content via the Real-Time Messaging Protocol. The extension includes an RtmpDataSource class and a corresponding Factory for easy integration, enabling developers to handle RTMP streams directly within the player.

extensions/rtmp/src/main/java · high confidence

Add SurfaceControl demo app

A new demo application, SurfaceControl, has been added to demonstrate the use of Android's SurfaceControl API with ExoPlayer. The demo includes a main activity that manages multiple surface views and a corresponding package-info file, providing a reference implementation for developers looking to integrate surface control features.

demos/surface/src/main/java · high confidence

Add VP9 native extension for hardware-accelerated YUV decoding

The VP9 native extension is introduced, providing a new JNI-based decoder that supports direct YUV output to SurfaceView for hardware-accelerated conversion. The change adds the necessary build scripts (Android.mk, libvpx.mk), configuration generators, and C++/JNI source files (vpx\_jni.cc) to integrate the libvpx library into the Android NDK build system, enabling efficient video decoding on Android devices.

extensions/vp9/src/main/jni · high confidence

Add VP9 video decoding support via libvpx

The VP9 extension now includes a new LibvpxVideoRenderer and supporting classes (VpxDecoder, VpxLibrary, VpxDecoderException) that enable hardware-accelerated or software VP9 playback using the libvpx library. This change introduces the core decoder implementation, native library loading, and exception handling for the VP9 codec, allowing users to play VP9-encoded video content.

extensions/vp9/src/main/java · high confidence

Add WorkManager extension module

A new WorkManager extension module has been added to ExoPlayer, providing a Scheduler implementation that leverages Android's WorkManager for background task scheduling. This includes the module's README documentation, AndroidManifest configuration, and Java package structure, enabling users to integrate ExoPlayer with WorkManager for scheduling media tasks.

extensions/workmanager · high confidence

Add native Opus decoder extension for ExoPlayer

The Opus audio extension is now built as a native Android component, introducing a new JNI layer (opus\_jni.cc) and build scripts (Android.mk, libopus.mk) that link libopus statically into libopusV2JNI.so. This enables the ExoPlayer Opus extension to decode Opus streams in native code, with support for both 16-bit PCM and float output modes, and exposes the native decoder version string to the Java layer.

extensions/opus/src/main/jni · high confidence

Add new decoder library module with core decoder interfaces and buffer types

The \library/decoder\ module has been introduced, containing the foundational classes for media decoding. This includes the \Decoder\ interface for handling input/output buffers, \SimpleDecoder\ for threaded decoding, and specific buffer classes like \DecoderInputBuffer\, \DecoderOutputBuffer\, and \VideoDecoderOutputBuffer\. The module also adds \CryptoInfo\ and \CryptoConfig\ for handling encrypted media data. All classes in this new module are marked as deprecated, signaling that developers should migrate to \androidx.media3\.

library/decoder/src/main · high confidence

Add new visual effects to the transformer demo

The transformer demo now includes new visual effects: a bitmap overlay that blends an image over a video frame, and a vignette effect that darkens pixels toward the edges. These are implemented via new GLSL fragment shaders (fragment\_shader\_bitmap\_overlay\_es2.glsl, fragment\_shader\_vignette\_es2.glsl) and a supporting vertex shader (vertex\_shader\_copy\_es2.glsl) that passes through coordinates for texture sampling.

demos/transformer/src/main/assets · high confidence

Add support for RTSP playback

The library/rtsp module introduces support for streaming media via the Real-Time Streaming Protocol (RTSP). This includes the core components for handling RTP data channels, extracting RTP packets, and managing payload formats. The implementation supports basic and digest authentication, handles SDP parsing for media descriptions, and manages session states. This enables users to play RTSP streams using ExoPlayer.

library/rtsp · high confidence

Add support for camera motion tracks to stabilize 360 video playback

The ExoPlayer core library now includes a new camera motion rendering pipeline to stabilize 360-degree videos. This change introduces a new \CameraMotionRenderer\ that parses camera motion metadata tracks and applies the corresponding rotation to the video frame. The implementation adds several new classes in the \com.google.android.exoplayer2.video.spherical\ package, including \CameraMotionListener\ and \CameraMotionRenderer\, alongside supporting classes like \FrameRotationQueue\ and \OrientationListener\ to handle sensor data and rotation matrices. These components work together to ensure that the video projection remains stable and aligned with the user's head or device orientation, improving the viewing experience for VR and 360-degree content.

library/core/src/main/java/com/google/android/exoplayer2/video/spherical · high confidence

Added Android 10+ MediaParser integration classes

Added new adapter and utility classes (InputReaderAdapterV30, OutputConsumerAdapterV30, MediaParserUtil) that bridge the ExoPlayer internal APIs with the Android MediaParser framework available from API level 30. These components enable the media parser to read from and write to ExoPlayer's internal data structures, supporting features like log session tracking and track type mapping for progressive playbacks on Android 10 and above.

library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser · high confidence

Added FLAC parser and data source headers

The FLAC extension now includes the C++ header files for the FLAC parser and data source interface, enabling the underlying audio decoding logic to parse FLAC streams, extract metadata (such as Vorbis comments and picture metadata), and handle stream positioning.

extensions/flac/src/main/jni/include · high confidence

Added GLSL shaders for bitmap overlay video processing

New GLSL shader files (bitmap\_overlay\_video\_processor\_fragment.glsl and bitmap\_overlay\_video\_processor\_vertex.glsl) were added to the demos/gl/src/main/assets directory. These shaders implement the rendering logic for overlaying a bitmap onto a video stream, handling texture transformations and alpha blending.

demos/gl/src/main/assets · high confidence

Added decoder debugging counters and reuse evaluation logic

Introduced the \DecoderCounters\ class to track decoder events such as buffer counts, dropped frames, and video frame processing offsets for debugging purposes. Additionally, added the \DecoderReuseEvaluation\ class to manage and report the results and reasons for decoder reuse decisions, including specific discard reasons like MIME type changes or resolution changes.

library/core/src/main/java/com/google/android/exoplayer2/decoder · high confidence

Added experimental bandwidth estimation classes to ExoPlayer2

The \com.google.android.exoplayer2.upstream.experimental\ package now includes a suite of experimental bandwidth estimation classes, including the \BandwidthEstimator\ interface, \ExperimentalBandwidthMeter\, and various statistic implementations like \SlidingWeightedAverageBandwidthStatistic\ and \ExponentialWeightedAverageStatistic\. These classes provide new strategies for estimating network bandwidth and time-to-first-byte. All classes in this package are marked as \@Deprecated\ with a directive to migrate to \androidx.media3\.

library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental · high confidence

Added text span classes for ruby, emphasis, and horizontal-in-vertical text

Added new classes to the text span package to support advanced text features: RubySpan for ruby text annotations, TextEmphasisSpan for pronunciation aids like Japanese boutens, and HorizontalTextInVerticalContextSpan for tate-chu-yoko styling. A new LanguageFeatureSpan marker interface and SpanUtil helper were also introduced to manage these spans. All classes are marked as deprecated, signaling that users should migrate to androidx.media3.

library/common/src/main/java/com/google/android/exoplayer2/text/span · high confidence

Demo app adds offline download support and track selection UI

The main demo app now includes a complete offline download workflow, featuring a background DownloadService (DemoDownloadService) that manages media downloads and displays progress via the DownloadNotificationHelper. A new DownloadTracker component monitors download states and updates the UI, while the SampleChooserActivity integrates download toggles and permission handling. Additionally, a new TrackSelectionDialog with swipe tabs allows users to manually select video, audio, and text tracks, and the app now requests storage and notification permissions required for these features.

demos/main/src/main/java · high confidence

HLS module split into separate module

The HLS support code has been extracted from the main ExoPlayer library into a dedicated \library/hls\ module. This change introduces new package structures and classes such as \HlsChunkSource\, \HlsMediaChunk\, and \HlsMediaPeriod\ within the \com.google.android.exoplayer2.source.hls\ package, alongside associated factories and interfaces. Users must now explicitly include the \exoplayer-hls\ dependency to enable playback of HLS content, as the \DefaultMediaSourceFactory\ will no longer automatically detect and instantiate HLS sources without this module present.

library/hls, library/smoothstreaming · high confidence

Introduce ExoplayerCuesDecoder and SubtitleDecoderFactory for internal subtitle handling

Added ExoplayerCuesDecoder to handle the internal text/x-exoplayer-cues MIME type, and a new SubtitleDecoderFactory interface to manage subtitle decoder instantiation. This refactors how text tracks are decoded and rendered, supporting a wider range of subtitle formats including WebVTT, TTML, SubRip, SSA, TX3G, CEA-608/708, DVB, and PGS.

library/core/src/main/java/com/google/android/exoplayer2/text · high confidence

Introduce new AdsLoader interface and ad playback state utilities

The ads playback architecture is refactored by introducing a new \AdsLoader\ interface that decouples ad loading logic from the \AdsMediaSource\. This change adds \AdsLoader\, \ServerSideAdInsertionUtil\, and \SinglePeriodAdTimeline\ to manage ad state, handle ad group skipping, and support audio-only ad containers. These components provide a cleaner separation of concerns for server-side ad insertion, allowing implementations to manage ad loading and state independently while exposing ad events and errors through the media source's event listener.

library/core/src/main/java/com/google/android/exoplayer2/source/ads · medium confidence

Introduce testutils module for media test utilities

The testutils module is introduced to provide utility classes for media unit and instrumentation tests. This includes the Action and ActionSchedule classes for scheduling playback actions, AdditionalFailureInfo for enhanced JUnit error reporting, AssetContentProvider for accessing test assets, and BitmapPixelTestUtil for pixel-level testing. These utilities are now available for use in tests to simplify test setup and assertions.

testutils · high confidence

Introduce the ExoPlayer UI module

The UI module is now a standalone, independent library that provides all UI components for media playback, including the PlayerView, PlayerControlView, DefaultTimeBar, and subtitle rendering. Developers can now depend on the \exoplayer-ui\ artifact separately from the core player, allowing for easier modularization and decoupling of the UI layer from the media playback engine.

library/ui · high confidence

Introduce the \`datasource\` library module with new and refactored data source implementations

The \library/datasource\ module is introduced, containing the \DataSource\ interface and its implementations (\DefaultDataSource\, \FileDataSource\, \HttpDataSource\, etc.) along with supporting classes like \DataSourceException\ and \DataSourceUtil\. These classes are marked as deprecated in favor of \androidx.media3\, but remain available for the \exoplayer2\ package. The module also includes an \AndroidManifest.xml\ for the \com.google.android.exoplayer2.upstream\ package.

library/datasource/src/main · high confidence

Introduce the open-source Muxer module for creating MP4 container files

The library/muxer module is now open-sourced, providing a new API for creating MP4 container files. The module includes the core \Mp4Muxer\ class and supporting utilities for writing MP4 boxes, handling color metadata, and converting NAL units. The implementation supports H.264, H.265, and AV1 video, as well as AAC audio. Additionally, the module includes a comprehensive set of Android instrumentation tests (\Mp4MuxerEndToEndTest\) and unit tests (\AnnexBUtilsTest\) to verify the muxer's functionality.

library/muxer · high confidence

Introduces ColorInfo class for video color metadata

Adds a new ColorInfo class to represent video color information, including color space, range, transfer, and HDR static info. This enables more precise handling of HDR and SDR color formats in the video processing pipeline.

library/common/src/main/java/com/google/android/exoplayer2/video · high confidence

Introduction of RequirementsWatcher and Scheduler interface for background task scheduling

The ExoPlayer library now includes a new \RequirementsWatcher\ class and \Scheduler\ interface within the \com.google.android.exoplayer2.scheduler\ package. \RequirementsWatcher\ monitors system requirements such as network connectivity, charging state, idle status, and storage levels, notifying listeners when these conditions change. The \Scheduler\ interface defines how services are scheduled to run in the foreground when specific requirements are met, including a new \getSupportedRequirements\ method to check compatibility. These components provide the foundation for managing background tasks based on device state, though the entire \exoplayer2\ package is marked as deprecated in favor of \androidx.media3\.

library/core/src/main/java/com/google/android/exoplayer2/scheduler · high confidence

Introduction of new media source and period implementations

The library introduces several new classes to handle media playback and composition. A base implementation, BaseMediaSource, is added to manage parallel reuse and event listener registration. New composite source types are introduced: ClippingMediaSource and ClippingMediaPeriod to handle time-based clipping of media; CompositeMediaSource to manage multiple child sources; and ConcatenatingMediaSource to play a sequence of media sources. Additionally, a BundledExtractorsAdapter is added to select extractors from bundled classes, and a CompositeSequenceableLoaderFactory interface is provided for composite loading strategies.

library/core/src/main/java/com/google/android/exoplayer2/source · high confidence

Native FLAC decoder and metadata extraction for Android

Added the native C++ implementation for the FLAC audio extension on Android. This includes the JNI bridge (flac\_jni.cc) and the FLAC parser (flac\_parser.cc), which enable decoding FLAC audio streams and extracting metadata such as Vorbis comments and picture frames. The build configuration (Android.mk, Application.mk, flac\_sources.mk) integrates the libFLAC library to support high sample rates and metadata exposure to the Java layer.

extensions/flac/src/main/jni · high confidence

New DASH manifest model classes for media3 migration

The DASH manifest parsing layer has been refactored into a new set of data classes (including AdaptationSet, BaseUrl, Descriptor, Period, ProgramInformation, Representation, and others) to support the migration to androidx.media3. These classes encapsulate the structure of DASH MPD elements, providing a clean API for accessing media content components, base URLs, descriptors, and program information, all marked as deprecated in the legacy exoplayer2 package.

library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest · high confidence

New Robolectric test utilities module

A new 'robolectricutils' module has been introduced to centralize test infrastructure for Robolectric-based media tests. This includes a 'RobolectricUtil' class providing helper methods to run the main looper until specific conditions are met, and a 'TestPlayerRunHelper' to block test threads while verifying player states and errors. Additionally, a 'TestDownloadManagerListener' is provided to monitor download manager states, and a 'RandomizedMp3Decoder' is included to generate deterministic, randomized audio data for testing purposes.

robolectricutils · high confidence

New container module for media container and NAL unit utilities

A new \library/container\ module has been introduced to house media container functionality. This includes moving NAL unit-related utilities (such as \NalUnitUtil\ and \ParsableNalUnitBitArray\) from the common library into this new module, along with the \MdtaMetadataEntry\ class. The module provides classes for parsing H.264/AVC and H.265/HEVC sequence parameter sets and handling NAL unit bitstreams. The \FormatHolder\ class has been replaced by a package-info.java file in the new \com.google.android.exoplayer2.container\ package. Tests have been added for the moved utilities.

library/container · high confidence

New database module with database provider abstractions and versioning utilities

A new 'database' module has been added to the library, introducing a dedicated package for database-related functionality. This includes the \DatabaseProvider\ interface and its implementations (\DefaultDatabaseProvider\, \StandaloneDatabaseProvider\) which allow media library components to read and write to SQLite databases. Additionally, a \VersionTable\ utility is provided to manage versioning for media library database components, and a \DatabaseIOException\ is introduced to handle SQLite-related errors. The module also includes a deprecated \ExoDatabaseProvider\ class that extends \StandaloneDatabaseProvider\. These changes support internal database operations for the media library, with a clear deprecation notice advising users to migrate to \androidx.media3\.

library/database · high confidence

New effect primitives and overlay support

The effects module introduces a new base class for GL shader programs (BaseGlShaderProgram) and a suite of built-in effects including Brightness, Contrast, Crop, and ColorLut. It also adds support for rendering bitmap and drawable overlays, managing texture resources via BitmapTextureManager, and implements a frame-dropping strategy for controlling output frame rates.

library/effect/src/main/java · high confidence

New utility classes for media clocking and debug text

Added new classes in the core library: DebugTextViewHelper, which provides a way to periodically update a TextView with debug information from an ExoPlayer instance, and MediaClock/StandaloneMediaClock, which track the progression of media time and allow setting playback parameters. These components are marked as deprecated, indicating a shift towards the androidx.media3 library.

library/core/src/main/java/com/google/android/exoplayer2/util · high confidence

New video rendering and metadata interfaces

Added new classes and interfaces to the video package: a base \DecoderVideoRenderer\ class, a \VideoFrameMetadataListener\ interface for receiving frame metadata, a \VideoDecoderOutputBufferRenderer\ interface for rendering decoder output buffers, a \VideoDecoderGLSurfaceView\ implementation, a \FixedFrameRateEstimator\ for frame rate estimation, a \MediaCodecVideoDecoderException\ for decoder errors, and a \PlaceholderSurface\ for secure rendering. These changes introduce new mechanisms for handling video output, metadata, and frame rate estimation within the deprecated \com.google.android.exoplayer2\ package.

library/core/src/main/java/com/google/android/exoplayer2/video · high confidence

Opus audio decoder implementation added to ExoPlayer

The Opus audio extension now includes a complete decoder implementation (LibopusAudioRenderer, OpusDecoder, and supporting classes) that decodes and renders Opus audio using the native libopus library. This adds support for decoding Opus streams with configurable output formats (including float and 16-bit PCM) and handles DRM initialization data. The component is marked as deprecated in favor of androidx.media3.

extensions/opus/src/main/java · high confidence

Removals

Removal of TextTrackRenderer

The TextTrackRenderer class has been removed from the ExoPlayer library. This change eliminates the specific renderer responsible for processing and displaying textual subtitles, likely as part of a broader refactoring to unify subtitle handling or migrate to a different rendering architecture.

library/src/main/java/com/google/android/exoplayer/text · high confidence

Removal of legacy demo app components

The full demo application's legacy implementation has been removed, specifically deleting the \EventLogger\ for debugging, the \FullPlayerActivity\ main UI, and the \SmoothStreamingTestMediaDrmCallback\ and \WidevineTestMediaDrmCallback\ classes used for testing DRM content.

demo/src/main/java/com/google/android/exoplayer/demo/full · high confidence

Removed deprecated and internal ExoPlayer components

The library has removed several internal and deprecated classes, including ExoPlayer, ExoPlayerImpl, ExoPlayerImplInternal, FrameworkSampleSource, CodecCounters, CryptoInfo, DefaultLoadControl, LoadControl, MediaClock, and MediaCodecAudioTrackRenderer. This cleanup eliminates legacy APIs and internal implementation details, signaling a shift toward a more modular and stable public interface for media playback and buffering.

library/src/main/java/com/google/android/exoplayer · high confidence

Removed deprecated utility classes

The \ManifestFetcher\, \PlayerControl\, \Util\, and \VerboseLogUtil\ classes have been removed from the \com.google.android.exoplayer.util\ package. This removes legacy helper classes that are no longer part of the library's public API.

library/src/main/java/com/google/android/exoplayer/util · high confidence

Removed legacy SmoothStreaming implementation

The legacy SmoothStreaming components, including the manifest parser, fetcher, and chunk source, have been removed from the library. This change eliminates the old SmoothStreaming support in favor of the new extractor-based architecture.

library/src/main/java/com/google/android/exoplayer/smoothstreaming · high confidence

Removed legacy TTML parsing classes

The legacy TTML parsing implementation, specifically the TtmlNode and TtmlParser classes, has been removed from the codebase. This change eliminates the older XML-based subtitle parsing logic in favor of a newer, simplified approach to handling TTML subtitles.

library/src/main/java/com/google/android/exoplayer/text/ttml · high confidence

Removed legacy cache implementation classes

The \Cache\, \CacheDataSink\, \CacheDataSource\, \CacheSpan\, and \SimpleCache\ classes in the \com.google.android.exoplayer.upstream.cache\ package have been removed. This change eliminates the previous cache API and its associated data sink and source implementations, likely as part of a larger refactoring of the caching subsystem.

library/src/main/java/com/google/android/exoplayer/upstream/cache · high confidence

Removed legacy chunk-based media source architecture

The \chunk\ package has been removed, including the \Chunk\, \ChunkSource\, \ChunkSampleSource\, \Format\, \FormatEvaluator\, and various media chunk implementations (e.g., \Mp4MediaChunk\, \WebmMediaChunk\). This change eliminates the previous chunk-based loading and buffering model in favor of a new extraction and sample-based architecture, simplifying the media playback pipeline and removing deprecated components like \MultiTrackChunkSource\.

library/src/main/java/com/google/android/exoplayer/chunk · high confidence

Removed legacy demo player components

The demo application's legacy player implementation has been removed. Specifically, the \DemoPlayer\ wrapper class and its associated \RendererBuilder\ implementations (\DefaultRendererBuilder\, \DashVodRendererBuilder\, \SmoothStreamingRendererBuilder\) and the \DebugTrackRenderer\ have been deleted. This cleanup removes the older architecture from the demo app, likely as part of a broader refactoring to simplify the demo's codebase.

demo/src/main/java/com/google/android/exoplayer/demo/full/player · high confidence

Removed legacy upstream data loading and buffering components

The ExoPlayer upstream package has removed several legacy classes related to data loading and memory management. Specifically, the \Allocation\, \BufferPool\, \DataSource\, \DataSourceStream\, \DataSpec\, \DefaultBandwidthMeter\, \FileDataSource\, \HttpDataSource\, \Loader\, \NetworkLock\, and \NonBlockingInputStream\ interfaces and implementations have been deleted. This change eliminates the previous abstraction for loading media data from various sources (file, HTTP) and managing memory allocations, likely as part of a broader refactoring of the player's architecture.

library/src/main/java/com/google/android/exoplayer/upstream · high confidence

Architecture

Extractors module restructured and migrated to androidx.media3

The \library/extractor\ module has been reorganized to support the \androidx.media3\ migration, including the addition of an \AndroidManifest.xml\ and \proguard-rules.txt\ for the new module structure. Utility classes for audio formats (AAC, AC-3, AC-4, DTS, MPEG, Opus, WAV) have been moved into this module, and the codebase has been updated to use \androidx.media3\ package names and deprecation annotations, while also introducing new capabilities such as MP3 index seeking and support for JPEG motion photo metadata.

library/extractor · high confidence

Moved utility classes to common module

Utility classes such as BitmapLoader, BundleUtil, BundleableUtil, Clock, CodecSpecificDataUtil, ColorParser, ConditionVariable, Consumer, CopyOnWriteMultiset, DebugViewProvider, and EGLSurfaceTexture have been moved to the common module. This change improves code organization and reduces dependencies between modules, making the codebase easier to maintain and extend.

library/common/src/main/java/com/google/android/exoplayer2/util · high confidence

Behavioural changes

AV1 extension: native build system and CPU detection improvements

The AV1 extension's native build was migrated to a new CMake-based system (CMakeLists.txt) that explicitly links against the Google cpu\_features library and applies -O2 optimization for release builds. Additionally, new cpu\_info.cc/h files were added to detect the number of performance cores on Android devices, enabling the decoder to use a heuristic for determining the default thread count.

extensions/av1/src/main/jni · high confidence

Add DataReader interface to upstream package

The DataReader interface has been added to the com.google.android.exoplayer2.upstream package, defining a contract for reading bytes from a data stream. This new interface includes a read method that returns the number of bytes read or a result code, and throws IOException on errors. The interface is marked as deprecated with a note to migrate to androidx.media3.

library/common/src/main/java/com/google/android/exoplayer2/upstream · high confidence

Added package-info.java for trackselection

A package-info.java file was added to the com.google.android.exoplayer2.trackselection package, applying the @NonNullApi annotation to enforce non-null contract expectations for that package.

library/common/src/main/java/com/google/android/exoplayer2/trackselection · high confidence

Audio processing and attributes moved to common module

The audio processing infrastructure has been reorganized into the common module. This includes the new AudioAttributes class, which configures playback via the underlying platform AudioTrack, and the AudioProcessingPipeline, which manages the flow of buffers through multiple AudioProcessor instances. New classes such as AudioProcessor, BaseAudioProcessor, and AudioProcessorChain have been introduced to handle audio transformations, including speed and pitch adjustments via the Sonic library. Additionally, the ToInt16PcmAudioProcessor and AuxEffectInfo classes are now part of the common audio package, providing standardized interfaces for audio format conversion and auxiliary effect management.

library/common/src/main/java/com/google/android/exoplayer2/audio · high confidence

Cronet extension deprecated in favor of androidx.media3

The Cronet extension classes (including CronetDataSource, CronetDataSourceFactory, and CronetEngineWrapper) are now marked as deprecated. Developers are encouraged to migrate to the androidx.media3 library, which contains the same ExoPlayer code. The CronetEngineWrapper class, which previously handled automatic selection between natively bundled and Google Play Services Cronet implementations, is also deprecated; users should now instantiate a CronetEngine directly or use CronetUtil.buildCronetEngine for headless environments.

extensions/cronet/src/main/java · high confidence

DASH downloader implementation and null-safety annotations

The DASH offline downloader implementation (DashDownloader) and its package-level null-safety annotations have been added. This introduces the concrete logic for downloading DASH content, including segment enumeration and parallel execution via an Executor, while establishing non-null defaults for the package to improve code safety.

library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline · high confidence

Deprecate ExoPlayer 2.x extensions in favor of AndroidX Media3

The OkHttp extension classes (OkHttpDataSource, OkHttpDataSourceFactory) are now marked as deprecated, signaling that the com.google.android.exoplayer2 package is no longer the active development path. Users are directed to migrate to the androidx.media3 library, which contains the same ExoPlayer code under the new package structure. This change does not remove functionality but encourages upgrading to the modern AndroidX namespace to ensure continued support and compatibility.

extensions/leanback/src/main/java, extensions/mediasession/src/main/java, extensions/okhttp/src/main/java · high confidence

Deprecate ExoPlayer 2.x media2 extension and provide migration guidance

The media2 extension in the \extensions/media2\ package is now deprecated, with all public classes and methods marked as \@Deprecated\ and pointing users to the \androidx.media3\ migration guide. This change includes the introduction of new internal classes such as \DefaultMediaItemConverter\, \MediaItemConverter\, \PlayerCommandQueue\, \PlayerWrapper\, \SessionCallback\, \SessionCallbackBuilder\, \SessionPlayerConnector\, and \Utils\ to facilitate the transition, while removing deprecated APIs like \SimpleExoPlayer.Builder\ and \ControlDispatcher\ from the public surface.

extensions/media2/src/main/java · high confidence

Deprecated ExoPlayer 2 Cast extension

The Cast extension classes (CastPlayer, CastTimeline, DefaultMediaItemConverter, etc.) are now marked as deprecated with Javadoc directing users to migrate to androidx.media3. The MediaItemConverter interface was renamed from SubtitleParser and moved to the cast package, and the package-info.java was updated to reflect the new package structure.

extensions/cast/src/main/java · high confidence

Deprecated ExoPlayer 2 upstream classes and interfaces

The upstream package now contains newly introduced or refactored classes such as Allocation, Allocator, BandwidthMeter, CmcdConfiguration, DefaultAllocator, DefaultBandwidthMeter, DefaultLoadErrorHandlingPolicy, LoadErrorHandlingPolicy, LoaderErrorThrower, and ParsingLoadable. All these classes are marked as deprecated with a directive to migrate to androidx.media3, indicating that the library is transitioning away from the com.google.android.exoplayer2 namespace.

library/core/src/main/java/com/google/android/exoplayer2/upstream · high confidence

Deprecated ExoPlayer UI components and added AdOverlayInfo.Builder

The ExoPlayer2 UI package is marked as deprecated with a directive to migrate to androidx.media3. New types AdOverlayInfo and AdViewProvider are introduced to manage ad-related UI overlays, with AdOverlayInfo providing a Builder pattern for constructing overlay information.

library/common/src/main/java/com/google/android/exoplayer2/ui · high confidence

Deprecated analytics components in ExoPlayer 2

The \AnalyticsCollector\, \DefaultAnalyticsCollector\, \PlaybackSessionManager\, \MediaMetricsListener\, \PlaybackStats\, \PlaybackStatsListener\, and \PlayerId\ classes in the \com.google.android.exoplayer2.analytics\ package have been marked as deprecated. Developers are advised to migrate to \androidx.media3\ to access the equivalent, updated analytics and playback tracking capabilities.

library/core/src/main/java/com/google/android/exoplayer2/analytics · high confidence

Deprecated and removed the legacy ExoPlayer2 FLAC extension

The FLAC extension in the \com.google.android.exoplayer2.ext.flac\ package has been marked as deprecated, with a migration guide pointing users toward \androidx.media3\. The implementation files (including \FlacExtractor\, \FlacDecoderJni\, and \LibflacAudioRenderer\) remain present in the diff but are annotated with \@Deprecated\ and contain references to the old \com.google.android.exoplayer2\ package structure. This change signals that the legacy ExoPlayer2 FLAC support is being phased out in favor of the newer Media3 API.

extensions/flac/src/main/java · high confidence

Deprecation of com.google.android.exoplayer2 package

The com.google.android.exoplayer2 package, including DrmInitData and related DRM classes, is now deprecated. Users are advised to migrate to androidx.media3, which contains the same ExoPlayer code. The DrmInitData class and its associated package-info file have been marked as deprecated, signaling the end of updates for the legacy package.

library/common/src/main/java/com/google/android/exoplayer2/drm · high confidence

ExoPlayer v2.19.1 release with deprecated API migration support

The library has been updated to version 2.19.1, introducing the \BasePlayer\ abstract class to simplify implementing the \Player\ interface and providing default implementations for common playback controls. A new \Bundleable\ interface and \BundleListRetriever\ utility have been added to support serializing and transferring complex object graphs across Android IPC boundaries. Additionally, the \C\ constants class has been expanded with new encoding and crypto type definitions, and \ParserException\ has been refactored with factory methods to provide more specific error context.

library/common/src/main/java/com/google/android/exoplayer2 · high confidence

FFmpeg audio extension refactored with new decoder and renderer classes

The FFmpeg audio extension has been restructured to use new classes: FfmpegAudioDecoder, FfmpegAudioRenderer, and FfmpegLibrary. The decoder now explicitly waits for and propagates channel count and sample rate from the native library, and supports float output. The renderer checks sink format support for both 16-bit and float PCM encodings. The native library loader was renamed from 'libffmpeg\_jni' to 'ffmpegJNI'. A dedicated FfmpegDecoderException was created for FFmpeg-specific errors, replacing the generic ExoPlaybackException for these components.

extensions/ffmpeg/src/main/java · high confidence

FFmpeg extension build system migrated to CMake

The FFmpeg extension's native layer now uses CMake (version 3.21.0+) to build the shared library, replacing the previous build scripts. This change introduces a CMakeLists.txt configuration, a dedicated build script (build\_ffmpeg.sh) for compiling FFmpeg libraries, and updates the JNI wrapper (ffmpeg\_jni.cc) to link against the statically imported FFmpeg libraries (avutil, swresample, avcodec).

extensions/ffmpeg/src/main/jni · high confidence

IMA extension refactors ad loading and introduces server-side ad insertion support

The IMA extension has been refactored to improve robustness and add new capabilities. Ad loading is now handled by a new AdTagLoader class, while ImaAdsLoader is updated with a Builder pattern and supports setting ad error and event listeners. The extension now supports server-side ad insertion (SSAI) via the new ImaServerSideAdInsertionUriBuilder and related utilities. Additionally, the extension allows apps to handle ad clicked/tapped events, pause/resume ads, and configure ad preloading timeouts and MIME types.

extensions/ima/src/main/java · high confidence

Improved media decoding reliability and performance via asynchronous buffer queueing

The media decoding pipeline has been refactored to support asynchronous buffer queueing on a background thread, which improves performance and responsiveness during playback. This change introduces new internal components such as \AsynchronousMediaCodecBufferEnqueuer\ and \AsynchronousMediaCodecCallback\ to handle buffer operations off the main thread, while also adding a \BatchBuffer\ to optimize buffer handling. Additionally, the \MediaCodecAdapter\ interface and its factory have been updated to support both synchronous and asynchronous modes, with the default behavior on Android 31+ favoring the asynchronous implementation for better stability.

library/core/src/main/java/com/google/android/exoplayer2/mediacodec · high confidence

Migrate from ExoPlayer to AndroidX Media3

The library has been migrated from the legacy ExoPlayer package to the new androidx.media3 namespace. This change updates all internal usages and public APIs to use the new package structure, meaning developers must update their imports and references from the old ExoPlayer classes to their Media3 equivalents.

. · high confidence

Move TrackGroup and TrackGroupArray to common

The TrackGroup and TrackGroupArray classes have been moved to the common module, making them available for use across different parts of the ExoPlayer library. This change also includes the addition of an optional id field to TrackGroup and ensures that metadata is excluded from Format when bundling from TrackGroup. The TrackGroup class now implements Bundleable, allowing it to be serialized and deserialized via Android Bundles, which is essential for state preservation. Additionally, the package-info.java files for the source and ads packages have been added, indicating a restructuring of the package hierarchy.

library/common/src/main/java/com/google/android/exoplayer2/source · high confidence

Offline download support refactored and simplified

The offline download API has been refactored to simplify usage and improve reliability. The \DownloadState\ class was renamed to \Download\ and now contains its own action and progress data, while \DownloadManager.Task\ was renamed to \Task\ and moved into an inner class. The \DownloadManager\ constructor was simplified, and the \DownloadManager.Listener\ interface was updated with new callbacks like \onInitialized\ and \onWaitingForRequirementsChanged\. Additionally, the \DownloadService\ was updated to support foreground notifications and requirements watching, and the \DownloadHelper\ was refactored to accept \MediaItem\ directly. These changes streamline the download management workflow and improve state tracking.

library/core/src/main/java/com/google/android/exoplayer2/offline · high confidence

Refactored DASH source implementation into new classes

The DASH source implementation has been refactored into new classes including DashChunkSource, DashMediaPeriod, DashMediaSource, DashSegmentIndex, and others, providing a cleaner separation of concerns for handling DASH streams. This change introduces new interfaces and implementations for managing chunk sources, media periods, and segment indexing, while maintaining backward compatibility through deprecation of the old MediaSourceFactory approach.

library/dash/src/main/java/com/google/android/exoplayer2/source/dash · high confidence

Refactored DRM session management with new core classes and interfaces

The DRM subsystem has been restructured to improve session lifecycle management and error handling. A new \DrmSession\ interface and \DefaultDrmSession\ implementation introduce reference counting for more robust session acquisition and release, preventing resource leaks. The \DrmSessionManager\ interface now supports pre-acquiring sessions via \preacquireSession\ and provides a \DrmSessionReference\ for managing pre-acquired states. A \DefaultDrmSessionManagerProvider\ was added to centralize the creation of \DrmSessionManager\ instances from \MediaItem\ configurations. Additionally, \DrmUtil\ was introduced to standardize DRM error code mapping, and \ClearKeyUtil\ was added to handle ClearKey-specific data adjustments for older Android versions.

library/core/src/main/java/com/google/android/exoplayer2/drm · high confidence

Refactored audio rendering and playback tracking architecture

The audio playback subsystem has been restructured to improve position tracking accuracy and decoder management. A new \AudioSink\ interface and \AudioTrackPositionTracker\ class have been introduced to manage audio output and track playback head position more reliably, reducing issues with position jank and drift. The \DecoderAudioRenderer\ and \MediaCodecAudioRenderer\ have been updated to use these new components, which also support configurable buffer sizes and improved handling of stream discontinuities and format changes.

library/core/src/main/java/com/google/android/exoplayer2/audio · medium confidence

Refactored chunk loading and extraction architecture in ExoPlayer core

The chunk loading and extraction subsystem has been restructured to improve testability and separation of concerns. A new \ChunkExtractor\ interface and \BundledChunkExtractor\ implementation decouple the logic for parsing media formats from the chunk loading process. \BaseMediaChunk\ and \BaseMediaChunkOutput\ have been made public to allow custom implementations and unit testing. The \ChunkSampleStream\ has been updated to work with the new \ChunkExtractor\ and \TrackOutputProvider\ patterns, enabling more flexible track output handling. These changes provide a cleaner API for media source implementations to integrate with the player's loading pipeline.

library/core/src/main/java/com/google/android/exoplayer2/source/chunk · high confidence

Refactored core player architecture and deprecated legacy classes

The core library has been refactored to introduce new base classes like BaseRenderer and AbstractConcatenatedTimeline, while deprecating older implementations such as SimpleExoPlayer. This change consolidates player logic into the ExoPlayer interface and its implementation, simplifying the API for playlist management, ad handling, and track selection. Developers should migrate to the new builder pattern and updated component interfaces.

library/core/src/main/java/com/google/android/exoplayer2 · high confidence

Refactored metadata handling with early output support and nested metadata unwrapping

The metadata rendering pipeline has been refactored to support early metadata output, allowing applications to receive metadata as soon as it is available rather than waiting for synchronization with the rendering position. The \MetadataRenderer\ now accepts a configuration flag to enable this behavior. Additionally, the system now supports unwrapping nested metadata messages, recursively decoding wrapped metadata entries. The \MetadataOutput\ interface has been renamed from \Predicate\ and updated to receive \Metadata\ objects directly. These changes improve the responsiveness of metadata delivery and enhance support for complex metadata structures.

library/core/src/main/java/com/google/android/exoplayer2/metadata · medium confidence

Refactored track selection architecture with new interfaces and base classes

The track selection system has been restructured to introduce a new \TrackSelection\ interface and a \BaseTrackSelection\ abstract implementation, alongside a dedicated \TrackSelector\ interface and \MappingTrackSelector\ base class. This refactoring separates the definition of a track selection from its dynamic update behavior, allowing for more flexible selection strategies. The \TrackSelector\ now returns a \TrackSelectorResult\ that encapsulates selections, renderer configurations, and track metadata, providing a more structured way to manage how media tracks are chosen and mapped to renderers.

library/core/src/main/java/com/google/android/exoplayer2/trackselection · high confidence

Removal of deprecated ExoPlayer SegmentIndex class

The library has removed the \SegmentIndex\ class from the \com.google.android.exoplayer.parser\ package. This change, part of the transition to AndroidX Media3, eliminates the legacy segment indexing implementation, requiring users to adopt the updated Media3 APIs for media playback and segment management.

library · high confidence

Removal of legacy WebM extractor implementation

The legacy \EbmlReader\ base class and the \WebmExtractor\ implementation in the \library/src/main/java/com/google/android/exoplayer/parser/webm\ directory have been removed. This change eliminates the previous WebM parsing logic, which previously handled extraction for formats like VP9 video, and likely impacts any components relying on the old WebM extraction pipeline.

library/src/main/java/com/google/android/exoplayer/parser/webm · high confidence

Removed Eclipse Java 1.6 compiler settings

The Eclipse JDT core preference files for the demo and library modules have been removed. These files previously enforced Java 1.6 as the target platform, compliance, and source level. Their removal indicates a shift away from Eclipse-specific project configuration, likely as part of the broader ExoPlayer V2 refactor.

demo/src/main/.settings, library/src/main/.settings · medium confidence

Removed Eclipse project configuration files

The demo and library modules have had their Eclipse-specific project files (.classpath, .project, and project.properties) removed. This change eliminates support for the Eclipse IDE, requiring developers to use alternative build systems like Gradle or Android Studio for the ExoPlayer demo and library modules.

demo/src/main, library/src/main · high confidence

Removed legacy DASH MPD parsing classes

The DASH MPD parsing layer has been refactored by removing several legacy classes including AdaptationSet, ContentProtection, MediaPresentationDescriptionFetcher, MediaPresentationDescriptionParser, Period, Representation, Segment, and SegmentedRepresentation. This cleanup simplifies the internal structure of the DASH manifest parser, likely paving the way for a new, more extensible parsing architecture.

library/src/main/java/com/google/android/exoplayer/dash/mpd · high confidence

Removed legacy DRM session manager interfaces

The legacy \DrmSessionManager\ interface and its \StreamingDrmSessionManager\ implementation have been removed from the ExoPlayer library. This change eliminates the older DRM session management API in favor of the updated V2 DRM architecture, meaning developers must migrate to the new session manager interfaces to handle DRM initialization, key loading, and playback state management.

library/src/main/java/com/google/android/exoplayer/drm · high confidence

Removed legacy MP4 parser classes

The MP4 parser implementation has been refactored, resulting in the removal of several internal classes including Atom, CodecSpecificDataUtil, FragmentedMp4Extractor, ParsableByteArray, Track, TrackEncryptionBox, and TrackFragment. This change alters the internal structure of the MP4 parsing logic, which may affect any code relying on these specific classes or their methods.

library/src/main/java/com/google/android/exoplayer/parser/mp4 · high confidence

Removed legacy demo app components

The legacy demo application has been simplified by removing the old sample selection interface and associated utility classes. Specifically, the \DemoUtil\, \SampleChooserActivity\, and \Samples\ classes have been deleted, indicating a shift away from the previous static sample list and activity-based navigation in favor of a newer demo app structure.

demo/src/main/java/com/google/android/exoplayer/demo, demo/src/main/java/com/google/android/exoplayer/demo/simple · high confidence

Removed separate DASH chunk source classes for MP4 and WebM

The distinct \DashMp4ChunkSource\ and \DashWebmChunkSource\ classes have been removed from the DASH implementation. This change consolidates the handling of MP4 and WebM media chunks, likely as part of the broader effort to merge fMP4/H264 and WebM/VP9 DASH implementations, simplifying the architecture by removing redundant source classes.

library/src/main/java/com/google/android/exoplayer/dash · high confidence

Transformer demo app receives major UI and feature updates

The Transformer demo application has been significantly updated with new visual effects and configuration options. Users can now apply RGB and HSL color adjustments, contrast adjustments, and various overlays (bitmap, text, timer) to their media. The configuration interface has been expanded to include controls for HDR mode selection, debug preview toggling, and audio effect settings. Additionally, the demo now supports 8k video, portrait aspect ratios, and includes a local file picker for media selection.

demos/transformer/src/main/java · high confidence

Update Cast demo app to use MediaItem and StyledPlayerView

The Cast demo application has been updated to use the new MediaItem API for defining media sources, including support for DRM-protected content and various stream types (HLS, DASH, MP4, MKV, MP3). The UI has been migrated from PlayerView to StyledPlayerView, and the app now supports queue manipulation (add, remove, move items) and handles remote queue changes. The application class and utility classes have been updated to reflect these changes, and the code is marked as deprecated in favor of androidx.media3.

demos/cast/src/main/java · high confidence

Fixes

Fix timestamp comparison for seeks in fMP4

Corrects the logic used to compare timestamps when performing seek operations in fragmented MP4 (fMP4) content. This ensures that seek targets are accurately matched to the correct media samples, preventing playback errors or incorrect seek positions in fMP4 streams.

(repo-wide) · high confidence

Test coverage

Add Android instrumentation tests for the Transformer module; Add GTS playback tests for DASH, Common Encryption, and offline playback; Add testdata module for media test assets; Added Android instrumentation tests for VP9 playback; Added Android instrumentation tests for the Media2 extension; Added Android instrumentation tests for upstream data sources; Added Android instrumented tests for video frame processing effects; Added Android test layout for media2; Added DASH offline download tests; Added IMA playback tests; Added comprehensive test coverage for the Cast extension; Added contract and unit tests for OkHttpDataSource; Added contract test for CronetDataSource; Added end-to-end playback tests for multiple media formats; Added end-to-end tests for DASH playback and metadata rendering; Added instrumentation test for Clearkey DRM playback; Added instrumentation tests for FLAC extension; Added instrumentation tests for clipped playback and stream volume management; Added test resource files for Android instrumentation tests; Added tests for ExoPlayer analytics components; Added tests for ExoPlayer cues decoder; Added tests for IMA extension ad loading and state management; Added tests for metadata rendering and decoding; Added tests for upstream components; Added unit and contract tests for the datasource library; Added unit test for FFMPEG extension's DefaultRenderersFactory; Added unit test for FLAC extension renderer factory; Added unit test for RTMP data source instantiation; Added unit tests for AdPlaybackState; Added unit tests for DASH manifest parsing and related utilities; Added unit tests for DRM session management and license handling; Added unit tests for DrmInitData; Added unit tests for ExoPlayer ad insertion logic; Added unit tests for ExoPlayer audio components; Added unit tests for ExoPlayer core components; Added unit tests for Metadata parcelable behavior; Added unit tests for Opus decoder and DefaultRenderersFactory; Added unit tests for StreamKey serialization; Added unit tests for TrackGroup serialization; Added unit tests for VP9 extension; Added unit tests for VideoSize serialization; Added unit tests for common utility classes; Added unit tests for core media source components; Added unit tests for experimental bandwidth meter classes; Added unit tests for offline download components; Added unit tests for spherical video components; Added unit tests for text processing components; Added unit tests for the asynchronous MediaCodec adapter and related components; Added unit tests for the video effect processing pipeline; Added unit tests for track selection components; Added unit tests for track selection configuration and overrides; Added unit tests for video rendering and frame-rate estimation.

Dependencies

Centralize ExoPlayer and third-party dependency versions in a shared Gradle file

The project now uses a new \constants.gradle\ file to define the ExoPlayer release version (2.19.1) and all third-party dependency versions (such as Guava, JUnit, Robolectric, and AndroidX libraries). This change consolidates version management, ensuring that all modules and demo apps reference the same versions for consistent builds and easier updates.

(dependencies) · high confidence

Updated Gradle wrapper to version 7.4.2

The Gradle wrapper has been upgraded from version 1.12 to 7.4.2. This update brings the project's build system to a more recent version of Gradle, which may include performance improvements, new features, and compatibility updates for the Android build process.

gradle · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 49 → 49 (-0.2)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 65 → 79 (+13.1)
  • Architecture 100 → 100 (-0.3)
  • Maturity 61 → 61 (-0.0)
  • Readiness 26 → 37 (+10.8)
  • Security 90 → 92 (+2.0)
  • Accessibility 43 (new)

Resolved (196)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (10 lines × 2) (extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java)
  • Duplicated block (10 lines × 2) (library/common/src/main/java/com/google/android/exoplayer2/util/Util.java)
  • Duplicated block (10 lines × 2) (library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java)
  • Duplicated block (10 lines × 2) (library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java)
  • Duplicated block (10 lines × 2) (library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java)
  • Duplicated block (10 lines × 2) (library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java)
  • Duplicated block (10 lines × 2) (library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java)
  • Duplicated block (10 lines × 2) (library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java)
  • Duplicated block (10 lines × 2) (library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java)
  • Duplicated block (10 lines × 2) (library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java)
  • Duplicated block (10 lines × 2) (library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java)
  • Duplicated block (10 lines × 2) (library/effect/src/main/java/com/google/android/exoplayer2/effect/OverlayShaderProgram.java)
  • Duplicated block (10 lines × 2) (library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java)
  • Duplicated block (10 lines × 2) (library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java)
  • Duplicated block (10 lines × 2) (library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java)
  • Duplicated block (10 lines × 2) (library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java)
  • Duplicated block (10 lines × 2) (library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java)
  • Duplicated block (10 lines × 2) (library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java)
  • …and 176 more

New (1539)

  • Boundary-crossing change coupling: FfmpegLibrary.java ↔ DefaultRenderersFactory.java (extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegLibrary.java)
  • Change coupling: AnalyticsCollector.java ↔ AudioRendererEventListener.java (library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java)
  • Change coupling: AnalyticsListener.java ↔ AudioRendererEventListener.java (library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java)
  • Change coupling: DefaultMediaSourceFactory.java ↔ FakeMediaSourceFactory.java (library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java)
  • Change coupling: OutputConsumerAdapterV30.java ↔ HlsSampleStreamWrapper.java (library/core/src/main/java/com/google/android/exoplayer2/source/mediaparser/OutputConsumerAdapterV30.java)
  • Change-coupling hub: ForwardingAudioSink.java → DecoderAudioRenderer.java, DefaultAudioSink.java, MediaCodecAudioRenderer.java (library/core/src/main/java/com/google/android/exoplayer2/audio/ForwardingAudioSink.java)
  • ClassTooLong: AdPlaybackState (library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java)
  • ClassTooLong: AdaptiveTrackSelection (library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java)
  • ClassTooLong: C (library/common/src/main/java/com/google/android/exoplayer2/C.java)
  • ClassTooLong: Cea608Decoder (library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java)
  • ClassTooLong: Cea708Decoder (library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java)
  • ClassTooLong: ChunkSampleStream (library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java)
  • ClassTooLong: Cue (library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java)
  • ClassTooLong: DashManifestParser (library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java)
  • ClassTooLong: DecoderVideoRenderer (library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java)
  • ClassTooLong: DefaultAnalyticsCollector (library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultAnalyticsCollector.java)
  • ClassTooLong: DefaultAudioSink (library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java)
  • ClassTooLong: DefaultBandwidthMeter (library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java)
  • ClassTooLong: DefaultDashChunkSource (library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java)
  • ClassTooLong: DefaultDrmSessionManager (library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java)
  • …and 1519 more

Architecture

  • Containers 0 added · 0 removed · contexts 23 added · 1 removed · edges 64 added · 0 removed

Added bounded contexts (23)

  • cast
  • common
  • container
  • core
  • cronet
  • dash
  • datasource
  • effect
  • extractor
  • flac
  • hls
  • ima
  • mediasession
  • muxer
  • playbacktests
  • robolectricutils
  • rtmp
  • rtsp
  • smoothstreaming
  • testutils
  • …and 3 more

Removed bounded contexts (1)

  • .

Added dependency edges (64)

  • cast → common
  • cast → testutils
  • cast → ui
  • common → testutils
  • container → common
  • core → common
  • core → datasource
  • core → extractor
  • core → testutils
  • cronet → common
  • cronet → datasource
  • dash → common
  • dash → core
  • dash → datasource
  • dash → extractor
  • datasource → common
  • effect → common
  • extractor → common
  • extractor → container
  • flac → common
  • …and 44 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

google/ExoPlayer was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 24 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit dd430f7053a1a3958deea3ead6a0565150c06bfc — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-ae95d6cad036.