Changelog
Changelog
All notable changes to this project will be documented in this file.
[2.0.1]
Updates:
- Refactored
applyDefaultTrackSelectioninFastPixPlayer.ktinto smaller, more specific helper methods for audio and subtitle selection - Changed
streamTypeinFastPixMediaItemBuilder.ktfrom nullable to a default value ofStreamType.onDemand - Improved safety when registering
autoRotateObserverinMainActivity.ktusing null-safe calls - Updated
PlayerStore.ktandPlayerView.ktto support nullableFastPixPlayerinstances - Replaced
e.printStackTrace()withLogger.loginUtils.kt - Cleaned up code by using
.orEmpty()and removing unnecessary null checks inDrmManager.ktandFastPixPlayer.kt
[2.0.0]
Added
- Timestamp-only seek previews: when no spritesheet is available,
SeekPreviewListener.onSpritesheetLoaded(...)is now invoked with aSpritesheetMetadata.TIMESTAMP_ONLYsentinel (bitmap isnull,timestampMsreflects the scrub position), so apps can render the seek time even without thumbnails- Gated by
PreviewFallbackMode.TIMESTAMP; setPreviewFallbackMode.NONEto suppress
- Gated by
Changed
- Default stream host migration: the default
customDomainforFastPixPlayeris nowstream.fastpix.com(wasstream.fastpix.io). Resolved playback URLs and the example/docs reflect the new host - Spritesheet URL resolver:
FastPixSpritesheetUrlResolvernow mapsstream.fastpix.io→images.fastpix.comandstream.fastpix.app→images.fastpix.co. The previousstream.fastpix.io,stream.fastpix.app, andvenus-stream.fastpix.devmappings have been removed - Seek preview load is no longer an infinite retry loop:
SeekPreviewManager.loadSpritesheetnow attempts the load once and, on unrecoverable failure, settles into timestamp mode and completes the flow. The lower-level repository/source still retries transient errors internally. Removed theINITIAL_RETRY_DELAY_MS/MAX_RETRY_DELAY_MSconstants and the exponential backoff loop CustomSpritesheetSourcetreats all 4xx as terminal: previously only404skipped retry; now400/401/403/404etc. all short-circuit to the no-spritesheet path (these won’t recover via retry)SpritesheetMetadatavalidation relaxed to allow non-negative values so theTIMESTAMP_ONLYsentinel can be constructed. Real spritesheets are still validated viaisValid()before being used
Version
- Library version bumped to
2.0.0inbuild.gradle.ktsandFastPixPlayerLibraryInfo.PLAYER_VERSION
[1.0.9]
Added
-
DRM Support (Widevine): SDK-level DRM abstraction for protected content playback
- Added
DrmConfigdata class for configuring DRM without exposing Media3 internals - Added
DrmManagerinternal manager that builds Media3DrmConfigurationfrom SDK config - Added
drmConfigproperty inFastPixMediaItemBuilderto enable DRM on a per-media-item basis - DRM license URL is auto-constructed from
playbackId,playbackToken, andstreamType— no manual URL assembly required - Widevine UUID and multi-session enabled by default
- Added
-
Video Quality Switching: Manual and automatic video quality (rendition) selection
- Added
VideoTrackdata model exposingid,width,height,bitrate,label,isSelected, andisAuto - Added
getVideoQualities()to retrieve available video renditions sorted by resolution - Added
getCurrentVideoQuality()to get the currently active rendition - Added
setVideoQuality(trackId: String)to lock playback to a specific quality - Added
enableAutoQuality()to re-enable adaptive bitrate (ABR) selection - Quality switches are deferred during seek operations and applied on seek completion
- Video track discovery integrated into
TrackManageralongside existing audio/subtitle track management
- Added
[1.0.8]
- Bumped
media3-dataversion from1.2.4to1.2.5
[1.0.7]
Updates:
- Bumped
media3version from1.2.3to1.2.4 - Updated library version to
1.0.7inREADME.md,build.gradle.kts, andFastPixPlayerLibraryInfo.kt - Added
AnalyticsConfigandVideoDataDetailsintegration inMainActivity - Refactored and cleaned up code in
MainActivity.kt
[1.0.6] - 2026
Fix
- Crash Fix on Seek Preview Config
[1.0.5] - 2026
Added
-
Audio Track Switching: Support for discovering and switching between multiple audio tracks
- Added
getAudioTracks()to retrieve available audio tracks - Added
getCurrentAudioTrack()to get the currently selected track - Added
setAudioTrack(trackId: String)to switch audio tracks dynamically without interrupting playback - Added
setDefaultAudioTrack(languageCode: String)to automatically select preferred language - Added
AudioTrackListenerwith callbacks:onAudioTracksLoaded()onAudioTracksChange()onAudioTracksLoadedFailed()onAudioTrackSwitching()
- Added
-
Subtitle Track Switching: Support for subtitles with dynamic switching and rendering
- Added
getSubtitleTracks()to retrieve available subtitle tracks - Added
getCurrentSubtitleTrack()to get current subtitle selection - Added
setSubtitleTrack(trackId: String)to enable specific subtitle track - Added
disableSubtitles()to turn off subtitles - Added
setDefaultSubtitleTrack(languageCode: String)for automatic subtitle selection - Added
SubtitleTrackListenerwith callbacks:onSubtitlesLoaded()onSubtitleChange()onSubtitlesLoadedFailed()onSubtitleCueChange()
- Added
-
Subtitle Rendering Support
- Introduced
SubtitleCueInfoandSubtitleRenderInfofor real-time subtitle rendering - Enables custom subtitle UI implementation using cue updates
- Introduced
[1.0.4] - 2026
Added
- Seek Preview (Spritesheet thumbnails): Thumbnail previews while scrubbing
- Added
SeekPreviewConfigto configure seek preview behavior (enabled, preload, cache, fallback mode) - Added
PreviewFallbackModefor graceful fallback when thumbnails are unavailable (timestamp/none) - Added
SeekPreviewListenercallbacks:onSpritesheetInitialized,onSpritesheetFailed,onPreviewShow,onPreviewHide,onSpritesheetLoaded - Added
FastPixPlayer.Builder.setSeekPreviewConfig(config: SeekPreviewConfig?)to enable seek preview at player creation time - Added
FastPixPlayer.setSeekPreviewListener(listener: SeekPreviewListener?)to receive preview frames - Added
FastPixPlayer.showPreview(),FastPixPlayer.loadPreview(timeMs),FastPixPlayer.hidePreview()for seek-bar integration
- Added
[1.0.3] - 2026
Added
-
Volume Control: Comprehensive volume management API
- Added
setVolume(volume: Float)method to set volume level (0.0f to 1.0f) - Added
getVolume()method to get current volume level - Added
mute()method to mute playback (saves current volume for restoration) - Added
unmute()method to restore previous volume level - Added
onVolumeChanged(volumeLevel: Float)callback inPlaybackListener- triggered when device volume changes via hardware buttons or system controls - Added
onMuteStateChanged(isMuted: Boolean)callback inPlaybackListener- triggered when mute state changes - Automatic device volume monitoring with periodic checks (200ms interval)
- Volume state is preserved across configuration changes
- Added
-
AutoPlay Support: Automatic playback start when media is ready
- Added
setAutoplay(autoplay: Boolean)method inFastPixPlayer.Builderto configure autoplay during player creation - Added
autoplayproperty onFastPixPlayerto enable/disable autoplay at runtime - When enabled, playback automatically starts when media is ready to play
- No manual call to
play()required when autoplay is enabled - Autoplay state is preserved across configuration changes
- Added
-
Loop Playback: Seamless looping functionality
- Added
setLoop(loop: Boolean)method inFastPixPlayer.Builderto configure loop during player creation - Added
loopproperty onFastPixPlayerto enable/disable looping at runtime - When enabled, playback automatically restarts from the beginning when it reaches the end
- Current media item repeats indefinitely until loop is disabled
- Loop state is preserved across configuration changes
- Added
-
Playback Rate Control: Flexible playback speed adjustment
- Added
setPlaybackSpeed(speed: Float)method to set playback speed to a specific value - Added
getPlaybackSpeed()method to get current playback speed - Added
getAvailablePlaybackSpeeds()method to get all available speed options - Available playback speeds: 0.25x, 0.5x, 0.75x, 1.0x, 1.25x, 1.5x, 1.75x, 2.0x
- Added
onPlaybackRateChanged(rate: Float)callback inPlaybackListener- triggered when playback speed changes - Playback speed automatically adjusts to closest available speed if exact value is not available
- Playback speed state is preserved across configuration changes
- Added
[1.0.2] - 2026
Improved
- Code Optimization
- Refactoring
[1.0.1] - 2026
Added
-
Playback Control Methods: Simple and intuitive playback control API
- Added
play()method to start or resume playback - Added
pause()method to pause playback - Added
togglePlayPause()method to toggle between play and pause states - Added
isPlaying()method to check current playback state
- Added
-
PlaybackListener Interface: Comprehensive event-driven architecture for playback monitoring
- Added
onPlay()callback - triggered when playback starts or resumes - Added
onPause()callback - triggered when playback is paused - Added
onPlaybackStateChanged(isPlaying: Boolean)callback - triggered on play/pause state changes - Added
onError(error: PlaybackException)callback - triggered when playback errors occur - Added
onTimeUpdate(currentPositionMs, durationMs, bufferedPositionMs)callback - continuous time updates during playback (similar to HTML5onTimeUpdate)- Invoked approximately every 500ms during active playback
- Provides current position, total duration, and buffered position
- Enables real-time UI updates for seek bars and time displays
- Added
onSeekStart(currentPositionMs)callback - triggered when seek operations begin - Added
onSeekEnd(fromPositionMs, toPositionMs, durationMs)callback - triggered when seek operations complete - Added
onBufferingStart()callback - triggered when player enters buffering state - Added
onBufferingEnd()callback - triggered when player exits buffering state - All callbacks are invoked on the main thread
- Optional callbacks have default empty implementations for flexibility
- Added
-
Listener Management: Methods for managing playback listeners
- Added
addPlaybackListener(listener: PlaybackListener)method - Added
removePlaybackListener(listener: PlaybackListener)method - Added
clearPlaybackListeners()method
- Added
Improved
- Enhanced player API with more intuitive playback control methods
- Better developer experience for building custom playback UIs with comprehensive callbacks
- Real-time time updates enable smooth seek bar and time display synchronization
- Seek operation tracking provides better UX during seeking
Technical Details
- Playback speed is implemented using Media3’s
PlaybackParametersAPI - Speed state is preserved across configuration changes
- All speed methods are available on both
PlayerViewand the underlying player instance - Time updates are automatically managed - start when playback begins, stop when paused/ended
- Seek callbacks automatically pause time updates during seek operations for better performance
[1.0.0]
Initial Release:
The first public release of the FastPix Android Player SDK, packed with modern playback capabilities for both live and on-demand streaming scenarios.
-
Support for Public & Private Media: Secure token-based playback for private videos and effortless access for public streams.
-
Live & On-Demand Streaming: Adaptive support for both real-time and pre-recorded content with optimized buffering strategies.
-
Audio Track Switching: Dynamically switch between available audio tracks, ensuring accessibility and multi-language support.
-
Subtitle Track Switching: Enhance viewer experience with support for multiple subtitle tracks and on-the-fly switching.
-
QoE & Playback Metrics: Built-in tracking of key Video Quality of Experience (QoE) indicators such as: rebuffer events, bitrate/resolution changes, and startup time — enabling deep insights into playback performance.
-
Custom Playback Resolution: Programmatically set or limit playback resolution to suit user preferences or bandwidth constraints.
-
Stream Type Configuration: Fine-tuned handling of stream types like HLS, DASH, and others — with control over live latency modes and playback strategies.
-
Custom Domain Support: Compatible with FastPix’s custom domain system for secure and branded media delivery.
-
Rendition Order Control: Configure and prioritize video renditions based on bitrate, resolution, etc., to ensure predictable quality behavior. Supports both ascending (low ➜ high) and descending (high ➜ low) strategies. Ideal for optimizing playback under bandwidth constraints or enforcing quality-first strategies.