ZoneMinder 1.38.1 Release Notes
This is a maintenance release that includes bug fixes, performance improvements, and enhancements to ZoneMinder 1.38.
Key Highlights
🎯 ONVIF Improvements
- New unified ONVIF control module - Replaces four separate vendor-specific implementations with a single, more robust module
- Automatic SSL verification fallback for cameras with self-signed certificates
- Improved clock drift handling - Configurable timestamp validity window (10-600 seconds) to handle time differences between ZoneMinder and cameras
- Better authentication - Fixes for "not authorized" errors caused by clock synchronization issues in ONVIF Event Listener
- Direct protocol testing mode -
zmcontrol.plnow supports--protocolflag for testing control modules without database access - Enhanced event listener support - Better handling of ONVIF events and subscription renewals
🚀 Performance Optimizations
- Event thread improvements - Uses condition variables instead of sleep for faster response to decoded frames
- Decoder optimizations - Better queue management and flushing when decoding is no longer needed
- Persistent blend buffer - Eliminates per-frame allocations in image blending (significant performance gain)
- Optimized pixel operations - Faster color merging and highlight detection algorithms
- Binary search for event seeking - Dramatically faster seek operations in event playback
🐛 Critical Bug Fixes
- Event naming race condition - Fixed events being renamed during recording
- Memory leaks - Fixed leaks in Event_Tag, blend operations, and hardware frame transfers
- Tag filtering - Fixed "No Tag" (0) and "Any Tag" (-1) filter logic
- Timezone handling - Proper handling of camera vs. server time zones in event streams
- SSL verification - Automatic retry without verification for Go2RTC, Janus, and ONVIF connections
🔧 Stability Improvements
- Thread safety - Fixed race conditions in analysis, decoder, and event threads
- Proper cleanup - Events now properly signal termination and wait for threads
- Better error handling - Improved handling of codec errors, network failures, and resource exhaustion
- Shared memory fixes - Correct attachment counting and cleanup
Detailed Changes
Core Engine
- Fixed decoder queue flushing when decoding mode changes
- Improved packet notification system for faster inter-thread communication
- Better handling of on-demand decoding modes (KEYFRAMES, KEYFRAMESONDEMAND)
- Fixed
last_write_timeupdates even when not decoding to prevent monitor stall detection false positives - Event threads now use
wait_for()instead of sleep for sub-millisecond response times - Fixed Event destructor to properly stop and join threads before cleanup
Camera Support
- FfmpegCamera: Fixed secondary stream credential application
- LocalCamera: Better error messages for missing /dev devices (systemd PrivateDevices check)
- LibVNC: Fixed memory allocation error handling
- LibVLC: Added null pointer checks before stopping player
- Added MPEG4 decoder support
- Fixed RTSP stream timeout handling
Control Systems
- AxisV2: Complete rewrite with credential guessing, binary search optimizations, and configuration get/set support
- Dahua: SSL verification with automatic fallback
- Uniview: LAPI JSON API support, configuration management, better network probing
- ONVIF: Unified module replacing vendor-specific implementations
- Reolink/TapoC520WS: Fixed brightness case sensitivity bug and missing sendCmd calls
- All control modules now support direct protocol testing mode
Web Interface & API
- Fixed tag filter SQL for special values (0 = No Tag, -1 = Any Tag)
- Better handling of Events_Tags table LEFT JOIN null comparison issues
- Improved event name updates to preserve user changes during recording
Database
- Added migration
zm_update-1.38.1.sqlto increaseONVIF_Optionscolumn from 64 to 255 characters - Fixed Event_Tag constructor to handle null
assigned_byvalues - Async database updates in Event destructor to avoid blocking
Build System
- Minimum CMake version raised to 3.12
- Fixed include directory handling (now uses
ZM_INCLUDE_DIRSlist) - Fixed
ZM_STRIP_NEONdefinition - Better handling of
add_definitions()vstarget_compile_definitions() - Fixed Perl executable detection (
${PERL_EXECUTABLE}instead of hardcodedperl) - Removed duplicate code in CMakeLists.txt
Configuration & Logging
- Fixed
zm_config.cppwhitespace trimming logic - ConfigItem copy constructor now properly copies all fields
- Better database command detection (supports MariaDB-native commands like
mariadbandmariadb-dump) - Improved logging in multi-server configurations
- Fixed version mismatch handling in
zmpkg.plto warn instead of fatal error
Scripts & Tools
- zmcontrol.pl: New
--protocolmode for direct control module testing without database - zmupdate.pl: Uses
findDbCommand()for MariaDB compatibility - zmcamtool.pl: Uses
findDbCommand()for mysqldump - zmonvif-probe.pl: Added
eventscommand to check ONVIF event support
Miscellaneous
- Expanded
MacVendors.jsonwith many more camera vendor MAC address prefixes - Fixed
zm_buffer.hnull pointer check - Fixed numerous typos in comments and debug messages
- Better error messages throughout the codebase
- Improved AGENTS.md developer documentation
Platform-Specific Changes
RedHat/Fedora/Rocky Linux
- Updated spec file to use
mariadb-connector-c-develinstead ofmariadb-devel - Added
cjson-develbuild dependency - Changed to
fedora:43fromfedora:rawhidein CI - Added
arp-scanandiproutedependencies - Fixed systemd conflicts in container builds
- Added explicit paths for network tools to avoid systemd
PrivateDevicesissues - Removed static library packaging per Fedora guidelines
CI/CD
- Removed obsolete CI workflows (Debian Bullseye/Bookworm, Ubuntu Focal, CentOS 8)
- Renamed package build workflows for clarity
- Updated Fedora build matrix
Upgrade Notes
- Database Migration: Run
zmupdate.plto apply schema changes (ONVIF_Options column expansion) - ONVIF Users: If you have custom ONVIF control configurations, you may want to switch to the new unified "ONVIF" control type for better reliability
- Clock Drift Issues: If experiencing ONVIF authentication failures, add
timestamp_validity=120(or higher) to ONVIF Options field - Control Testing: Use new
zmcontrol.pl --protocol ONVIF --address user:pass@ip --command get_configfor diagnostics
Contributors
This release includes contributions from the ZoneMinder development team and community members who reported bugs, tested fixes, and provided feedback.
Full Changelog: 1.38.0...1.38.1