June 29, 2016

Wowza Streaming Engine 4.5 released

Wowza Streaming Engine 4.5.0, build 18676, released on June 23, 2016. These highlights
  • Facebook Live, SHOUTcast, and Icecast stream target integration 
  • Apple HLS delivery to generic targets
  • Integration of Panasonic® AW-series PTZ cameras and AJ-series cameras
  • Passthrough and transcoded stream SCTE-35 and KLV marker preservation
  • Simple Network Management Protocol (SNMP) support

Detailed list of changes in Wowza Streaming Engine 4.5.0

  • Install/Update/Uninstall

  • Fixed a logic bug in update tool post-uninstall actions, that caused the update tool to log an error when there wasn't one and to not log an error when there was (in this latter case, the "Restoration complete" message wouldn't be shown)
  • Fixed update tool issue where permissions and execute settings were lost when uninstalling an update on OS X and Linux

Wowza Streaming Engine Manager

  • Fixed multicast in/out interface address assignments in the VHost configuration section of the manager
  • Fixed application creation in the manager so advanced options are immediately available
  • Removed httpRandomizedMediaName property from VOD HTTP Origin application in the manager
  • Improved stream recording crontab validation in the manager
  • Fixed disabling nDVR configuration in the manager
  • Fixed null pointer when playing content in the manager's MPEG-DASH test player

Stream Targets (Push Publishing)

  • Fixed Stream Targets page to eliminate unintended page refreshes
  • Fixed Stream Targets bug where all enabled stream targets show an Active status when any stream target is active
  • Fixed Wowza Streaming Cloud Stream Target so that audio-only streams can be pushed successfully
  • Added support in Stream Targets to push Apple HLS (cupertino) streams to Akamai over SSL/HTTPS (only controllable through application properties)
  • Added push publishing map file (PushPublishMap.txt) property "sendSSL" to control use of SSL when POSTing Apple HLS (cupertino) streams to Akamai (valid values are "true" and "false", default is false). Use of this option requires Java 1.7 or newer
  • Added push publishing map file (PushPublishMap.txt) property "playbackSSL" to control use of SSL (HTTP vs. HTTPS) in the playlist and chunklist for Apple HLS (cupertino) streams pushed to Akamai (valid values are "true" and "false", default is false (HTTP)). Use of this option requires Java 1.7 or newer
  • Fixed push publishing Akamai HLS ABR rendition ordering to maintain order from map file
  • Fixed problem with RTMP push publishing that caused an exception when connection was refused and result object included "application" item with description of the reason for failure
  • Removed incorrect display of application-level buttons when editing a specific stream target in Wowza Streaming Engine Manager
  • Added Shoutcast1, Shoutcast2, and Icecast2 Stream Targets for audio-only push publishing
  • Added support to enable users to develop custom Apple HLS stream target destinations using a generic stream target base class
  • Added support for Facebook stream target destination


  • Fixed HEVC decoder crash on Linux by setting LD_PRELOAD variable in startup script
  • Fixed Quick Sync accelerated H.264 decoder to filter out filler NAL units that caused decoding artifacts
  • Added GPUID selection to transcoding decode options
  • Fixed Transcoder crash when SkipFrameCount is set higher than the source stream framerate. Destination framerate now set to 1 when this happens
  • Fixed Transcoder log statement formatting so the comment data has proper JSON format (field names double-quoted)
  • Improved MP3 decoder so that it properly decodes packets with more than one MP3 frame

Live Stream Recording

  • Added IP whitelisting/blacklisting for LiveStreamRecord HTTP Provider
  • Fixed Live-to-VOD clip extraction code that caused the conversion start time to be overwritten with the default value. This caused all conversions to start at the beginning of the DVR store
  • Added dvrConverterDebugConversions query parameter to nDVR converter REST API to allow debug to be enabled per conversion request
  • Fixed issue with some live-record recordings being out of lip sync (adjusted codec config timecodes to match first packet in list and fixed timecode of first data packet to match trimmed audio/video)
  • Improved nDVR conversion performance when selecting segments from large stores
  • Fixed LiveStreamRecord HTTP whitelist/blacklist logic when both are empty
  • Added splitOnTcDiscontinuity parameter to the streamrecorders REST API endpoint
  • Fixed LiveStreamRecord when configured for "append" and two streams with different codecs are published sequentially. This caused a cast exception to be thrown when closing the MP4 file and resulted in a corrupt file. When the file was subsequently reopened for append, an infinite loop prevented all future requests to start/stop recording and any application failed to be processed. Now if the incoming stream doesn't have the same codecs as the MP4 file being appended to, appending is disabled and the default version scheme (date/time stamp) is used such that recorded content isn't lost


  • Fixed nDVR packetizers to shut down correctly when an application instance stops
  • Fixed nDVR AES manifest to include the URI prefix in the X-KEY-METHOD header
  • Improved DVR ABR alignment algorithm to better handle resumption of alignment calculation after large gaps when feeds come in at different times
  • Improved DVR ABR alignment algorithm to ignore small gaps that don't align with alternative chunks
  • Fixed DVR manifest reader to use property "dvrTextReaderClass" to dynamically load class to read DVR manifest files
  • Enhanced IDvrFileWriter init() to include the IDvrStreamStore to provide more context to custom writers
  • Added option to use SAX parser for DVR manifest parsing, controlled by DVR property "dvrUseSAXParser" (Boolean, default is false), which should improve performance

Closed Captions

  • Added closed-caption options for VOD/Live HTTP Origin applications in Wowza Streaming Engine Manager

Media Cache

  • Added support for Google Cloud Storage to Media Cache
  • Added debug for MediaCacheItemFileImpl to see file operations in progress. Property MediaCacheSource/debugLog or MediaCache/debugLog enables this output

HTTP Streaming (Apple HLS - Cupertino)

  • Turned off Apple HLS cupertinoAutoAdjustDurationIfOutOfBounds system by default (also improved logging when feature is on)
  • Disabled EXT-X-ALLOW-CACHE header by default for Apple HLS streams; mediastreamvalidator warns this is a deprecated playlist header item
  • Fixed Apple HLS repeater so that custom chunk IDs are migrated from origin to edge correctly
  • Added API getChunkMap() to LiveStreamPacketizerCupertinoChunk. Returns the chunk's byte layout to help identify the media data that makes up the chunk:
  • CupertinoChunkMap LiveStreamPacketizerCupertinoChunk.getChunkMap()
  • Added API getDataPackets() to LiveStreamPacketizerCupertinoChunk. Returns a list of all the data AMFPackets that occurred during the chunk duration (can be used to get onTextData, onCUE (SCTE-35), or onKLV event data):
  • List LiveStreamPacketizerCupertinoChunk.getDataPackets()
  • Enhanced Apple HLS DVR playlists to insert discontinuity marker when alternate chunks are used during stream gaps:
  • Added HTTPStreamer/Properties Boolean property "dvrCupertinoPlaylistDiscontinuityAtAlternates" to control the behavior (default is true)
  • Added HTTPStreamer/Properties Boolean property "cupertinoAppendQueryParamsToEncUrl" to control if query parameters are appended to encryption URL for Apple HLS streaming (default is true, set to false for Fairplay)
  • Added key file Boolean item "cupertinostreaming-aes128-iv-include-in-chunklist" and encryption API to control if IV value is included in chunklist when doing Apple HLS encryption (default is true, set to false for Fairplay):
  • boolean CupertinoEncInfo.isEncIVBytesInChunklist()
  • CupertinoEncInfo.setEncIVBytesInChunklist(boolean encIVBytesInChunklist)

HTTP Streaming (MPEG-DASH)

  • Fixed MPEG-DASH playback issue on Chrome/OS X by adding sample flags to MP4 fragment data to make key frames (trun box)
  • Fixed MPEG-DASH on-demand streaming with CENC issue that caused an exception and failure on segment requests
  • Fixed MPEG-DASH streaming issue related to incorrect identification of all video frames as sync/i-frames in trun boxes
  • Fixed MPEG DASH SMIL/AMLST request handling for non-repeater-edge server requests. When all streams are unavailable, Wowza Streaming Engine doesn't attempt internal retries, since they create a lot of DASH HTTP sessions that can cause heap issues when many clients try to connect
  • Fixed MPEG DASH SMIL/AMLST request handling for repeater-edge server requests so that internal retries re-use the DASH HTTP session created on the initial try for all ensuing tries, avoiding creation of numerous sessions
  • Added support for tag in on-demand and live MPEG-DASH manifests
  • Added HTTPStreamer String property "mpegdashChunkHostDomain", which modifies the domain name indicated in the MPD tag. Allows content files to be located on a different server than the MPD manifest file
  • Changed MPEG-DASH RepresentationId values to include an indication of the rendition bitrate (for example: "p0va0r3500000", which is a 3500000 bps video rendition)
  • Added HTTPStreamer String property "mpegdashMinBufferTime", which can be used to modify the minBufferTime attribute in DASH MPDs
  • Fixed MPEG-DASH null pointer for some audio segment indexing
  • Added support for the repeat count attribute (@r) within the SegmentTimeline.S elements in MPEG-DASH on-demand streaming MPDs. This greatly reduces the size of MPDs for large assets with many contiguous segments of the same duration
  • Fixed MPEG-DASH null pointer when in HTTP Origin mode
  • Added API to support custom fragment ID and time offset for MPEG-DASH live streaming packetizer:
  • New interface IHTTPStreamerMPEGDashLiveStreamPacketizerChunkIdHandler that must be implemented to provide chunkId and timecode for the stream. For it to work with many players, chunkId must be set as follows: chunkId = 1 + (timecode/liveStreamPacketizer.getChunkDurationTarget())
  • To set custom chunkId handler, add mpegdashChunkIdHandlerClass property to LiveStreamPacketizer/Properties container in Application.xml and set it to full path to your IHTTPStreamerMPEGDashLiveStreamPacketizerChunkIdHandler implementation
  • Fixed a potential synchronization issue with live stream repeater for MPEG-DASH
  • Added HTTPStreamer/Properties Boolean property "mpegdashAdjustCTTSForFirstKeyFrameToZero" to adjust CTTS values to zero (default is false). Some browsers can't play on-demand MPEG-DASH assets where CTTS of first frame isn't zero
  • Fixed serialization and deserialization of AMFPacket used for MPEG-DASH live-repeater, which caused some repeated streams to fail
  • Updated HTTPProviderMediaList so that it formats the videoCodecId string for AVC streams per RFC6381 Section 3.2 to meet MPEG-DASH requirements

HTTP Streaming (Smooth)

  • Fixed Smooth Manifest so that MaxWidth,MaxHeight,DisplayWidth,DisplayHeight show the highest values when multiple renditions are available
  • Fixed Smooth Streaming adapter for live streams so that 404 HTTP status is returned for fragment requests that aren't in current readahead list rather than waiting for several seconds to return 404
  • Added HTTPStreamers/Properties Boolean property "smoothOnlyWaitIfReadAheadFragment". If true, 404 is returned for fragment requests that aren't in the readahead list; if false, 404 is returned if request is for previously deleted fragment (maintain a list of 2000 fragments, default is true)
  • Added HTTPStreamers/Properties integer property "smoothFragmentNotFoundStatus" to control HTTP status returned if fragment isn't found (default is 404)

HTTP Streaming (General)

  • Fixed OPTIONS request to provide CORS headers when an invalid application/instance is requested

RTSP/RTP Streaming

  • Updated VP9 RTP depacketizer and packetizer to latest specification version (draft-ietf-payload-vp9-01)
  • Fixed UDP port allocation/deallocation issue with RTSP/RTP streaming
  • Removed errant RTSP/RTP warning message: "RTCPHandler.handleMessage : socket address is null or not RTCP packet"
  • Added .stream file property for MediaCaster multicast RTSP re-streaming to specify the audio and video port to use when the server returns zero for the port number in the DESCRIBE response (rtspMulticastServerPortAudio and rtspMulticastServerPortVideo, both the specified port number and the next port number are used for each track [RTP and RTCP], default is zero)

On-Demand Streaming (VOD)

  • Fixed the bitrate calculation for MP3 files that have ID3 tags in them (off by a factor 5--too large)
  • Increased default VOD readahead cache size from 64K to 256K for better performance on higher bitrate files

MPEG-TS Ingestion

  • Added support for LATM AAC audio ingestion over MPEG-TS
  • Added listener interface IRTPDePacketizerMPEGTSNotify to MPEG-TS depacketizer to enable callbacks during live TS processing:
  • Added RTP/Properties String property "rtpDePacketizerMPEGTSListenerClass", set to full path of class that implements IRTPDePacketizerMPEGTSNotify to enabled (pipe | delimited for multiple class definitions)
  • IRTPDePacketizerMPEGTSNotify definition, best to extend RTPDePacketizerMPEGTSNotifyBase and override needed callbacks:
  • public void onInit(RTPDePacketizerMPEGTS rtDePacketizerMPEGTS, RTPContext rtpContext, RTPDePacketizerItem rtpDePacketizerItem);
  • public void onStartup(RTPDePacketizerMPEGTS rtDePacketizerMPEGTS, RTPTrack rtpTrack);
  • public void onShutdown(RTPDePacketizerMPEGTS rtDePacketizerMPEGTS, RTPTrack rtpTrack);
  • public void onPAT(RTPDePacketizerMPEGTS rtDePacketizerMPEGTS, ProgramAssociationTable newPAT);
  • public void onPMT(RTPDePacketizerMPEGTS rtDePacketizerMPEGTS, ProgramMapTable newPMT);
  • public void onVideoStart(RTPDePacketizerMPEGTS rtDePacketizerMPEGTS);
  • public void onAudioStart(RTPDePacketizerMPEGTS rtDePacketizerMPEGTS);
  • public void onTimecodeReady(RTPDePacketizerMPEGTS rtDePacketizerMPEGTS);
  • Added RTPDePacketizerMPEGTS API to add and remove listeners:
  • public void addListener(IRTPDePacketizerMPEGTSNotify listener)
  • public boolean removeListener(IRTPDePacketizerMPEGTSNotify listener)
  • Added MPEG-TS depacketizer API for monitoring incoming data for a particular PID. This might be used to monitor SCTE-35 ad markers, KLV metadata, closed captioning data, ID3 metadata tags, and so on:
  • Three different callback interfaces based on the PID data format:
  • IMPEG2UserMonitorRawNotify: Get called back for each individual 188 TS packet for a given PID
  • IMPEG2UserMonitorPESNotify: Get called back with assembled Packetized Elementary Stream (PES) data
  • IMPEG2UserMonitorSectionNotify: Get called back with assembled section table data (SCTE-35 and SCTE-104 table data...)
  • RTPDePacketizerMPEGTS API for adding and removing monitors:
  • public void clearPIDMonitorMap()
  • public Map getPIDMonitorMap()
  • public boolean pidMonitorEmpty()
  • public PIDMonitorHolder getPIDMonitor(int PID)
  • public void putPIDMonitorMap(int PID, IMPEG2UserMonitorPESNotify monitor)
  • public void putPIDMonitorMap(int PID, IMPEG2UserMonitorSectionNotify monitor)
  • public void putPIDMonitorMap(int PID, IMPEG2UserMonitorRawNotify monitor)
  • public PIDMonitorHolder removePIDMonitorMap(int PID)
  • public boolean containsPIDMonitorMap(int PID)
  • A given PID can only be monitored once. Any internal monitoring such as a video or audio PID for ingestion trumps any user-added PID monitors
  • Added additional RTPDePacketizerMPEGTS API:
  • public int getVideoPID()
  • public int getAudioPID()
  • public RTPTrack getAudioRTPTrack()
  • public RTPTrack getVideoRTPTrack()
  • public int getAudioCodec()
  • public RolloverLong getAudioTC()
  • public int getAudioCodecStreamRate()
  • public int getAudioCodecChannels()
  • public int getVideoCodec()
  • public RolloverLong getVideoTC()
  • public RolloverLong getVideoPTS()
  • public RolloverLong getVideoDTS()
  • public RolloverLong getDataTC()
  • Added default MPEG-TS PID monitor implementation for ad marker (SCTE-35) ingestion (com.wowza.wms.rtp.depacketizer.RTPDePacketizerMPEGTSMonitorCUE)
  • Added default MPEG-TS KLV monitor implementation for key length value (KLV) data ingestion (com.wowza.wms.rtp.depacketizer.RTPDePacketizerMPEGTSMonitorKLV)


  • Added support for multiple SSL certificates (Java KeyStores) per HostPort (TLS Server Name Identification (SNI) is required)
  • Fixed IP whitelisting/blacklisting for RTSP/RTMP authentication
  • Added HTTPProvider/Properties property "passwordFile" to allow alternative username/password file to be used


  • Added support for SNMP. Supported objects are: Server, VHost, Application, ApplicationInstance, Stream, and Client
  • Added support for WebSockets as part of an HTTPProvider
  • Improved live stream receiver to block against null packets
  • Improved H.264 PPS decoding to properly calculate display frame size based on aspect ratio (if calculation leads to width that's within round-off error, we use the original frame width)


  • Fixed incorrect logging for OutgoingStreamConfig REST API call
  • Added REST API endpoints to list and purge items from MediaCache
  • Fixed REST API JSON error content type to be consistent with non-error response
  • Updated applications/live/instances/_definst_/streamrecorders REST API endpoint so the option parameter can also be the single keywords "append", "overwrite", or "version"

No comments: