File Details
WM/3.0.0.18
- B
- Jun 22, 2026
- 3.01 MB
- 1.1K
- 1.21.11+4
- Forge + 2
File Name
watermedia-3.0.0.18.jar
Supported Versions
- 1.21.11
- 1.21.1
- 1.20.1
- 1.19.2
- 1.18.2
Curse Maven Snippet
📦 UPDATE 3.0.0.18 (BETA)
⚡ CodecsAPI
- ⚙️ Added:
ImageReader#reset()— frame-0 rewind (GIF/PNG/APNG/WebP; other formats full re-open) - ⚙️ Added:
CodecsAPI#available(String)— codec-availability query (pure-Java codecsPNG/JPEG/GIF/WEBP/NETPBMalways present) - ⚙️ Added:
common.dds.DDSHeader(DX10 DDS + per-frame-delay footer),common.bc.BCCodec(native seam, bindings pending)
⚡ MediaAPI — Animated images (TxMediaPlayer / GLEngine)
- ⚙️ Added: codec cache (BC over DDS) —
NetworkCache.Mode(DISK/CODEC, frommedia.txCodecCache) + streamingCodecWriter; dormant until native BC ships (playback unchanged) - ⚙️ Added:
GFXEngine#supportsCompressedTextures(String)/uploadCompressedFrames(ByteBuffer[], String, int)— default-off BCn upload hooks - ⚙️ Added: config
media.txCodecCache(default off) - ⚙️ Changed: Mode 2 gated by VRAM budget —
media.txFrameTexturesBudgetMB(32 MB, 0 disables) replacesmedia.txMultiTextureFrameThreshold; 256-frame cap - ⚙️ Changed: Mode 2 passive clock — no thread per animated image; frame resolved from wall time on
texture() - ⚙️ Changed: preloaded frame-texture sets upload progressively (no load hitch on long animations)
- ⚙️ Added:
GLEnginelatest-wins coalescing — ≤1 upload task queued, newer frames replace undrained - ⚙️ Added:
GLEnginepersistent-mapped PBO ring (ARB_buffer_storage/ GL 4.4); legacy PBO path as fallback - ⚙️ Changed: hot-path
glGetErroroff unless-Dwatermedia.glchecks=true - ⚙️ Changed: loop/seek/step-back rewind via
ImageReader#reset()(no disk re-read/decoder rebuild) - ⚙️ Added: shared decode permit pool — bounds aggregate Tx decode CPU (simultaneous GIFs no longer starve game threads)
- ⚙️ Changed: paused streaming waits on signals (no 100 Hz poll); pause/seek/stop interrupt frame delays
- ⚙️ Changed: streaming memory — retention 6→2 buffers, pool trimmed while paused, prefetch cap uses real frame size
⚡ MediaAPI
- ⚙️ Added:
MediaPlayer#maxSize(int, int)(+maxWidth()/maxHeight()) — caps uploaded frame dims per axis (min(native, cap), never upscales) - ⚙️ Added:
MediaPlayer.LodLevel(MAX/CLOSE/NEAR/FAR/FAR_AWAY= 100/75/50/25/10%) +lod(LodLevel)/lod()— % of capped dims; applies hot - ⚙️ Added:
MediaPlayer#sourceWidth()/sourceHeight()(native res pre-scale) viascaledWidth(int)/scaledHeight(int) - ⚙️ Added:
FFMediaPlayerper-frame downscale viasws_scale(SWS_AREA); keeps native pixel format when sws-supported, else BGRA - ⚙️ Added:
TxMediaPlayerJava area-average downscale before upload (Mode 3 on the fly; Modes 1-2 at prep) - ⚙️ Changed:
MRL.preload(URI...)moved toMediaAPI - ⚙️ Removed (
MRL):reloadAll(),forgotten(),error(),expired() - ⚙️ Added:
MRL.Status—FETCHING/LOADED/EXPIRED(manual reload) /ERROR/BLOCKED(mature-gated) /FORGOTTEN(renew viaMediaAPI.getMRL(URI))
⚡ MediaAPI — Playback engine (FFMediaPlayer / engines)
- ⚙️ Added:
SFXEngine#flush()/pendingMs()(ALEngineviaAL_SOFT_source_latency) — clock now tracks audible position - ⚙️ Added: config
media.ffmpegHardwareAcceleration+ auto SW fallback when GPU transfer fails/exceeds budget (AMD D3D11VA stutter) - ⚙️ Changed: audio fed eagerly (buffer pool = backpressure, no 2ms gate);
ALEnginebuffers 4→8 (~340ms) - ⚙️ Fixed: stale OpenAL buffers after underrun/pause-resume (audio "slowed down"/repeated)
- ⚙️ Fixed:
pause()never paused the source (drained/underran);startPaused()pause/clock-reset race - ⚙️ Fixed: resampler-flush PTS yanked clock backwards/stalled — delay now compensated in output PTS
- ⚙️ Fixed: mid-stream audio param changes (chained OGG / Icecast) rebuild resampler; state dropped on seek
- ⚙️ Fixed:
AV_NOPTS_VALUEtimestamps (Ogg demuxer) corrupted clock — synthesized continuity - ⚙️ Fixed: native use-after-free —
duration()/liveSource()/canPlay()read cached snapshots;release()waits for pipeline - ⚙️ Fixed: torn video frames (rotating buffer pool); stale
SwsContextafter resolution change (BGRA fallback) - ⚙️ Fixed:
file://broken on Linux/macOS; seek clamped to 0 without known duration; odd-height chroma copied one row short; stream indices re-resolved after reopen - ⚙️ Removed:
VULKANandOPENCLfrom HW decoder candidates
⚡ PlatformsAPI
- ⚙️ Removed:
IPlatform#validate(URI)(folded intogetData(URI)) - ⚙️ Changed:
IPlatform#getData(URI)is now 3-state —null(not this platform) / throws (belongs but failed, or mature-gated) /PlatformData(success) - ⚙️ Fixed:
PornHubPlatformNPE on hostless URIs (e.g.file://) broke local-file playback — now returnsnullfor a null host - ⚙️ Changed: Enhanced logging and exception messages
⚡ GENERAL
- ✨ Animated images (GIF / WebP) are far lighter and smoother — most animations no longer stream frame-by-frame, there is no longer a background thread per animation, long animations no longer hitch while loading, and many animations playing at once no longer stutter the game or each other (lower CPU and VRAM all around)
- ✨ Videos can use less VRAM and bandwidth — mods can now cap the upload resolution or pick a distance-based level of detail, so distant or many simultaneous screens cost far less
- 🛠️ Smoother video on AMD GPUs — playback now falls back to software decoding automatically when hardware decoding stutters, and hardware decoding can be disabled from the config (
media.ffmpegHardwareAcceleration) - 🛠️ Changed default
- 🐛 Fixed: local files (
file://) would not play on Linux and macOS — local media opens again on those systems - 🐛 Fixed: audio playing "slowed down" or repeating itself after a pause or a game hitch
- 🐛 Fixed: pausing did not actually pause audio (it kept draining and then cut out)
- 🐛 Fixed: live / streaming audio (chained OGG, Icecast radio) playing at the wrong speed
- 🐛 Fixed: torn or garbled video frames under heavy load
- 🐛 Fixed: occasional crashes and freezes while playing some streams