Update to 20141211. Set LICENSE.
- Changed our implementation of "setBackgroundHandling()" and \
"BasicTaskScheduler" to check for (and disallow) socket numbers \
because <sys/select.h> has a bug (at least, in most systems) that causes \
in this case. (Thanks to Michel Promonet for pointing this out.)
- Needed to make the "QuickTimeFileSink" constructor and destructor \
protected: to allow subclassing.
- Fixed a bug in parsing 'absolute' RTSP "Range:" headers with no end time.
(Thanks to Ken Chow for reporting this.)
- Added a new option "-K" to "openRTSP, to tell the client to \
periodically send "OPTIONS"
requests as 'keep-alives' for buggy servers that don't use incoming RTCP \
"RR" packets to
indicate client liveness. (Thanks to Peter Schlaile for this suggestion.)
- Added a new 'protected' virtual member function \
"noteRecordedFrame()" to "QuickTimeFileSink".
This function is called whenever a frame is recorded to the output file.
The default implementation of this virtual function does nothing, but \
subclasses can redefine
it if they wish.
- When "RTSPClient" parses a RTSP response, we first skip over any \
blank lines that may be at
the start of the response. This can happen if the previous response (e.g., to \
contained extra whitespace.
(Thanks to ilwoo Nam for giving an example of a server that exhibited this \
- We had forgotten to initialize the "RTSPClient" member variable \
that we introduced in the previous version.
- Added a new "RTSPClient" member function \
"disallowBasicAuthentication()" that you can call if
you don't want a RTSP client to perform 'basic' authentication (whcih involves \
the username and password over the network), even if the server asks for this.
(Thanks to Tomasz Pala for this suggestion.)
- Updated the debugging printout code in "RTCP.cpp" to identify all \
known RTCP payload types,
even if we don't currently handle them. We also - when doing debugging \
printout - parse and
print out the contents of SDES RTCP packets.
- Updated "RTSPClient" so that it reuses \
"fCurrentAuthenticator" if we previously
updated it with data from a "WWW-Authenticate:" response, even if a \
"authenticator" parameter was passed as a parameter to the command. \
This reduces the
number of authetication exchanges that take place if the server asks for \
on more than one command in a RTSP session.
(Thanks to Tomasz Pala for this suggestion.)
- Updated "DigestAuthenticator" to allow for the possibility of \
"username" or "password"
- Updated the "RTSPServer" implementation to add an access check \
before the first "SETUP"
(the one that doesn't include a session id), because it's possible, in \
principle, for a client
to send such a "SETUP" without first sending a "DESCRIBE". \
Therefore, we need to perform
access checks on both commands.
- Added support for the VP9 video RTP payload format (sending and receiving), \
demultiplexing and streaming of a VP9 video track from a Matroska-format file.
- Made "VP8VideoRTPSource" more robust against a bad first-byte header \
field in the payload.
- Increased the max output packet size for "MultiFramedRTPSink" and \
"RTCPInstance" from 1448
to 1456, because we had a report of problems when proxying incoming JPEG/RTP \
packets of this
size (and because 1456 bytes still gives a packet size of no more than 1500 \
bytes when we add
in IP, UDP, and UMTP headers).
- Increased the RTSP request and response buffer sizes from 10000 to 20000 \
bytes, because we
saw a RTSP stream (VP8 video) that had an extremely large \
"configuration=" string that was
hiting the previous limit.
- Fixed the "RTSPServer" implementation to handle a rare race \
condition that could cause a
"ServerMediaSession" object to be deleted while it was being used to \
(Thanks to Michel Promonet for reporting this.)
- Fixed a bug in the "MultiFramedRTPSource" implementation where we \
weren't properly checking the
size of incoming RTP packets that have the "CC" field (i.e., number \
of "CSRC" fields) non-zero.
- Updated "Groupsock::output()" to be a virtual function. (This makes \
it possible to implement
"Groupsock" subclasses that implement 'bump-in-the-stack' protocols \
(such as SRT(C)P) below
- Fixed a problem in the "timestampString()" routine that occurs if \
"time_t" is 64 bits, but
we're on a 32-bit machine. (Thanks to Deanna Earley for reporting this.)
- Updated the debugging output code in "RTCP.cpp" to make it clearer \
that SDES and APP packets
are not invalid; just not (yet) handled by us.
- Changed the way in which the "RTSPServer" code handles incoming \
"OPTIONS" commands that contain
a "Session:" header. If the "Session:" header contains a \
session id that does not exist, then
we now return a "Session Not Found" error (even though the handling \
of the "OPTIONS" command is
not session-specific). This new behavior will help proxy servers (that use \
implementation as a 'back-end' server) better detect when the back-end server \
while streaming. (Thanks to Jonathan Brady for noticing this issue.)
- Note that the signature of the virtual function \
changed. It now takes an extra (in) parameter "Boolean \
If you have subclassed "RTSPServer" and redefined this function, you \
must update your
redefinition to match this new signature.
- Fixed a bug in the "DynamicRTSPServer" code (used by the \
"LIVE555 Media Server") that
had been introduced in version 2014.07.12, and was causing streaming from \
to fail. (Thanks to Gilles Chanteperdrix for noting this.)
- Fixed a bug that was introduced in version 2014.03.25 that could cause \
excessive CPU usage
for servers that stream from a single source to both RTP/UDP and RTP/TCP clients.
Thanks to Chris Richardson for noting this.
- Added a new function "attrVal_strToLower()" to \
"MediaSubsession". This returns a string
attribute as a lower-case string. ("mode" SDP attributes are now \
looked up using this function.)
(Thanks to James Huang for noting a problem that made this necessary.)
- Added an alternative form of "strDupSize()" (in the \
"UsageEnvironment" library) that
also returns the size of the allocated buffer.
- Fixed an obscure bug in "RTPInterface::sendPacket()" when sending a \
packet over TCP.
(Thanks to "ChaSeop Im" for reporting this.)
- Added "-DXLOCALE_NOT_USED" to the "COMPILE_OPTS" line in \
the "config.solaris*" configuration
files, because someone claimed that this was necessary in order to build the \
code for Solaris.
- Made the "RTSPServer" code more robust, to allow for the possibility \
of the same substream
being "SETUP" by the same client more than once. (This could cause \
a crash when streaming a
MPEG Program Stream file, and potentially for other file types as well.)
(Thanks to Yann Fleutot of "Stormshield" for reporting this.)
- Changed some error message output code that was allegedly causing compiler \
errors in Debian Linux.
- Corrected the previous revision's change to "groupsock/NetCommon.h" \
to remove a definition
of "int8_t", because that's apparently already defined for Windows.
(Thanks to Victor Kulichkin for noting this.)
- Updated the "DynamicRTSPServer" code (used by the "LIVE555 \
Media Server") so that it
creates a new "ServerMediaSession" object for each new request for a \
file. (Any existing
"ServerMediaSession" for the file will be removed, but any existing \
client for that
"ServerMediaSession" will continue streaming.) This allows for the \
the underlying file changing size between successive requests.
(Thanks to Nadir Raimondo for the suggestion.)
- Updated "groupsock/NetCommon.h" to add some new size-specific int \
definitions that apparently
weren't already defined for some Windows compilers.
- Added an update to "MPEG2TransportStreamMultiplexor" and \
that makes it possible to (optionally) specify a PID for a multiplexed stream.
(Currently, only the low 8 bits of this PID will be used.)
The default behavior remains: Use the 8-bit 'stream_id' as the PID.
(Thanks to Piers Hawksley for the patch.)
- Fixed another bug in the RTSP server's handling of incoming Base-64-encoded \
- Fixed a bug in the RTSP server's handling of incoming Base-64-encoded requests \
RTSP-tunneled-over-HTTP) that get split over more than one network read.
(Thanks to Piers Hawksley for the reporting the problem, and providing \
diagnostic output to
help track down the bug.)
- Made the RTP/RTCP-over-TCP implementation more robust, by stopping all use of \
if any write to the socket should fail.
- Fixed a bug in "MPEG2IndexFromTransportStream" that was causing it \
to print out error messages
(but otherwise work OK) when it saw Transport Packets with \
"adaptation_field_control" == 2.
(Thanks to Nadir Raimondo for reporting this.)
- Added an "#ifndef" around the definition of OUR_PROGRAM_NUMBER in \
to allow it to be defined as a different value. (Suggestion by Piers Hawksley.)
- Fixed (extremely minor and inconsequential) memory leaks in \
"MatroskaFile" and "StreamReplicator".
- Changed "UsageEnvironment::reclaim()" to return a Boolean value: \
True if it was actually
able to reclaim the object's memory; False otherwise.
- Updated the "BasicTaskScheduler" 'dummy socket' hack (to work around \
a bug in Windows'
"select()" implementation) to make the dummy socket number a member \
variable. This allows
us to close this socket in the "BasicTaskScheduler" destructor. \
(Apparently this matters
to some people...)
- Changed the way in which we set the maximum output packet size for RTCP, \
because the previous
hack (in "RTCP.cpp") wasn't 'thread safe'. (Thanks to Liao ChunWei \
for noting this.)
- Moved "ourMD5.hh" from the "liveMedia" directory to the \
so as to make it accessible to applications.
We also added a new function "our_MD5DataRaw()", which is similar to \
"our_MD5Data()", except that it returns the digest as a 'raw' \
16-byte buffer, rather than
as an ASCII hex string.
- Added a "RemoveNext()" function to \
"AddressPortLookupServer". (It just calls
- Fixed a bug in the way we implemented a timeout on blocking writes in \
the previous version.
- Added the ability to receive the "audio/G722" RTP payload format \
- Updated the 'blocking send()' hack in \
"RTPInterface::sendDataOverTCP()" so that the
'blocking send()' (if called) will have a timeout (default value: 500 ms), \
blocking indefinitely (which might happen if the TCP connection has hung for \
(If you wish, you can change this by compiling "RTPInterface.cpp" with
RTPINTERFACE_BLOCKING_WRITE_TIMEOUT_MS defined to be some other value. A \
value of 0 means:
Don't timeout - i.e., the previous behavior.)
If the 'blocking send()' does time out, then the socket is closed, which will \
network activity (RTSP,RTP,RTCP) on the socket to cease. (If this is a RTSP \
then all state for the connection will eventually be reclaimed normally.)
(Thanks to Gord Umphrey for suggesting the 'setsockopt()' call that sets the \
- Removed the "profile_level_id" parameter from the 'optional' variants of
"H264VideoRTPSink::createNew()", because this value can instead be \
extracted from the
SPS NAL unit (after removing 'emulation' bytes).
Simularly, we removed the "profileSpace", "profileId", \
"tierFlag", "levelId", and
"interopConstraintsStr" parameters from the 'optional' variants of
"H265VideoRTPSink::createNew()", because these values can instead be \
extracted from the
VPS NAL unit (again, after removing 'emulation' bytes).
- Added a new function "RTSPServer::disableStreamingRTPOverTCP()" that \
you can call - on a
RTSP server - to deny clients that request RTP/RTCP-over-TCP streaming.
- Made the constructors and destructors for the classes \
and "RTSPServer::RTSPClientSession" 'protected' rather than \
'public', because objects of these
classes should be created only via the "createNewClientConnection()" and
"createNewClientSession()" virtual functions, and destroyed only by \
the "RTSPServer" code.
- Change the "reuse_connection" Transport parameter for our RTSP \
"REGISTER" command to be a
simple flag (present, or not present), rather than a parameter that takes a value.
(This change is also noted in the most recent update of our Internet-Draft:
- Fixed a compilation error in "OggFileServerDemux.cpp" that occurred \
when DEBUG is defined.
- We can now handle incoming RTCP packets that are multiplexed on the same port \
as RTP packets.
A "RTCPInstance" does this by 'registering' itself with the \
The "RTPSource" network handler then forwards any multiplexed RTCP \
packets to the
Multiplexed RTP/RTCP packets are signaled by an "a=rtcp-mux" line in \
the SDP descriptor.
- Allow a RTP-transmitting server to (optionally) multiplex RTCP on the same \
port as RTP.
If this is done, a "a=rtcp-mux" line (as defined in RFC 5761) will \
be automatically added
to the SDP description.
Also, if this option is chosen, the RTP (and RTCP) port may be odd-numbered.
For "OnDemandServerMediaSubsession"s, this option is specified via a \
"multiplexRTCPWithRTP" (default value: False) in the constructor, or \
using a new
public member function "multiplexRTCPWithRTP()".
For "PassiveServerMediaSubsession"s, this option is specified by \
passing (in "createNew()")
a "rtcpInstance" parameter that has the same 'groupsock' as the \
NOTE: RTSP clients that are built using previous versions of this library (or \
some other software) will not handle RTCP that's multiplexed with RTP. \
option should be enabled ONLY IF you know that all RTSP clients will be using \
of the software, or later.
- Fixed a bug in "QuickTimeFileSink" and "AVIFileSink" that \
could apparently cause a NULL
pointer to be dereferenced. (Thanks to Martijn van den Broek for reporting this.)
- Fixed an issue in the "RTPInterface" code that could cause \
"SetSpecificRRHandler()" to not
work properly when RTP/RTCP is being carried over TCP.
- Fixed a bug in "H264VideoFileServerMediaSubsession" (and \
and "MPEG4VideoFileServerMediaSubsession") that could cause a crash \
(due to a 'race condition')
if the input file ended before 'configuration' data could be extracted.
(Thanks to Robert Sujker for finding and analyzing this problem.)
- Fixed a bad "#ifndef" in "DVVideoRTPSource.hh"
- Added support for demultiplexing and streaming Opus audio tracks from \
- Updated the H.265/RTP implementation to remove the "tx-mode" \
attribute, to conform to the latest
version of the H.265 RTP payload format specification.
- Added a new function "OutPacketBuffer::increaseMaxSizeTo()" that \
to a new value only if it's bigger than the current value. Thanks to Michael \
- Fixed a couple of minor code 'nits' that Nikolai Vorontsov discovered using a \
- Fixed a bug that was causing some bytes to be deleted when receiving H.265/RTP \
(Thanks for Michel Promonet for bringing this to our attention.)
- Added support for streaming Opus audio tracks from Ogg files. Also updated \
(which is used by "openRTSP") to write Opus audio streams into \
- Updated the "ProxyServerMediaSession" implementation - and thus the \
"LIVE555 Proxy Server"
to support proxying of Opus audio RTSP/RTP streams.
- Added a "test.opus" file option to the \
"testOnDemandRTSPServer" demo application.
- Made minor changes to "OggFileParser.cpp" to eliminate compiler \
warnings on some platforms.
- Added a new class "TheoraVideoRTPSource" to implement reception of \
Theora Video RTP streams.
- Updated "ProxyServerMediaSession" to support proxying of Theora \
video RTSP/RTP streams.
- Updated the signature of "TheoraVideoRTPSink::createNew()" to remove \
the "width", "height",
and "pf" parameters, because we can extract these from the \
'identification' header parameter.
- Added support for streaming Theora video tracks from Matroska files.
- Updated "OutputSocket::write()" to do a "setsockopt()" \
call to set the TTL, even if
the TTL is 0. (As before, however, we don't do the "setsockopt()" \
call if the TTL is the
same as before (an optimization.) (Thanks to Daniel Martinez Contador for the \
- Changed the "RTSPServer" destructor to delete \
"RTSPClientSession" objects before deleting
"RTSPClientConnection" objects. We do this because each \
is created from a "RTSPClientConnection", and passes its \
"RTSPClientConnection" object to
"handleAlternativeRequestByte()" (for RTP-over-TCP streaming).
- Added classes ("OggFile", "OggFileServerDemux") for \
demultiplexing and streaming from 'Ogg'
files. At present, only 'Vorbis' audio tracks can be streamed. Later, \
however, we'll also
support 'Theora' video and 'Opus' audio.
- Added support for streaming from an Ogg-format file (named \
"test.ogg") to the
"testOnDemandRTSPServer" demo application.
- Added a new demo application "testOggStreamer" (similar to the \
existing "testMKVStreamer") for
streaming an Ogg-format file via IP multicast.
- Added support for streaming from Ogg-format files (with filename suffix \
".ogg", ".ogv", or
".opus") to the "LIVE555 Media Server". (Note, however, \
that we don't yet support streaming
Theora video tracks or Opus audio tracks from Ogg-format files. That will \
- Updated "MPEG2IndexFromTransportStream.cpp" to check for the prefix \
0x00 0x00 0x01 before
assuming that a Transport Stream payload begins a PES packet (if \
- Made "ServerMediaSession::generateSDPDescription()" more \
bullet-proof against the possibility
of media subsession SDP lines' length changing from the first time they are \
the second time. (Thanks to Michael Brimer for raising this issue.)
- Updated the "LIVE555 Media Server" code to eliminated a potential \
problem if more than one
Matroska (or Ogg)-format file were being streamed concurrently. (The 'watch \
for setting up "ServerMediaSubsession"s for these files are no \
longer global variables.)
- Fixed a minor bug in "openRTSP" that could cause a 'double free' if \
the RTSP "PLAY" command failed.
- We now properly handle "Range:" headers of the form \
"a=npt=now-". (The previous version had
appeared to handle this, but didn't do so properly.)
- Updated the RTSP server's "Range:" header parsing routine to \
properly handle a "Range:" header
of the form "npt= -0", which can be given when requesting reverse play.
(Thanks to Manickam Nambirajan for noting this problem.)
- Added a new class "OggFileSink" for writing data (from a Vorbis \
audio, Theora video, or
Opus audio track) into an 'Ogg'-format file. (This writes only a single track \
to the file;
it does not multiplex multiple tracks into the file.)
Also updated the "openRTSP" application to use this class when \
recording incoming Vorbis audio,
Theora video, or Opus audio RTP streams, so that the resulting files can be played
directly by media players.
- Exported the "calculateCRC()" routine that \
"MPEG2TransportStreamMultiplexor" uses to
calculate its CRCs, because the same CRC algorithm ends up being used in Ogg files.
- Made the "testMKVStreamer" demo application more robust when \
handling unknown track types.
- Updated the Matroska file parsing code to ignore tracks that exist, but which \
a MIME (media) type that we know about.
- Changed "TheoraVideoRTPSink::createNew()" to no longer take a 'RTP \
timestamp frequency' as
parameter, because the RTP payload format specification states that a \
frequency of 90000 Hz
MUST be used.
- Removed some duplicate code that was being used in both \
- Updated the "RTSPServer" code to properly handle RTSP \
"PLAY" requests that have a "Range:"
header of "npt=now-", "npt=now-<endTime>", or \
(Thanks to Manickam Nambirajan for bringing this to our attention.)
- Removed a lot of code duplication from the \
by defining and implementing a base class \
We also added a new member functions \
"MatroskaFile::createRTPSinkForTrackNumber()" which create - from a \
track in a Matroska file -
source and "RTPSink" objects suitable for streaming. These functions \
are used not only
to implement the \
"MatroskaFileServerMediaSubsession::createNewRTPSink()" virtual \
functions, but also to
support multicast streaming from a Matroska file.
- We added a new 'test program' "testMKVStreamer", for streaming from \
a Matroska file via
- The previous version's change to \
inadvertently broke RTP-over-TCP streaming. This version fixes it again.
(Thanks to KC Chao for noting the problem.)
- Considerably simplified the parsing and accessing of "a=fmtp:" SDP \
(in "MediaSession.cpp"). Now, instead of having individual member \
variables and accessor
functions for a set of 'hard-wired' attribute names, we automatically parse \
and record *any*
attribute that happens to appear in a "a=fmtp:" SDP line, and have \
functions - MediaSubsession::attrVal_str/int/unsigned/bool() - that can lookup any
"a=fmtp:" attribute by name (returning an appropriate 'null' value \
if it wasn't present in
the SDP description). (For backwards-compatibility, however, we have kept a \
few of the
most commonly-used old accessor functions, such as \
This will simplify the adding of support for new RTP payload formats.
- Updated the implementation of \
not create 'destination' objects (i.e., "RTPSink"s, \
"RTCPInstance"s, and their "groupsock"s)
if the 'client port number' parameter is 0. For normal RTSP streaming, this \
will never be the
case. However, it will be the case when "getStreamParameters()" is \
called as a hack when
setting up HTTP Live Streaming. Consequently, extraneous UDP sockets will no \
longer be created
when HTTP Live Streaming is set up.
- Fixed another bug in "TCPStreamSink" (hopefully the last one for a \
- Fixed a bug in "TCPStreamSink" that could cause a crash in servers \
that implement HTTP Live
Streaming. (Thanks to Park Chen for bringing this to our attention.)
- Added a non-static version of "FramedSource::handleClosure()". This \
to call "<object>->handleClosure()"rather than the unwieldy \
- Fixed a bug in "RTSPServer" whereby it would access a \
object shortly after handling "TEARDOWN". (Thanks to Michel \
Promonet for reporting this.)
- Fixed a bug in "H265VideoRTPSource" (when reconstructing the first \
fragment of a fragmented
- Added a "H265VideoFileSink" class, similar to the existing \
Also updated the "openRTSP" application to write received H.265 \
Streams using this new class.
- Updated the "ProxyServerMediaSession" code (and thus also the \
"LIVE555 Proxy Server") to
handle proxying of H.265/RTP streams.
- Fixed a bug in "H264VideoRTPSink" (and "H265VideoRTPSink") \
- introduced in previous versions
- that would have prevented proxy servers from working properly on H.264 (and \
- Implemented "H265VideoRTPSource" for receiving H.265/RTP streams.
- Make "H264VideoRTPSource" more robust against unusually short NAL units.
- Fixed an incorrect #ifndef in "H265VideoStreamDiscreteFramer.hh"
- In the "TCPStreamSink" destructor, we now make sure that all pending \
background handling on the
output (TCP) socket has been disabled. (Thanks to Park Chan for bringing this \
to our attention.)
- Changed the implementation of \
"Authenticator::reclaimDigestResponse()" to do a "delete"
rather than a "free()", because we had previously changed \
"our_MD5Data()" from C code that
called "malloc()" to C++ code that called "new".
(Thanks to Michel Promonet for reporting this issue.)
- Added support for streaming H.265 tracks from Matroska files.
- Fixed a bug (introduced in the previous version) that would cause a RTSP \
server streaming from
a Matroska file containing H.264 video to report an incorrect \
- Added support for indexing (and subsequent 'trick play' (seeking) operation \
on) Transport Stream
files that contain H.265 video. (This has not been fully tested yet.)
- Added a new demo application "testH265VideoToTransportStream", \
similar to the existing
- Changed the implementation of the (rarely-called) \
"Socket::changePort()" function so
that the new socket gets the same 'receive buffer size' and 'send buffer size' that
the old socket had. (Thanks to Cristian Jerez for noting this issue.)
- Updated the "ourIPAddress()" code in \
"groupsock/GroupsockHelper.cpp" to use
"ReceivingInterfaceAddr" as our IP address, if it was set to \
something other than INADDR_ANY.
(Thanks to Gilles Chanteperdrix for this suggestion.)
- Added a new class "H265VideoRTPSink" for streaming H.265 video.
- Added a new class "H265VideoFileServerMediaSubsession" for streaming \
a H.265 file from a RTSP
server, similar to the existing "H264VideoFileServerMediaSubsession" \
- Created a new abstract base class \
"H264or5VideoStreamDiscreteFramer", and made
"H264VideoStreamDiscreteFramer" and \
"H265VideoStreamDiscreteFramer" subclasses of this.
(This eliminated some duplicate code.) Note, however, that now \
is no longer a subclass of "H264VideoStreamFramer". (Ditto for \
"H265*".) This means that any
existing code that might have cast a "H264VideoStreamDiscreteFramer" as
a "H264VideoStreamFramer" will now be broken, and will need to change.
- Updated the "LIVE555 Media Server" application (currently, just the \
source code version)
to allow it to stream from H.265 Elementary Stream ("*.265") files.
- Updated the "testOnDemandRTSPServer" demo application to allow it to \
a H.265 Elementary Stream file ("test.265").
- Fixed a potential (though unlikely) problem in "H264VideoRTPSink" \
have caused an incorrect "profile_level_id" value to be set in SDP \
(due to the presence of 'emulation bytes' in the SPS NAL unit).
- Updated the "FileSink" implementation to make it work better when \
the "oneFilePerFrame" flag
is set. Now, the right thing will happen if "addFrame()" is called \
more than once before
"afterGettingFrame()" is called - as is done by \
"H264VideoFileSink" (to prepend a 'start code').
Also, if successive frames happen to have the same presentation time, we now \
use a filename
suffix to distinguish them. (Before, the second frame's data would overwrite \
- Improved the "openRTSP" command's error messages when the user gives \
- Added "Host:" headers to the HTTP "GET" and \
"POST" requests that "RTSPClient" sends when
setting up RTSP/RTP/RTCP tunneling over HTTP. Some HTTP servers complain if \
the "Host:" header
isn't present. (Thanks to Victor Gottardi for reporting this issue.)
- Added initial support for H.265 video, by defining two new classes \
"H265VideoStreamDiscreteFramer". Because H.265 is similar to H.265, \
these classes - along with
their old H.264 equivalent ("H264VideoStreamFramer" and \
now subclassed from a single abstract class "H264or5VideoStreamFramer".
Support for H.265 is still a 'work in progress'; we still need to define new \
RTP source and
sink classes for it, along with RTSP server and Matroska demultiplexing \
support, as well
as new and updated test programs.
- Cleaned up the "RTSPServer" request handling code to improve the \
handling of session ids in
requests. (We also now make sure that a valid session id in *any* request \
will cause the
request to be counted as indicating 'liveness' on the session.)
- Removed some old, unused code from "MP3StreamState".
- In "BasicUsageEnvironment", moved the implementation of the \
"DELAY_HOUR", and "DELAY_DAY" from \
"DelayQueue.hh" to "DelayQueue.cpp", because of a report
that some compilers were allegedly having problems with the previous code.
- In "groupsock/GroupsockHelper.cpp", changed a couple of "#ifdef \
to "#ifdef __ANDROID__", because the latter definition is allegedly \
what 'Android' uses.
- Rewrote our MD5 implementation (and, in particular, the \
"our_MD5Data()" function) in C++.
- Updated the years in the copyright notice on each file.
- Fixed a potential 'double free' issue in "MediaSession.cpp".
(Thanks to ChanMin Kim for noticing this.)
- Updated "RTSPClient" to move the code that sends short 'dummy' UDP \
packets (to improve the
chances of receiving packets from a server that's behind a NAT) into its own \
Also, we now call this before sending a "PLAY" command, rather than \
after receiving the response
to a "SETUP" command. (This is so that the packets will also be \
sent when resuming after
a "PAUSE"; thanks to Gilles Chanteperdrix for this suggestion.)
- Added a Windows-specific definition to one file to compensate for the fact \
that the "fileno()"
function is deprecated in recent versions of Windows.
- Added an implementation of a new class "TheoraVideoRTPSink" - for \
(This was developed using the "VorbisAudioRTPSink" code as a base;
thanks to Gilles Chanteperdrix.)
- Updated the new "openRTSP -P <interval-in-seconds>" option to \
work with the
"-F <filename-prefix>" option, if you also specified \
"-q", "-4", or "-i".
- Removed a stray #define DEBUG from "RTSPServer.cpp"
- Fixed a bug in the "RTSPServer" code that was causing it not to \
Base64-encoded requests (sent over a RTSP-over-HTTP connection) properly. \
Also updated the
"parseRTSPRequestString()" code to make it more tolerant of \
whitespace (or NULL) characters
at the start of requests; we now skip over them.
(Thanks to Bob Bischan for providing an example that illustrated this problem.)
- Updated the "ProxyServerMediaSession" code to change the way in \
which the code can create
an instance of your subclass of "ProxyRTSPClient" (if you've defined \
Previously, this was done by calling a virtual function - but that didn't \
work, because it was
being called from the "ProxyServerMediaSession" constructor. Now, \
instead, you will
define a (non-member) function that returns a new object of your \
and then (in the constructor of your "ProxyServerMediaSession" \
subclass) pass this function
as a parameter to the constructor of the parent class (i.e., \
(Thanks to Craig Matsuura for bringing this problem to our attention.)
- Fixed a bug in "QuickTimeFileSink" and "AVIFileSink": When \
closing the object, we need to call
"stopGettingFrames()" on each input source.
- Added a new option "-P <interval-in-seconds>" to \
"openRTSP". This option tells "openRTSP"
to write a new output file periodically.
- Updated "RTSPServer" to add an optional "timeout=" \
parameter to the end of the "Session:" header
in each "SETUP" response (unless "fReclamationTestSeconds" \
was 0). (Note that compliant
RTSP/RTP clients are still expected to send RTCP "RR" packets, which \
the server uses to note
- Fixed a line of code in "RTPInterface.cpp" that was breaking 'Win64' \
(Thanks to the VLC developers for noting this.)
- Updated the "sendDataOverTCP()" function (in \
"RTPInterface.cpp") to allow for the possibility of
one of the "send()" calls partially succeeding - i.e., writing some, \
but not all, of its data.
- Fixed a couple of minor bugs. (Thanks to "firstname.lastname@example.org".)
- Made a minor change to the "ProxyRTSPClient" code to prevent a \
- Updated the previous bug fix to close another vulnerability. All applications \
RTSP server or RTSP client SHOULD UPGRADE to the latest version of the code!
(Thanks to iSEC Partners <http://isecpartners.com/> for discovering and \
reporting this bug.)
- Fixed a serious buffer overflow bug in RTSP command parsing. Because this bug \
was a security
hole (potentially allowing an attacker to cause arbitrary code execution), all \
that include a RTSP server or RTSP client SHOULD UPGRADE to the latest version \
of the code!
(Note that RTSP clients are affected, because they - like RTSP servers - can \
(Thanks to iSEC Partners <http://isecpartners.com/> for discovering and \
reporting this bug.)
- In \
removed the call to
"RTPInterface::clearServerRequestAlternativeByteHandler()" (when \
that we had added in version 2013.07.31. This was preventing the \
object (and its socket) from being deleted when the client closed its end of \
the TCP connection
following a "TEARDOWN".
(Thanks to Bruno Abreu for reporting this problem.)
- Made a minor change to the random retransmission interval used in \
- Fixed a bug that might cause a "MediaSink" to incorrectly continue \
operating after its input
source object has indicated that it's closed. (Thanks to Michel Promonet for \
- Added a new option "-g" to "openRTSP" and \
"playSIP" to allow the user to specify an
alternative user agent in outgoing requests. (Thanks to Marco Vlahovic for \
- Updated the Matroska file parsing code to better handle skipping over very \
(such as embedded file attachments). (Thanks to Michel Promonet for reporting \
- Changed the function "MatroskaDemux::newDemuxedTrack()" to return \
(based on the file's language preference) only. This mirrors the functionality of
"MatroskaFileServerDemux::newServerMediaSubsession()", and makes it \
easier for applications
to iterate through the tracks of a demultiplexed Matroska file.
- Added an optional "preferredLanguage" parameter to \
(to mirror the corresponding parameter that's in \
- Cleaned up the "MatroskaFile.hh" header file to remove some \
definitions that should not
be exposed to developers.
- The "ServerMediaSession" and "ServerMediaSubsession" \
destructors had accidentally been made
public. Changed them to be protected instead. (Thanks to Michel Promonet for \
- Updated the "TCPStreamSink" code to check for an 'EPIPE' errno if \
the "send()" fails, because apparently - in this case -
the socket can still be considered 'writable' (by "select()"), even \
though it's no longer usable.
(Thanks to Park Chan for suggesting this.)
- Fixed a bug in "ByteStreamMemoryBufferSource":" The \
fLimitNumBytesToStream" member variable was not being initialized.
(Thanks to Park Chan for reporting this.)
- Added a new class "RTSPRegisterSender" that sends (and handles the \
response to) our custom RTSP "REGISTER" command.
This class uses a "RTSPClient" to do the sending, thereby \
simplifying the handling of the RTSP response, and also
handing authentication. We also use this class to improve and simplify the \
implementation of "RTSPServer::registerStream()".
- Added a new demo application "registerRTSPStream" to the \
"testProgs" directory. This application can be used to send
a custom RTSP "REGISTER" command to a RTSP client or proxy server. \
(Note, however, that servers that wish to register their
own streams should continue to use the \
"RTSPServer::registerStream()" method to do so - not this \
- Updated the "LIVE555 Proxy Server" application to take an optional \
'-U <username> <password>' command-line option.
This option specifies a username,password pair to use to authenticate (if \
necessary) incoming "REGISTER" commands.
- Added the ability to authenticate incoming RTSP "REGISTER" commands, \
and added a new option "-k <username> <password>"
to "openRTSP" to allow the user (in combination with the \
"-R" option) to specify access control on incoming REGISTER commands.
- Added the ability for "RTSPServer" subclasses to have different \
'authentication databases' for different RTSP commands.
- Moved some of the implementation of "RTSPClient::sendRequest()" into \
a new virtual function "setRequestFields()".
This makes it easier for a subclass to implement a new custom RTSP command, if \
desired. (We now use this to implement
the sending of our custom "REGISTER" command.)
- Reordered the member function implementations in "RTSPClient.cpp" to \
better match the order that they're defined
- Updated the implementation of the "REGISTER" command to conform with \
our recent IETF Internet-Draft
("draft-finlayson-rtsp-register-command-00"). The \
"RTSPServer::registerStream()" function has been modified accordingly \
two new optional parameters: "receiveOurStreamViaTCP" (Boolean), and \
- Made the "RTSPServer" code's parsing of "Transport:" \
headers a little more robust.
- Updated the way that "RTSPClient" sends "OPTIONS" \
commands. If we are currently part of a session, then we add a
"Session:" header to the request.
- Changed the HTTP version - used in our RTSP-over-HTTP implementation - from \
1.0 to 1.1. (I don't think this matters at all,
but most HTTP used elsewhere is version 1.1.)
- Fixed a bug in the interpretation of bits in the 'video-specific header' in \
"MPEG1or2VideoRTPSource", when slices
are present. (Thanks to David Verbieren for reporting this.)
- Fixed "RTSPServerWithREGISTERProxying" to include \
"REGISTER_REMOTE" in the list of supported command names returned in \
to an "OPTIONS" command. (Thanks to Bob Bischan for noting this.)
- Updated the signature of \
"RTSPServerWithREGISTERProxying::createNew()" to take a Boolean \
(default value: False), which tells the server whether or not to enable \
RTP/RTCP-over-TCP streaming for each newly created
(Thanks to Bob Bischan for bringing this to our attention.)
- Updated "RTSPServerWithREGISTERProxying" to automatically generate a \
proxy stream name "registeredProxyStream-N"
for the URL of each proxy stream that's created using the "REGISTER" \
or "REGISTER_REMOTE" command, rather than trying to use
the suffix in the back-end stream URL - in case that's excessively complex \
(e.g., with parameters).
- The "LIVE555 Proxy Server" was not properly passing the 'verbosity \
level' (specified by the "-v" or "-V" option)
to a new "ProxyServerMediaSubsession" object created as a result of \
a RTSP "REGISTER" command (handled if the "-R"
option was given). To fix this we needed to update the signature of \
to take a new "verbosityLevelForProxying" optional parameter.
(Thanks to Bob Bischan for bringing this to our attention.)
- Updated the "socketJoinGroup()" and "socketJoinGroupSSM()" \
functions to set the IP_MULTICAST_ALL socket option to 0,
if that option is defined. (The P_MULTICAST_ALL socket option is defined in \
modern versions of Linux to overcome
a bug in the Linux kernel's default behavior. This option, when set to 0, \
ensures that we receive only packets that were sent
to the specified IP multicast address, even if some other process on the same \
system has joined a different multicast group
with the same port number.)
(Thanks to Michel Promonet for the suggestion.)
- Made some changes to the server implementation of RTSP-over-HTTP to \
potentially make it possible for web browsers to
- Updated the change made in version 2013.09.27 to ensure that we don't have any \
background reading still taking
place on the datagram sockets that we close when we switch to \
- Made a minor fix to the previous release (to stop the proxy server from \
attempting to send a "PAUSE" command
immediately after it receives a RTCP "BYE" from the back-end server).
- Updated the way that the "ProxyServerMediaSession" code handles a \
RTCP "BYE" packet from the back-end server. It now
treats this as if the connection to the back-end server had closed, by \
reopening the connection, and sending another "DESCRIBE".
(Thanks to Yogev Cohen for the suggestion.)
- When a RTSP client requests RTP/RTCP over TCP streaming, we now close the \
datagram sockets that would have otherwise been
used for receiving RTP and RTCP, because we know that they're no longer needed.
- Fixed an obscure bug - triggered by the "ProxyServerMediaSession" \
code - that could sometimes cause a previously deleted object
to be accessed. (Thanks to Yogev Cohen for reporting this.)
- It turns out that the fix that we'd made back in version 2012.10.04 to (try \
to) prevent RTCP reports from being sent over
TCP connections prematurely was incomplete. (It had prevented only \
"SR" reports - not "RR" - from being sent.)
This version fixes this. (Thanks to Stanley Biggs for reporting this.)
- Made an update to the previous change to the way that "openRTSP" \
handles the "-Q" option.
- Made a minor change to the way that "openRTSP" handles the \
"-Q" option (to address an issue that someone reported).
- Improved the bugfix that was in the previous release (because that fix still \
had a deleted object being accessed).
- Fixed an obscure bug in the "RTPInterface" implementation that could \
cause a "SocketDescriptor" object to get deleted twice
(when receiving RTP-over-TCP). (Thanks to Subhankar Saha for reporting this \
bug, and tracking down the cause.)
- Updated "H264VideoStreamFramer" to Improve (the accuracy and \
efficiency of) the test whether the current NAL unit
ends an 'access unit'. (This also fixes a bug reported by Philipp Schrader.)
- Fixed a minor memory leak in "RTCPInstance::setSpecificRRHandler()" \
(if this function is called more than once).
(Thanks to Eric Pronovost for the report.)
- Fixed a bug in "MatroskaFileParser" that was causing it not to parse \
8-byte float values properly.
- Added parsing of some previously unknown Matroska ids.
- Corrected two diagnostic output messages in "MatroskaFileParser".
- Corrected a disgnostic output message in "testWAVAudioStreamer" (if \
the audio is converted to u-law).
- Fixed the implementation of the 'trimTrailingZeros' option in \
"base64Decode()" so that it trims only extraneous 'padding' bytes.
(Thanks to Chris Richardson for the suggestion.)
- Changed the way that some "RTSPServer" command implementations call \
"setRTSPResponse()", to make it more obvious to developers
how a subclass could reimplement these commands.
- Updated the "openRTSP" client application so that we no longer wait \
for a response to the "TEARDOWN" command if we were
signaled (via "kill -HUP") to end. (This ensures that the program \
will end even if the server hangs on the "TEARDOWN" command.)
- Fixed a tiny memory leak that can sometimes occur when destroying a \
"RTSPClient" object. (Thanks to Michel Promonet.)
- Changed "setServerRequestAlternativeByteHandler()" to be a static \
member function of "RTPInterface", because it doesn't
need to refer to a specific "RTPInterface" object. Also added a \
"clearServerRequestAlternativeByteHandler()" (that just sets the \
'handler' and 'client data' parameters to NULL).
We also make sure that we call this latter function in the \
"RTSPClient" destructor. This fixes the *real* bug that
Andrey Shvyrkin reported.)
- Added a new "-C" option to "openRTSP" to specify that the \
RTSP client should ask for a multicast stream, if the server doesn't
already specify one. (Note that not all servers will support this.) (Thanks \
to Michel Promonet for the suggestion.)
- Moved the call to "RTPInterface::stopNetworkReading()" from the \
"RTCPInstance" and "(MultiFramed)RTPSource" destructors to \
"RTPInterface" destructor. This means that it will also be called \
when a "RTPSink" is destroyed. Even though a "RTPSink"
doesn't actually do any 'network reading', calling \
"stopNetworkReading()" when it's destroyed will cause its socket to \
deregistered properly if it's streaming RTP-over-TCP. (This fixes a bug that \
was reported by Andrey Shvyrkin.)
- Fixed a problem that might cause a crash when deleting a \
"RTSPServer" object while a RTP-over-TCP stream was
currently taking place. (Thanks to Piers Hawksley for reporting this.)
- Fixed a minor memory leak in "RTSPClient" when it sends a HTTP \
"GET" command for RTSP-over-HTTP tunneling.
(Thanks to Jianliang Zhang for reporting this.)
- Moved the "parseScaleHeader()" function to \
"RTSPCommon.hh", to make it available to subclasses of \
(Thanks to Michel Promonet for the suggestion.)
- Fixed some minor memory leaks in "RTPInterface". (Thanks to Chris \
- Fixed an obscure bug in our implementation of RTP/RTCP-over-TCP that could \
cause a "select()" error (due to an already-closed
socket being checked) if the TCP connection was not closed cleanly.
(Thanks to Andrey for reporting and helping track this bug down.)
- Updated the implementation of "RTSPServer"s handling of \
RTSP-over-HTTP to allow for the possibility of the input Base64
command string containing whitespace. We now strip this whitespace (if any) \
before calling "base64Decode()" on the data.
(Thanks to Chris Richardson for this suggestion.)
- Added a new, alternative version of "base64Decode()" that takes the \
length of the input string as a parameter.
This saves a call to "strlen()" if we already know the length of the \
- In "MPEG2TransportStreamMultiplexor.cpp", we rename the constants \
"PAT_FREQUENCY" and "PMT_FREQUENCY" to the more accurate
names "PAT_PERIOD" and "PMT_PERIOD".
- We now support two new, custom RTSP requests: "REGISTER" and \
"REGISTER_REMOTE". These RTSP requests are currently non-standard;
however, we will be submitting an IETF Internet-Draft document that describes them.
These requests make it possible for a server (or some 3rd party) to \
'advertise' a RTSP stream (given by a "rtsp://" URL) to
a RTSP client application, or to a proxy server. The client application - or \
proxy server - can then start accessing this
RTSP stream, as it normally would. However, as a special feature (if the \
request name was "REGISTER" and not "REGISTER_REMOTE"),
the client application or proxy server gets to reuse the TCP connection that \
was used to send the "REGISTER" request.
This can be useful if the server is behind a firewall or NAT, but the client \
application (or proxy server) is on
the public Internet.
To send a "REGISTER" request (for an existing stream, described by a \
"ServerMediaSession" object that was added to a "RTSPServer"
object), call the new member function
specifying the remote client (or proxy server)'s name or IP address, and \
To create a simple server that accepts incoming "REGISTER" (or \
"REGISTER_REMOTE") requests, and then creates a new \
object to handle the "rtsp://" URL specified by each such \
incoming request, create a
object, by calling \
"HandlerServerForREGISTERCommand::createNew()" (see \
(For an illustration of this, note how we implement the new '-R' \
command-line option for the "openRTSP" application.)
To create a proxy server that automatically accepts incoming \
"REGISTER" (or "REGISTER_REMOTE") requests, and proxies the
"rtsp://" URL specified by each such incoming request, create a
rather than a usual "RTSPServer".
(For an illustration of this, note how we implement the new '-R' \
command-line option for the "LIVE555 Proxy Server".)
- Added a new command-line option '-R' to the "LIVE555 Proxy Server" \
application. This option tells the server to accept incoming
"REGISTER" (or "REGISTER_REMOTE") requests - telling the \
server about a new stream to proxy. This also allows a 'back-end'
server to "REGISTER" one or more of its streams with the proxy \
server - with the proxy server then getting to reuse
the TCP connection that the server had used to contact the proxy server. \
(This can be useful if the 'back-end' server is behind
a firewall or NAT, with the proy server being on the public Internet; in this \
case, you may also wish to use the "-t" option,
telling the proxy server to also request RTP-over-TCP streaming from the \
Note also that if you give the '-R' option to the "LIVE555 Proxy \
Server", then you no longer need to specify any back-end
"rtsp://" URL(s) on the command line (though you still may do this).
- Added a new command-line option '-R' (or '-R <port-num>') to the \
"openRTSP" RTSP client demo application.
This option - which can be given instead of a "rtsp://" URL - tells \
"openRTSP" to wait - on the specified port number - for
an incoming "REGISTER" or "REGISTER_REMOTE" request, \
announcing a "rtsp://" URL. When it receives such a request, it opens \
streams from the specified "rtsp://" URL, as normal.
(If <port-num> is omitted from the '-R' option, then \
"openRTSP" will choose (and display) its own port number.)
- Some RTSP clients apparently periodically send an "OPTIONS" request \
- with a "Session:" id - to indicate client liveness.
This is of dubious legality (and these clients should really be sending RTCP \
"RR"s anyway), but we now recognize such requests
as indicating client 'liveness'. (Thanks to Chris Richardson for the suggestion.)
- Updated the constructor to "RTSPClient" (and its subclasses - in \
particular "ProxyRTSPClient") to add a
'socket number to server' parameter. This socket number (if >=0) is the \
socket of an existing TCP connection to the
server. This allows you to create a RTSP client object from an existing TCP \
connection. (If this is done, the supplied
"rtsp://" URL must point to the server that's at the endpoint of the \
The "RTSPClient::createNew()" function also takes a 'socket number \
to server' parameter, but this has a default value of -1,
so existing code that creates "RTSPClient"s using only the \
"createNew()" function will not need to change.
- Fixed a very minor bug (that would, in practice, likely never get triggered) \
in the "H264VideoStreamParser" code.
(Thanks to Julien Vary for the report.)
- Removed a "#define DEBUG 1" that had accidentally been left in \
"RTSPServer.cpp". (Thanks to Warren Young for noting this.)
- Support for the old, deprecated 'synchronous' "RTSPClient" interface \
has now been completely removed. Developers have had
three years now to upgrade to using the asynchronous "RTSPClient" \
- We temporarily disabled the RTCP "BYE"-sending change that we made \
in version 2013.04.23, because that doesn't work correctly
for multiple clients that are streaming from the same data source (i.e., if \
"reuseFirstSource" is True).
(This means that once again, for now, RTCP "BYE"s will not get sent \
when "closeAllClientSessionsForServerMediaSession()" or
"deleteServerMediaSession()" is called. However, this will get \
fixed in some future release.)
(Thanks to Subhankar Saha for noting this.)
- We now recogize the "width" and "height" parameters in \
"a=fmtp:" SDP lines. These parameters are non-standard, but
are sometimes used to specify the video width and/or height. (Thanks to Claes \
- Added "protected:" "setRTSPResponse()" function shortcuts \
to "RTSPClientSession", so that subclasses of \
can call them, if desired.
(Thanks to Scott Taylor for the suggestion.)
- Changed the definition of "Boolean" (for newer Windows compilers) \
from a #define to a typedef.
- Moved "BitVector.hh" to the liveMedia "include" directory, \
so that applications can use the "BitVector" class, if desired.
- Removed <cr> characters that were at the end of each line of \
- Began adding support for a new, custom "REGISTER" \
(server->client) RTSP command. This is not finished, so don't use it yet.
- The bugfix in the previous version was incomplete. This should fix it for real.
- Fixed a bug that was introduced in version 2013.04.21 when we added an \
optimization for handling RTP-over-TCP channels.
(Sometimes a "SocketDescriptor" structure might have been accessed \
just after it was deleted.)
- Make sure that the "RTSPServer" sends a RTCP "BYE" \
whenever a "ServerMediaSubsession" object is deleted. In particular,
a RTCP "BYE" will now be sent (for each subsession) whenever \
"deleteServerMediaSession()" is called.
- Fixed a bug that would sometimes cause a proxy RTSP server to send invalid \
RTCP reports to front-end clients.
- Fixed a bug in the support for decoding '%<hex><hex>' sequences \
defined in version 2013.03.31
- Updated the #ifdef in "Boolean.hh" to allow Windows developers to \
use our "Boolean" type even if "bool" is defined.
(To do this, define "USE_LIVE555_BOOLEAN" on the command line.)
- Fixed a bug in "MultiFramedRTPSource" that could cause a buffer data \
structure to be accessed after deletion in rare
circumstances (if a RTP-over-TCP read failed). (This may fix a problem \
reported by Jeff Shanab.)
- Modified the way that the "RTPInterface" code handles the reading \
and processing of RTP-over-TCP channels, to perform better
in the case when we are not handling all subsessions of a RTSP stream. \
(Thanks to Colin Caughie for this suggestion.)
- Updated the "MPEG2TransportStreamMultiplexor::doGetNextFrame()" \
implementation to occasionally complete delivery
to its downstream object by returning to the event loop, rather than by \
calling "FramedSource;:afterGetting()" directly.
This eliminates the possibility of stack overflow caused by excessively large \
(Thanks to Markus Schumann for bringing this issue to our attention.)
- Added a #define to the "testRTSPClient" code to specify that the \
application requests, by default, RTP/UDP streaming.
If you wish, you can easily change this to request RTP-over-TCP streaming.
- Made "RTPSource::curPacketRTPTimestamp()" "private:", to \
make it clear that receiving (client) code never needs to see
RTP timestamps, because the RTP timestamp <-> presentation time \
translation is done automatically by our software.
- Moved some "RTPSink" member functions from "public:" to \
"protected:", because they're not intended to be used outside
this class (or by the RTCP implementation).
- Updated the "RTPInterface" code to ensure that the socket hash table \
is always deleted when it's empty, to further satisfy
memory-leak obsessive people.
- Made some minor changes to the "ProxyServerMediaSession" code to \
avoid some compiler warnings.
- Some systems needed to #include <ctype.h> in "RTSPCommon.cpp" \
to compile "isdigit()", used by the code that we added in
version 2013.03.31. (Thanks to Michel Promonet for noting this.)
- Updated the change to the proxying code that we made in version 2013.04.04. \
By default, we now *never* send "GET_PARAMETER"
as our 'liveness indicator' command, because some IP cameras seem to crash \
whenever they receive "GET_PARAMETER".
(The old code that sent "GET_PARAMETER" is still there, but #ifdef'd \
out, in case anyone wants to send "GET_PARAMETER".)
- Increased "OutPacketBuffer::maxSize" in the \
"live555ProxyServer" application to 100,000 bytes, to accommodate some \
that send ridiculously large frames. (Note, however, that if the back-end \
network (from the proxy to clients) has any significant
packet loss, then these ridiculously large frames might not end up getting \
delivered to clients. Instead, you should fix your
back-end server to not send frames this large.)
- Updated the "RTPReceptionStats" code (in \
"liveMedia/RTPSource.cpp") to eliminate the possible use of some \
(if a RTCP "RR" report is sent before we have received any RTP \
packets). (Thanks to Michel Promonet for noting this.)
- Updated the "RTSPClient" implementation of "GET_PARAMETER" \
to handle response stringss that don't begin with the parameter name.
In this case, we return the entire result string.
- Because at least one IP camera out there seems to crash whenever it receives a \
"GET_PARAMETER" command, even though it
reported - in response to our earlier "OPTIONS" command - that it \
supported "GET_PARAMETER", we updated the
"ProxyServerMediaSession" code to send "GET_PARAMETER" as \
a 'liveness' command only if the server earlier reported
(in the "SETUP" response's "Session:" header) a non-zero \
"timeout" parameter. (Thanks to Roman Gaufman for demonstrating
such a buggy server.)
- Our "ProxyServerMediaSession" code can now proxy JPEG video RTP \
streams. (It does so by copying the raw JPEG/RTP payloads from
a "SimpleRTPSource" to a "SimpleRTPSink", without \
interpreting the JPEG-specific header fields at all. We also had to add
a hack for 'copying' the RTP 'M' bit as well.)
- Some minor changes to eliminate some compiler warnings.
- Added support for decoding '%<hex><hex>' sequences if they exist \
in RTSP URL stream names. (This allows media server file
names to contain spaces, or non-ASCII UTF-8 characters, for example.) (Thanks \
to Warren Young for proposing this.)
- Our "ProxyServerMediaSession" code currently does not support the \
proxying of JPEG video or AMR audio streams
(because the data output by the "RTPSource" object is not in a form \
that can be fed directly into the corresponding
"RTPSink" object). This may be fixed sometime in the future, but, \
in the meantime, we output an error message
(when in 'verbose' output mode) if we try to proxy such streams.
- Updated our RTSP server implementation so that we send an initial RTCP \
"SR" packet before sending the first RTP packet.
This will make it likely (though still not certain) that the receiver will \
immediately start getting RTCP-synchronized
(Note that client application code must still allow for the possibility of \
initial presentation times not being RTCP-synchronized,
in case they don't receive this initial "SR" packet (or in case they \
are streaming from a server other than this one).)
- Updated the "RTSPClient" NAT 'hole punching' hack that we made in \
version 2012.02.03 so that it also sends dummy packets
on the RTCP port, as well as the RTP port. This increases the chance that \
clients that are behind a NAT will receive the
initial RTCP "SR" packet that we noted above.
- The RTSP server modification that we made in version 2013.02.27 (to better \
support "PLAY" requests with no "Range:" header)
had a bug computing the current 'normal play time' if more than one such \
consecutive "PLAY" requests were received.
This is now fixed. (Thanks to 'kingaceck' for reporting this.)
- The bugfix that we made in version 2013.02.11 was accidentally backed out in \
version 2013.02.27. We restore it here.
- Fixed a bug that could cause problems if a server streamed from the same \
Matroska file more than once.
(Thanks to Sebastien Escudier for noting this.)
- Fixed a couple of cases where the "testRTSPClient" and \
"openRTSP" applications were not deleteing the \
in RTSP response handler functions. (This caused a minor memory leak, \
although only in situations where RTSP commands failed.)
- When the RTSP server receives a "PLAY" request with no \
"Range:" header, it now includes a "Range:" header in its \
using the stream's current 'normal play time' as the start time. This allows \
receiving clients to correctly compute
'normal play time' after such a request (e.g., after PLAYing following a PAUSE).
(Thanks to Sebastien Escudier for raising this issue.)
To implement this, we added a new virtual function "getCurrentNPT()" \
to "ServerMediaSubsession" (and subclasses).
- Fixed "RTSPClient" to properly handle "SETUP" responses \
that (erroneously) do not contain a "Transport:" header.
(Thanks to Eric Huertel for noting this.)
- Changed the destructors of "AVIFileSink" and \
"QuickTimeFileSink" to delete chained data structures iteratively,
rather than recursively, to avoid possible stack overflow if we these chains \
are very long.
(Thanks to Anton Chmelev for this suggestion.)
- Removed some unused member fields from a few classes.
- Fixed an obscure bug in the way that "RTSPClient" handles some \
responses. (Thanks to Michel Promonet for finding this.)
- Fixed an obscure bug in "MultiFramedRTPSource": When such a source \
is 'stopped', we need to make sure that any pending delivery
to the downstream object has also been unscheduled. (Thanks for Claes \
Erlandsson for helping to track this down.)
- Updated "liveMedia/include/InputFile.hh" to reflect the fact that \
WinCE - like other versions of Windows - supposedly does not
support treating open files as "select()"able sockets. (Thanks to \
- Updated "config.iphoneos" and "config.iphone-simulator" to \
update "IOS_VERSION" to 6.1
- Added a fix to "StreamReplica::doStopGettingFrames()" so that ot \
doesn't try to 'deactivate' a replica that hasn't yet been
activated. (Thanks to Bruno Abreu.)
- Added a hack to "StreamReplicator" to handle the case of a replica \
while it's in the process of having a frame delivered to it.
(Thanks to Bruno Abreu.)
- Made a minor fix to the way that "FileSink" reacts to any error that \
it gets when writing its target file.
(We also made the "continuePlaying()" function \
"protected:".) (Thanks to Bruno Abreu.)
- Improved the way that proxy RTSP servers respond to a back-end stream \
signaling its closure (by sending a RTCP "BYE").
(This also fixes a bug (and abort) that some people were seeing in this situation.)
- Fixed a bug in the "RTSPServer" request parsing code that we changed \
in version 2013.01.18. (It wasn't properly parsing
RTSP requests that ended with the "CSeq:" header.) (Thanks to \
Rafael Gil for noting this.)
- The "LIVE555 Media Server" (currently just the source code version, \
not the pre-built binary versions)
now support streaming from ".vob" files (i.e., VOB files, containing \
MPEG-2 video and AC-3 audio).
Made several changes to the implementation of \
"ProxyServerMediaSession" (and related classes):
- Fixed a bug in the way that it was resetting its state whenever it needs to \
close, then reopen its connection
with the back-end server.
- We now reset the connection whenever the "OPTIONS" command returns \
any error, not just when we lose the RTSP connection.
- We change the periodic 'liveness' command that we send to the back-end server. \
When possible, we send a (empty) "GET_PARAMETER"
command, rather than "OPTIONS" (because some servers erroneously use \
"GET_PARAMETER" - rather than RTCP "RR" packets - to
indicate client liveness).
- Added some more debugging (verbose) output.
- Changed the "RTSPServer" request parsing code so that it passes only \
the first incoming request's header portion to
the call to "parseRTSPRequestString()". Previously, it was passing \
the entire input buffer, which could cause
"parseRTSPRequestString()" to return incorrect results if more than \
one request was pipelined, and the first request
did not include a "Content-Length:" header, but some subsequent \
pipelined request did.
- More changes to some Makefile definitions that were apparently breaking in \
some versions of Windows.
- Updated the "RTSPClient" parsing code to ignore \
"RTP-Info:" headers (in "PLAY" responses) that don't define \
"seq" and "rtptime" parameters. We need both of those \
parameters to be present in order for the "RTP-Info:" header to be \
- Some minor changes to the library "Makefile.head" and \
- Made a minor fix to the debugging output from the "testRTSPClient" \
demo application, to display the 'seconds' part of
presentation times as "int"s, rather than "unsigned".
- Fixed some Makefile definitions what were apparently breaking in some versions \
(Thanks to Claes Erlandsson for noting this.)
- Added a new virtual function hack - "specialClientUserAccessCheck() - to \
allow subclasses of "RTSPServer" to perform an
additional access check on a user, after the username has already been \
validated using digest authentication.
(This is in addition to the existing "specialClientAccessCheck()" \
hack that allows subclasses to do an additional acces check
*before* digest authentication.) (Thanks to Chris Richardson for the suggestion.)
- Fixed a bug in the RTSP server handling of "RTSP-over-HTTP" that \
could cause a crash in unusual circumstances.
(Thanks to Chris Richardson for noting this.)
- Removed a bogus, unnecessary binary file that had somehow found its way into \
the "liveMedia" directory.
- Fixed a bug in our RTSP server's implementation of RTSP-over-HTTP that could \
cause a "Bad file descriptor" select() error
to occur when a RTSP-over-HTTP session gets closed. (Thanks to Rafael Gil for \
bringing this to our attention.)
- Updated the "BasicTaskScheduler" implementation to print out some \
extra debugging information if the "select()" call failed
(e.g., with a "Bad file descriptor" error). Because these errors \
are typically caused by an invalid socket number
(i.e., a socket number that had already been closed) being used in \
"select()", we now print out the sockets that were
being used in the "select()" call.
- Argh! Really fixed this time.
- Fixed the "install" Makefile target in the previous release (stupid \
- In the previous release, we had forgotten to add an "install:" \
target to the top-level Makefile. (Thanks to Benjamin Drung for
- Updated the support for building shared libraries - first introduced in \
version 2012.12.15 - to add an "install:" Makefile
rule, and to make symbolic links to alternative names of the shared libraries. \
(Thanks to Benjamin Drung.)
- Updated the "MatroskaFile" implementation to signal that the input \
file has been parsed even if the specified file name
doesn't exist. (In particular, this stops the \
"testOnDemandRTSPServer" demo application from blocking if the test \
"test.mkv" or "test.webm" do not exist. I don't know why \
this wasn't caught before...)
- Added an experimental new configuration file \
"config.linux-with-shared-libraries", for building for Linux with \
only (i.e., no static libraries). (Thanks to Benjamin Drung for proposing and \
assisting with this.)
- Fixed another bug in the "ProxyServerMediaSession" destructor: We \
need to delete the "MediaSession" object before we delete
the "ProxyRTSPClient" object, in case the "MediaSession"s \
RTP/RTCP objects have an 'alternative byte handler' reference back
to the "ProxyRTSPClient". (Thanks to Sergei Bastrakov for reporting \
- Fixed a bug in "ProxyServerMediaSession" that would be triggered if \
a "RTSPServer" that uses such an object were deleted.
(This also fixes a memory leak that would occur if a proxy's back-end server \
failed, but then restarted.)
(Thanks to Sergei Bastrakov for reporting this bug.)
- Fixed a bug in "ProxyRTSPClient" that was causing some background \
tasks to not be halted when a "ProxyServerMediaSession" is
deleted. (Thanks to Sergei Bastrakov for bringing this to our attention.)
- Fixed a minor memory leak in \
"RTSPServer::closeAllClientSessionsForServerMediaSession()". (Thanks \
to Matt Norman.)
- Fixed an issue that caused "sapWatch" to fail to compile for at \
least one version of Debian. (Thanks to Alessio Treglia.)
- Fixed a bug in "ProxyRTSPClient". When we discover that the \
connection to the back-end server has failed, we need to
close any existing front-end RTSP client connections before we delete all of \
The signature to "ProxyServerMediaSession::createNew()" has also \
changed; it now takes a pointer to the "RTSPServer" as parameter.
- Added a new configuration file "config.iphone-simulator" for \
building for Apple's iPhone simulator (running on a Mac).
(Note that we already had a configuration file "config.iphoneos" for \
building for the iPhone (or iPad) itself.)
- Updated "SIPClient" and the "playSIP" demo application \
with a fix (suggested by Frederic Nadeau) to make "playSIP" send
RTCP "RR" packets back to the correct address. This is a hack, and \
should be fixed by upgrading "SIPClient" to make it
asyncronous (like "RTSPClient").
- Updated the (Windows-only) implementation of "gettimeofday()" to be \
'thread safe' (and also work correctly in WinCE).
(Thanks to Simon Roehrl.)
- Made a change to the implementation of \
"RTPSink::convertToRTPTimestamp()" to overcome a possible integer \
(Thanks to Simon Roehrl for noting this issue.)
- Made the "ProxyServerMediaSubsession" implementation a little more \
robust, by making sure that an object doesn't try to handle
reception of a RTCP "BYE" after it's been deleted.
- Updated "config.iphoneos" to update "LINK_OPTS" to fix a \
linking problem (and also update "IOS_VERSION" to 6.0).
(Thanks to Chris Ballinger.)
- Made the "addNewInputSource()" function of \
"MPEG2TransportStreamFromESSource" "protected:", to allow \
"MPEG2TransportStreamFromESSource" to support adding new kinds of \
input stream, if desired.
- Updated "AVIFileSink" to add an index at the end. (Thanks to \
- Updated the "MediaSession" implementation to accept \
"audio/OPUS" as a valid RTP payload format (which can be implemented
using a "SimpleRTPSource").
- Fixed a bug in "PresentationTimeSessionNormalizer". (Thanks to \
- Fixed a bug in the way that our RTSP proxy implementation reinitializes itself \
after reestablishing connectivity with the
back-end server. It now deletes all "ProxyServerMediaSubsession"s, \
so that they will get reestablished when the response
to the new "DESCRIBE" command comes back. (This also makes it \
possible for the back-end stream to restart with different
parameters.) (Thanks to Aashish Kaushik for reporting this problem.)
- Moved the definition of the "PresentationTimeSessionNormalizer" and \
"PresentationTimeSubessionNormalizer" classes to
"include/ProxyServerMediaSession.hh", so that developers can use \
them if they wish. (Note, though, that those classes were
intended for use only within our "ProxyServerMediaSession" (etc.) \
implementation, so don't complain if they don't do what you
- Added a "#ifndef RTSP_BUFFER_SIZE"/"#endif" around the \
definition of RTSP_BUFFER_SIZE in "liveMedia/include/RTSPServer.hh",
to allow this definition to be changed at compile time if desired. \
(Suggestion from Matt Schuckmann.)
- Updated the "RTPInterface" RTP/RTCP-over-TCP handling code to \
properly handle the case where we know about the
'stream channel id' for an embedded RTP or RTCP packet, but haven't yet \
registered a read handler function for it.
(This can occur in rare situations if our server starts sending RTP or RTCP \
packets before sending the RTSP "PLAY" response,
and the client (e.g., VLC) doesn't start reading from its input source until \
after it receives the "PLAY" response.)
(Thanks to Ralf Globisch for noticing this issue, and proposing a solution.)
- Maved "RTSPClient::reset()" from "private:" to \
"protected:", and made "ProxyRTSPClient::reset()" call \
(at the end). This causes the "ProxyRTSPClient" object to properly \
get reset (and, in particular, the 'session id' to get
reset) if we have to restart a connection with a back-end server.
(Thanks to Aashish Kaushik for reporting this issue.)
- Made the implementation of ending RTP/RTCP-over-TCP a little more efficient \
(by implementing each packet send using 2 calls
to "send()", rather than 4).
- Updated our implementation of sending RTP/RTCP-over-TCP so that if the initial \
'$' send() succeeds, we force the send()s of
the remaining data (the 'stream channel id', packet size, and packet data) to \
succeed, even if it means that we have to
temporarily block by doing so. This makes servers whose RTP/RTCP-over-TCP \
streams exceed the capacity of the network
handle this a bit more gracefully, avoiding the possibility that 'incomplete' \
packet data will appear on receivers'
- We backed out the change that we made (back in version 2012.06.12) to ignore \
SDP-specified port numbers for unicast streams,
because this broke our SIP client (which has no way of telling the server that \
it wants to use a different port number).
Now, if you want to ignore SDP-specified port numbers, you'll need to compile \
"MediaSession.cpp" with the definition
- Fixed a bug that would cause "playSIP" to crash if run without a \
username/password parameter. (Thanks to Sam Machin.)
- Added "#include <errno.h>" to \
"groupsock/include/NetCommon.h", to reduce the likelihood of compiler \
when compiling for Windows. (Thanks to Bruno Marchand for the suggestion.)
- Updated "StreamReplicator" to call "stopPlaying()" on the \
upstream source if/when all replicas have closed.
(Thanks to Bruno Marchand for the suggestion.)
- Updated the fix that we made in version 2012.09.11: When a \
"RTSPClient" requests RTP/RTCP-over-TCP streaming, it is
prepared to handle incoming RTP/RTCP-over-TCP data as soon as it receives the \
"SETUP" response, but doesn't start sending
RTCP "RR" packets until after it receives the "PLAY" response.
- Made the code for receiving RTP/RTSP-over-TCP streams a little more robust. \
(Thanks to Rex Wolf.)
- Made a minor fix to the way that "SIPClient" sends a \
"BYE". (Thanks to Frederic Nadeau.)
- Made the "fDestinationsHashTable" field in \
"OnDemandServerMediaSubsession" "protected:" rather than \
"private:", to allow
subclasses to access it, if desired. (They should only do lookups in the \
(Thanks to Matt Schuckmann for this suggestion.)
- Fixed the RTSP proxying implementation so that the presentation times of \
relayed frames are properly aligned with
'wall clock' time, so that receivers will get these presentation times \
accurately (using RTCP). We also defer RTCP "SR"
reports on the outgoing ('front-end') streams until the incomong streams' \
presentation times have been RTCP-synchronized
(because until then, the incoming presentation times are not accurate).
(Thanks to Bruno Marchand for bringing this issue to our attention.)
- Updated the "ProxyRTSPClient" implementation so that if the \
connection to the back-end server fails, it tries to restore the
connection by sending a new "DESCRIBE" command. This is more \
reliable (especially for back-end servers that use authentication.)
(Thanks to Lei Wu for this suggestion.)
- Added optional Boolean parameters to the "createNew()" functions for \
"MPEG1or2VideoStreamDiscreteFramer", and \
"DVVideoStreamFramer" filters, to specify that the input frames' \
times should be passed through unmodified. (The default behavior for these \
filters is to modify at least some presentation
times.) This parameter is necessary for our RTSP proxying implementation \
(because it wants to relay frames' presentation times
- Updated "RTSPClient.hh" to move the "fCSeq" and \
"fCurrentAuthenticator" from "private:" to \
This makes it possible for subclasses to implement variants of RTSP commands.
(Thanks to Matt Schuckmann for this suggestion.)
- Updated the "MediaSession" implementation to accept \
"audio/ILBC" as a valid RTP payload format (which can be implemented
using a "SimpleRTPSource").
- Added a "usesTCPTransport()" Boolean function to \
"RTSPServer::RTSPClientSession" so that subclasses can easily know \
(at least one subsession of) the session is being streamed via TCP.
- Removed a small piece of unnecessary code from the "testRTSPClient" \
code. (Thanks to Anton Zvyagintsev for noticing this.)
- Minor bugfix in "RTSPClient" when implementing RTSP-over-HTTP: Don't \
enqueue "POST" request records (after sending the command),
because we don't expect a response to this request. (Thanks to Daniel Peng.)
- Print an error message (in "RTCP.cpp" and \
"MultiFramedRTPSource.cpp") when we hit a buffer limit when reading
a (RTCP or RTP) packet over TCP.
- Increased MAX_PACKET_SIZE in "MultiFramedRTPSource.cpp" (for reading \
incoming packets) to 20000, because of a report
of a server sending packets larger than 10000 bytes.
- Added support for receiving the "application/VND.ONVIF.METADATA" RTP \
payload format. This is just a XML document packed into
simple RTP packets (but with the "M" bit used to indicate the end of \
(Thanks to Michel Promonet for this suggestion.)
- Updated the meaning of the "doNormalMBitRule" parameter to \
"SimpleRTPSource::createNew()" and \
It now applies for all media types other than "audio". (Previously, \
it applied only to "video".)
This change makes it possible to use "doNormalMBitRule" = True for \
the "application/VND.ONVIF.METADATA" RTP payload format.
- Fixed a bug in the URL parsing code in "RTSPCommon.cpp" that would \
cause parsing to fail for RTSP urls that don't have any
slashes after the "host" or "host:port" part. (Such URLs \
would usually be used only for operations - such as "OPTIONS" - on the
entire server.) (Thanks to Tamas Vincze for reporting this.)
- Fixed a problem whereby a "RTSPClient" streaming RTP/RTCP-over-TCP \
would sometimes send its first RTCP "RR" packet before
the server had had a chance to handle the "PLAY" command. This \
caused a problem for our server, because it would receive
the RTCP "RR" packet over the RTSP command connection, before it \
knew how to deal with this.
(Thanks to Ralf Globisch for reporting this issue.)
- Fixed a bug in "MPEG2TransportStreamFromESSource": Its destructor \
wasn't stopping the delivery from upstream objects.
(Thanks to Jing Li for reporting this.)
- Updated "AVIFileSink" to add a 'start code' before each H.264 NAL \
unit that it writes to the file.
(Thanks to 'giuchangyong' for the suggestion.)
- Added "-DTIME_BASE=int" to the COMPILE_OPTS for each of the \
"config.macosx*" configuration files (because someone reported
that it seems to be necessary for them).
- The socket error handling improvement that we made back in version 2012.07.24 \
inadvertently broke a workaround that we had
made (much earlier) for a bug in Windows. This caused problems for some \
Windows clients that receive via RTP-over-TCP.
This version should fix those problems.
- Modified the implementation of \
"MatroskaFileParser::parseEBMLVal_float()" to remove some aliasing \
that might cause
some compilers to generate incorrect code when optimizing. (Thanks to 'Owen' \
for noting this issue.)
- Fixed a bug in "RTSPServer" that would cause incorrect RTSP \
responses to be sent back in response to "PAUSE"
(and some "GET_PARAMETER" and "SET_PARAMETER") commands. \
(Thanks to Matthias Meding for reporting this.)
- Fixed a bug in "WAVAudioFileServerMediaSubsession" that could cause \
problems when seeking within very large WAV files.
(Thanks to 'Raph' for noting this problem.)
- Fixed a bug in "VorbisAudioRTPSink". (Thanks to Owen Wallace for \
- Fixed an obscure bug in the "MatroskaFile" constructor if the \
specified input file does not exist.
Also, fixed an obscure bug in "RTSPServer" if it receives a \
(Thanks to Kevin Kuo for reporting this.)
- The private->protected change to "fPreferredFrameSize" in the \
previous release was done in the wrong header file. It should
have been done in "WAVAudioFileSource.hh", not \
- Added a new 'filter' class "EndianSwap24", for byte-swapping 24-bit \
values between little and big-endian.
- Updated "WAVAudioFileServerMediaSubsession" to support the streaming \
of 24-bit (or 20-bit) WAV audio files.
(Thanks to 'Raph' for this suggestion, and for providing an example file.)
- Brought the "testWAVAudioStreamer" demo application up-to-date, by \
increasing the variety of WAV file formats that it can support.
- Added a "-U <absolute-start-time-string>" option to \
"openRTSP", to support seeking by 'absolute' time (if, of course, the
server supports this). (Thanks to Michel Promonet for this suggestion.)
- Updated the RTSP server implementation so that, by default, if a client tries \
to "PLAY" a stream using an 'absolute' time,
then the server will refuse by sending back a regular (NPT) "Range:" \
header instead. (If you want the server to handle
seeking by 'absolute' time, then you need to reimplement \
- Made the "fPreferredFrameSize" variable in \
"ByteStreamFileSource.hh" "protected:" rather than \
"private:", to allow subclasses
of "WAVAudioFileSource" to change its value, if desired.
- Added optional RTSP server and RTSP client support for streams that are \
indexed by 'absolute' time - i.e., using strings
of the form "YYYYMMDDTHHMMSSZ" or \
- For RTSP server developers (i.e., developers who have their own subclasses \
- To automatically have your streams advertised (in their SDP description) \
as supporting absolute time indexing,
reimplement (in your subclass) the virtual function:
"virtual void getAbsoluteTimeRange(char*& absStartTime, \
char*& absEndTime) const;"
This function should set "absStartTime" to a string value (of \
the form noted above), and should set "absEndTime" to
a corresponding string value, if the stream has an end time, otherwise NULL.
- To implement seeking by absolute time, reimplement (in your subclass) the \
"virtual void seekStreamSource(FramedSource* inputSource, \
char*& absStart, char*& absEnd);"
"absStart" (and "absEnd", if non-NULL) are strings (of \
the form noted above).
(The function *may* change them, to make them more accurate.)
- For RTSP client developers:
- To check whether a stream supports indexing by absolute time,
call "MediaSession::absStartTime()" or \
"MediaSubsession::absStartTime()", and check whether this (string) \
value is non-NULL.
- To play a stream, indexed by absolute time, call one of the new, \
alternative forms of "RTSPClient::sendPlayCommand()"
that take "absStartTime" (and optional "absEndTime") \
strings as parameters.
- Updated the "BasicTaskScheduler" class to make the \
'maxSchedulerGranularity' time (in microseconds) an optional parameter to
"BasicTaskScheduler::createNew()". This parameter (default value: \
10000 (i.e., 10 ms)) specifies the maximum time that we
wait (in "select()") before returning to the event loop to handle \
non-socket or non-timer-based events,
such as 'triggered events'. You can change this is you wish (but only if you \
know what you're doing!),
or set it to 0, to specify no such maximum time.
(You should set it to 0 only if you know that you will not be using 'event \
- Fixed the RTSP server support for MPEG Transport Stream 'trick play' to stream \
the correct amount of data when a stream
'duration' is specified for fast forward or reverse play. (Thanks to Michael \
Boom for reporting this bug.)
- Made some changes to "liveMedia/include/RTSPServer.hh" to make old \
- Modified the change to the definitions of EINTR, EAGAIN, EINPROGRESS, \
EDOULDBLOCK in "groupsock/include/NetCommon.h"
(made in the previous release) to ensure that they are always mapped to the \
- A major update to the RTSP server implementation. A single RTSP client \
session (i.e, the streaming of one particular stream
to one particular client) can now use an arbitrary number (>=1) of TCP \
For more details, see:
http://lists.live555.com/pipermail/live … 15571.html
- Put #ifndef/#endif around the (Windows-only) definitions of EINTR, EAGAIN, \
EINPROGRESS, EDOULDBLOCK in
"groupsock/include/NetCommon.h", in case they are already defined by \
the system's header files.
(Thanks to Hyunho Kim for bringing this to our attention.)
- Made a small modification to "H264VideoStreamFramer.cpp" to \
eliminate some 'unused variable' compiler warnings
(when compiling without DEBUG defined).
- Made the "RTPInterface" code for handling RTP/RTCP-over-TCP a little \
- Updated the "WAVAudioFileSource" WAV-file parser to skip any \
extraneous 'chunks' between RIFF and FORMAT.
(Thanks to Sid Price for suggesting this.)
- Updated the "RTPInterface" code to better handle socket errors when \
reading from TCP sockets. (Thanks to Barry Stump for
bringing this issue to our attention.)
- Made sure that some code that calls "fileno()" for doing \
asynchronous file reading never gets compiled under Windows
(where all file reading is synchronous), because some versions of Windows \
redefine the result type of "fileno()".
(Thanks to Sid Price for bringing this to our attention.)
- A member variable of "ProxyServerMediaSession" was not being \
initialized correctly (causing a "valgrind" error).
(Thanks to Jesus Leganes for reporting this.)
- Removed some unnecessary "abort()" calls from the code.
- Fixed a minor bug in the "H264VideoStreamParser" code that could \
sometimes cause a very short trailing NAL unit to not
get parsed properly. (Thanks to John McNamara for reporting this issue.)
- Made some changes to RTSP header parsing, to make it more robust. (Thanks to \
Lionel Orry for the suggestion.)
- Updated the RTSP server code to properly handle "Range:" headers of \
the form "npt=-<endtime>".
(Thanks to Michael Boom for bringing this to our attention.)
- Modified the implementation of \
"ServerMediaSession::generateSDPDescription()" to ignore (skip over) \
subsessions that use
medium or codec names that we don't understand. (Previously, subsessions like \
this would cause a NULL SDP description to be
returned.) This allows "ProxyServerMediaSession" to properly handle \
sessions like this. (Thanks to Kiran Thakkar for
alerting us to an example that illustrated this problem.)
- Moved "ProxyRTSPClient" - which had previously been hidden inside \
the implementation of "ProxyServerMediaSession" - to
the "ProxyServerMediaSession.hh" header file, in case developers \
want to subclass it. We also define a new virtual function
"ProxyServerMediaSession::createNewProxyRTSPClient()" whichh can be \
reimplemented to create such subclasses.
(Thanks to Jesus Leganes for this suggestion.)
- Made "RTSPClient::sendRequest()" a virtual function, and made it \
"protected:" rather than "private:", in case subclasses
want to redefine it (e.g., to do additional functions such as logging).
(Thanks to Jesus Leganes for this suggestion.)
- Moved the code for ignoring the SIGPIPE signal to "RTSPCommon.cpp", \
and made it a function. We now call this function from
the "RTSPClient" code, as well as the "RTSPServer" code. \
(Thanks to Barry Stump for the suggestion.)
- Added a new public member flag "describeCompletedFlag" to \
"ProxyServerMediaSession". This can be used as a 'watch variable'
in a call to "doEventLoop()", to 'block' in the event loop until the \
back-end "DESCRIBE" command sent for a newly-created
"ProxyServerMediaSession" has completed.
- Fixed a bug in "H264VideoStreamParser" that affected the \
"testH264VideoToTransportStream" demo application.
(Thanks to John McNamara for helping to debug the problem.)
- We no longer set a non-default "FileSink" buffer size in the \
"testH264VideoToTransportStream" demo application, because the
"FileSink" is fed by a "MPEG2TransportStreamFromESSource", \
ehich delivers only one 188-byte Transport Stream packet at a time.
- Fixed a bug in "HTTP Live Streaming" server support. (Thanks to \
Daniel Wang for reporting the problem.)
- Updated the implementation of "triggerEvent()" in \
"BasicTaskScheduler" to avoid a possible race condition (if \
is called from a non-LIVE555 thread). (Thanks to Matthais Doering for noting \
- Updated the "ProxyServerMediaSession" code to ensure that all \
front-end "RTCPInstance" objects are created with non-zero
- If a SDP description specifies a port number for a unicast stream, then we \
still choose an ephemeral client port number,
just as we would if the SDP description had not specified a port number (the \
usual case). Renato Mauro reports that some Sony
network cameras do this; this change lets the client choose a different port \
number (which is useful if one host is receiving
from more than one such camera at once).
- Fixed some minor bugs with Matroska file parsing. (Thanks to Petr Novak.)
- A field in "RTPTransmissionStats" was not being initialized in the \
constructor. (Thanks to Michel Promonet for noting this.)
- Updated "UsageEnvironment/include/Boolean.hh" to use the 'bool' type \
defined for "MSVC++ 8.0, Visual Studio 2005 and higher",
if that development environment is being used. Also, fixed a few places in \
the code where we were using boolean types
incorrectly. (Thanks to Nikolai Vorontsov for these suggestions.)
- Changed the implementation of "RTSPServer::removeServerMediaSession(char \
const* streamName)" to not
call "lookupServerMediaSession()", in case that (virtual) function \
has been overridden in a subclass to do something different.
Now we just call the hash table 'remove' function directly. (Thanks to Bruno \
Abreu for bringing this to our attention.)
- Updated the "config.iphoneos" configuration file. (Developers may \
need to change the definition of "IOS_VERSION", however.)
- Added "#include <ctype.h>" to \
"MPEG4GenericRTPSink.cpp", because some systems apparently need this \
to define "tolower()".
(Thanks to Michel Promonet for noting this.)
- Really fixed the bug in the implementation of \
"StreamReplicator::deleteReplica()" that I was supposed to have fixed \
the previous revision. (Thanks to Bruno Abreu for setting us straight.)
- Fixed the signature of \
"MultiFramedRTPSink::curFragmentationOffset()" to return an \
"unsigned" rather than a "Boolean".
(Thanks to Nikolai Vorontsov for noticing this.)
- Fixed the "testReplicator" demo application code to actually do what \
it claims - transmit one replica stream via UDP,
while writing the other replica stream to a file.
(We had accidentally omitted the line that transmits one replica stream via UDP.)
- Fixed a bug in the implementation of \
"StreamReplicator::deleteReplica()". (Thanks to Bruno Abreu for \
- Fixed a bug in "RTSPServer" that would occur if you tried to add two \
different "ServerMediaSession" objects using the same
stream name. (Thanks to Vadim Kosarev for noting this.)
- Added "-DXLOCALE_NOT_USED=1" to "config.cygwin" (on the \
suggestion of Warren Young).
- Modified the "RTSPClient" implementation to be more careful about \
not accessing the "RTSPClient" object's state after
calling "handleRequestError()", in case the handler function handles \
the error by deleting the "RTSPClient" object itself.
(The "testRTSPClient" demo application does this, for example.) \
(Thanks to Gord Umphrey for reporting a problem,
and to Guy Bonneau for pointing out this as a possible cause.)
- Fixed a typo in the "Makefile.tail" file for the \
"mediaServer" directory. (Thanks to 'Nix Lo' for the report.)
- Removed an unneeded "typedef" from "Locale.hh"; it was \
causing compiler warnings. (Thanks to Barry Stump and Warren Young
for reporting this.)
- Added a debugging error message to various "*Sink" classes, to warn \
when the "numTruncatedBytes" parameter in the 'after getting'
function is >0. When this happens, you need to increase the \
"bufferSize" parameter in the appropriate "*::createNew()" \
- Changed the buffer size used by the "testH264VideoToTransportStream" \
demo application from 10000 to 100000, because input H.264
NAL units are often larger than 10000 bytes.
- Changed the default 'buffer size' parameter in \
"H264VideoFileSink::createNew()" from 10000 to 100000, because input \
NAL units are often larger than 10000 bytes.
- Changed the signature of "AuxHandlerFunc()" (used by the \
"setAuxilliaryReadHandler()" hack) to pass "packetSize" by \
instead of by value. (Thanks to Keary Griffin for this suggestion; he was \
using this mechanism to implement SRTP.)
- Changed the way that we disable the handling of SIGPIPE signals in \
"RTSPServer.cpp" (so that the server doesn't get killed
when clients, running on the same host, get killed). (Phillipe Clavel \
reported that the old method
- "signal(SIGPIPE, SIG_IGN);" - wasn't working properly on Mac OS X.)
- Made some cosmetic changes to the "live555ProxyServer" code, prior \
to its official announcement.
- Added "ProxyServerMediaSession" - a subclass of \
"ServerMediaSession" that can be used to create a (unicast) RTSP \
that acts as a 'proxy' for another (unicast or multicast) RTSP/RTP stream.
- Added a new application "live555ProxyServer", and included it in a \
new subdirectory "proxyServer/" in the
"LIVE555 Streaming Media" distribution. This application - which \
uses the new "ProxyServerMediaSession" class - acts as
a unicast RTSP server 'proxy' for one or more 'back end' (unicast or \
multicast) RTSP streams, specified on the command line.
- Fixed an obscure bug in RTP/RTCP-over-TCP reading. (Thanks to Shiyong Zhang \
for reporting this.)
- Changed the definition of "Boolean" in \
"UsageEnvironment/include/Boolean.hh" from "unsigned" to \
to avoid an apparent conflict when compiling for Mac OS X (and also to save \
(Thanks to Barry Stump for the suggestion.)
- Madea a minor change to "RTPInterface" to accommodate RTSP clients \
that call 'startPlaying()' on a "RTPSource" object prior
to the handling of a RTSP "SETUP" response. (This change affected \
only RTP-over-TCP streams.)
- Changed the "RTSPClient" "fVerbosityLevel" field from \
"private:" to "protected:", to allow subclasses to use it in \
- Made some changes to "GroupsockHelper.cpp" that were allegedly \
needed for compilation for 'Android'.
- Made a minor change to "NetCommon.h" that allegedly improves/fixes \
compilation for some version of Windoze.
- Removed the "MP3HTTPSource" class; it was old code that shouldn't be \
- Made some changes to "H264VideoRTPSink" and \
"T140TextRTPSink" to correct some minor bugs.
- Improved the way that "H264VideoStreamDIscreteFramer" detects and \
reports NAL units that erroneously begin with
MPEG 'start codes'.
- Fixed a bug in the way in which the "ServerMediaSession" reference \
count is updated by "RTSPServer::RTSPClientSession" objects.
(Thanks to Daniel Liu for reporting this.)
- Modified the "MultiFramedRTPSource" code to optimize the case when \
the 'packet reordering threshold' has been set to 0.
(Doing this is not recommended, however, unless you're only going to be on \
networks where packet reordering is extremely
- Added a new member function "reassignInputSource()" to \
"FramedFilter", to allow a filter's input source to be changed.
- Changed some comments in "testRTSPClient.cpp" to make it clearer \
that if you (for whatever reason) choose to reclaim the
"UsageEnvironment" and "TaskScheduler" objects, then you \
can do so only *outside* the event loop (e.g., in "main()", after
"doEventLoop()" has returned).
- Fixed a bug in the way that "MPEG1or2DemuxedServerMediaSubsession" \
creates "AC3AudioStreamFramer" objects.
This was causing errors in the way that AC3 audio tracks in VOB files were \
being streamed by "testOnDemandRTSPServer".
(Thanks to "Rustam" for reporting this issue.)
- Corrected a potentially misleading error message in "RTSPClient". \
(Thanks to Sebastien Escudier for reporting this.)
- Fixed a bug in the "RTSPServer" implementation that could prevent it \
from properly handling 'pipelined' requests
(such as "SETUP" requests) from a single client.
- Updated the "RTSPClient" code to (when "verbosityLevel" \
> 0) output a warning message when the server 'skips over' one of our
earlier requests. If this happens, it indicates a bug in the server (perhaps \
a bug in the way that the server handles
pipelined requests - such as the bug that we just fixed in our own server here).
- Fixed a bug in the "RTSPClient" code that prevented it from properly \
handling 'pipelined' responses from a single server.
- Fixed a bug in the Matroska file parsing code that could cause an infinite \
loop when streaming from a multi-track file.
- Updated the "RTSPServer" code to no longer attempt to seek, or set \
the scale of, a subsession within a multi-subsession
stream. (Instead, these operations can be done only on the 'aggregate' session.)
- Added a new member function "addFilter()" to \
"MediaSubsession". This allows RTP receivers to add a filter (such as \
in front of the subsession's "readSource()", changing \
"readSource()" to be this new filter.
- Fixed a minor bug in "ServerMediaSession" that was causing it to \
generate incomplete default 'info' and 'description' strings
in SDP descriptions.
- Fixed a minor bug in "T140TextRTPSink": Make sure that the 'idle \
timer' (for delivering empty frames downstream) gets turned
off when the input source closes.
- Fixed the testing of the "mpeg4Mode" parameter to the \
"MPEG4GenericRTPSink" constructor, to make it case-insensitive.
- Added new versions of "H264VideoRTPSink::createNew()" that \
(optionally) take SPS and PPS NAL units
(either in raw binary form, or as a 'sprop-parameter-string') as parameters. \
This is useful if you know this information in
advance, rather than having to get it from the input 'framer' object.
- Added a new version of "H264VideoStreamFramer::setSPSandPPS()" that \
takes a 'sprop-parameter-string'
(instead of the raw binary NAL units) as parameter.
- Added a new version of "MPEG4ESVideoRTPSink::createNew()" that takes \
stream configuration information as a parameter. This is
useful if you know this information in advance, and don't want to rely upon \
the sink getting this from the input 'framer' object.
- Added a member function "MPEG4VideoStreamFramer::setConfigInfo()" \
that can be used to (optionally) set stream configuration
information, without requiring the framer to read it from the input source.
- Added a new version of "VorbisAudioRTPSink::createNew()" that takes \
a Base-64-encoded 'configuration' string - rather than
raw configuration headers - as parameter.
- Added a minor hack to "MediaSubsession" to allow ADU-ized MP3 frames \
to optionally be received 'as is',
instead of always converting them back to MP3 frames for delivery.
- Added a new member function "ServerMediaSession::numSubsessions()" \
to return the number of "ServerMediaSubsessions" that have
been added to the "ServerMediaSession".
- Changed the signature of "base64Decode()" to make its string \
argument "char const*" instead of "char*" (for extra type \
- We no longer define RTSPCLIENT_SYNCHRONOUS_INTERFACE by default. \
Consequently, the old, now-deprecated 'synchronous' "RTSPClient"
interface will no longer be available, by default. If you still want this, \
however, you can get it by "#define"ing
RTSPCLIENT_SYNCHRONOUS_INTERFACE before "RTSPClient.hh" gets \
included the first time.
- Modified the 'multicast loopback' mechanism for getting our own IP address to \
check the source address of the received
multicast packet, to make sure that it's valid (e.g., not 127.0.0.1). (Thanks \
to Stefan Spurling for this suggestion.)
- Updated "MediaSubsession::initiate()" to better handle the \
(relatively rare) case of UDP-only (i.e., non-RTP) streams that
specify a port number in the SDP description. In this case, because RTP is \
not being used, we accept the provided port number
even if it's odd, and we don't bother creating a RTCP 'groupsock'. (Thanks to \
John Orr for this suggestion.)