2023.07.24:
- Updated the event trigger implementation once again, to allow for the possibility of
developers redefining MAX_NUM_EVENT_TRIGGERS (it must always be <= the number of bits
in an "EventTriggerId", though. (Thanks to Jan R?rgaard Hansen for this suggestion.)
2023.06.20:
- Updated the event trigger implementation again - in the case where "NO_STD_LIB" is
defined. In this case, "fTriggersAwaitingHandling" is implemented as an array of
"Boolean volatile"s, rather than as a 32-bit bitmap. This should make 'race conditions'
less likely even if "NO_STD_LIB" is defined (though you should use the preferred, default
implementation - that uses an array of "std::atomic_flag"s - if possible).
2023.06.16:
- Changed the (default) implementation of 'event triggers' in "BasicTaskScheduler" to
implement "fTriggersAwaitingHandling" using "std:atomic_flag"s, rather than as a bitmap.
This should overcome 'race conditions' that some users experienced when calling
"triggerEvent()" from a non-LIVE555 thread. (Thanks to Jan R?rgaard Hansen for reporting
this issue.)
Note that this is the first time the LIVE555 code has required the C++ standard library.
(If you cannot use the C++ standard library, then you can compile the code - but getting the
old behavior - by defining "NO_STD_LIB".)
- Minor change to "RTSPCommon.cpp" to overcome a compilation error in XCode on Mac OS X.
2023.06.14:
- Fixed a bug in the Matroska file parsing code that could sometimes cause a 'use after free'
error. (Thanks to Meng Ruijie, Martin Mirchev, and "jerry testing" for reporting this.)
2023.06.10:
- Minor change to "GroupsockHelper.cpp" to overcome a compilation error in XCode on Mac OS X.
2023.06.08:
- Updated the "dateHeader()" function in "RTSPCommon.cpp" to use "gmtime_r()" instead of
the older, non-thread-safe "gmtime()". (Thanks to Russell Greene for the patch.)
2023.05.10:
- Fixed a minor memory leak in the "RTSPServer" code.
(Thanks to Zhudong Jie for reporting this.)
2023.03.30:
- Calls to "send()" and "sendto()" now explicitly take "MSG_NOSIGNAL" rather than 0 as the
'flags' parameter. In most systems, 0 seems to work, but apparently not in
Debian Linux. (Thanks to Eric Beuque for reporting this.)
2023.01.19:
- By default, we no longer compile "groupsock/NetAddress.cpp" for Windows to use
"gethostbyname()", because of a report that this breaks IPv6 name resolution.
(From now on, if you still want to use "gethostbyname()" for Windows, edit the
"win32config" file before running "genWindowsMakefiles".)
2023.01.11:
- Updated the "BasicTaskScheduler"/"DelayQueue" implementation to make the 'token counter'
a field of the task scheduler object, rather than having it be a static variable.
This avoids potential problems if an application uses more than one thread (with each thread
having its own task scheduler). (Thanks to Jan R?rgaard Hansen for reporting this issue.)
- Performed the annual update of the copyright years near the start of each file
2022.12.01:
- Yet another fix to the previous fix for RTSP-over-HTTP streaming.
2022.11.30:
- The previous version's fix to "RTSPClient" (for RTSP-over-HTTP streaming) was incomplete.
This should fix it for real.
2022.11.29:
- Fixed a bug in "RTSPClient" that would cause RTSP-over-HTTP streaming over TLS to
sometimes fail. (Thanks to Johannes Gajdosik for reporting this.)
- Fixed a bug that would cause a RTSP server to use an incorrect URL if it accepted connections
via TLS, but *without* streaming SRTP.
2022.11.19:
- Added a new global variable "ReceivingInterfaceAddr6" (analogous to the existing
variable "ReceivingInterfaceAddr" for IPv4) to allow applications to optionally
change the default receiving address for IPv6.
(Thanks to Yahia Benmoussa for the patch.)
2022.10.01:
- Updated the previous revision so that the virtual function "specialHandlingOfAuthenticationFailure()"
is now called only if there is an actual authentication failure - not on the first time that
we send back a "401 Unauthorized" response.
2022.09.30:
- Added a new virtual function "specialHandlingOfAuthenticationFailure()" to "RTSPServer" to
allow a subclassed "RTSPServer" to take special action (e.g., statistics logging)
whenever an authentication failure occurs. (By default, the function does nothing.)
(Thanks to Joerg Dommaschk for this suggestion.)
2022.07.14:
- (This does not change the code at all.) We now use SHA-1 rather than MD5 to hash the
latest tarball of our code (as SHA-1 is considered a more secure hash than MD5).
2022.06.16:
- Both our RTSP client and RTSP server implementations now support (optional)
RTSP-over-HTTPS streaming, when RTSP-over-TLS would otherwise be available.
(This does not apply to a RTSP server that streams SRTP/SRTCP. In that case, sending
SRTP/SRTCP over a TLS connection would add unnecessary overhead, so is not supported.)
2022.06.14:
- Added optional support (via #ifdefs) to the "testOnDemandRTSPServer" demo application
for streaming via RTSPS (RTSP-over-TLS) and optionally SRTP (encrypted RTP/RTCP).
To use this, you would need to define SERVER_USE_TLS, and PATHNAME_TO_CERTIFICATE_FILE and
PATHNAME_TO_PRIVATE_KEY_FILE.
2022.04.26:
- A minor update to the previous release, to ensure that we don't call "delete[]" on an
uninitialized pointer.
2022.04.25:
- Updated "RTSPClient" so that it can optionally include a "Require:" header in RTSP commands.
(See the definition of "setRequireValue()" in "include/RTSPClient.hh")
(Thanks to Gregory Chiapa from Thales Group for suggesting this.)
2022.04.15:
- Fixed a "fprintf()" argument-order-evaluation bug in the "mikeyParse" demo application.
(Thanks to Taeho Kim for reporting this.)
2022.04.12:
- Updated the "openRTSP" application (RTSP command-line client) to add an option '-L', meaning:
receive only an "application" (e.g., 'metadata') track, if present, outputting the data
to 'stdout'. (This is analogous to the existing '-a' and '-v' options, for receiving only
audio or video.)
2022.02.07:
- Updated the SRTP packet sending code in "MultiFramedRTPSink.cp" to not allocate
a variable-sized buffer on the stack, because some compilers can't handle this.
- Ensure that RTSP servers that serve SRTP do not also support streaming over the TCP connection,
because that would add extra overhead for no benefit.
2022.01.21:
- Fixed a bug in the "groupsock" library that could cause outgoing RTP packets to get duplicated
when a RTSP "PLAY" command is sent after a "PAUSE".
(Thanks to Yahia Benmoussa for reporting this.)
2022.01.20:
- More updates to the code for optional server SRTP streaming.
(This appears to be working now, but needs further testing before being officially announced.)
2022.01.17:
- More updates to the code in preparation for optional server SRTP streaming.
(SRTCP transmission and reception is now working; SRTP transmission is not working yet.)
2022.01.11:
- Fixed a minor memory leak in "RTSPClient" when receiving a SRTP stream.
- Updates to "RTPSink" in preparation for optional server SRTP streaming - not working yet.)
2022.01.06:
- Made "GenericMediaServer::addServerMediaSubsession()" a virtual function, and redefine it
in the subclass "RTSPServer" to call the base function, then set the "ServerMediaSubsession"s
"streamingIsEncrypted" flag (if the RTSP server is streaming SRTP).
(This is in preparation for optional server SRTP streaming - not working yet.)
2021.12.18:
- Fixed a bug in the way that "RTSPClient" handles its two separate TCP connections when
it does RTSP-over-HTTP. (Thanks to Laszlo Ast for noticing this.)
- Updated "RTPInterface::sendDataOverTCP()" so that if it's necessary to do a blocking send(),
we call "makeSocketNonBlocking()" immediately after the call to "send()".
(This fixes an issue noted by Andrei Chtcherbatchenko.)
- Performed the annual update of the copyright years near the start of each file
2021.12.07:
- Added #ifndef NO_OPENSSL/#endif around "#include <openssl/err.h>" in "liveMedia/TLSState.cpp",
so that the code will compile if you're compiling with no OpenSSL headers, and NO_OPENSSL
defined. (Thanks to William Pfeffer for noticing this.)
2021.11.23:
- Updated the "RTSPServer::setTLSState()" function to take an optional parameter
"weServeSRTP". For now, the default value of this parameter is False, but it will
get changed to True later, when we implement server-side SRTP.
2021.11.14:
- Updated the RTSP server implementation to (optionally) support connections via TLS.
To enable this, call
setTLSState(<certFileName>, <privKeyFileName>);
on your newly-created "RTSPServer" object (before you enter the event loop to start
handling requests) - where <certFileName> is the (string) pathname of a certificate file,
and <privKeyFileName> is the (string) pathname of a private key file - both in PEM format.
At present, this implementation does *not* serve SRTP (encrypted RTP/RTCP), and so does
not accept "rtsps://" URLs. (This will change in the future.)
2021.11.10:
- Updated the "TLSState" interface and implementation to (1) reduce the amount of stuff
that the compiler gets to see if you're compiling with NO_OPENSSL defined, and (2) add a
new subclass "ServerTLSState" that will eventually be used to implement optional
TLS connections to our RTSP server. (This has not been completed yet.)
2021.11.01:
- Split the "TLSState" class into two classes: "TLSState" (an abstract base class),
and "ClientTLSState" (a subclass). This is in preparation for later defining a
second subclass "ServerTLSState" that will eventually be used to implement TLS connections
in our RTSP server.
2021.10.31:
- Updated the implementation of AES encryption/decryption (used by our client SRTP
implementation) to use the new OpenSSL EVP interface. This makes it possible to
use hardware acceleration (e.g., AES-NI), when it is available.
2021.10.28:
- Updated the "RTSPClient"s implementation of receiving RTP/RTCP-over-TCP so that it will
also work over a RTSP-over-TLS (including RTSPS) connection.
2021.10.20:
- Fixed a bug in "MatroskaFileParser" that could cause delivery of data to a downstream object
that wasn't expecting it (potentially causing an invalid memory access).
(Thanks to "pany.2011" for reporting this.)
2021.08.24:
- The final (I hope!) update to eliminate a "depends on uninitialised value" report from 'valgrind'.
Because "recvfrom()" can be expected to fill in the 'from' address only if it's called on a
datagram socket, we update the implementation of "RTPInterface::handleRead()" to set the
'from' address variable to a 'dummy' value before calling "readSocket()", in the case where
it's reading RTP/RTCP-over-TCP.
2021.08.23:
- Updated the "readSocket()" code in "GroupsockHelper.cpp" yet again to try to eliminate
another (alleged) "depends on uninitialised value" report from 'valgrind'.
2021.08.19:
- Updated the "readSocket()" code in "GroupsockHelper.cpp" to eliminate another possible
"depends on uninitialised value" report from 'valgrind'. (Thanks to Dmitry Kostromin)
2021.08.18:
- Updated the "readSocket()" code in "GroupsockHelper.cpp" to eliminate a
"depends on uninitialised value" report from 'valgrind'. (Thanks to Dmitry Kostromin)
2021.08.17:
- Updated the 'groupsock' "setPortNum()" function to not rely upon the "ss_family" family
field, in case it's uninitialized.
2021.08.14:
- Fixed a minor bug in the previous release ("delete" should have been "delete[]")
2021.08.13:
- Fixed a bug in "MPEG1or2Demux" that could cause a 'reading twice at the same time" abort
when streaming from a MPEG Program Stream file. (Thanks to Ba Jinsheng for reporting this.)
- Fixed a potential memory leak in "AC3AudioStreamFramer". (Thanks to Ba Jinsheng for reporting this.)
2021.08.09:
- Fixed a bug in the MPEG-1 or 2 file server demultiplexors that could cause a RTSP server
to crash if it received successive RTSP "SETUP" commands for the same track.
(Thanks to Ba Jinsheng for reporting this.)
2021.08.06:
- Fixed a bug in the Matroska and Ogg file server demultiplexors that could cause a RTSP server
to crash if it received successive RTSP "SETUP" commands for the same track.
(Thanks to Ba Jinsheng for reporting this.)
2021.08.04:
- In the "MP3FileSource" implementation, we no longer do a recursive call to "doEventLoop()"
when attempting to synchronously read from a MP3 file. This avoids a possible
stack overflow in the RTSP server if multiple concurrent requests are made.
(Thanks to Ba Jinsheng for reporting this.) The server still does some synchronous reads,
when initializing, and when parsing MP3 frame headers. This should be fixed sometime in the
future.
2021.07.20:
- If a "RTSPClient" receives a response to a RTSP "PLAY" that changes the 'scale()' or 'speed()'
of the whole session, then those parameters also need to be changed in each subsession
(as that inheritance doesn't happen automatically).
(Thanks to a developer in China for reporting this.)
2021.07.10:
- Updated "H264or5VideoStreamFramer.cpp" once again to set the default value of
"DeltaTfiDivisor" to 2.0 for H.265, and 1.0 for everything else. (This fixes the frame rate
for another stream supplied by Paul Westlund.)
2021.06.29:
- In the proxy server implementation, if a client closes one substream, but there are still
other clients receiving other substream(s), then we no send a single-track RTSP "PAUSE"
command downstream, because some back-end servers might handle that by pausing all tracks
of the stream. So now, in this case, we don't send a RTSP "PAUSE" command at all.
(Thanks to Jose Maria Infanzon for noting this issue.)
2021.06.25:
- Updated "H264or5VideoStreamFramer.cpp" to set the default value of "DeltaTfiDivisor" to
1.0 (rather than 2.0), and to assume a frame rate of 30 fps (rather than 25 fps) if there
is no VPS or SPS NAL unit that specifies a different frame rate. This seems to work the best
for most raw H.264 and H.265 video streams. (Thanks to Paul Westlund for supplying an
example file to motivate this.)
2021.05.22:
- Fixed a bug that might cause a "REGISTER" or "DEREGISTER" command to be handled after
the corresponding "RTSPClientConnection" object is deleted.
(Thanks to Mario Takeuchi for reporting this bug and providing a patch.)
2021.05.17:
- If a stream has no known duration, then our "a=range:" line (in the server's SDP description)
now says "npt=now-" rather than "npt=0-". Although the latter appears to be valid
(according to RFC 2326), it has been claimed that "ffmpeg" RTSP clients do not handle it.
(Thanks to Dmitry Bely for raising this issue.)
2021.05.03:
- Updated the code for "getOurIPAddresses()" to check that "p->ifa_addr" is not NULL before
we try dereferencing it. (Thanks to Thore Mehr for noting this.)
2021.04.06:
- Fixed a bad #define in "liveMedia/include/MPEG2TransportStreamAccumulator.hh"
2021.04.05:
- Updated "groupsock/GroupsockHelper.cpp" to cast the 4th argument of various calls to
"setsockopt()" to "(const char *)" to make MSVC happy.
(Thanks to Josh Thorson for suggesting this.)
2021.03.22:
- Updated the "BasicUDPSource" class to reimplement the "maxFrameSize()" virtual function.
This will make "StreamSource" subclasses work properly when fed from "BasicUDPSource"s,
by telling the "StreamSource" to read as much data as possible from each incoming datagram.
(Thanks to Josh Thorson for discovering this.)
2021.03.17:
- Removed extraneous code from "MPEG2TransportStreamAccumulator.hh". (Also, include that
header file in "liveMedia.hh".)
2021.03.16:
- Fixed a bug in the implementation of "OnDemandServerMediaSubsession" that could cause a
RTSP server to crash - for certain "OnDemandServerMediaSubsession" subclasses - if it is
accessed by a malicious RTSP client. If you have a RTSP server that uses one or more of
the following "OnDemandServerMediaSubsession" subclasses:
AC3AudioFileServerMediaSubsession
ADTSAudioFileServerMediaSubsession
AMRAudioFileServerMediaSubsession
then you should upgrade to this version of the code ASAP, as this is a potential security
vulnerability. (Note, however, that the "DynamicRTSPServer" code used by the
"LIVE555 Media Server" is not vulnerable to this bug.)
(Thanks to Zhao Jiaxu for reporting this bug.)
2021.03.15:
- Updated the various RTSP server applications in "testProgs" to use a common routine
"announceURL()" (implemented in "announceURL.cpp") to display the IPv4 and/or IPv6 "rtsp://"
URLs of the stream.
- Updated the "testMP3Streamer", "testMP3Receiver", "testMPEG1or2AudioVideoStreamer",
"testMPEG1or2VideoStreamer", and "testMPEG2TransportStreamer" demo applications to
(optionally) stream using IPv6 multicast instead of IPv4 multicast.
(To enable this, uncomment the line that #defines USE_IPV6_MULTICAST)
- Removed from the "live555 Media Server" code the line that outputs a comment about
supportng HTTP Live Streaming (on indexed Transport Stream files).
This is no longer supported.
2021.02.11:
- Updated the "live555 Media Server" and "testOnDemandRTSPServer" applications to display both
IPv4 and IPv6 RTSP URLs when starting (or just an IPv4 RTSP URL if the system is IPv4-only,
or just an IPv6 RTSP URL if the system is IPv6-only).
2021.02.10:
- Fixed a bug in "GenericMediaServer" that could potentially cause infinite recursion in the
"live555 Media Server" application. (This had earlier been fixed in version 2019.09.30,
but had accidentally been reintroduced into a recent revision.)
- Before binding to IPv6 sockets, set the IPV6_V6ONLY flag set to 1, so that we can have
an IPv4 socket and an IPv6 socket bound to the same port.
2021.02.09:
- Fixed a bug in "groupsock/GroupsockHelper.cpp" that could cause a compilation error on
some systems where "sa_len" is not defined in "struct sockaddr".
2021.02.05:
- Updated the mechanism by which we figure out our (IPv4 and/or IPv6) address.
Instead of the 'multicast loopback' mechanism, we use "getifaddrs()".
(If "getifaddrs()" doesn't work, then we fall back to the
"lookup host name"->"resolve host name" method, as we did before.)
If "getifaddrs()" is not defined on your system (or if you don't want to use it), then
you can disable its use by compiling with NO_GETIFADDRS defined.
- Updated "RTSPServer::rtspURL()" (and "RTSPServer::rtspURLPrefix()") to take an optional
parameter "useIPv6" (default value: False). If True, the returned "rtsp://" URL (or prefix)
uses our IPv6 address, rather than our IPv4 address.
(We also defined shortcut functions "ipv4rtspURL(Prefix)()" and "ipv6rtspURL(Prefix)()"
that call the above functions.)
- Fixed a bug in the 'groupsock' "addressIsNull()" function for IPv6 addresses.
2021.01.29:
- Renamed the 'groupsock' function "ourIPAddress()" to "ourIPv4Address()".
(We also define a function "ourIPv6Address()", though for now this just returns a null
IPv6 address.)
2021.01.28:
- Fixed the "config.macosx-no-openssl" configuration file (it had been accidentally trying to
link with SSL and crypto libraries).
2021.01.21:
- Updated the "GenericMediaServer" class (and its subclasses, including "RTSPServer" and
"DynamicRTSPServer") to use two main server sockets: one for handling connections over IPv4;
the other for handling connections over IPv6. (Connections over IPv6 might not be fully
working yet.)
- Changed the "groupsock" "getSourcePort()" function to take an extra "domain"
(AF_INET or AF_INET6) parameter. (This is needed in case the function's implementation
needs to call "bind()".)
2021.01.20:
- Updated the implementations of several helper functions in "groupsock/GroupsockHelper.cpp"
to work with IPv6 (once we support it).
2021.01.18:
- Changed the virtual function "ServerMediaSession::sdpLines()" to take an 'address family'
parameter. This lets us ensure (in "OnDemandServerMediaSubsession") that generated SDP
descriptions for unicast streams have the correct IP address family string ("IP4" or "IP6").
- Changed the "GenericMediaServer::setUpOurSocket()" function to take a 'domain'
(AF_INET or AF_INET6) parameter, in preparation for eventual support for IPv6.
2021.01.17:
- In the "groupsock" library, changed the signature of "nullAddress()" to take an optional 'address family' parameter.
- Removed obsolete parameters "fServerAddressForSDP" and "fPortNumForSDP" (and member function "setServerAddressAndPortForSDP()") from "ServerMediaSubsession".
2021.01.16:
- Fixed minor bug in "RawVideoRTPSource". (Thanks to Yahia Benmoussa.)
2021.01.14:
- Changed the virtual function "GenericMediaServer::lookupServerMediaSession()" to be
asynchronous, to allow the actual lookup to be performed within the event loop, in response
to an event. "lookupServerMediaSession()" now takes a 'completion function' and
'completion client data' as parameter. Once the lookup is done, the completion function
is called - with the 'completion client data' and looked-up "ServerMediaSession" object
as parameter.
(Thanks to Mit Shan for providing the use case that motivated this change.)
2021.01.13:
- Fixed a memory leak in the "MIKEYPayload" class. (Thanks to Micha Kalfon for reporting this.)
2021.01.09:
- Updated the constructor for the 'groupsock' "NetAddressList" class to take an (optional)
'address family' parameter. This can be used to lookup specifically an IPv4 or IPv6 address
for a given host name. (In 'liveMedia', updated "MediaSession.cpp" to use this mechanism
when parsing a SDP description.)
- Updated the "ServerMediaSession::generateSDPDescription()" function to take an
'address family' parameter, so we can generate proper SDP (specifying the proper IP address
family) even for connections from IPv6 clients. Updated the
"RTSPServer::RTSPClientConnection" constructor accordingly, to record the address family
of the connection, for subsequent use when calling "generateSDPDescription()".
2021.01.01:
- Updated the 'groupsock' "setupDatagramSocket()" and "setupStreamSocket()" to take
an 'address family' parameter, in preparation for eventual support for IPv6.
2020.12.23:
- Updated the implementation of "NetAddressList()" to properly return an IPv6 address
if the hostname being looked up is IPv6 only. (This is in preparation for eventual
support for IUPv6.)
- More minor changes to the "groupsock" library in preparation for eventual support for IPv6.
Note that the type name "netAddressBits" is no longer defined; use "ipv4AddressBits" instead.
2020.12.13:
- Fixed a bug accidentally introduced in the previous release (Linux distributions don't
include the field "ss_len" in their definition of "struct sockaddr_storage").
(Thanks to Scott Robinson for reporting this.)
2020.12.12:
- Updated the "groupsock" "socketJoin/LeaveGroup()" functions to take
"struct sockaddr_storage const&" as parameter, in preparation for eventual support for IPv6.
2020.12.11:
- Updated the "MediaSession" "fSourceFilterAddr" field and "connectionEndpointAddress()"
and "setDestinations()" member functions to use a "struct sockaddr_storage",
in preparation for eventual support for IPv6.
- More cleanup of the "groupsock" library.
2020.12.10:
- Updated the "Groupsock" constructors to take "struct sockaddr_storage const&"s as
parameter, in preparation for eventual support for IPv6.
(Ditto for the "createGroupsock()" virtual in "OnDemandServerMediaSubsession"
and its subclasses.)
- Updated "Groupsock::groupAddress()" and "Groupsock::sourceFilterAddress()" to return
a "struct sockaddr_storage&", in preparation for eventual support for IPv6.
2020.12.09:
- Cleaned up the "groupsock" library by removing a lot of code that was used only for the
old "UDP multicast tunneling" mechanism (which would not work for IPv6 addresses anyway).
- Fixed a bug (accidentally introduced in the previous release) that could cause clients'
RTCP "RR" packets to not get sent properly.
2020.12.08:
- Updated the "Groupsock::addDestination()" and "Groupsock::changeDestinationParameters()"
functions to take a "struct sockaddr_storage" as parameter, in preparation for
eventual support for IPv6.
2020.12.07:
- Updated the interface to the 'groupsock' "GroupEId" class to use "struct sockaddr_storage",
in preparation for eventual support for IPv6.
2020.12.06:
- Allow for parsing (and generating) "IP IP6" in SDP descriptions,
for when we later support IPv6.
2020.12.05:
- Changed "fServerAddress" in "RTSPClient" and "SIPClient" to use a "struct sockaddr_storage",
in preparation for eventual support for IPv6.
- Performed the annual update of the copyright years near the start of each file
2020.12.04:
- Updated "RTCPInstance::(un)setSpecificRRHandler()" to take "struct sockaddr_storage"
as parameter, in more preparation for eventual support for IPv6.
2020.12.03:
- Updated "AddressPortLookupTable"s member functions to take "struct sockaddr_storage"
as parameter, in more preparation for eventual support for IPv6.
2020.12.02:
- Updated the "ServerMediaSubsession" "getStreamParameters()" virtual function to
take "struct sockadd_storage" as parameters, in preparation for eventual support for IPv6.
2020.12.01:
- More cleanup of the "groupsock" and "liveMedia" libraries,
in more preparation for eventual support for IPv6.
2020.11.30:
- Updated "RTSPServer.cpp" again to replace another "sockaddr_in" with "sockaddr_storage",
in more preparation for eventual support for IPv6.
2020.11.29:
- Updated the 'groupsock' "GroupEId" implementation (but not yet the interface) to
use "sockaddr_storage", in preparation for eventual support for IPv6.
2020.11.28:
- Updated the packet output routines in the "groupsock" library to use "sockaddr_storage",
in preparation for eventual support for IPv6
2020.11.27:
- Fixed some non-portable code (not buildable on some Linux versions) in
"groupsock/GroupsockHelper.cpp" that was accidentally introduced in version 2020.11.25.
(Thanks to Olivier Binda for reporting this.)
2020.11.26:
- We now use a "struct sockaddr_storage" rather than a "struct sockaddr_in" for the
'client address' field in the ("GenericMediaServer" and "RTSPServer") "ClientSession" class.
2020.11.25:
- Updated readSocket(), Groupsock::handleRead(), and RTPInterface::handleRead()
(and related functions) to take/return a "sockaddr_storage" (rather than a "sockaddr_in"),
to prepare for eventual support for IPv6.
- Added some basic logging code (from Jim Ham) to "RTSPServer.cpp".
This code is #ifdef'd out by default. To enable it, define LOG_RTSPSERVER_ACCESS
2020.11.22:
- Updated the 'groupsock' "AddressString" class to use the standard "inet_ntop()" function
(and also to work for IPv6 addresses once we support them).
- Updated the "RTSPServer::rtspURLPrefix()" (and thus "RTSPServer::rtspURL()") functions to
enclose the IP address literal in square brackets [] if the address is IPv6 (which it
currently won't be, because we don't yet support IPv6.)
2020.11.21:
- Removed the use of "our_inet_addr()" (and "inet_addr()") functions, and replaced them with
calls to (the more up-to-date) "inet_pton()" function.
- Updated the "parseRTSPURL()" function to recognize IP address literals (in "rtsp://" URLs)
that are enclosed in square brackets []. (This is how IPv6 address literals are included in
URLs, although we don't yet support IPv6.)
2020.11.20:
- Renamed the existing 'macosx' config file to 'config.macosx-catalina', and created a new
config file 'config.macosx-bigsur' that will work with Apple's new OS "MacOS Big Sur".
2020.11.19:
- In "liveMedia/TLSState.cpp", changed the call to "TLS_client_method()" back to
"SSLv23_client_method()", because "TLS_client_method()" isn't defined for SSH
in some systems (e.g., Mac OS)
2020.11.05:
- Changed the HTTP version used in our RTSP-over-HTTP implementation (for both clients and
servers) from HTTP/1.1 back to HTTP/1.0.
(This was a suggest from David Yang, who noted that HTTP/1.1 would require that we
implement "chunked" transfer-coding.)
2020.11.03:
- Updated the "LIVE555 HLS Proxy" application to output the liveMedia version number
when starting.
- Added the LGPLv3 header to some files (where it had accidentally been omitted before).
(Thanks to Sebastian Ramacher for noting this.)
2020.10.16:
- Changed "TLSState::read()" to treat any "SSL_read()" result of <=0 as if the
TLS connection has closed (unless the error was SSL_ERROR_WANT_READ).
This fixes a problem that could cause 100% CPU usage in RTSP client applications.
(Thanks to Larry Wu and Navinar Kochupandarakalatil from Intel for reporting this.)
- Updated "TLSState::setup()" to use "TLS_client_method()" instead of the (deprecated)
"SSLv23_client_method()".
2020.08.19:
- Fixed a bug in "QuickTimeFileSink" that could cause malformed "esds" atoms to be
generated. (Thanks to Chris Paucar for reporting this issue.)
2020.08.18:
- In "MPEG2TransportStreamFromESSource.cpp", changed the name of the constant LOW_WATER_MARK
to TS_FROM_ES_LOW_WATER_MARK, and "#ifndef"d it, so that, if you wish, you can redefine it
at compile time.
2020.08.12:
- Fixed a bug in the handling of pausing, when streaming from (multi-track) Matroska files.
2020.08.11:
- Fixed another bug in the handling of seeking within Matroska files.
2020.08.10:
- Fixed a bug in the handling of seeking within Matroska files.
(Thanks to Jim Ham for reporting this problem.)
2020.08.09:
- Changed the parameter signature of the "RawVideoRTPSink" constructor and "createNew()"
functions so that the "width" parameter comes before the "height" parameter. This order
- "width", "height" - is more common, and is the order used when these parameters are
defined in RFC 4175.
IMPORTANT NOTE: Because the types of these two parameters are the same, existing application
code that uses "RawVideoRTPSink" will compile without error; however, it will not work
properly unless the order of the parameters in the call to "RawVideoRTPSink::createNew()"
is changed.
2020.08.05:
- More cleanup of the implementation of "RawVideoRTPSink".
2020.07.31:
- Cleaned up the implementation of "RawVideoRTPSink".
2020.07.21:
- Updated the "RawVideoRTPSource" implementation to not set "fCurrentPacketCompletesFrame"
until we are processing the last line in the packet.
(Thanks to Andrey Lisovoy for reporting this issue.)
2020.07.09:
- Fixed a potential buffer overflow bug in the server handling of a RTSP "PLAY" command,
when the command specifies seeking by absolute time.
(Thank to Xiaobo Xiang for reporting this.)
2020.06.25:
- Fixed a memory leak in the "sha1()" function (a "EVP_MD_CTX" object was not being deleted).
(Thanks to Amir Perlman for reporting this.)
2020.06.23:
- Moved all definitions of PREFIX from "Makefile.tail" files to "Makefile.head" (so that
it can be redefined by a "config.*" file, if desired.
Also changed the definition of EXE in "config.mingw" to be ".exe".
(Thanks to Eric Beuque for this suggestion.)
2020.06.22:
- Fixed a typo in the previous release that could cause a compilation problem for some
developers. (Thanks to Eric Beuque for reporting this.)
2020.05.15:
- Added a new filter class "ADTSAudioStreamDiscreteFramer" that prepends ADTS headers to
incoming AAC audio frames. This makes the AAC audio playable (by media players)
- Updated "openRTSP" to use a "ADTSAudioStreamDiscreteFramer" when outputting a AAC audio
stream. This makes the resulting file playable (by media players).
- Updated the "LIVE555 HLS Proxy" to support AAC audio tracks (as well as H.264/5 video).
2020.05.14:
- Updated "H264or5VideoStreamDiscreteFramer" to add VPS,SPS,PPS NAL units (if known) to
the output stream, each time an "access_unit_delimiter" NAL unit is added.
This makes it more likely that the Transport Stream segments produced by the
"LIVE555 HLS Proxy" will be understandable by a client browser.
- Added support for H.265 video streams to the "LIVE555 HLS Proxy". (This has not yet been
fully tested.)
2020.05.13:
- Made the "MPEG2TransportStreamMultiplexor" segmentation mechanism (used by "HLSSegmenter")
more robust in case the Transport Stream PTS is not monotonic non-decreasing.
2020.04.24:
- Fixed an apparent bug in "RTSPClient" that was causing it to not always send an
"Authorization:" header when sending a RTSP "OPTIONS" command.
(Thanks to Alexander Prohorov for reporting this.)
2020.04.12:
- Updated "config.linux-with-shared-libraries" (and "liveMedia/Makefile.tail") to ensure
that "libssl" and "libcrypto" are linked when "libliveMedia" is built.
(Thanks to Felix Kaechele for reporting this.)
2020.04.06:
- Removed support for the classes “RTSPServerSupportingHTTPStreaming” and "TCPStreamSink”.
These were being used (in the "LIVE555 Media Server") for streaming using
"HTTP Live Streaming" (HLS). This was always a hack; it is better to use a dedicated
HTTP server to serve HLS segments, rather than trying to implement a HTTP server
(serving 'virtual HLS segments) within our own (primarily RTSP) server.
If you are looking for HLS support, note that we provide a source-code demo application
"testH264VideoToHLSSegments" that converts a (static) H.264 Elementary Stream file to
HLS segments, and the "LIVE555 HLS Proxy", which proxies a live RTSP/RTP stream
to HLS segments.
2020.03.06:
- Fixed a problem in "H264or5VideoStreamFramer.cpp" that was allegedly causing problems
compiling for Windows.
2020.02.25:
- Added full support for the "LIVE555 HLS Proxy" ("live555HLSProxy") application, which
is documented at:
http://live555.com/hlsProxy/
2020.02.24:
- Commented out a line of code that was preventing "RTSPClientConnection" objects from being
closed when a RTSP server handles a "TEARDOWN" command (on a RTP-over-TCP stream).
2020.02.23:
- Updated our (unicast) RTSP server implementation to handle "PAUSE" commands by calling
"stopGettingFrames()" on the input source. Normally, this is just a no-op, but might not
be for some input sources. (See below.)
- Fixed a bug in "H264or5VideoStreamFramer" that was causing it to not update its
presentation times properly following a pause. (Thanks to Micha Kalfon for reporting this.)
- Updated "openRTSP" to improve the handling of the "-R <port-num>" option. If the specified
port number cannot be used (e.g., because it's already in use), then "openRTSP" now exits.
2020.02.11:
- Added support for receiving SRTP (encrypted) RTSP streams.
Currently only a few RTSP servers support SRTP. Our current RTSP client code is known
to support two of them: The Axis and Bosch network cameras. These cameras support SRTP
only when the RTSP connection to the camera is over a TLS connection (something that our
RTSP client code has supported since early December 2019).
(If you manufacture a network camera (or other RTSP server) that supports streaming SRTP,
but which our RTSP client code does not yet handle, then please let us know, and we might
be able to update our code to support it.)
Note that this support for SRTP is currently only for RTSP *clients*.
Our RTSP server implementation does not currently support streaming (outgoing) SRTP
However, the "LIVE555 Proxy Server" can now be used to proxy back-end SRTP streams.
(The front-end streams will be regular RTP.)
As usual, if you don't have the "openssl" library, you can compile the code by specifying
-DNO_OPENSSL=1
on the command line. (If you do this, you won't be able to connect to RTSP servers over TLS,
nor access SRTP streams.)
(Many thanks to Thales Group for sponsoring this work.)
- Updated the "LIVE555 Proxy Server" so that it can recognize/handle back-end "rtsps://" URLs.
- Removed a cast that had prevented a file from compiling on MSVC.
(Thanks to Jonathan Brady for reporting this.)
- Added a new configuration file "config.macosx-no-openssl" for Mac OS X.
2020.01.28:
- Fixed a bug (accidentally introduced in version 2020.01.10 that had caused "openRTSP"s
-K option to stop working.
2020.01.24:
- Added #ifdefs around the code in the function "setSocketKeepAlive()" (in "GroupsockHelper.cpp")
in case "TCP_KEEPCNT" and/or "TCP_KEEPINTVL" are not defined.
(Thanks to Wictor Lund for reporting this issue.)
- More minor improvements to the "mikeyParse" testProg
2020.01.23:
- Removed stray characters that had been accidentally left in "mikeyParse.cpp" (in "testProgs")
2020.01.22:
- Fixed a bug in the "TLSState" constructor (some fields were not initialized properly).
(Thanks to Horst Possegger for reporting this.)
- Updated the "mikeyParse" demo application to properly parse the "Key validity" section
of a "Key Data" sub-payload.
2020.01.19:
- Updated "TLSState::read()" to allow for "SSL_read()" 'failing' with a
SSL_ERROR_WANT_READ error code. If this happens, we just pretend to succeed, but
returning a read count of 0. Fortunately, "RTSPClient" (the only code that calls
"TLSState::read()" will handle this OK, and the read will get recalled again when ready.
- Minor improvements to the output of the "mikeyParse" demo application.
2020.01.11:
- Added a new application "mikeyParse" to "testProgs". "mikeyParse" parses a Base64 string
- that encodes a binary MIKEY (multimedia key management) message - and outputs a human-readable
description of the MIKEY message. (The Base64 string could, for example, have been used in a
SDP "a=key-mgmt:" attribute, as defined by RFC 4567.)
2020.01.10a:
- Removed a stray character that had accidentally been inserted into "config.linux-with-shared-libraries",
preventing it from being used.
2020.01.10:
- Made sure that each "TaskToken" is set to NULL when its scheduled event occurs, to ensure that
"unscheduleDelayedTask()" is never later called with it. Also, because "unscheduleDelayedTask()"
sets its "TaskToken&" parameter to NULL, there's no need to do this explicitly outside the call.
(Thanks to Helmut Grohne for proposing this.)
2020.01.09:
- Improved the "MediaSession"/"MediaSubsession" SDP parsing code by moving replicated code into a
single function. (We also now parse the "key-mgmt" SDP attribute, although we don't yet use it.)
2019.12.30:
- Moved the definition of "class tcpStreamRecord" inside "RTPInterface.cpp", to make it clear
that this class is intended to be used only to implement "RTPInterface".
- Added the "EXT-X-INDEPENDENT-SEGMENTS" tag to the playlist header generated by the
"testH264VideoToHLSSegments" and "live555HLSProxy" demo applications.
2019.12.27:
- Added a new demo application "live555HLSProxy" to "testProgs".
(Because this is still 'work in progress', it is described/documented only on our
developers' mailing list, for now.)
2019.12.13:
- In the file "win32config" (used for generating Makefiles for Windows), moved "-DNO_OPENSSL=1" from
"C_FLAGS" to "COMPILE_OPTS", following a suggestion.
- Changed the type of the "data" parameter in the (private) member function "RTSPClient::write()"
from "const u_int8_t*" to "const char*", following a suggestion. (Ditto for "TLSState::write()".)
- Removed some stray (unused) files that had accidentally got left in the "liveMedia" directory.
2019.12.10:
- Improved the handling of "npt" (Normal Play Time) times in the RTSP "Range:" header.
(Thanks to Denis Genestier.)
2019.12.07:
- Added support to "RTSPClient" for connecting to the server via TLS (encrypted TCP). "RTSPClient"
will now connect via TLS if the URL begins with "rtsps://", or if the URL's port number is
322 (the port number reserved for RTSP over TLS), or if the "useTLS()" function is called on
the "RTSPClient" object before the first RTSP command is sent.
(Note that only RTSP client support for TLS is implemented for now; our RTSP server implementation
currently does not support connections over TLS. Note also that RTP/RTCP-over-TCP is not
currently supported on a TLS connection.)
Note that because applications now link with "-lssl -lcrypto", you *must* re-run "genMakefiles"
(to generate a new Makefile) after upgrading to this version of the software.
(If you don't wish to support RTSP-over-TLS (or if you don't have "OpenSSL"), you can avoid this
by compiling with "-DNO_OPENSSL=1")
2019.12.05:
- Fixed a memory leak in the RTSP "REGISTER" command implementation
(that I had failed to catch in the previous release).
2019.12.04:
- Fixed a couple of memory leaks in the RTSP "REGISTER" command implementation.
(Thanks to Micha Kalfon for noting this.)
- Changed to protection of the member function "setSDPLinesFromRTPSink" in
"OnDemandServerMediaSubsession" from "private:" to "protected:".
- Performed the annual update of the copyright years near the start of each file
2019.11.22:
- Fixed a bug in the previous revision's fix to the "RTSPClient" URL parsing code.
2019.11.11:
- Fixed the URL parsing code in "RTSPClient" to allow for the possibility of an embedded password
containing a '@'. (Thanks to Ha Viet for reporting this.)
- Fixed a potential memory leak in "GenericMediaServer.cpp" (if "addUserRecord()" is called more
than once with the same user name. (Thanks to Jeff Shanab for reporting this.)
2019.11.06:
- Added a new application "testH264VideoToHLSSegments" to "testProgs".
This demo application converts an H.264 (Elementary Stream) video file - named "in.264" - into
a sequence of HLS ("HTTP Live Streaming") segments, plus a ".m3u8" file that can be accessed
via a web browser.
2019.11.05:
- Added initial support for HLS (Apple's "HTTP Live Streaming"), by adding a new class "HLSSegmenter"
that takes - as input - a MPEG Transport Stream, and outputs a series of MPEG Transport Stream
files, each representing a segment of the input stream.
(A demo application that illustrates this will be added (to "testProgs") shortly.)
- Completed the previous revision by adding support for "inserting access unit delimiters" to
"H264or5VideoStreamDiscreteFramer" (rather than just to "H264or5VideoStreamFramer").
2019.11.04:
- Added a new (optional) parameter to the various H.264/H.265 'framer' classes, to tell us
whether or not to add an "access unit delimiter" NAL unit before each output H.264/H.265 NAL unit
that begins an 'access unit'.
(The default behavior remains as before: Do not insert "access unit delimiters".)
2019.11.03:
- Updated "MPEG2TransportStreamMultiplexor" to support 13-bit PIDs (previously, PIDs were
assumed to be 8 bits only), and to make the output transport streams more compatible with
HLS-compliant transport streams.
2019.10.20:
- Added a function "currentSegmentDuration()" to "MPEG2TransportStreamMultiplexor".
(This is useful only if we had previously configured the multiplexor to do timed segmentation.)
2019.10.11:
- Some minor changes to prevent compilation errors with older, dumb compilers.
2019.10.10:
- Added optional support to "MPEG2TransportStreamMultiplexor" for 'segmenting' the output
Transport Stream (by inserting a PAT and PMT Transport packet) every 'n' seconds.
(Also, an optional handler function is called whenever such a segment has completed.)
- Fixed a problem with the definition of "MPEG2TransportStreamParser" that could trip up some
compilers. (Thanks to Denis Genestier for reporting this.)
2019.09.30:
- Fixed a bug in "GenericMediaServer.cpp" (accidentally introduced in version 2019.08.10) that
could cause an infinite recursion error in the "LIVE555 Media Server".
(Thanks to Yi Xiansheng for reporting this.)
2019.09.18:
- Fixed a potential NULL pointer access error in "MatroskaFile.cpp" (if the input file contained
an H.264 or H.265 track without proper VPS,SPS,PPS NAL unit information)
2019.09.17:
- Added some more debugging statements to "RTSPServer.cpp" in hope of resolving an issue that
someone has seen with the "LIVE555 Proxy Server".
2019.08.28:
- Changed the implementation of "RTSPClient::sendGetParameterCommand()" to send no body in
the request if the "parameterName" is "" (not just NULL), because otherwise it supposedly
confuses some servers. (Thanks to Sergei Gagarin for reporting this problem.)
2019.08.16:
- Changed the way that "GenericMediaServer::createNewClientSessionWithId()" generates new
client session ids so that it avoids generating the same client session id in succession.
(This avoids confusing the MPEG1or2 and Matroska file demultiplexors, potentially causing an
'access after delete' error.)
(Thanks to Thuan Pham and Marcel Boehme from Monash University for reporting this.)
2019.08.12:
- Updated "H264or5VideoStreamParser::analyze_sei_payload()" to properly set the frame rate
for H.265 streams when "frame_field_info_present_flag" is not set.
(Thanks to Charles Yu for reporting this issue.)
2019.08.11:
- Updated the previous release by supporting (in our demultiplexor) more Transport Stream
elementary "stream_type"s.
2019.08.10:
- In "GenericMediaServer" (the base class for "RTSPServer"), made the 'streamName' versions
of "removeServerMediaSession()", "closeAllClientSessionsForServerMediaSession()", and
"deleteServerMediaSession()" virtual, to give subclasses more flexibility in how they're
implemented. We also changed the implementation of these functions to simply call
(the 'streamName' version of) "lookupServerMediaSession()" (which was already virtual).
- Added support for demultiplexing a MPEG Transport Stream, and added a new demo application
(in "testProgs") "testMPEG2TransportStreamSplitter" that demultiplexes a Transport Stream file
into a set of output files, one for each of its component tracks. (Note that this application
reads from 'stdin'.)
2019.07.27:
- Fixed a bug in Matroska file parsing that could (in rare circumstances) have lead to an
"attempt to read from the same source more than once" error.
- Updated the "H264or5VideoFileSink" and "OggFileSink" constructors to make copies of their
configuration string parameters, to ensure that they stay valid as long as needed.
- Updated the "MatroskaFile" class to support demultiplexing a ".mkv"/".webm" file into multiple
files (one per track), and added a new demo application "testMKVSplitter" to illustrate this.
2019.06.28:
- Changed the visibility of some fields of "PassiveServerMediaSubsession" from "private:"
to "protected:" - as requested by Zhang Qian.
2019.05.29:
- Fixed a bug in the "H264or5VideoStreamDiscreteFramer" code (if the "includeStartCodeInOutput"
parameter is 1) that was added in version 2019.03.06.
2019.05.21:
- Added new classes "JPEG2000VideoRTPSink" and "JPEG2000VideoRTPSource" for sending/receiving
JPEG 2000 video in RTP - as specified in RFC 5371.
(Thanks to Francois Bonnissent for providing the initial implementation.)
2019.05.12:
- Improved the RTSP server's handling of bogus "Content-Length:" values to avoid a possible
memory access error. (Thanks to Hugo Lefeuvre for reporting this.)
2019.05.03:
- Made it possible to specify = at compile time - that you don't want to use the multicast loopback
trick for finding your system's IP address. To disable this mechanism, compile
"groupsock/GroupsockHelper.cpp" with "-DDISABLE_LOOPBACK_IP_ADDRESS_CHECK=1".
2019.04.24:
- Changed the visibility of some member functions from "private:" to "protected:", to make them
accessible to subclasses - as requested by Chris Paucar.
2019.03.06:
- Added an optional parameter "includeStartCodeInOutput" (default value: False) to
"H264VideoStreamDiscreteFramer" and "H265VideoStreamDiscreteFramer". (This is something that
we'd promised to add back in 2014, but had forgotten about then.)
2019.02.27:
- Fixed a bug in "parseAuthorizationHeader()" that could cause a memory access error for
some malformed headers.
(Thanks to Mans van Someren for reporting this.)
2019.02.03:
- Fixed a bug that could cause an 'access after delete' error if a RTSP server stream ends
after RTP/RTCP-over-RTSP having been set up.
(Thanks to Thuan Pham and Marcel Boehme from Monash University for reporting this.)
2018.12.14:
- Added support for sending (and handling) RTCP "BYE" packets that contain a 'reason' string.
This required a change to the API. This change is backwards-compatible; however, existing
application code will need to be recompiled.
The function "RTCPInstance::sendBYE()" now takes an optional "reason" (string) parameter.
And there's now a new function "RTCPInstance::setByeWithReasonHandler()", which is similar to
the existing function ""RTCPInstance::setByeHandler()", except that the handler function takes
a "reason" parameter. (The "reason" string should be delete[]d by the handler function.)
(Thanks to Denis Genestier for this suggestion.)
2018.11.26:
- Fixed a bug in the server implementation of RTSP-over-HTTP to prevent a potential
denial-of-service attack. (Thanks to Huawei for reporting this issue.)
2018.10.17:
- Fixed a bug in the server implementation of RTSP-over-HTTP to prevent a possible buffer
overflow problem. (Thanks to Cisco for reporting this issue.)
2018.10.10:
- Updated the #ifdefs in "GroupsockHelper.cpp" to account for recent changes to 'Android'.
(Thanks to Brian Chase for providing a patch.)
2018.09.18:
- Fixed a bug in "RawVideoRTPSink". (Thanks to Denis Genestier.)
2018.09.10:
- Fixed a potential 'double deletion' in "RawVideoRTPSource.cpp". (Thanks to Denis Genestier.)
2018.09.06:
- Removed some stray files that had accidentally been left in the previous release.
2018.09.05:
- Added "RawVideoRTPSink" for streaming raw video over RTP, and also updated "MatroskaFile"
to support Matroska files that contain raw video tracks.
(Many thanks to Denis Genestier for contributing this.)
2018.08.28a:
- Oops, the previous version wasn't building properly; it's fixed now.
2018.08.28:
- Fixed a bug in "RawVideoRTPSource" (it was instantiating the wrong 'factory' subclass)
2018.08.27:
- Fixed a problem (in "GroupsockHelper.cpp") that could cause compilation problems on Mac OS X.
2018.08.26:
- Updated the RTSP server implementation to protect against a bogus "Content-Length:" value
(in a request from a client) causing a pointer wraparound.
(Thanks to Ori Hollander of VDOO for reporting this.)
2018.08.05:
- Added a new class "RawVideoRTPSource" for handling incoming 'raw video' RTP packets (RFC 4175).
(Thanks to Denis Genestier for providing the first draft of this.)
2018.07.07:
- Fixed a problem with the "openRTSP" application, if it's run with both the "-c" and "-P <interval>"
options. (Thanks to Giancarlo for noticing this.)
2018.07.01:
- Added a new "groupsock" function "setSocketKeepAlive()" which (tries to) set up a 'keepalive'
on TCP sockets, so that it will survive temporary network interruptions. Add an option for
calling this to the "setupStreamSocket()" function, and call this when creating sockets for
the RTSP server.
(Thanks to Warren Young and Denis Genestier for this suggestion.)
2018.04.25:
- Fixed the implementation of "unpackBandwidthEfficientData()" in "AMRAudioRTPSource", to ensure
that we can never overflow the output buffer. (Thanks to GRIMM for reporting this issue.)
2018.02.28:
- Updated "RTSPClient" to properly handle a completely empty response to "GET_PARAMETER".
(Thanks to Eric Heurtel for noting this issue.)
2018.02.26:
- Added protection against an alleged potential memory leak in
"OnDemandServerMediaSubsession::setSDPLinesFromRTPSink()".
2018.02.18:
- Updated "config.macosx" to add "-DNEED_XLOCALE_H=1" to the command line for compiling, to
compensate for the changes made in the previous release.
2018.02.12:
- Because glibc >= 2.26 no longer has the include file "xlocale.h", we no longer try to include it,
unless "NEED_XLOCALE_H" is defined. Also, we renamed "XLOCALE_NOT_USED" to "NEWLOCALE_NOT_USED".
(If you're confused by this, see the comments at the top of "liveMedia/include/Locale.hh".)
- Added comments to clarify that the "fileNameArray" input parameter to
"ByteStreamMultiFileSource::createNew()" is required to have a terminating NULL 'file name',
to indicate the end of the array.
2018.01.29:
- Made some minor changes that supposedly make the code build better for some versions of Windows
2018.01.24:
- Changed the parameter signature (and implementation) of "RTSPClient::handlePLAYResponse()" so that
"session" and "subsession" are pointer rather than reference parameters - because they can be NULL.
(Thanks to Marco Porsch for noting this issue - and *no* thanks to the Videolan people, who
apparently discovered this (and patched this in their own version of the code) two months ago,
without informing us.)
- Removed an "if (&session != NULL)" from the "setSpeed()" implementation, because it should always
be true (because "session" is a reference parameter).
2017.10.28:
- Fixed the handling of the LIVE555 Proxy Server's "-u <username> <password>" command-line option if
the "REGISTER" command is also implemented (i.e., with "-R"). Now, when we handle "REGISTER",
the <username> and <password> are used to access the REGISTER'ed back-end stream, if necessary.
- Changed the server handling of the RTSP "REGISTER" command to (if "reuseConnection" is True) delay
a short period of time (100ms) between replying to the "REGISTER" command, and actually
handling it. This is intended to reduce/avoid the possibility of a subsequent "DESCRIBE" command
ending up in the client ("REGISTER" sender)'s buffer, before the socket gets reused for handling
incoming RTSP commands. (Thanks to Durgesh Tanuku for noting this issue.)
- Made a change to "SIPClient" to better handle Asterisk SIP servers with authentication.
(Thanks to Rus.)
2017.09.12:
- Made some improvements/bug fixes to AVI indexes in "AVIFileSink".
(Thanks to Victor V. Vinokurov.)
- Updated the handling of the "writeTimeoutInMilliseconds" parameter in the "makeSocketBlocking()"
function to work correctly on Windows. (Thanks to Jeff Shanab for noting this issue.)
- Added support for adding Opus audio to MPEG Transport Streams. This is done by setting the
"mpegVersion" parameter to 3 in "MPEG2TransportStreamFromESSource::addNewAudioSource()" or
"MPEG2TransportStreamMultiplexor::handleNewBuffer()".
(Thanks to Praveen Mathad for suggesting this.)
2017.07.18:
- Updated "BitVector" to support a signed version of "get_expGolomb()", and fixed our H.264/265
parsing code to use the signed version where appropriate.
(Thanks to Toson Huang and Long Zhang for reporting this.)
2017.06.04:
- Fixed a bug in "RTPInterface::removeStreamSocket()" that could cause not all 'TCP stream'
records for a given socket number to be removed if a TCP socket I/O error occurred
(during RTP/RTCP-over-TCP streaming). (Thanks to Gerald Hansink et al for reporting this.)
2017.05.24:
- In "RTSPClient.cpp", moved the call to "clearServerRequestAlternativeByteHandler()" from the
"RTSPClient" destructor to the "resetTCPSockets()" function (which is called more often).
This should eliminate a 'pointer to a deleted object' error.
(Thanks to Gerald Hansink et al for reporting this.)
2017.04.26:
- Added a new public member function "numClientSessions()" to "GenericMediaServer"
(and therefore to "RTSPServer", which inherits from this). This allows a server to
- at any time - check how many clients are currently accessing the server.
- Updated the diagnostic output in "RTSPClient" to distinguish between opening a new TCP socket
and connect()ing on a TCP socket. (The distinction is important for "REGISTER", which can
reuse an existing TCP socket.)
2017.04.10:
- Fixed a bug in "base64Decode()" that could be triggered if (1) your RTSP server is streaming
RTP/RTCP-over-HTTP, and (2) the remote client sends bad Base64 data
(containing an embedded '\0' character). (Thanks to Arkady Bernov for reporting this.)
2017.01.26:
- Updated "ProxyServerMediaSession.cpp" to change all 'reset()' operations so that they are now
run as a 'scheduled task' from the event loop - avoiding the possibility of bugs caused by
'reset()' being called while another operation is in progress.
(Thanks to Erik Montnemery for reporting this issue, and proposing a fix.)
2016.11.28:
- Our "RTSPClient" code now ignores "Connection: close" lines in the responses to HTTP "GET"
requests (that are used to set up RTSP-over-HTTP tunneling). Because this tunneling
requires that the (separate) input and output TCP connections remain intact, we assume that
the server - if it includes such a line in the response to a HTTP "GET" - doesn't really
mean it.
(Thanks to Nguyen Viet Hung for reporting a server that does this.)
2016.11.17:
- Fixed a bug in the handling of 'APP' RTCP subpackets. (Thanks to Frederik de Ruyck for reporting this.)
- Fixed a bug in the "StreamReplicator" code. (Thanks to Bruno Abreu for reporting this.)
2016.11.06:
- Increase the RTSP client's socket receive buffer when we'll be receiving RTP/RTCP-over-TCP,
and increase the RTSP server's client connection socket send buffer when it's used to
"REGISTER" a stream.
2016.11.03:
- Fixed a bug (in the sending/ handling of the "REGISTER"/"DEREGISTER" commands) that had been
accidentally introduced in version 2016.09.19. (Thanks to Ralf Globisch for noting this.)
2016.10.29:
- Performed the annual update of the copyright years and license near the start of each file
2016.10.21:
- Changed the "RTCPInstance error" message in "RTCP.cpp" to make it clear that the problem is
caused by the remote endpoint using a buggy version of RTP/RTCP-over-TCP streaming.
- Updated "QuickTimeFileSink" to make the various creation/modification times relative to
January 1st 1904 in UTC (as Apple recommends), rather than in US Pacific Time.
2016.10.11:
- After building the source code, we now display a message reminding the developer about our FAQ.
2016.09.22:
- Added a new "liveMedia" class "MPEG2TransportStreamAccumulator" - a filter that can be used
to combine several (by default, 7) MPEG Transport Stream 188-byte 'packets' into a larger
chunk of data, more appropriate for streaming via RTP (or raw UDP).
2016.09.19:
- Added support for an experimental RTSP "DEREGISTER" command, which undoes the effect of
a "REGISTER" command.
- Moved the REGISTER/DEREGISTER-specific functionality of "RTSPServer.cpp" into a new file
"RTSPServerRegister.cpp", to make the base RTSP server code (in "RTSPServer.cpp") easier to
comprehend.
2016.09.12:
- Fixed "GenericMediaServer::createNewClientSessionWithId()" to make sure that the new
'client session' object (returned by a call to "createNewClientSession()") is not NULL
before it tries to add it to the 'fClientSessions' table.
(Thanks to Helmut Grohne for discovering this issue.)
2016.09.08:
- Updated "RTSPClient::reset()" to reset each of the 'request queues' as well.
(Thanks to Erik Montnemery for noting a problem (with the "LIVE555 Proxy Server") that this caused.)
- Updated "GenericMediaServer::ClientConnection::closeSockets()" so that it doesn't try to call
"closeSocket()" (=="close()") on socket numbers <0.
2016.09.05:
- Fixed a problem whereby a 'delayed task' for a "MPEG2TransportStreamMultiplexor" object might
have gotten run after such an object was deleted.
(Thanks to Bruno Basilio for providing debugging output to help track this down.)
- Updated "Socket::reset()" (in "groupsock/NetInterface.cpp") so that it doesn't try to call
"closeSocket()" (=="close()") on socket numbers <0.
- Added a comment to "UsageEnvironment/include/UsageEnvironment.hh" to note that "triggerEvent()"
should not be called with the same 'event trigger id' from different threads.
(This was already noted in a comment in "liveMedia/DeviceSource.cpp", but not in
"UsageEnvironment/include/UsageEnvironment.hh", which is where "triggerEvent()" is defined.)
2016.08.27:
- Fixed a problem whereby a "Medium" object's "nextTask()" (i.e., "fNextTask") could hold
an invalid value after a 'scheduled task' has occurred (but before the next similar task
is scheduled) - which causes problems should the "Medium" object be deleted during that
window of time. (Thanks to Helmut Grohne for noting this problem.)
- Added comments to "UsageEnvironment/include/UsageEnvironment.hh" to make it clear that
"unscheduleDelayedTask()" (or "rescheduleDelayedTask()") must not be called on a
'scheduled task' after it has already occurred.
(Thanks to Helmut Grohne for motivating this.)
2016.08.07:
- Fixed a bug in the handling of the non-standard "com.ses.streamID:" header (used by
'SAT>IP' servers) that we had introduced in version 2016.01.12.
(Thanks to Yaobing Deng for noting this.)
2016.07.19:
- Fixed a bug in "RTSPServer" that could cause a crash if a "RTSPServer" object is deleted after
having been used for RTSP-over-HTTP streaming. (Thanks to Pavel Aronov.)
- Updated "RTSPClient" to recognize a "Connection: Close" header in a server's response.
It handles this header by closing the RTSP TCP connection (because the server is assumed to
not be using it again), so that we open a new TCP connection for any subsequent commands.
(Thanks to Nathan (at MediaPortal) for this suggestion.)
- Made a small optimization to "RTSPServer"s handling of the first "SETUP" command from
each client. (Thanks to Maxim Dementiev for the suggestion.)
2016.06.26:
- Added a new (public) function "canDeliverNewFrameImmediately()" to "MPEG2TransportStreamMultiplexor".
This function may be used by a downstream reader to test whether the next call to "doGetNextFrame()"
will deliver data immediately. It can be useful if you want to decide whether or not to keep
accumulating multiple Transport Stream 'packets' into an outgoing RTP packet.
(Thanks to Gilles Chanteperdrix for suggesting this.)
- Made a minor syntactic change to "MediaTranscodingTable.hh" to eliminate compiler warnings.
2016.06.23:
- Changed the constant "MAX_INPUT_ES_FRAME_SIZE" to a static member variable
"MPEG2TransportStreamFromESSource::maxInputESFrameSize" that can, if desired, be increased
at run time (before a "MPEG2TransportStreamFromESSource" object is created).
(Thanks to Gilles Chanteperdrix for motivating this.)
2016.06.22:
- Changed "~ProxyServerMediaSession()" so that it no longer deletes the "MediaTranscodingTable"
object that it had been passed in its constructor. (The reason for this is that the same
"MediaTranscodingTable" can be used by more than one "ProxyServerMediaSession".)
- Made the "parseTransportHeaderForREGISTER()" function (that's used in the "RTSPServer"
implementation) non-static, so that it can be used in other, non-RTSP server implementations
that want to handle the "REGISTER" command.
- Made the "RTPSink::SSRC()" function "public:" rather than "protected:".
(Thanks to Jean-Luc Bonnet for this suggestion.)
2016.05.20:
- Added a new virtual function "noteLiveness()" to the "ServerMediaSession" class.
This function is called (by a "GenericMediaServer") whenever there's 'liveness' on a
"ClientSession". The default implementation of this function is a 'noop', but subclasses can
redefine it - e.g., if you want to remove long-unused "ServerMediaSession"s from the server.
- Fixed a bug in the options handling for the command "live555ProxyServer" that could erroneously
produce a "usage" error if the '-R' option is used, but no back-end "rtsp://" URL is given.
2016.05.18:
- Backed out the change to "MultiFramedRTPSink" that was made in 2016.05.17; the 2016.05.16
version turned out to be correct.
- Rearranged "#include"s to avoid an 'excessive #include nesting' error with some
old compilers.
2016.05.17:
- Made a (mostly inconsequential) fix to the previous bugfix for "MultiFramedRTPSink".
2016.05.16:
- Fixed a bug in "MultiFramedRTPSink" that affected subclasses that redefine
"frameSpecificHeaderSize()" (for frame-specific headers that precede multiple frames in a
RTP packet). (Currently, the only subclass that this affected was "VorbisAudioRTPSink".)
(Thanks to Gilles Chanteperdrix for reporting this bug.)
- Made a minor update to the "ProxyServerMediaSession" code to better support optional
media transcoding.
2016.04.21:
- Made it easier to set the MTU for all outgoing RTP packets, instead of having to call
"setPacketSizes()" after each "MultiFramedRTPSink" is created. If you wish, you can define
the compile-time constants (macros) RTP_PAYLOAD_MAX_SIZE and (optionally) RTP_PAYLOAD_PREFERRED_SIZE
when compiling "MultiFramedRTPSink.cpp". (These constants have default values of 1456 and 1000
respectively, just as before.)
- Updated "GroupsockHelper.{hh,cpp}" to (supposedly) support 'MinGW' better
2016.04.01:
- Fixed a bug the "ProxyServerMediaSubsession" code that could cause an infinite loop if the
'back-end' server was slow to respond to "SETUP" requests.
(Thanks to Erik Montnemery for helping to debug this.)
- Added support for parsing/streaming Matroska files that contain PCM audio tracks.
(Thanks to Michel Promonet.)
2016.03.16:
- Added some more debugging fprintf()s to the "ProxyServerMediaSubsession" code to try to
track down a bug.
- Simplified the "genMakefiles" script (moving duplicate code into a 'for' loop).
2016.03.14:
- Updated the proxy server implementation to better handle 'front-end' clients that have asked to
stream only some of the substreams of a multi-stream session. Now, if a substream is closed
(because all 'front-end' clients have stopped requesting it), but other front-end clients are
still streaming other substreams, then we will send - to the 'back-end' server - only a
substream-specific "PAUSE" command; not a "PAUSE" command for the entire stream.
(Thanks to Lakshmi Narayanan for noting this issue.)
- Added an optional "-p <RTSP-port-number>" option to the "LIVE555 Proxy Server", to allow
the user to specify a RTSP server port number other than the standard port numbers: 554 and 8554.
(These standard port numbers are still tried if the specified port number can't be used.)
(Thanks to Denis Genestier for this suggestion.)
2016.02.22:
- Updated the "ProxyServerMediaSession" to add a Boolean virtual function
"allowProxyingForSubsession()". By default, this always returns True. However, subclasses can
redefine this if they wish to restrict which subsessions of a stream get proxied - e.g., if
you want to proxy only video tracks.
- Improved the "WAVAudioFileSource" code (for parsing WAV-format audio files) to make it more
tolerant of unusual formats.
- Made it possible to build a version of the "liveMedia" library that doesn't contain any
RTSP server code; e.g., if you are developing only a RTSP client, and want to save space.
To do this, omit any files that contain "Server" or "RTPSink" in their name, and define
OMIT_REGISTER_HANDLING when compiling "RTSPClient.cpp".
(Thanks to Jeff Shanab for this suggestion.)
2016.02.09:
- Added an option "-E <absolute-seek-end-time>" to "openRTSP".
(Thanks to Hans Maes for suggesting this.)
2016.02.08:
- Fixed a bug that was causing "playSIP" to crash.
(Thanks to Vilaysak Thipavong for reporting this.)
2016.01.29:
- Updated "QuickTimeFileSink" to make it usable with non-RTP input sources.
It still needs to have a "MediaSession" that describes the input source; however, this
input source no longer needs to be RTP; it can, instead, be a UDP or other type of source.
(Of course, audio/video synchronization and hint tracks can't be done in this case.)
- Changed the name of a variable in the "Makefile.tail" file for the "BasicUsageEnvironment"
project, in response to a complaint that the old name clashed with something in some
Windows development environment
2016.01.24:
- Updated "ProxyServerMediaSession.cpp" to add some 'internal error' debugging fprintf()s
to try to catch a possible bug that was reported recently.
2016.01.20:
- When a server calls "startStream()" to start a RTSP stream for a client, we now no longer
make a slight adjustment to the RTP timestamp sequence (using the "presetNextTimestamp()" call)
if there is already another ongoing stream using the same "RTPSink". The effect of this is
only minor, but it ensures that the addition of an addition 'destination' to an ongoing RTSP/RTP
stream does not cause any change to the contents of the RTP/RTCP packets.
(Thanks to Erik Montnemery for noting this issue.)
2016.01.16:
- This release has no source-code changes from the previous release. However, a test file was
mistakenly left in the previous version; this produced an excessively-large tar file.
This has now been removed.
2016.01.12:
- Added a hack to "RTSPClient" to handle the non-standard "com.ses.streamID:" header - used by
'SAT>IP' servers - by using its value in the 'base URL' for subsequent requests.
(Thanks to Julian Scheel for proposing this.)
2015.12.22:
- Updated "QuickTimeFileSink" to add a sanity check to try to prevent an occasional problem
with H.264 video tracks that contain 'sync frames'.
- Updated the "config.linux-with-shared-libraries" configuration file to use the $(CC) and $(CXX)
macros, to allow for cross-compiling. (Thanks to Michel Promonet.)
- Updated the years in the copyright notice on each file.
2015.11.09:
- Changed the "ProxyServerMediaSession" code once again. We backed out the changes in the
previous two releases, and now respond to failures of the back-end "SETUP" or "PLAY" commands
by doing a full reset - which involves deleting the "ProxyServerMediaSubsession" object, and
doing another "DESCRIBE" to create a new one. However, we can't do this immediately
- because the "SETUP" and "PLAY" commands can be sent from within
"ProxyServerMediaSubsession::createNewStreamSource()". Instead, we wait until the next
'liveness' command, which will get sent immediately when we return to the event loop.
- Our proxy server code no longer converts the "mode" string to lower case before passing it to
"MPEG4GenericRTPSink::createNew()". (This turned out to be unnecessary, and was breaking some
clients that weren't treating this string as case-insensitive when they saw it in the stream's
SDP descriptor.) (Thanks to Craig Matsuura for noting this issue.)
2015.10.29:
- Updated the fix in the previous revision to apply to the back-end "PLAY" command as well as
the back-end "SETUP" command, because both of these back-end commands can get sent from within
"ProxyServerMediaSubsession::createNewStreamSource()", so we can't allow the
"ProxyServerMediaSubsession" object to get deleted in either case.
2015.10.12:
- The change that we made to the "ProxyServerMediaSession" code in version 2015.07.31 (to reset
the proxy server's state if a back-end "SETUP" command fails) was too aggressive; it was
deleting the "ProxyServerMediaSubsession" object. This was a problem, because "SETUP" commands
can be called from within "ProxyServerMediaSubsession::createNewStreamSource()". Instead, we
now deal with a failed back-end "SETUP" command simply by resetting the 'back-end' connection.
(Thanks to Hardik Sangani for reporting this issue.)
2015.09.24:
- Fixed a bug in "RTSPClient" that could cause a crash if the TCP connection was lost while
resending a RTSP command. (Thanks to ChaSeop Im for reporting this.)
- Moved some more generic 'media server' functionality from "RTSPServer" to its parent class
"GenericMediaServer".
- Added a new pure virtual function "getRTPSinkandRTCP()" to "ServerMediaSubsession" to
allow callers to get ('const') access to a stream's "RTPSink" and/or "RTCPInstance" (and thus
their corresponding "Groupsock" objects) after the stream has been created (using
"getStreamParameters()".
- Updated "Groupsock" to allow for the possibility of there being more than one 'destRecord'
for each sessionId. (This is something that doesn't happen in the normal case; it's only
a special case for WebRTC.)
2015.08.07:
- If a "RTCPInstance" happens to have both a source and a sink (an unusual situation), we now
include both "SR" and "RR" reports in each outgoing RTCP report packet.
- When a "RTPSink" is being closed, we no longer turn off background reading on its 'groupsock'
(because, being a "RTPSink", we never turned it on), just in case the 'groupsock' is also
being shared with something else (e.g., a "RTPSource") that does background read handling).
2015.08.06:
- Fixed a bug that would cause the destruction of a "RTCPInstance" that was sharing a 'groupsock'
with a "RTPSource" (i.e., for multiplexed RTP and RTCP) to stop the "RTPSource" from continuing
to receive incoming RTP packets. This normally wasn't a major problem, because the destruction
of the "RTCPInstance" was usually followed immediately by the destruction of the "RTPSource".
However, it's also possible for the "RTPSource" to stay alive long after the "RTCPInstance"
is deleted; in this case things will now work correctly.
2015.07.31:
- Fixed a minor memory leak in the "ProxyServerMediaSession" code ("PresentationTimeSessionNormalizer"s
and "PresentationTimeSubsessionNormalizer"s weren't being deleted properly).
(Thanks to Dnyanesh Gate for reporting this.)
- Made the "ProxyServerMediaSession" code a bit more bullet-proof, by resetting the 'back-end'
connection if a "SETUP" command fails.
(Thanks to Craig Matsuura for providing a real-world example of "SETUP" failing.)
- Fixed the 'estimated bitrate' values in "testMPEG1or2VideoReceiver.cpp" and
"testMPEG2TransportReceiver.cpp" to match those in the corresponding "test*Streamer.cpp" files.
(Thanks to Alex Anderson for reporting this.)
2015.07.23:
- Fixed a potential buffer overflow bug in "RTSPServer".
(Thanks to "an anonymous researcher working with Beyond Security's SecuriTeam Secure Disclosure"
for discovering this.)
2015.07.19:
- Fixed a bug in "RTPInterface::sendDataOverTCP()"; it was disabling transmission on its socket
if the "send()" call failed. We now do this only if the error was not "EAGAIN".
(Thanks to Erik Oomen for bringing this to our attention.)
- Changed "QuickTimeFileSink" to try to work around an issue with QuickTime sometimes complaining
about the frame number in the last 'sync frame' being 'out of range'.
- Changed the parameter signature for "ProxyServerMediaSession::createNew()" (and the
"ProxyServerMediaSession" constructor) to take a "GenericMediaServer*" rather than
a "RTSPServer" as parameter. This makes it possible to create proxy servers that use protocols
other than RTSP at the 'front-end'. (The 'back-end' protocol will still be RTSP, however.)
- Defined a new class "MediaTranscodingTable" that can be used to generate "FramedFilter"
(subclass) objects that perform media transcoding. Added a parameter of this type
(with default value NULL) to the "ProxyServerMediaSession" constructor and "createNew()"
function. This makes it possible to - if you wish - add transcoding functionality to
a proxy server. (This feature is still experimental, and might be changed in the future.)
- Added optional "initialPortNum" and "multiplexRTCPWithRTP" parameters to the
"ProxyServerMediaSession" constructor - to be passed to the "ProxyServerMediaSubsession"
objects that it creates. This allows subclasses to change these parameters if they wish.
- Updated "ProxyServerMediaSession" to make it possible for subclasses to create subclasses
of "Groupsock" and/or "RTCPInstance", if they wish.
2015.06.25:
- Changed the definition of the "doEventLoop()" "watchVariable" to make it 'volatile'.
(Ditto for the "fTriggersAwaitingHandling" field in the "BasicTaskScheduler" implementation.)
This is to alleviate a concern about aggressive optimizing compilers possibly generating
incorrect code. (Thanks to Remi Denis-Courmont for bringing this issue to our attention.)
2015.06.24:
- Updated the implementation of "GenericMediaServer" to move the code that removes and deletes
all "ClientConnection", "ClientSession", and "ServerMediaS(ubs)ession" objects from the
"GenericMediaServer" destructor to a member function "cleanup()". This member function
MUST be called from the destructor of any subclass of "GenericMediaServer". (Putting this
code in the destructor of "GenericMediaServer" itself was a bug, because the
"ClientConnection", "ClientSession", and "ServerMediaS(ubs)ession" objects may themselves have
been subclassed, and there may be a problem deleting them after the "GenericMediaServer"
subclass destructor has already been called.
(Thanks to Christopher Benne for noting this.)
- Fixed the way that "RTSPClient" handles responses to "GET_PARAMETER" to properly allow for
possible additional pipelined responses appearing afterwards.
(Thanks to Paul Clark for identifying this problem.)
- Moved the "ClientSession" liveness checking/timeout mechanism from "RTSPServer" to its new
abstract base class "GenericMediaServer". (The API and functionality of the "RTSPServer"
class remains unchanged.)
- Updated the "OnDemandServerMediaSubsession" code to make it possible for subclasses to create
and use subclasses of "RTCPInstance".
- Undid the change that we made to "RTSPClient.hh" in the previous version. There is no longer
a demonstrated need to make "RTSPClient::connectToServer()" virtual.
- Made a syntactic change to "MatroskaFile.cpp" to eliminate some compiler warnings.
2015.06.21:
- Updated "RTSPClient" to put "port=" rather than "client_port=" in "Transport:" headers
when requesting a multicast stream, in accordance with RFC 2326.
(Thanks to Julian Scheel for noting this.)
- Updated "MultiFramedRTPSource" so that it doesn't deliver 0-length frames to the downstream
object - in case the downstream object interprets this as being an error.
(Thanks to Julian Scheel for the suggestion.)
- Made the member function "RTSPClient::connectToServer()" virtual, in response to a request
from a developer who wanted to reimplement this in their "RTSPClient" subclass.
- Changed the "Groupsock::output()" function to no longer take a 'TTL' parameter.
(Instead, we now use the TTL (usually 255) that was provided when the "Groupsock" object was
created.)
- Cleaned up the "GroupEId" class that's used by "Groupsock". (Previously, that class had some
extra, experimental functionality that turned out not to be useful.)
- Cleaned up the "destRecord" structure that's used in "Groupsock" to represent the
(possibly multiple) destinations for each "Groupsock" object.
- Updated the "groupsock" library and "OnDemandServerMediaSubsession" to better support
(in some future release) sockets whose destination endpoints are set via STUN packet exchanges.
2015.06.11:
- Fixed a bug in "RTSPClient" that had accidentally been introduced in version 2015.06.04 that
prevented "Session:" headers from being included in some requests.
2015.06.10:
- Fixed the return type of the "createNewClientConnection()" virtual function, redefined in
"RTSPServerSupportingHTTPStreaming".
- More changes to satisfy anal-retentive compilers.
- Removed the "DarwinInjector" code; that functionality has not been supported for some time.
2015.06.09a:
- More changes to supposedly satisfy anal-retentive compilers.
2015.06.09:
- Added some "friend" declarations to "GenericMediaServer.hh" and "RTSPServer.hh" in an attempt
to placate an anal-retentive Windows compiler. (Issue reported by Deanna Earley.)
2015.06.07:
- Restructured the "RTSPServer" class into an abstract base class "GenericMediaServer"
and a subclass "RTSPServer". This makes it possible to develop other kinds of media server
that use the same "ServerMediaSession"/"ServerMediaSubsession" objects to represent
the stream(s) that they serve, but using protocols other than RTSP.
- Added a new virtual function "createGroupsock" to "OnDemandServerMediaSubsession".
This makes it possible for subclasses of "OnDemandServerMediaSubsession" to automatically
use subclasses of "Groupsock" (e.g., those that implement STUN/DTLS).
- Moved the "ignoreSigPipeOnSocket()" function from "RTSPCommon.hh" ("liveMedia" library)
to "GroupsockHelper.hh" ("groupsock" library), because the function is not specific to RTSP.
2015.06.04:
- Added optional support for including the RTSP "Speed:" header in "PLAY" requests.
(Thanks to Sarma Kolavasi.)
- Updated the implementation of "setResultErrMsg()" in "BasicUsageEnvironment" to work properly
in Windows. (Thanks to Stas Tsymbalov.)
2015.05.31:
- Updated the "ProxyServerMediaSession" code to recover better if a back-end RTSP "PLAY" command
fails (for whatever reason). Should this happen, we now reset the connection to the 'back-end'
server. (This will cause the initial 'front-end' client connection (that caused the "PLAY"
command to be sent) to fail, but subsequent 'front-end' client requests will now have a better
chance of succeeding.)
2015.05.28:
- Fixed a bug in error reporting in the "groupsock" library. In a couple of places, we
were using the result of "getResultMsg()" directly in a call to "setResultMsg()", but
unfortunately those functions are implemented (at least in "BasicUsageEnvironment") using
the same buffer. (Thanks to Stas Tsymbalov for reporting this.)
- Updated the "MPEGVideoStreamFramer" class (and thereby its subclasses, including
"H264VideoStreamFramer" to implement the "doStopGettingFrames()" virtual function by
calling "flushInput()". This should fix a potential problem whereby these classes might not
work correctly if the downstream reader calls "stopPlaying()", and then resumes reading.
(Thanks to Stas Tsymbalov for bringing this issue to our attention.)
2015.05.25:
- Fixed a bug in "StreamReplicator::removeStreamReplica()": It should have been calling
"deactivateStreamReplica()" *before* possibly deleting the "StreamReplicator" object
(if this was the last replica, and "fDeleteWhenLastReplicaDies" was True).
(Thanks to Stas Tsymbalov for reporting this.)
- Fixed some potential problems with "StreamReplica" deactivation. (Thanks to Stas Tsymbalov.)
- Updated the "RTSPServer" implementation to call "ignoreSigPipeOnSocket()" on 'client connection'
sockets, rather than just on the main server socket. This is to ensure that the server doesn't
get killed if a client - running on the same host - gets killed. (Note that, because of this
fix, it should never be necessarily to set the "MSG_NOSIGNAL" flag on any of our calls to "send()".)
2015.05.12:
- Updated the previous revision to change the order in which fields are deleted in the
"RTSPServer" destructor, to avoid a possible crash if "RTSPServer" objects are deleted.
(Thanks to ChaSeop Im for noting the problem.)
2015.05.03:
- Updated the "RTSPServer" implementation to fix a bug in RTP/RTCP-over-TCP streaming.
Before, if the "RTSPClientConnection" object closed before the "RTSPClientSession" object,
and the TCP connection was also being used for RTP/RTCP-over-TCP streaming, then the
streaming state (in the "RTSPClientSession") would stay alive, even though the TCP socket
had closed (and the socket number possibly reused for a subsequent connection).
This could cause a problem when the "RTSPClientSession" was later reclaimed (due to inactivity).
Now, whenever a "RTSPClientConnection" object is closed (due to the RTSP TCP connection closing),
we make sure that we also close any stream that had been using the same TCP connection
for RTP/RTCP-over-TCP streaming. (Thanks to Kirill Zhegulev for noting this issue.)
- Removed extraneous comments near the top of "testProgs/registerRTSPStream".
2015.04.22:
- Updated "config.iphone" and "config.iphone-simulator" to work with the latest Xcode.
(Thanks to Braden Ackerman.)
- Fixed a rare memory leak in "MultiFramedRTPSource" that might occur if it's reading an incoming
packet over TCP - requiring >1 read for the packet - and the "MultiFramedRTPSource" gets closed
or paused while this is happening.
(Thanks to Kirill Zhegulev for noting this.)
2015.04.16:
- Added the "f" (force symbolic link) flag to the "ln" command in the "make install" Makefile
rules, in case you're reinstalling the same version of a library.
(Thanks to Luca Ceresoli for noting the need for this.)
2015.04.15:
- Removed the previous (20 kByte) hard-wired limitation in the size of incoming packets for
"MultiFramedRTPSource". (Now, any size packet up to the maximum size of 65535 can be handled.)
- Added a (u_int16_t) field "desiredMaxIncomingPacketSize" to "RTSPClient". If set to a value >0,
then a "Blocksize:" header with this value (minus an allowance for IP, UDP, and RTP headers)
will be sent with each "SETUP" request.
(Thanks to Deanna Earley for noting the optional RTSP "Blocksize" header.)
2015.04.01:
- By default, "H264or5VideoStreamDiscreteFramer" sets "fPictureEndMarker" (and thus the RTP
'M' bit) if the NAL unit is VCL. Because this isn't always the right thing to do (e.g., if
we're delivering multiple 'slice' NAL units per 'access unit' (picture)), we now move this test
into a virtual function "H264or5VideoStreamDiscreteFramer::nalUnitEndsAccessUnit()".
If desired, you can implement a subclass that redefines this virtual function.
(Thanks to Chris Richardson for bringing this issue to our attention.)
- Made a minor syntactic change to "ProxyServerMediaSubsession.cpp" to ensure that it compiles
with some old versions of VC++.
2015.03.19:
- Updated the "RTSPClient" code for handling a "WWW-Authenticate:" header in a "401 Unauthorized"
response. We now check for the "stale=TRUE" parameter. If it's set, then we resend the
command, even if we already handled an earlier "WWW-Authenticate:" header.
(Thanks to Deanna Earley for noting the need to handle "stale=TRUE".)
2015.03.16:
- Made a small change to the "BasicTaskScheduler" implementation to reduce the likelihood of
a race condition with external thread(s) calling "triggerEvent()".
2015.03.06a:
- Oops - forgot to add '\0'-termination to the previous fix.
2015.03.06:
- Updated "RTSPClient" to decode %-encoded characters, should they appear in the <username>
and/or <password> fields in a "rtsp://" URL.
(Thanks to Deanna Earley for suggesting this.)
2015.03.01:
- Updated the "H264or5VideoRTPSink" implementation to make sure that any stale fragmented
data is flushed (discarded) if a server's stream is paused. This ensures that - after we
resume from the pause - that we never stream data with old presentation times.
(Thanks to Gilles Chanteperdrix for discovering and reporting this issue.)
2015.02.26:
- Fixed a bug in "ProxyServerMediaSubsession" that could cause a crash if the parent
"ProxyServerMediaSession" object is removed from the RTSP server and deleted.
(Thanks to Sergio ? for first reporting this problem. Thanks to Chiung Ikhwan for discovering
the source of the bug.)
2015.02.23:
- Fixed a bug in "OnDemandServerMediaSubsession::getCurrentNPT()".
(Thanks to Gilles Chanteperdrix for noting this.)
2015.02.17:
- Latest version of the "LIVE555 Streaming Media" code (reinstalled due to a server crash).
2015.02.13:
- Oops - removed the "#define DEBUG" that had inadvertently been left in "RTCP.cpp" in
the previous version.
2015.02.12:
- Updated the previous release of "RTCP.cpp" to ensure that it will compile for Windows.
2015.02.10:
- Added experimental support for sending RTCP "APP" packets, and handling incoming RTCP
"APP" packets. (Thanks to Nick Ogden for suggesting this, and providing an example implementation.)
2015.02.05:
- Made the "ProxyServerMediaSession" code a bit more 'bulletproof'.
2015.02.04:
- Fixed a bug in "DigestAuthentication" that could cause the proxy server code to crash if it
was given a username and password for its 'back end' server.
(Thanks to Sergio Andrade for reporting this.)
- Fixed a minor bug in "MatroskaFileParser".
- Did some syntactic cleanup on a few files to avoid compiler warnings with the newest version
of "gcc".
2015.01.27:
- Fixed a bug in "MPEG2TransportStreamFromESSource" that could sometimes cause an abort if
more than one Elementary Stream Source were multiplexed into a single Transport Stream.
(Thanks to Marc Palau for reporting this issue.)
2015.01.19:
- Fixed an obscure bug in "RTSPClient" that might conceivably have caused a crash if it received
a completely empty RTSP response.
2015.01.04:
- Updated "config.iphone-simulator" to work with the latest Xcode. (Thanks to Braden Ackerman.)
- In the "BasicUsageEnvironment" implementation, renamed "EventTime" to "_EventTime" to avoid
a reported naming conflict.
2014.12.17:
- Updated "RTSPServerSupportingHTTPStreaming" to make sure that the data stream source gets closed
when it's no longer needed.
2014.12.16:
- Changed the FD_SETSIZE check (introduced in version 2014.12.11) so that it's not done
in Windows (because in Windows, FD_SETSIZE has different semantics).
(Thanks to Deanna Earley for reporting this.)
2014.12.13:
- Updated the H.264/H.265 parsing code in "H264or5VideoStreamFramer" to be a little smarter about
how it computes a file's frame rate (when streaming a 'raw' H.264 or H.265 file).
(Thanks to Michel Promonet for inspiring this.)
- Updated "config.iphoneos" to work with the latest Xcode. (Thanks to Braden Ackerman.)
2014.12.11:
- Changed our implementation of "setBackgroundHandling()" and "moveBackgroundHandling()" in
"BasicTaskScheduler" to check for (and disallow) socket numbers >= FD_SETSIZE,
because <sys/select.h> has a bug (at least, in most systems) that causes buffer overflow
in this case. (Thanks to Michel Promonet for pointing this out.)
2014.12.09:
- Needed to make the "QuickTimeFileSink" constructor and destructor protected: to allow subclassing.
2014.12.08:
- 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.
2014.11.28:
- 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 a "DESCRIBE")
contained extra whitespace.
(Thanks to ilwoo Nam for giving an example of a server that exhibited this behavior.)
2014.11.12:
- We had forgotten to initialize the "RTSPClient" member variable "fAllowBasicAuthentication"
that we introduced in the previous version.
2014.11.07:
- 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 sending
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.
2014.11.01:
- Updated "RTSPClient" so that it reuses "fCurrentAuthenticator" if we previously
updated it with data from a "WWW-Authenticate:" response, even if a non_NULL
"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 authentication
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"
being NULL.
- 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.
2014.10.28:
- Added support for the VP9 video RTP payload format (sending and receiving), including the
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.
2014.10.21:
- 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).
2014.10.20:
- 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.
2014.10.16:
- 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 implement "DESCRIBE".
(Thanks to Michel Promonet for reporting this.)
2014.10.07:
- 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
RTP/RTCP.)
2014.10.03:
- 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.
2014.09.22:
- 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 our "RTSPServer"
implementation as a 'back-end' server) better detect when the back-end server has restarted
while streaming. (Thanks to Jonathan Brady for noticing this issue.)
2014.09.11:
- Note that the signature of the virtual function "RTSPServer::lookupServerMediaSession()" has
changed. It now takes an extra (in) parameter "Boolean isFirstLookupInSession".
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 multi-stream files
to fail. (Thanks to Gilles Chanteperdrix for noting this.)
2014.08.26:
- 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.
2014.08.23:
- 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.
2014.07.25:
- 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.
2014.07.18:
- 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.
2014.07.13:
- 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.)
2014.07.12:
- 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 possibility of
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.
2014.07.04:
- Added an update to "MPEG2TransportStreamMultiplexor" and "MPEG2TransportStreamFromESSource"
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.)
2014.06.28:
- Fixed another bug in the RTSP server's handling of incoming Base-64-encoded requests.
2014.06.27:
- Fixed a bug in the RTSP server's handling of incoming Base-64-encoded requests (when handling
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 the socket
if any write to the socket should fail.
2014.06.24:
- 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 MPEG2TransportStreamMultiplexor.cpp,
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.
2014.05.27:
- 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...)
2014.05.25:
- 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 "liveMedia/include" directory,
so as to make it accessible to applications.
We also added a new function "our_MD5DataRaw()", which is similar to the existing
"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
"HashTable::RemoveNext()".)
2014.05.14:
- Fixed a bug in the way we implemented a timeout on blocking writes in "RTPInterface" in
the previous version.
- Added the ability to receive the "audio/G722" RTP payload format (using "SimpleRTPSource").
2014.05.08:
- Updated the 'blocking send()' hack in "RTPInterface::sendDataOverTCP()" so that the
'blocking send()' (if called) will have a timeout (default value: 500 ms), rather than
blocking indefinitely (which might happen if the TCP connection has hung for some reason).
(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 cause all
network activity (RTSP,RTP,RTCP) on the socket to cease. (If this is a RTSP server,
then all state for the connection will eventually be reclaimed normally.)
(Thanks to Gord Umphrey for suggesting the 'setsockopt()' call that sets the timeout.)
- 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).
2014.04.23:
- 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 "RTSPServer::RTSPClientConnection"
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:
"draft-finlayson-rtsp-register-command-01.txt")
- Fixed a compilation error in "OggFileServerDemux.cpp" that occurred when DEBUG is defined.
2014.03.25:
- 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 corresponding "RTPSource".
The "RTPSource" network handler then forwards any multiplexed RTCP packets to the
"RTCPInstance".
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 parameter
"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 "rtpSink" parameter.
NOTE: RTSP clients that are built using previous versions of this library (or perhaps using
some other software) will not handle RTCP that's multiplexed with RTP. Therefore, this
option should be enabled ONLY IF you know that all RTSP clients will be using this version
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.
2014.03.18:
- Fixed a bug in "H264VideoFileServerMediaSubsession" (and "H265VideoFileServerMediaSubsession"
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.)
2014.03.17:
- Fixed a bad "#ifndef" in "DVVideoRTPSource.hh"
2014.03.16:
- Added support for demultiplexing and streaming Opus audio tracks from Matroska/Webm files.
2014.02.26:
- 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 sets "OutPacketBuffer::maxSize"
to a new value only if it's bigger than the current value. Thanks to Michael Brimer for
motivating this.
- Fixed a couple of minor code 'nits' that Nikolai Vorontsov discovered using a code analyzer.
2014.02.19:
- Fixed a bug that was causing some bytes to be deleted when receiving H.265/RTP streams.
(Thanks for Michel Promonet for bringing this to our attention.)
- Added support for streaming Opus audio tracks from Ogg files. Also updated "OpusFileSink"
(which is used by "openRTSP") to write Opus audio streams into Ogg-format files.
- 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.
2014.02.17:
- 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.
2014.02.13:
- 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 suggestion.)
- Changed the "RTSPServer" destructor to delete "RTSPClientSession" objects before deleting
"RTSPClientConnection" objects. We do this because each "RTSPClientSession" object
is created from a "RTSPClientConnection", and passes its "RTSPClientConnection" object to
"handleAlternativeRequestByte()" (for RTP-over-TCP streaming).
2014.02.10:
- 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 come later.)
- Updated "MPEG2IndexFromTransportStream.cpp" to check for the prefix 0x00 0x00 0x01 before
assuming that a Transport Stream payload begins a PES packet (if "payload_unit_start_indicator"
is set).
- Made "ServerMediaSession::generateSDPDescription()" more bullet-proof against the possibility
of media subsession SDP lines' length changing from the first time they are calculated, and
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 variables' used
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.
2014.02.08:
- 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.)
2014.02.07:
- 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.)
2014.02.04:
- 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 don't have
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 "VorbisAudioRTPSink"
and "TheoraVideoRTPSink".
2014.01.29:
- Updated the "RTSPServer" code to properly handle RTSP "PLAY" requests that have a "Range:"
header of "npt=now-", "npt=now-<endTime>", or "npt=-<endTime>".
(Thanks to Manickam Nambirajan for bringing this to our attention.)
2014.01.28:
- Removed a lot of code duplication from the "*MatroskaFileServerMediaSubsession" classes,
by defining and implementing a base class "MatroskaFileServerMediaSubsession".
We also added a new member functions "MatroskaFile::createSourceForStreaming()" and
"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::createNewStreamSource()" and
"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
IP multicast.
2014.01.24:
- The previous version's change to "OnDemandServerMediaSubsession::getStreamParameters()"
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 attributes
(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 general-purpose accessor
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 "fmtp_spropparametersets()".)
This will simplify the adding of support for new RTP payload formats.
2014.01.21:
- Updated the implementation of "OnDemandServerMediaSubsession::getStreamParameters()" to
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.
2014.01.20:
- Fixed another bug in "TCPStreamSink" (hopefully the last one for a while :-)
2014.01.19:
- 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 allows code
to call "<object>->handleClosure()"rather than the unwieldy "FramedSource::handleClosure(this)".
2014.01.18:
- Fixed a bug in "RTSPServer" whereby it would access a recently-deleted "RTSPClientSession"
object shortly after handling "TEARDOWN". (Thanks to Michel Promonet for reporting this.)
2014.01.17:
- Fixed a bug in "H265VideoRTPSource" (when reconstructing the first fragment of a fragmented
NAL unit).
2014.01.16:
- Added a "H265VideoFileSink" class, similar to the existing "H264VideoFileSink".
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 H.265) streams.
2014.01.15:
- Implemented "H265VideoRTPSource" for receiving H.265/RTP streams.
- Make "H264VideoRTPSource" more robust against unusually short NAL units.
- Fixed an incorrect #ifndef in "H265VideoStreamDiscreteFramer.hh"
2014.01.14:
- 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.)
2014.01.13:
- 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 "profile_level_id" value.
- 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
"testH264VideoToTransportStream".
- 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.)
2014.01.11:
- 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 an H.265 file from a RTSP
server, similar to the existing "H264VideoFileServerMediaSubsession" class.
- Created a new abstract base class "H264or5VideoStreamDiscreteFramer", and made
"H264VideoStreamDiscreteFramer" and "H265VideoStreamDiscreteFramer" subclasses of this.
(This eliminated some duplicate code.) Note, however, that now "H264VideoStreamDiscreteFramer"
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 stream from
an H.265 Elementary Stream file ("test.265").
- Fixed a potential (though unlikely) problem in "H264VideoRTPSink" that might
have caused an incorrect "profile_level_id" value to be set in SDP descriptions
(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 the first.)
- Improved the "openRTSP" command's error messages when the user gives it incompatible
command-line options.
2014.01.07:
- 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 "H265VideoStreamFramer" and
"H265VideoStreamDiscreteFramer". Because H.265 is similar to H.265, these classes - along with
their old H.264 equivalent ("H264VideoStreamFramer" and "H264VideoStreamDiscreteFramer") are
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".
2013.12.31:
- In "BasicUsageEnvironment", moved the implementation of the constants "DELAY_MINUTE",
"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 ANDROID"s
to "#ifdef __ANDROID__", because the latter definition is allegedly what 'Android' uses.
2013.12.29:
- Rewrote our MD5 implementation (and, in particular, the "our_MD5Data()" function) in C++.
- Updated the years in the copyright notice on each file.
2013.12.21:
- 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 member function.
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.
2013.12.18:
- Added an implementation of a new class "TheoraVideoRTPSink" - for Theora video.
(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".
2013.12.17:
- Removed a stray #define DEBUG from "RTSPServer.cpp"
2013.12.16:
- Fixed a bug in the "RTSPServer" code that was causing it not to handle pipelined
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.)
2013.12.15:
- 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 one).
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 "ProxyRTSPClient" subclass,
and then (in the constructor of your "ProxyServerMediaSession" subclass) pass this function
as a parameter to the constructor of the parent class (i.e., "ProxyServerMediaSession").
(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
client liveness.)
2013.12.05:
- Fixed a line of code in "RTPInterface.cpp" that was breaking 'Win64' compilers.
(Thanks to the VLC developers for noting this.)
2013.12.04:
- 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 "maksqwe1@ukr.net".)
2013.12.03:
- Made a minor change to the "ProxyRTSPClient" code to prevent a potential divide-by-zero
error.
2013.11.29:
- Updated the previous bug fix to close another vulnerability. All applications that include
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.)
2013.11.26:
- 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 applications
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 receive RTSP
commands.)
(Thanks to iSEC Partners <http://isecpartners.com/> for discovering and reporting this bug.)
- In "StreamState::endPlaying()"("OnDemandServerMediaSubsession.cpp"), removed the call to
"RTPInterface::clearServerRequestAlternativeByteHandler()" (when streaming RTP-over-TCP)
that we had added in version 2013.07.31. This was preventing the "RTSPClientConnection"
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.)
2013.11.25:
- Made a minor change to the random retransmission interval used in "ProxyServerMediaSession".
2013.11.15:
- 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 reporting this.)
2013.11.14:
- 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 the suggestion.)
2013.11.10:
- Updated the Matroska file parsing code to better handle skipping over very large tracks
(such as embedded file attachments). (Thanks to Michel Promonet for reporting this issue.)
2013.11.06:
- Changed the function "MatroskaDemux::newDemuxedTrack()" to return 'preferred' tracks
(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 "MatroskaFileServerDemux::createNew()"
(to mirror the corresponding parameter that's in "MatroskaFile::createNew()").
- 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 noting this.)
2013.10.25:
- 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.)
2013.10.24:
- Fixed a bug in "ByteStreamMemoryBufferSource":" The fLimitNumBytesToStream" member variable was not being initialized.
(Thanks to Park Chan for reporting this.)
2013.10.22:
- 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 application.)
- 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
in "RTSPClient.hh".
2013.10.18:
- 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 to take
two new optional parameters: "receiveOurStreamViaTCP" (Boolean), and "proxyURLSuffix" (string).
- Made the "RTSPServer" code's parsing of "Transport:" headers a little more robust.
2013.10.16:
- 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.)
2013.10.11:
- 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 response
to an "OPTIONS" command. (Thanks to Bob Bischan for noting this.)
2013.10.09:
- Updated the signature of "RTSPServerWithREGISTERProxying::createNew()" to take a Boolean "streamOverTCP" parameter
(default value: False), which tells the server whether or not to enable RTP/RTCP-over-TCP streaming for each newly created
"ProxyServerMediaSession".
(Thanks to Bob Bischan for bringing this to our attention.)
2013.10.08:
- 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).
2013.10.07:
- 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 "RTSPServerWithREGISTERProxying::createNew()"
to take a new "verbosityLevelForProxying" optional parameter.
(Thanks to Bob Bischan for bringing this to our attention.)
2013.10.03:
- Updated the "socketJoinGroup()" and "socketJoinGroupSSM()" functions to set the IP_MULTICAST_ALL socket option to 0,
if that option is defined. (The IP_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
use this.
2013.10.02:
- 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 RTP/RTCP-over-TCP streaming.
2013.10.01:
- 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).
2013.09.30:
- 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.)
2013.09.27:
- 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.
2013.09.18:
- 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.)
2013.09.11:
- 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.
2013.09.08:
- Made a minor change to the way that "openRTSP" handles the "-Q" option (to address an issue that someone reported).
2013.09.07:
- Improved the bugfix that was in the previous release (because that fix still had a deleted object being accessed).
2013.08.31:
- 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.)
2013.08.28:
- 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.)
2013.08.16:
- 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).
2013.08.15:
- 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.
2013.08.05:
- 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.)
2013.07.31:
- 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 corresponding function
"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.)
2013.07.30:
- Moved the call to "RTPInterface::stopNetworkReading()" from the "RTCPInstance" and "(MultiFramed)RTPSource" destructors to the
"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 get
deregistered properly if it's streaming RTP-over-TCP. (This fixes a bug that was reported by Andrey Shvyrkin.)
2013.07.16:
- 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 "RTSPServer".
(Thanks to Michel Promonet for the suggestion.)
2013.07.03:
- Fixed some minor memory leaks in "RTPInterface". (Thanks to Chris Richardson.)
2013.06.30:
- 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 input string.
- In "MPEG2TransportStreamMultiplexor.cpp", we rename the constants "PAT_FREQUENCY" and "PMT_FREQUENCY" to the more accurate
names "PAT_PERIOD" and "PMT_PERIOD".
2013.06.18:
- 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
"RTSPServer::registerStream()"
specifying the remote client (or proxy server)'s name or IP address, and port number.
To create a simple server that accepts incoming "REGISTER" (or "REGISTER_REMOTE") requests, and then creates a new "RTSPClient"
object to handle the "rtsp://" URL specified by each such incoming request, create a
"HandlerServerForREGISTERCommand"
object, by calling "HandlerServerForREGISTERCommand::createNew()" (see "liveMedia/include/RTSPClient.hh").
(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
"RTSPServerWithREGISTERProxying"
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 back-end server.)
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 and
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.)
2013.06.14:
- 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 TCP connection.)
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.)
2013.06.06:
- Removed a "#define DEBUG 1" that had accidentally been left in "RTSPServer.cpp". (Thanks to Warren Young for noting this.)
2013.05.30:
- 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" interface.
- 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 Erlandsson.)
- Added "protected:" "setRTSPResponse()" function shortcuts to "RTSPClientSession", so that subclasses of "RTSPClientSession"
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 "config.armlinux".
- Began adding support for a new, custom "REGISTER" (server->client) RTSP command. This is not finished, so don't use it yet.
2013.04.30:
- The bugfix in the previous version was incomplete. This should fix it for real.
2013.04.29:
- 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.)
2013.04.23:
- 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 "closeAllClientSessionsForServerMediaSession()" or
"deleteServerMediaSession()" is called.
- Fixed a bug that would sometimes cause a proxy RTSP server to send invalid RTCP reports to front-end clients.
2013.04.22:
- 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.)
2013.04.21:
- 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 input frames.
(Thanks to Markus Schumann for bringing this issue to our attention.)
2013.04.16:
- 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.
2013.04.08:
- 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.)
2013.04.06:
- 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 camera servers
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 uninitialized variables
(if a RTCP "RR" report is sent before we have received any RTP packets). (Thanks to Michel Promonet for noting this.)
2013.04.05:
- 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.
2013.04.04:
- 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.)
2013.04.01:
- 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.
2013.03.31:
- 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.
2013.03.23:
- 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
presentation times.
(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.)
2013.03.07:
- 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 delete[]ing the "resultString"
in RTSP response handler functions. (This caused a minor memory leak, although only in situations where RTSP commands failed.)
2013.02.27:
- When the RTSP server receives a "PLAY" request with no "Range:" header, it now includes a "Range:" header in its response,
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 these chains are very long.
(Thanks to Anton Chmelev for this suggestion.)
- Removed some unused member fields from a few classes.
2013.02.11:
- Fixed an obscure bug in the way that "RTSPClient" handles some responses. (Thanks to Michel Promonet for finding this.)
2013.02.05:
- 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 Simon Roehrl.)
- Updated "config.iphoneos" and "config.iphone-simulator" to update "IOS_VERSION" to 6.1
2013.01.25:
- Added a fix to "StreamReplica::doStopGettingFrames()" so that it doesn't try to 'deactivate'
a replica that hasn't yet been activated. (Thanks to Bruno Abreu.)
2013.01.23:
- Added a hack to "StreamReplicator" to handle the case of a replica being deleted
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.)
2013.01.22:
- 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.)
2013.01.21:
- 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).
2013.01.19:
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.
2013.01.18:
- 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.
2013.01.15:
- Updated the "RTSPClient" parsing code to ignore "RTP-Info:" headers (in "PLAY" responses) that don't define *both* the
"seq" and "rtptime" parameters. We need both of those parameters to be present in order for the "RTP-Info:" header to be useful
to us.
- Some minor changes to the library "Makefile.head" and "Makefile.tail" files.
- 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".
2013.01.05:
- Fixed some Makefile definitions what were apparently breaking in some versions of Windows.
(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.)
2013.01.04:
- 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.
2013.01.03:
- 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.
2012.12.24:
- Argh! Really fixed this time.
2012.12.23:
- Fixed the "install" Makefile target in the previous release (stupid Makefile syntax!).
2012.12.22:
- In the previous release, we had forgotten to add an "install:" target to the top-level Makefile. (Thanks to Benjamin Drung for noting this.)
2012.12.21:
- 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.)
2012.12.18:
- 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 files
"test.mkv" or "test.webm" do not exist. I don't know why this wasn't caught before...)
2012.12.15:
- Added an experimental new configuration file "config.linux-with-shared-libraries", for building for Linux with shared libraries
only (i.e., no static libraries). (Thanks to Benjamin Drung for proposing and assisting with this.)
2012.11.30:
- 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 this.)
2012.11.29:
- 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.)
2012.11.28:
- 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.)
2012.11.22:
- 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.)
2012.11.17:
- 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 "ProxyServerMediaSubsession"s.
The signature to "ProxyServerMediaSession::createNew()" has also changed; it now takes a pointer to the "RTSPServer" as parameter.
2012.11.16:
- 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").
2012.11.08:
- 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 overflow problem.
(Thanks to Simon Roehrl for noting this issue.)
2012.11.05:
- 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.)
2012.10.24:
- Made the "addNewInputSource()" function of "MPEG2TransportStreamFromESSource" "protected:", to allow subclasses of
"MPEG2TransportStreamFromESSource" to support adding new kinds of input stream, if desired.
2012.10.22:
- Updated "AVIFileSink" to add an index at the end. (Thanks to "qiuchangyong qiuchangyong".)
- Updated the "MediaSession" implementation to accept "audio/OPUS" as a valid RTP payload format (which can be implemented
using a "SimpleRTPSource").
2012.10.21:
- Fixed a bug in "PresentationTimeSessionNormalizer". (Thanks to Bruno Marchand.)
2012.10.19:
- 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
want.)
- 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.)
2012.10.18:
- 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.)
2012.10.17:
- Maved "RTSPClient::reset()" from "private:" to "protected:", and made "ProxyRTSPClient::reset()" call "RTSPClient::reset()"
(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).
2012.10.16:
- 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'
TCP connections.
2012.10.12:
- 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
-DIGNORE_UNICAST_SDP_PORTS=1
2012.10.11:
- 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 warning messages
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.)
2012.10.04:
- 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.
2012.10.01:
- 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 table, though.)
(Thanks to Matt Schuckmann for this suggestion.)
2012.09.27:
- 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 incoming 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 the "MPEG4VideoStreamDiscreteFramer",
"MPEG1or2VideoStreamDiscreteFramer", and "DVVideoStreamFramer" filters, to specify that the input frames' presentation
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
unmodified.)
- Updated "RTSPClient.hh" to move the "fCSeq" and "fCurrentAuthenticator" from "private:" to "protected:".
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 whether
(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.)
2012.09.13:
- 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 the document).
(Thanks to Michel Promonet for this suggestion.)
- Updated the meaning of the "doNormalMBitRule" parameter to "SimpleRTPSource::createNew()" and "SimpleRTPSink::createNew()".
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.
2012.09.12:
- 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.)
2012.09.11:
- 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).
2012.09.07:
- 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.)
2012.09.06:
- 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.)
2012.08.31:
- 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 reporting this.)
2012.08.30:
- 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 malformed request.
(Thanks to Kevin Kuo for reporting this.)
2012.08.29:
- 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 "ByteStreamFileSource.hh".
2012.08.28:
- 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 "ServerMediaSession::seekStream()" or
"OnDemandServerMediaSubsession::seekStreamSource()".)
- Made the "fPreferredFrameSize" variable in "ByteStreamFileSource.hh" "protected:" rather than "private:", to allow subclasses
of "WAVAudioFileSource" to change its value, if desired.
2012.08.20:
- 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 "YYYYMMDDTHHMMSS.<frac>Z".
- For RTSP server developers (i.e., developers who have their own subclasses of "OnDemandServerMediaSubsession"):
- 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;"
(see "liveMedia/include/ServerMediaSession.hh").
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 function:
"virtual void seekStreamSource(FramedSource* inputSource, char*& absStart, char*& absEnd);"
(see "liveMedia/include/OnDemandServerMediaSubsession.hh").
"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.
(see "liveMedia/include/RTSPClient.hh")
- 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 triggers'.)
2012.08.17:
- 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 compilers happy.
2012.08.12:
- 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 "WSA*" equivalents.
2012.08.08
- 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 connections.
For more details, see:
http://lists.live555.com/pipermail/live-devel/2012-July/015571.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).
2012.07.26:
- Made the "RTPInterface" code for handling RTP/RTCP-over-TCP a little more robust.
- Updated the "WAVAudioFileSource" WAV-file parser to skip any extraneous 'chunks' between RIFF and FORMAT.
(Thanks to Sid Price for suggesting this.)
2012.07.24:
- 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.
2012.07.18:
- 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.)
2012.07.14:
- 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.)
2012.07.06:
- 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.)
2012.07.03:
- 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.)
2012.06.26:
- 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.
2012.06.23:
- 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.
2012.06.17:
- 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 "triggerEvent()"
is called from a non-LIVE555 thread). (Thanks to Matthais Doering for noting this issue.)
- Updated the "ProxyServerMediaSession" code to ensure that all front-end "RTCPInstance" objects are created with non-zero
bandwidth estimates.
2012.06.12:
- 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.)
2012.05.17:
- 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.)
2012.05.11:
- Really fixed the bug in the implementation of "StreamReplicator::deleteReplica()" that I was supposed to have fixed in
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.)
2012.05.03:
- 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 reporting this.)
- 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).
2012.04.27:
- 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.)
2012.04.26:
- 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()" call.
- 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 H.264
NAL units are often larger than 10000 bytes.
- Changed the signature of "AuxHandlerFunc()" (used by the "setAuxilliaryReadHandler()" hack) to pass "packetSize" by reference
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.)
2012.04.21:
- Made some cosmetic changes to the "live555ProxyServer" code, prior to its official announcement.
2012.04.18:
- Added "ProxyServerMediaSession" - a subclass of "ServerMediaSession" that can be used to create a (unicast) RTSP servers
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 "unsigned char",
to avoid an apparent conflict when compiling for Mac OS X (and also to save some space).
(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 their own
debugging output.
- 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 used.
2012.04.04:
- 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
unlikely.)
- 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).
2012.03.22:
- 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.)
2012.03.20:
- 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 a 'framer')
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 safety).
2012.02.29:
- 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.)
2012.02.04:
- Updated "WAVAudioFileSource" to read from its input file asynchronously,
if possible, rather than doing a synchronous (blocking) read.
2012.02.03:
- Updated "RTSPClient" to - after receiving a "SETUP" response for a UDP stream - send a couple of short 'dummy' UDP packets
to the server. This will make it more likely that the incoming RTP/UDP packets will successfully traverse a NAT box
(if the client is behind a NAT). (Note that we don't do this for RTCP, because the client's regular RTCP "RR" packets will
have the same effect.)
- Changed the way that the "sessionId" member field in "MediaSubsession" is managed. Its memory is now managed by "MediaSubsession"
itself, rather than by "RTSPClient" (as it was previously). With the previous behavior, "valgrind" (incorrectly) reported
a possible memory leak. The new behavior should make 'valgrinerds' happy.
2012.01.26:
- We now make the "MediaLookupTable" class visible in the header file "include/Media.hh". This allows developers to, if they wish,
iterate over the whole set of "Medium" objects that they've created.
(Thanks to Aviad Rozenhek for this suggestion.)
- "HashTable::Iterator::create()" now takes a "HashTable const&" as parameter, rather than a "HashTable&".
(This makes it possible for iterators to work on (references to) hash tables that we've declared as const - for more type safety.)
2012.01.25:
- Added a new class "MPEG2TransportUDPServerMediaSubsession" (a subclass of "OnDemandServerMediaSubsession") that can be used
to build a RTSP server that can takes a UDP (raw UDP or RTP/UDP) Transport Stream as input (via IP multicast, or unicast).
We also updated the "testOnDemandRTSPServer" demo application to show how a RTSP server can take input from the
(IP multicast) Transport Stream sent by the "testMPEG2TransportStreamer" demo application.
(Thanks to Achraf Gazdar for this suggestion.)
- Added a new demo application (in "testProgs") "testMPEG2TransportReceiver"
(which can receive the MPEG-2 Transport/RTP stream sent by "testMPEG2TransportStreamer")
2012.01.13:
- Fixed a bug in "StreamReplicator" that could cause 'replica deactivation' code to be executed more than once on the same replica,
with bad results. (Thanks to Mike Stewart for reporting this.)
- Updated the 'connect()'-result test in "RTSPClient.cpp" to check for EWOULDBLOCK as well as EINPROGRESS.
(Windoze systems can apparently return EWOULDBLOCK. Thanks to Jeff Shanab for the suggestion.)
2012.01.07:
- Added a new "liveMedia" class "StreamReplicator". This can be used to create an arbitrary number of 'replicas' of an input
stream. We also added a new demo application "testReplicator" (in "testProgs") that demonstrates how to use this class.
- Made a small change to "testRTSPClient" to account for the possibility of a RTCP "BYE" being received after having sent a
RTSP "TEARDOWN".
2011.12.23:
- Added a new demo application "testRTSPClient" to the "testProgs" directory. If you're developing your own RTSP client
application (or want to embed RTSP client functionality into a larger application), then "testRTSPClient" is a better model
for this than "openRTSP" (because "openRTSP" was designed to be a standalone application, and is complex, with a large number
of options).
- Fixed a bug in "MultiFramedRTPSource" that could cause an incorrect count of 'truncated' bytes to get reported if the receiving
sink's buffer size was too large to fit a complete incoming frame. (Even worse, this bug might also cause a frame of invalid
data (that should have been truncated from the previous frame) to get delivered to the sink.)
2011.12.20:
- Fixed a "RTSPServer" bug in handling commands (such as "GET_PARAMETER" or "SET_PARAMETER") that have a "Content-Length:" header,
specifying extra bytes at the end of the message. (The bug usually affected only RTP-over-TCP streams, not RTP-over-UDP.)
(Thanks to Jer Morrill for bringing this bug to our attention.)
- We no longer make the 'groupsock' "reuseFlag" a static variable, in case the library is being accessed by multiple threads.
Instead, we now make it part of the "groupsockPriv" memory that's part of each "UsageEnvironment".
(Thanks to Michel Promonet for noting this issue.)
2011.12.19:
- Updated the "UserAuthenticationDatabase" destructor (in "RTSPServer.cpp") to delete each of the "password" strings that we
had previously allocated, thereby eliminating a memory leak. (Thanks to Michel Promonet for noting this.)
- Fixed a bug with the "#ifdef"s in "liveMedia/include/Locale.hh" (introduced in version 2011.11.27) - to ensure that the new
'xlocale' functions get used on Linux by default.
(Thanks to Remi Denis-Courmont for alerting us to this issue.)
- Added a public member function "url()" to "RTSPClient", to get the RTSP URL. (This might be useful for applications that
create multiple "RTSPClient" objects, and want to identify each one (e.g., when debugging).)
2011.12.02:
- Updated the "H264VideoStreamFramer" implementation to avoid triggering a "StreamParser" internal error, even for extremely
large NAL units.
2011.11.29:
- Updated "MPEG2TransportStreamMultiplexor" to change the Program Map PID from 0x10 to 0x30. (Thanks to Chris Richardson,
who noted that PIDs below 0x30 are not valid for ATSC or DVB (although they may be valid for other Transport Streams).)
- Updated the "NetAddressList()" constructor (for resolving names->IP addresses) to use "getaddrinfo()" - if available - rather
than the older, deprecated "gethostbyname()" function. Also, the "ourIPAddress()" code (in "GroupsockHelper.cpp") now uses
the "NetAddressList()" code (if the initial multicast loopback method fails) to look up our host name.
2011.11.28:
- Use "uintptr_t" and "intptr_t" in a few places, where appropriate, to eliminate compiler warnings when compiing for 64-bits.
(Thanks to the VLC developers for this suggestion.)
- When we create each (datagram or stream) socket, set the 'close on exec' property (if we can).
(Thanks to the VLC developers for this suggestion.)
2011.11.27:
- Updated the definition and implementation of the "Locale" class to - if possible - use "newlocale()" rather than "setlocale()".
The reason for this is that - on some systems - "setlocale()" may not be thread safe.
(Thanks to the VLC developers for this suggestion.)
IMPORTANT NOTE: Some systems - e.g., FreeBSD - do not have the "xlocale.h" header file that defines "newlocale()".
This means that we had to #ifdef the code, and continue to use the old implementation (using "setlocale()"),
if XLOCALE_NOT_USED is defined. We have updated the "config.freebsd" configuration file to add "-DXLOCALE_NOT_USED=1"
to the compile flags. However, if there are other systems that have "locale.h" but not "xlocale.h", then their configuration
files will need to be updated also. If you find such a system, then please let us know (using the "live-devel" mailing list).
- Updated the 'IP address finding' code in "groupsock/GroupsockHelper.cpp" to use "getaddrinfo()" - if available - rather than
the older, deprecated "gethostbyname()" function.
(Thanks to the VLC developers for this suggestion.)
- Made the "RTSPClient" member function "setBaseURL()" protected rather than private, to allow subclass constructors to,
if they wish, construct and set the "rtsp://" URL in the body of their constructor, rather than in the call to the parent
"RTSPClient" constructor. (If they want to do this, then they should first pass "NULL" as the "rtspURL" parameter in the
parent constructor.)
(Thanks to Jeff Shanab for this suggestion.)
2011.11.26:
- We no longer use "inet_ntoa()" (or "our_inet_ntoa()"), because it's not safe if called from multiple threads.
Instead, we now use our own "AddressString" class (defined in "groupsock/include/NetAddress.hh").
E.g., instead of calling
our_inet_addr(addr)
we now call
AddressString(addr).val()
(Thanks to the VLC developers for noting the problem with "inet_ntoa()".)
- Updated the "WindowsAudioInputDevice" code to make it work better with Unicode. (Thanks to Jeff Shanab.)
2011.11.20:
- Fixed "RTCP.cpp" to not call a "BYE" handler (if one's set) until the very end of the incoming RTCP report handler member
function. This is to allow for the (common) possibility of the "BYE" handler causing "this" to get deleted.
(Thanks to Jeff Shanab for noticing this.)
- Updated some counters used by "MPEG2TransportStreamFramer" from "unsigned long" to "u_int64_t", to better support streams
that last for several days. (Thanks to Tim Shackleton for this fix.)
- Modified the "RTSPServer" code to properly handle weird RTSP clients that ask for RAW UDP streaming, but also specify two
port numbers in the "client_port=" part of the "Transport:" header.
(Thanks to "homepuh(at)yandex.ru" for this suggestion.)
- Made a small change to the "VP8VideoRTPSource" implementation to reflect a minor change (the addition of the "K" header flag)
in the most recent IETF Internet-Draft (draft-ietf-payload-vp8-02.txt)
- Added an #ifndef to "Boolean.hh" to deal with a Windows development environment that already defines (not "#define"s)
"True" and "False". (Thanks to Jeff Shanab for this suggestion.)
2011.11.08:
- Added "VorbisAudioRTPSink" and "VorbisAudioRTPSource" for sending/receiving Vorbos audio RTP streams (based on RFC 5215).
- Added "VP8VideoRTPSink" and "VP8VideoRTPSource" for sending/receiving VP8 video RTP streams.
- Added support for extracting and streaming Vorbis audio tracks from Matroska (including WEBM) files.
- Added support for extracting and streaming VP8 video tracks from Matroska (including WEBM) files.
- Updated the "testOnDemandRTSPServer" and "LIVE555MediaServer" (source-code version only) applications to support streaming
from ".webm' files.
- Fixed frame durations for data extracted from Matroska tracks that don't have a 'default duration'.
- Fixed a memory leak in "RTSPClient::sendOptionsCmd()". (Thanks to Gregg Mattinson for reporting this.)
(Note, however, that "sendOptionsCmd()" - and other functions in the synchronous interface - are currently deprecated.
Developers should now be using the asynchronous "RTSPClient" interface instead.)
2011.11.02:
- Updated the Matroska file parsing code to be more tolerant of extremely large frames (larger than the "StreamParser"
"BANK_SIZE"), and bogus data - to avoid tripping into parser 'internal errors'.
- Added an #ifndef/#endif around the "NoReuse dummy;" statement in "RTSPServer.cpp". This allows a developer - at compile time -
to allow a "RTSPServer" to run even if there is already a server using the same port. (The only time you should do this is
if you anticipate restarting a server immediately after it exits, when the old server is still in a TIME_WAIT state, and
you're sure that no other server will ever be running with the same port number.)
(Suggestion by Chris Richardson.)
2011.10.27:
- Added support for seeking within streams that are demultiplexed from a Matroska file.
- Modified the signatures of the virtual functions "ServerMediaSubsession::seekStream()"
and "OnDemandServerMediaSubsession::seekStreamSource()" to make the "seekNPT" parameter a "double&" rather than a "double".
This makes it possible for subclasses to make slight changes to the specified seek position when they implement seeking.
(This is necessary for seeking within Matroska-demuxed streams, because 'cue points' in Matroska files can be coarse-grain.)
- Made a slight modification to "openRTSP" so that it sets the play duration correctly if the RTSP seek position changes as
a result of the RTSP "PLAY" command.
- Changed the implementation of "ReorderingPacketBuffer" in "MultiFramedRTPSource" to use a doubly-linked list rather than
a singly-linked list. This makes it more efficient to add new packets to the list after a packet loss has occurred
(while we wait for the 'reordering threshold' to expire). (As always, most of the "ReorderingPacketBuffer" code gets called
only if a packet is lost (or reordered) in the input stream; not in the common case where all packets arrive in order.)
(Thanks to Ralf Schroeder for this suggestion.)
- Made the implementation of the "our_random()" function more robust in case it's called concurrently by multiple threads.
(Of course, as explained in the FAQ, you should calling LIVE555 code from multiple threads only if each thread uses its own
"UsageEnvironment" and "TaskScheduler" object.)
(Thanks to Michael Margold for raising this issue.)
- Fixed the way that you can specify - in the C/C++ preprocessor - that you want to use the system-supplied "random()" and
"srandom()" functions, rather than our own versions. You can do this by defining USE_SYSTEM_RANDOM (e.g., in a "config." file).
2011.10.18:
- Improved "RTSPServer" support for subdirectories in "rtsp://" URLs (handling this better for non-compliant clients
that try to do a "SETUP" on agrregate URLs - when there is only a single subsession in the stream).
2011.10.09:
- Updated "RTSPServer" to better support multiple "/" characters (i.e., subdirectories) in URL - i.e., improving the modification
that we made back in version 2011.08.13.
- Added an #include to "RTSPCommon.hh" to overcome a compilation problem that some
people had when using Borland development tools on Windows.
2011.10.05:
- Added support for RTSP/RTP streaming, on demand, from a Matroska ('.mkv') file. The video, audio, and subtitle tracks (if any)
within the file are demultiplexed and streamed separately, via RTP. We currently support H.264 video, AAC, AC3 and MP3 audio,
and text subtitles. Sometime in the future, we will also support WEBM ('.webm') Matroska files, with VP8 video and Vorbis audio.
(We don't currently support seeking within the underlying Matroska file (to implement RTSP seeking), but hope to do so
in the future.)
We also updated the "testOnDemandRTSPServer" demo application and the "LIVE555 Media Server" (currently, just the source-code
version - not the prebuilt application binary versions) to support streaming from '.mkv' files.
- Added a new "RTPSink" subclass "T140TextRTPSink" to implement the 'text conversation' RTP payload format defined
by RFC 4103. (Note, however, that the optional support for 'redundancy' - as described in that RFC - is not yet supported.)
We had already implemented the *reception* of this RTP payload format (using "SimpleRTPSource").
We use this payload format to stream 'subtitle' tracks from Matroska files.
- Added a new configuration file "config.macosx-32bit" for generating 32-bit-only binaries for Mac OS X.
(Thanks to Robert Wolff for contributing this.)
- Added a mechanism for (optionally) setting a callback function on a "RTPSink" - to be called if a send of data over
the sink's socket fails. (Contributed by Ralf Globisch.)
- Made a minor change to "MultiFramedRTPSink" to ensure that the "doSpecialFrameHandling()" virtual function gets called
even when sending RTP packets that contain a 0-length payload.
- Fixed a minor memory leak in "H264VideoRTPSink" (the intermediate 'fragmenter' object wasn't getting deleted properly)
2011.09.19:
- We now set RTCP "RR" handlers for "PassiveServerMediaSubsession"s. As a result, client sessions for multicast streams
will no longer time out - as long as the clients send RTCP "RR" packets which the server can receive.
- Added a new public member function "setSPSandPPS()" to "H264VideoStreamFramer". This lets you initialize a
"H264VideoStreamFramer" (or a "H264VideoStreamDiscreteFramer") with SPS and PPS NAL units, in case these do not appear
early (or at all) in the input stream.
- Made some performance improvements to "H264VideoFileServerMediaSubsession" and "MPEG4VideoFileServerMediaSubsession".
- Fixed a bug in "H264VideoRTPSink" that could cause input source processing to not get stopped properly if the sink gets deleted.
2011.09.02:
- Updated "MultiFramedRTPSource" to more cleanly handle the situation where the sender's SSRC changes. We don't yet support
streams that contain multiple SSRCs, but we can handle streams where the SSRC changes occasionally - e.g., because a multicast
source has been restarted. (When the SSRC changes, we don't check the RTP sequence number of the first packet.)
(Thanks to Dmitriy Vasil'ev for bringing this issue to our attention.)
2011.08.22:
- Updated the "RTSPServer" code to handle a rare condition whereby "handleRequestBytes()" gets called recursively.
(This can happen only when we handle a "DESCRIBE" by re-calling the event loop (e.g., to wait for SDP parameters to
become available).) If this happens, we need to make sure that we don't delete the "RTSPClientSession" object until we leave the
outermost call. (Thanks to Vadim Kosarev for identifying the problem, and proposing the solution.)
2011.08.20:
- Modified the "MediaSession" and "MediaSubsession" classes to make it possible for developers to add support for receiving
new RTP payload formats, without having to modify the "MediaSession" or "MediaSubsession" code itself. To do this, developers
define their own subclasses of "MediaSession" and "MediaSubsession". For more details, see the comment near the top of
"liveMedia/include/MediaSession.hh"
2011.08.13:
- Updated the "RTSPServer" implementation to allow multiple "/" characters in the "rtsp://" URL. This allows the
"LIVE555 Media Server" to stream from subdirectories. (Thanks to Mike Williams for this suggestion.)
- Updated the "RTSPClient" code to more cleanly handle our server's (empty) responses to RTSP "GET_PARAMETER" commands.
(Thanks to Sebastien Escudier for noting this issue.)
- Updated the "StreamParser" code to allow parsers to test whether we've seen EOF on the input stream. We also modified
the "H264VideoStreamParser" code to use this, and fix a bug which was causing it to omit the last NAL unit in the input file.
- Updated "JPEGVideoRTPSource" to generate correct (or at least more correct) JPEG headers when the input stream contains just
one quantization header.
- Added a 'cast' to the "RTSPServerSupportingHTTPStreaming" code to overcome a compilation problem that some people may
have been seeing.
2011.07.21:
- Changed some member variables from "private:" to "protected:", to make subclassing easier.
(Requested by Mojtaba Nouri and James Stafford.)
- Added a sanity check to the "RTP-over-TCP" handling code in "RTPInterface.cpp" to alleviate a strange condition (perhaps a bug)
that Jeremy Noring saw.
2011.07.18:
- Added a new, optional extension to "RTSPServer" - called "RTSPServerSupportingHTTPStreaming" - that supports streaming
to iPhones and iPads, using Apple's "HTTP Live Streaming" mechanism. (For this to work, the files being streamed *must* be
MPEG Transport Stream files with H.264 video, and must also be 'indexed' (using the same 'index file' mechanism that we use
for 'trick play'). (The "live555MediaServer" source code has been updated to support this, as an option.)
- Fixed a bug in the various "*Streamer" demo applications that stream from the same input file, in a loop. We weren't calling
"stopPlaying()" on the "RTPSink" object at the end of each loop. This bug directly affected only "testH264VideoStreamFramer",
but was theoretically an issue for other demo applications as well. (Thanks to Sergey Kosov for reporting this.)
2011.07.15a:
- Removed some experimental new code that had accidentally been left in the "mediaServer" directory.
2011.07.15:
- Added a new class "ByteStreamMemoryBufferSource" to encapsulate a (static) memory buffer that's used as a byte stream data source.
- Added a new class "TCPStreamSink" to encapsulate a writable TCP socket. Being a "MediaSink", you can call "startPlaying()"
on it, to stream from a "FramedSource" to a TCP socket. This class could be used to implement a HTTP server, for example.
- Changed the signature of "ServerMediaSubsession::seekStream()" to take an additional "numBytes" return parameter.
This parameter is set to the number of bytes that will be streamed (or 0 if unlimited, or unknown).
(This can be used to implement a HTTP server, with a "Content-Length:" response header.)
- Added a new virtual function "getStreamSource(streamToken)" to "ServerMediaSubsession". This provides an easy way for
"RTSPServer" subclasses to access the media source for each stream, if desired.
- Removed the classes "HTTPSink" and "MPEG1or2VideoHTTPSink". They weren't being used anymore.
2011.07.08:
- Updated the RTSP server implementation to check the "Content-Length:" header - if present - in incoming requests. Most commands
don't include extra data after the <CR><LF><CR><LF>, and thus don't need a "Content-Length:" header. However, two commands
- GET_PARAMETER and SET_PARAMETER - include extra data, and thus have a "Content-Length:" header. We now check this value,
to make sure that we've received all of the required data for each request.
(Thanks to Matt Schuckmannn for reporting this issue.)
2011.07.06:
- Modified the change to "ByteStreamFileSource" that we made in version 2011.06.12. We now call "read()" only if we know that
the underlying file is non-seekable. Otherwise - if the file is seekable - we call "fread()", as we did prior to 2011.06.12.
(Reading from the file using "read()" doesn't work properly if we're also seeking within the file.
This is why Transport Stream 'trick play' got broken by 2011.06.12, but should be working again now.)
2011.07.05:
- Updated "MPEG2IndexFromTransportStream" to make "MPEG2TransportStreamIndexer" more robust when it sees PCR timestamps decreasing
in time (something that shouldn't happen). (Thanks to Mojtaba Nouri for providing an example Transport Stream file that
illustrates this.)
- Fixed a bug in "MPEG2IndexFromTransportStream" that could cause the "MPEG2TransportStreamIndexer" utility to hang when it
saw bogus data appear before a MPEG system code. (Thanks to Julian Scheel for reporting this issue.)
- Modified the "BasicTaskScheduler" implementation to add "dumySocket" only to "fReadSet", but not to "fWriteSet" or "fExceptionSet".
This should continue to work around the Windows bug (where "select()" returns an error if no sockets are present in "fReadSet"),
but without causing "select()" to keep returning unnecessarily (chewing up CPU). (Thanks to Matt Schuckmann for reporting this.)
- We now make all files in the source code distribution read-only, by default. Developers can, of course, change the permissions
of any of these files to make them writeable, but having them be read-only by default helps emphasize that modifying the
supplied source code is discouraged. Instead, developers should - if possible - extend the supplied source code using
C++ subclassing. For more information, see the FAQ: http://www.live555.com/liveMedia/faq.html#modifying-and-extending
2011.06.16:
- Updated "AC3AudioRTPSink" and "AC3AudioRTPSource" to conform to RFC 4184, which defines the RTP payload format for AC-3 audio.
Previously, we were using a different, incompatible payload format (that had been defined by an initial draft document, but
which differed from that defined in the final RFC. Unfortunately, this means that older clients that use our code
- including existing binary versions of VLC and MPlayer - will no longer be able to play AC-3/RTP streams from our server
(until they are rebuilt using this newest version of our library).
- Updated "AC3AudioStreamFramer" - and added a new class "AC3AudioFileServerMediaSubsession" - to support streaming from an AC-3
audio file. We also added this support to the "testOnDemandRTSPServer" demo application, and to the "LIVE555 Media Server"
(currently just the source code; not the prebuilt binary versions).
(Thanks to Ashwani Kathuria for suggesting this.)
- Moved the definition of "class StreamState" from "OnDemandServerMediaSubsession.cpp" to "OnDemandServerMediaSubsession.hh".
Even though "class StreamState" is used only internally, in the implementation of "OnDemandServerMediaSubsession", moving its
definition to the header file makes it possible for subclasses of "OnDemandServerMediaSubsession" to access it.
2011.06.14a:
- Removed some junk (debugging) files that had accidentally been left in the "testProgs/" directory.
2011.06.14:
- Fixed a race condition in "H264VideoFileServerMediaSubsession" and "MPEG4VideoFileServerMediaSubsession" that could have been
triggered when two separate clients tried to stream the same file concurrently. (Thanks to Bruno Abreu for reporting this.)
- Fixed a minor bug in "Authenticator::operator=()": we were not freeing the LHS object's memory before doing the
assignment. (Thanks to Sawan Das for noting this.)
- Updated "config.iphoneos" to change LIBRARY_LINK from "ar cr " to "libtool -s -o ", just as we did for "config.macosx" in the
previous release.
2011.06.12:
- Updated the RTCP implementation to (if we're a SSM source) reflect incoming RTCP packets back to the multicast group
*only* if the packet originated from another host. This means that we won't reflect packets that come from other
processes on our own host. The reason for this is that we can't reliably distinguish such packets from packets that were
actually looped back from us. (We must not 'reflect' such packets, otherwise we risk a packet storm.)
- Updated the "ByteStreamFileSource" code to make the underlying socket non-blocking. We also read data using "read()"
rather than "fread()", to eliminate blocking (if READ_FROM_FILES_SYNCHRONOUSLY is not defined). (This change should
affect only reading from pipes, not regular files.) (Thanks to Tyson Wiser for noting this issue.)
- Updated the "DelayQueue" destructor to make sure that any remaining delay queue entries are destroyed.
(Thanks to "Mr. Xiao" and Luke Kucalaba for (independently) reporting this issue.)
- Updated "config.macosx" to change LIBRARY_LINK from "ar cr " to "libtool -s -o ", because someone reported that "ar"
didn't work for them.
- Added support for receiving the "audio/EAC3" RTP payload format (which is handled the same way as "audio/AC3").
(Thanks to Gregory McGarry for the patch.)
2011.05.25:
- Fixed a bug in "RTSPClient" which was causing clients to crash if servers returned a 401 error code, but without a
"WWW-Authenticate:" header. (Thanks to Sebastien Escudier for reporting this.)
2011.03.14:
- Updated the "MPEG2TransportFileServerMediaSubsession" to use the "streamDuration" parameter (if >0.0) to limit
the number of Transport Packets that are streamed from the source file. (This happens only if the file is indexed.)
This allows the server to implement finite RTSP ranges for such streams.
- Fixed a minor bug in "OnDemandServerMediaSubsession" if "reuseFirstSource" is set. (Thanks to Andreas Gaer for noting this.)
2011.03.06:
- Changed the implementation of "RTSPClient::teardownMediaSession()" and "RTSPClient::teardownMediaSubsession()"
(i.e., in the old, now-deprecated synchronous "RTSPClient" interface) to not wait for, or handle, a response to the
RTSP "TEARDOWN" command. This avoids the client blocking indefinitely if the server (or its connection) happens to die before
the RTSP response gets sent.
(Note, however: All RTSP client applications should be updated to use the new, asynchronous interface. The old synchronous
interface will not be supported indefinitely.)
2011.03.05:
- Changed the signature of the "OnDemandServerMediaSubsession::seekStreamSource()"
virtual function to add a "streamDuration" field. This field (if >0.0) tells
the implementation how much data to stream before ending with EOF.
Our RTSPServer implementation now uses this to implement finite RTSP ranges
(as specified in the "Range:" header). As with seeking, only some codecs currently
implement this: MP3 audio, WAV audio, and DV video.
- We now support streaming from IMA ADPCM ("DVI4") WAV files.
- When streaming MP3 audio files or indexed MPEG Transport Stream Files, we now compute a more accurate bitrate estimate
(for use in computing RTCP packet frequencies).
2011.01.24:
- Fixed a bug that was accidentally introduced in version 2011.01.10, and which crashes VLC (when VLC is used to play a
"rtsp://" URL). To avoid the bug, VLC should therefore use this version or later.
2011.01.21:
- Fixed a bug in "H264VideoStreamFramer" that was introduced in the last release.
(This affected the "testH264VideoToTransportStream" demo application.) (Thanks to Dunling Li for reporting this.)
- Fixed a minor syntax bug in "H264VideoStreamFramer.cpp" which (fortunately) had not been an actual problem.
(Thanks to Guillaume Le Neindre for the report.)
2011.01.20:
- Added a new demo application "testH264VideoToTransportStream", which takes an H.264 Video input file (named "in.264"),
and converts it to a Transport Stream file (named "out.ts").
(Note that for this conversion to work properly, the input H.264 file must contain sufficient timing information for us to be
able to deduce the frame rate.)
(Thanks to Dunling Li for this suggestion.)
- Changed our RTSP server implementation so that the "SET_PARAMETER" command succeeds (but does nothing) by default.
(Subclasses can redefine its behavior, if necessary.) We also now support the special "*" URL, which designates an
operation on the entire server. (The only commands for which this is allowed are "OPTIONS", "GET_PARAMETER" and "SET_PARAMETER".)
(Thanks to Jeremy Noring for noting that some clients need this.)
2011.01.19:
- Fixed a bug in "OnDemandServerMediaSubsession" that was causing unicast RTSP/RTP
servers to sometimes omit sending the very first packet of a stream. (This seemed
to occur only for servers running on Windows.)
2011.01.10:
- Updated "RTSPClient" so that the new asynchronous interface can handle RTSP URLs that contain a "<username>:<password>@"
before the server host name/address. This had been supported in the old synchronous interface, but when we implemented the
new asynchronous interface, we had forgotten to implement it there as well.
- Made a change to the implementation (but not the default behavior) of "RTSPServer" to allow for the possibility of a subclass
implementing HTTP streaming (using the same HTTP port that we use to support RTSP-over-HTTP tunneling).
2011.01.06:
- We added support for receiving the RTP payload formats "audio/L20", "audio/L24" and "audio/DAT12", as defined in RFC 3190.
We also recognize the new "fmtp:"-line parameters "emphasis" and "channel-order" that this RFC also defines.
(Thanks to Maciej Szlapka for noting that these payload formats had not previously been supported.)
2011.01.05:
- Made a small change to the sanity check introduced to "MultiFramedRTPSink" and "BasicUDPSink" in version 2010.12.05 to
eliminate the possibility of small extra delays accumulating over time. (Thanks to Warren Young for raising this issue.)
- Made a small change to the 'magic values' that are used to implement the "esds" atom for MPEG-4 video in "QuickTimeFileSink".
(I have no idea what these values are supposed to do, but Stu Tomlinson reports that the new values work better for him.)
2010.12.31:
- We now support 'trick play' operations (seeking, fast-forward, reverse play) on MPEG Transport Stream files that contain
H.264 video (rather than just MPEG-2 video, as previously). To support this, the index file format has been extended in a
backwards-compatible way, so that existing index files (for MPEG-2 video Transport Streams) will continue to work as before.
New versions of the "MPEG2TransportStreamIndexer" and "testMPEG2TransportStreamTrickPlay" utilities - and the
"live555MediaServer" - have also been released.
- Fixed a bug in the definition of the "profile_level_id" field in "H264VideoRTPSink". (Thanks to Geoff Cleary for noting this.)
- Change the parsing of RTSP "Range:" headers to allow parameters of the form "clock=" or"smtpe=". (However, we currently don't
interpret parameters of this form; instead, we just ignore them.)
(Thanks to Sebastien Escudier for this suggestion.)
- Fixed "openRTSP" to properly reset internal state before repeating the playing of a stream (if the '-c' (play continuously))
option is used. (Thanks to Anon Sricharoenchai for noting this.)
2010.12.14:
- Oops - there was a serious bug in the 'event trigger' implementation in the previous release.
IMPORTANT: You should upgrade to this new version if you plan to use the 'event trigger' mechanism!
(Thanks to "P.J." for noticing the bug in the previous version.)
2010.12.11:
- Added a new 'event trigger' mechanism to "TaskScheduler". This makes it possible
to define new events that can be handled within the event loop. Unlike other
library functions, events can be 'triggered' (i.e., fired) from a separate thread.
This makes it easier to implement input devices than the old 'watchVariable'
mechanism (which remains).
Also, the "DeviceSource" class - which is a model for how to implement an input
device class - has been significantly improved. It now uses the new 'event trigger'
mechanism. Also, more of it has been implemented, making it clearer where new code
needs to be written.
2010.12.05:
- Significantly improved our support for streaming H.264 video. In particular, "H264VideoStreamFramer"
and "H264VideoStreamDiscreteFramer" (a new class) act like their corresponding MPEG4 versions: "H264VideoStreamFramer" reads
an H.264 Video Elementary Stream byte stream (e.g., from a file), and "H264VideoStreamDiscreteFramer" reads discrete H.264 video
NAL units (i.e., one-at-a-time), e.g., from an H.264 video encoder. (Note that developers no longer need to subclass
"H264VideoStreamFramer".) We also added a new demo application - "testH264VideoStreamer" - for streaming from
an H.264 Elementary Stream Video file via multicast. "testOnDemandRTSPServer" and "live555MediaServer" were also updated to
stream H.264 Video Elementary Stream files.
- Added a sanity check to "MultiFramedRTPSink" and "BasicUDPSink" to allow for the possibility of the system clock jumping ahead
in time, and thereby messing up the calculation of how long to wait before sending the next packet.
(Thanks to Anders Chen for noting this issue.)
- Fixed bugs in "AMRAudioRTPSource" and "QCELPAudioRTPSource" that might sometimes cause an event handler to try to reference
objects that had already been deleted. (Thanks to David Cailliere for detecting the problem with "AMRAudioRTPSource";
it turns out that "QCELPAudioRTPSource" had the same problem.)
2010.11.17:
- Added new a member function "setAuthenticationDatabase()" to "RTSPServer". This allows a server's manager to change
(or disable) authentication at runtime. (Thanks to Jeremy Norling for suggesting this functionality.)
2010.11.10:
- Fixed "openRTSP" to eliminate a recursive call to "shutdown()" if we receive a RTCP "BYE" while in the middle of doing
a RTSP "TEARDOWN" command. (Thanks to David Cailliere for noting this issue.)
2010.11.09:
- The previous release had accidentally included some experimental changes to "H264VideoStreamFramer" that were not (yet)
intended to see the light of day.
2010.11.08:
- Fixed a minor problem with RTSP-over-HTTP support in "RTSPClient" that was causing some servers to complain due to the
"CSeq:" header value not being incremented properly. (Thanks to Kamil Dobkowski for the report.)
2010.11.04:
- Backed out and corrected the change to "RTSPClient" that we made in version 2010.10.22. It turns out that existing RTSP-over-HTTP
servers that return "401 Unauthorized" in response to the HTTP "GET" *do*, in fact, want clients to resend the "GET" command
(with a filled-in "Authorization:" header). However, at least one such server out there closes the TCP connection after
sending back the "401 Unauthorized" response, so we need to send the second "GET" command using a new TCP connection.
(Thanks to Kamil Dobkowski for providing access to a server that illustrated this problem.)
2010.10.28:
- Updated "JPEGVideoRTPSource" amd "JPEGVideoRTPSink" to support optional "Restart Marker Headers" in the outgoing RTP packet.
(We already supported such headers in *incoming* JPEG/RTP packets ("JPEGVideoRTPSource").)
If "type()" (defined by the "JPEGVideoSource" subclass) returns a value in [64,127], then the "JPEGVideoSource" subclass must
also redefine "restartInterval()" to return a non-zero value.
(Thanks to Cristiano Belloni for suggesting this addition.)
2010.10.23a:
- Fixed a bug in the way that "RTSPClient" generates ephemeral RTP/RTCP port number pairs for use when receiving unicast
RTSP/RTP streams. The RTP (even) port was guaranteed not to be in use elsewhere on the same host, but that guarantee was not
necessarily true for the RTCP (next, i.e. odd) port. This version fixes this.
2010.10.23:
- Our server implementation of "RTSP-over-HTTP tunneling" now allows for the possibility of receiving data from the
(Base-64-encoded) initial RTSP command at the same time that we receive the HTTP "POST" command. (This is a possibility because
the client does not wait for a response to the "POST" - because there isn't one.)
2010.10.22:
- Made a minor modification to the way that "RTSPClient" does "RTSP-over-HTTP tunneling". If the initial "GET" request
returns "401 Unauthorized", then we don't resend it (with an "Authorization:" header).
Instead, we continue, as normal, sending the subsequent HTTP "POST" (with an "Authorization:" header).
It's not clear (from the limited documentation on "RTSP-over-HTTP tunneling") which behavior is 'correct', but at least some
servers seem to handle the new approach better.
2010.10.20:
- Made the implementation of 'RTSP-over-HTTP tunneling' in the RTSP server more tolerant of certain buggy clients.
(Thanks to Cristiano Belloni for this suggestion.)
2010.10.15:
- Added server support for RTSP/RTP-over-HTTP tunneling. We added a new "RTSPServer" member function
Boolean setUpTunnelingOverHTTP(Port httpPort);
to (attempt to) set up tunneling on the specified HTTP port number.
We also updated the "testOnDemandRTSPServer" and "live555MediaServer" applications to try to set up HTTP tunneling
on port 80, then port 8000, and then finally port 8080.
2010.10.06:
- Made a small change to "RTSPClient" to make it better handle RTSP servers that
erroneously do not include "CSeq:" lines in their responses.
(Thanks to Sebastien Escudier for this suggestion.)
- Made a minor update to "RTSPClient" to better handle any error in the HTTP "GET" command (if RTSP-over-HTTP tunneling
is being used).
- Updated the "timestampString()" function in "groupsock/GroupsockHelper.cpp" to allow for the possibility of "ctime()" returning NULL.
- Removed the (never fully implemented) "RTSPOverHTTPServer" class.
Instead, RTSP-over-HTTP tunneling will be implemented within the existing "RTSPServer"
code, as that seems to be easier than using a separate class.
2010.09.25:
- Disabled the code for "Groupsock::multicastSendOnly()", because it was apparently causing SSM multicast packets to not be
received by other applications on the same host (at least, for some systems).
2010.09.23a:
- Backed out the "RTSPServer" change that was in the previous release, because of a report that it doesn't work.
2010.09.23:
- Updated "H264VideoFileSink" to take an optional "sprop parameter string" parameter as input. If present, this string is
decoded, and the resulting data (SPS/PPS NAL units) is prepended to the file.
Also, updated "openRTSP" to call "MediaSubsession::fmtp_spropparametersets()", and pass this string when creating a
"H264VideoFileSink".
- Updated "RTSPServer" to ensure that we transmit RTP and RTCP packets over the same interface that is used by the requesting client
(in case the server is multi-homed). (Thanks to David Stegbauer for this suggestion.)
2010.09.22:
- Added a new virtual function "internalError()" to "UsageEnvironment" and "TaskScheduler". This function is called
a small number of times within the library code when an unexepected, 'should not occur'-type error condition occurs.
The default implementation of this function calls "abort()", but subclasses can, of course, redefine this, if desired.
- Updated "RTSPClient::parseTransportParams()" to accept either "port=<num1>-<num2>" or "port=<num>".
(The RTSP specification is ambiguous about whether or not both are allowed.)
- Made sure that calls to "ntohl()" and "htonl()" take (and return) "u_int32_t" rather than unsigned", for improved portability.
(Thanks to Anon Sricharoenchai for this suggestion.)
2010.09.10:
- Added a sanity check to "MediaSubsession::getNormalPlayTime()" so that we ignore any old packet that might
mess up the initial computation of the presentationTime-to-NPT offset following the arrival of new "RTP-Info" data.
This should never happen with our servers (though John Shao Fa - who proposed this check - claims to be seeing it).
We add the check, however, to protect against other servers that might be messing up.
2010.09.03:
- Made sure that various calls to "TaskScheduler::scheduleDelayedTask()" are called with a "int64_t" 'delay in microseconds'
parameter, to avoid possible integer underflow if the system clock gets set back in time.
(Thanks to Sebastien Escudier for reporting this problem.)
2010.08.31:
- Fixed some problems in the way that we implement RTP/RTCP-over-TCP streams that were showing up when we have more than one
such stream sharing the same input source ("reuseFirstSource" == True). (Thanks to John Tam for reporting this.)
2010.08.22:
- Updated the "DarwinInjector" class to use the new, asynchronous "RTSPClient" interface.
2010.07.29:
- Fixed a bug in RTP-over-TCP that was sometimes causing a socket to (attempt to be) read after it had already been closed.
(Thanks to Wilton @ Invent Vision for reporting this bug.)
- Fixed some bugs in the way that RTP reception statistics were being generated and reported. (Thanks to David Cailliere.)
- Added a new config file "config.linux-64bit" that should work better than "config.linux" for building for 64-bit Linux systems.
2010.07.13:
- Updated the "openRTSP" and "playSIP" applications to use the new asynchronous "RTSPClient" interface.
- Made the "readSocket()" routine more bullet-proof against Windows brain damage that was apparently causing problems with
Windows RTSP clients that do RTP-over-TCP.
(Thanks to Kamil Dobkowski for this suggestion.)
2010.07.07:
- Fixed a problem with RTP-over-TCP reception that was causing some RTP-over-TCP streams to not be received properly.
All RTSP client applications that can request/receive RTP-over-TCP should upgrade to this new version.
(Thanks to Kamil Dobkowski for providing a server that we could use to debug the problem.)
- Reinstated the functionality of the "forceMulticastOnUnspecified" flag in the "RTSPClient" "SETUP" command.
(This functionality had temporarily been disabled, because I wasn't sure that it was still used by anyone.
But apparently it is.)
2010.06.22:
- Fixed another bug in the new "RTSPClient" implementation (thanks to Sebastien Escudier); we were not recognizing
"npt=now-" in "Range:" headers.
- Fixed a bug in "openRTSP" (reported by Kenneth Ljungh). We were closing output files before issuing a RTSP "TEARDOWN" command.
This problem was exposed only with the new "RTSPClient" implementation, because it reenters the event loop (thereby possibly
handling incoming RTP packets) after the sending of the "TEARDOWN", before it gets handled and responded to.
We have now fixed the "openRTSP" code to not close output files until after the RTSP "TEARDOWN" has been completed.
2010.06.18:
- Fixed a bug in the new "RTSPClient" implementation (reported by Sebastien Escudier) - that was causing problems
when streaming from some RTSP-enabled video cameras.
2010.06.16a:
- Made "RTSPClient"s parsing of "Transport:" headers more bullet-proof against those sent by some servers
(including, apparently, some recent versions of VLC's built-in RTSP server) that include a "client_port=" field,
but no "server_port=" field. (In this case, we assume that the server port is the same as the client port.)
2010.06.16:
- Fixed another bug in the new "RTSPClient" implementation of "GET_PARAMETER".
(Thanks to Denis Charmet for reporting this.)
- Made "RTSPServer::RTSPClientSession::handleAlternativeRequestByte1()" more bullet-proof against an alleged bug noted by
Jeremy Noring. (The actual bug hasn't been located, but this change apparently stops it from causing problems.)
2010.06.15:
- Removed the "blockUntilReadable()" function, because it's no longer needed, now that all socket reads are asynchronous.
This means that "readSocket()" no longer calls "select()", which should improve the performance of applications.
- Improved the processing of RTP/RTCP/RTSP-over-TCP (possibly fixing some bugs in the process).
- Fixed bugs in the new "RTSPClient" implementation of "GET_PARAMETER" and "SET_PARAMETER".
(Thanks to Denis Charmet for reporting this.)
2010.06.11:
- Fixed some potential memory access errors in the previous version of "RTSPClient".
- Removed code from "RTSPClient" that was supposed to deal with buggy (Microsoft?) servers, but which in reality was causing
clients to not know the duration of time-bounded streams properly.
- Modified the new RTSP client implementation of "RTSP-over-HTTP" to make it more consistent with the old implementation.
(Doug Porter reported a problem with the implementation in release 2010.05.29.)
- "AMRAudioSource" (and therefore its subclasses also) were not redefining the "MIMEtype()" virtual function. Fixed this.
(Thanks to Adam Mich for reporting this.)
- Fixed a minor problem that was causing some "UsageEnvironment"-allocated tables not to get deleted under some circumstances.
2010.05.29:
- Made a major change to the interface and implementation of "RTSPClient", to make it perform operations asynchronously
- i.e., without blocking. Each operation that performs a RTSP command now takes a 'response handler' function as parameter.
The operation returns immediately, but the 'response handler' function will get called later, when a response arrives
(or if an error occurs).
For backwards compatibility, the old 'synchronous' interface still remains, and is implemented using the new 'asynchronous'
interface. (However, the old 'synchronous' interface should not be used for new applications, and it will likely be removed
in a few months.)
For now, the demo application "openRTSP" still uses the old interface, but will be rewritten over the next few weeks to use the
new "RTSPClient" interface.
- Modified the "TaskScheduler" definition yet again, because it was too complicated. There's now just one virtual function
for setting/clearing socket handlers:
"virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData) = 0;"
where "conditionSet" is a combination of SOCKET_READABLE, SOCKET_WRITABLE, and SOCKET_EXCEPTION.
For backwards compatibility, the existing "turnOnBackgroundReadHandling()" and "turnOffBackgroundReadHandling()" functions
are retained, but are now implemented using "setBackgroundHandling()".
See "UsageEnvironment/include/UsageEnvironment.hh" for details.
2010.05.28:
- Updated the previous revision of "TaskScheduler" to add two more new virtual functions
"turnOnBackgroundExceptionHandling()" and "turnOffBackgroundExceptionHandling()",
because it turns out that Windows needs them for checking on a failed remote "connect()"
(behaving differently from Posix, which requires only select()ing the socket for
writing, not an error).
2010.05.27:
- Updated "TaskScheduler" (and our supplied example subclass "BasicTaskScheduler") to include new virtual functions
"turnOnBackgroundWriteHandling()" and "turnOffBackgoundWriteHandling()". These are the same as the "Read" versions,
except that they are for checking when a socket becomes writable. (They will be used to implement the new, upcoming
'asynchronous' implementation of "RTSPClient".)
We also modified the signature of "setResultErrMsg()" to take an optional "err" parameter. (If non-zero, this will be used
instead of "getErrno()".)
- Added a "config.iphoneos" (for cross-compiling on a Mac for the iPhone). (Thanks to Mark Vasilkov.)
2010.04.09:
- Fixed a bug in the way that "AMRAudioRTPSource" reimplements "hasBeenSynchronizedUsingRTCP()".
(Thanks to Ralf Globisch for reporting this bug.)
- Increased "SegmentQueueSize" in "MP3ADU.cpp" from 10 to 20, to allow for some unusually-VBR MP3 files that neeed this.
(Thanks to Dirk Raffel for reporting this problem.)
- Changed the implementation of "parseRangeHeader()" in "RTSPCommon.cpp", in preparation for upcoming changes to "RTSPClient".
2010.04.01:
- Fixed the "openRTSP" code so that it no longer restricts the play time duration (using the "-d" option), because there is no
no longer any practical limit on the duration that gets passed to "TaskScheduler::scheduleDelayedTask()"
(because it is microseconds in 64 bits).
(Thanks to Brad Thomas for this suggestion.)
- Removed some obsolete (and unused) code from the "RTSPClient" implementation, in preparation for a major reworking of this code.
2010.03.16:
- Made more improvements to "QuickTimeFileSink". (Thanks to Wolfgang Breyha.)
2010.03.15:
- Fixed a bug in the Transport Stream file indexing mechanism that was preventing index files from properly being generated
for some Transport Stream files. (We sometimes weren't analyzing Program Association Tables correctly.)
- Removed the hack that we introduced in version 2009.11.27, because we have now fixed the bug that made that necessary.
- Removed the "RTPOverTCP_OK" hack from "RTPInterface.cpp", because it's no longer needed.
2010.03.14:
- Fixed the RTSP server implementation so that - when streaming via RTP-over-TCP - it can now handle RTSP commands after the
first "PLAY". (This fixes a long-standing bug.)
- Updated "QuickTimeFileSink" to support writing files larger than 2GB. Also fixed a bug involving "esds" atoms for MPEG-4.
(Thanks to Wolfgang Breyha for this patch.)
- Fixed a bug in the way that RTCP "SDES" items are constructed. (Thanks to Jeremy Norling for bringing this to our attention.)
- Added a sanity check to the string version of "BasicUsageEnvironment::operator<<()", to check for a NULL string input.
(Thanks to Paulo Rogerio Panhoto for this suggestion.)
2010.03.08:
- Fixed a rare bug that could sometimes cause RTSP clients to reuse the same (ephemeral) port number.
(Thanks to Andro Debevere for reporting this.)
- Made changes to "config.armlinux", suggested by Rafael Carre.
- Removed a "|| defined(__CYGWIN32__)" test from "groupsock/GroupsockHelper.cpp", because it's no longer needed.
(Cygwin has apparently now fixed the bug that made that necessary.)
(Thanks to Tatterdemalian Anzulovic for reporting this.)
2010.02.10:
- Fixed a possible 1-byte overflow in "RTSPClient::setupMediaSubsession()". (Thanks to Martin Bonnin for reporting this.)
- Make "parseCLine()" a bit more robust against certain technically illegal, but still parseable SDP "c=" lines.
(Thanks to Aurelien Nephtali for this suggestion.)
2010.02.09:
- Fixed the way that "RTSPClient" operations handle the "timeout" parameter.
We now make the socket blocking afterwards (having made it non-blocking beforehand).
(Thanks to Jeremy Noring for this patch.)
2010.01.22:
- Changed the implementation of "Socket::changePort()" once again, beause it was reported that the change made in version
2010.01.15 didn't work. Note, however, that this change also introduces a new function
virtual void moveSocketHandling(int oldSocketNum, int newSocketNum) = 0;
to the "TaskScheduler" API. We have implemented this for "BasicTaskScheduler". If you implement your own subclass of
"TaskScheduler", then you will need to implement this new function as well.
2010.01.16:
- Added ""#include <stdio.h>" to "groupsock/NetInterface.cpp". This was tripping up some people.
(Thanks to Ben Hutchings for noticing this.)
2010.01.15:
- Changed the implementation of "Socket::changePort()" to call "bind()" directly, rather than closing the socket and reopening a
new one. That old implementation sometimes caused the socket number to change, which messed up our event loop.
(Thanks to Rob Krakora for noticing this.)
- Improved the implementation of DV video streaming (introduced in the previous release) - in particular,
to implement "DVVideoRTPSource".
2010.01.13:
- Added support for streaming/receiving DV video via RTP (using the RTP payload format defined in RFC 3189.
(Thanks to Ben Hutchings for his help.)
2010.01.11:
- Increased the default "FileSink" buffer size in "openRTSP" from 20000 to 100000, because the previous limit was being bumped into
too many times.
- Added #include "GroupsockHelper.hh" to "DVVideoStreamFramer.cpp", because it defines "gettimeofday()".
2010.01.09:
- In the various demo applications (in "testProgs/"), we changed the calls to "abort()" back to "exit(1)", because we want
"abort()" to be used only for serious (unexpected) errors; not things like bad command-line arguments.
- Updated the RTSP server implementation to make session ids random (and 8 (hex) digits long), to conform to the RTSP specification.
(Thanks to Guy Bonneau for this suggestion.)
2010.01.07:
- Fixed a bug in "parseGeneralConfigStr()" (it was mistakenly returning an extra byte).
- A few places in the code we called "exit()" if we encountered an unexpected error. By request, these have now been changed to
"abort()".
- Made the "fSDPLines" member variable (in both "OnDemandServerMediaSubsession" and "PassiveServerMediaSubsession") "protected"
rather than "private". This allows subclasses to - if they wish - delete and NULL "fSDPLines" each time a client connects, in
case the stream's SDP parameters have changed.
2009.11.27:
- Temporarily hacked the RTSP server code to not include "GET_PARAMETER" as an available option in the response to the "OPTIONS"
command. This will stop VLC from using "GET_PARAMETER" as a client 'liveness' indicator. This is something that we don't
need, because we already use clients' RTCP "RR" packets as a 'liveness' indicator, and because sending "GET_PARAMETER" over a
RTP-over-TCP session causes problems with our current implementation. (This hack will be removed when we fix the problem with
RTP-over-TCP.)
2009.11.12:
- Made "BasicTaskScheduler::DelayQueue.cpp" more robust against an apparent compiler error on some platforms (e.g., Mac OS X)
that was leading to "select() fails: Invalid argument" errors.
- Added a new compilation configuration file: "config.avr32-linux". (Thanks to Jorge Munoz Castiner.)
- Made some minor changes to "groupsock/GroupsockHelper.cpp", "liveMedia/InputFile.cpp" and "liveMedia/OutputFile.cpp"
to make these files compile (or compile better) for WinCE. (Thanks to Pierre Ynard for these fixes.)
2009.09.28:
- Added an optional "timeout" parameter to "DarwinInjector::setDestination()". (Suggested by Jeremy Noring.)
- Added support for receiving the "text/T140" RTP payload format. (Suggested by Pierre Ynard.)
2009.09.21:
- Added patches proposed by Ben Hutchings to (i) improve the top-level Makefile; (ii) build better static libraries (on
Linux, FreeBSD, and Mac OS X); (iii) have RTSP servers set "b=AS:" lines in their SDP (and set an appropriate socket send buffer
size), and (iv) have RTSP (and other SDP) clients interpret the "b=AS:" line (if present) to set the socket receive buffer.
- Changed two source files in the "groupsock" project to use the (current standard) <sstream> #include file.
- Increased RTSP_PARAM_STRING_MAX to 200 (request by Stuart Rawling)
2009.09.04:
- Fixed "BasicTaskScheduler"s workaround to a Windows bug (thanks to Vityusha Vinokurov).
- Fixed "DelayQueue::synchronize()" to allow for the possibility of the system clock being reset back in time.
(Thanks to Sebastien Escudier for pointing out this issue.)
- Made "H264VideoRTPSink::auxSDPLine()" "protected:" rather than "private:" (following a request from Stuart Rawling)
2009.07.28:
- Updated "QuickTimeFileSink" to add a "stss" atom for video streams, following a suggestion by Gerardo Ares.
(At present we just 'guess' which video 'samples' (frames) are 'key frames', so this might not work properly on some
video streams.)
- Modified the "config.uClinux" configuration file, following a suggestion by Chetan Raj.
- Changed "RTSPClient"s implementation of the RTSP "TEARDOWN" command to always act as if the command succeeded, regardless of
the actual response from the server (because, from the client's point of view, the session has ended).
(This overcomes a potential memory leak, pointer out by Stuart Rawling.)
2009.07.09:
- Modified the RTSP server implementation to - for streams where there is a known duration - always include a range end time
in the RTSP "PLAY" response, even if the client did not specify one in the "PLAY" request. This allows VLC's client
'trick play' to (mostly) work.
- Updated "MediaSession::initiate()" to eliminate a possible memory leak if we get an error in socket creation.
(Thanks to Denis Charmet.)
- Made a minor change to "MultiFramedRTPSink" to make monitoring/debugging easier. (Thanks to Guy Bonneau.)
- Begun adding support for DV video. However, this implementation is still incomplete. DO NOT USE IT!
2009.06.02:
- Updated the MPEG Transport Stream multiplexor implementation to allow for H.264 video. (Thanks to Massimo Zito.)
- Updated "MultiFramedRTPSink" to allow for subclasses for RTP payload formats (such as DV, coming soon) that impose
a granularity on RTP fragment sizes.
2009.04.20:
- Fixed "BasicUsageEnvironment::getErrno()" to always (under Windows) return
"WSAGetLastError()" (and to just ignore the "errno" variable>.
Also fixed a few places in the code where we were still using "errno"
instead of calling "getErrno()"
2009.04.07:
- Changed many "char*" variables to "char const*" to eliminate possible compiler warnings.
(Thanks to Sebastien Escudier for pointing out this issue.)
2009.04.06:
- Modified our Windows-only version of "gettimeofday()" so that it now returns times based on the proper epoch.
(Thanks to Patrick White for this suggestion.)
- Created a new config file for 64-bit Solaris, and renamed the old "config.solaris" file to make it
clear that it's for 32-bit Solaris only. (Thanks to Michael Skaastrup.)
- Modified "config.mingw" to add "-DLOCALE_NOT_USED" to the "COMPILE_OPTS =" line. (The VLC folks seem to want
this.)
- Made a minor change to some win32-specific code in "RTSPClient.cpp" that the VLC folks seem to like.
(However, "RTSPClient" is about to undergo a major overhaul (for asynchronous I/O) anyway...)
- Made a small change to "mediaServer/DynamicRTSPServer.cpp" to eliminate compiler warnings on some platforms.
2009.03.22:
- Updated "MediaSession::initiate()" to make the selection of ephemeral client
port numbers (for RTP and RTCP) more robust, and to eliminate the possibility of
the same port numbers accidentally getting chosen more than once by different
clients running on the same host. (Thanks to Guido Marelli and others for helping
track down this issue.)
2009.02.23:
- Changed the way in which 'trick mode' transport streams are generated, so that each
video I-frame is included in the output Transport Stream no more than once.
This means that now - for low scale values - the output frame rate, and bit rate,
will be les than that of the original file. (Beforehand, we maintained the same
frame rate, which meant that - because each output frame is an I-frame - the output
stream's bit rate was always significantly larger than the original. This caused
problems for some clients.)
- Changed the 'client liveness' checking code in the "RTSPServer" implementation so that it deletes the
"RTSPClientSession" object even for multicast streams.
- Made a minor fix to an error report in "RTSPClient". (Thanks to Igor Milavec.)
2009.02.13:
- Changed calls to the "Locale()" constructor to use an explicit variable name (rather than an anonymous
declaration), because some compilers weren't handling the anonymous declaration properly.
(Thanks to Steven Kramer for noticing this.)
- Improved the "RTSPServer" definition and implementation to make it easier to subclass the
"RTSPServer::RTSPClientSession" class (e.g., to add a custom implementation of the "SET_PARAMETER" command).
Also added an iterator class for iterating over the "RTSPClientSession" objects within a "RTSPServer".
- Make "MediaSubsession::parseSDPAttribute_framerate()" a little more robust.
(Thanks to Shawn Van Every for the suggestion.)
- Improved "BasicUsageEnvironment0::reportBackgroundError()" (thanks to Matt Schuckmann)
- Fixed a bug in the "AVIFileSink" code (thanks to Pramod Bhadwat for reporting this).
2009.01.26:
- Updated the header file for "rtcp_from_spec.c" to make the call to "exit()" a noop.
(Thanks to Chris Silvers for raising this issue.)
- Changed the definition of "RTSPClientSession" (in "RTSPServer") to make it protected (and also to make its
command handler functions protected and virtual), to allow developers to subclass it (to change the
implementation of some commands).
(Thanks to Yedidia Amit for suggesting this.)
- Fixed a minor bug in "scheduleNextQOSMeasurement()" (in the "openRTSP" implementation).
(Thanks to Gabriele De Luca for noticing this.)
2008.12.20:
- Removed - from "MultiFramedRTPSource.cpp" - the historical sanity check for bizarrely delayed packets.
Accepting such bizarro packets causes problems in the code; it's best not to accept them at all.
- Added to "FramedFilter" a new public function "detachInputSource()" that sets the filter's input source
to NULL. This is useful if you want to close the filter independently of closing its input source.
(Thanks to Alex Cichowski for this suggestion.)
- Modified the header file for "MultiFramedRTPSink" to make its implementation of the "stopPlaying()" virtual
function public. (Thanks to Guy Bonneau for this suggestion.)
- Changed "MediaSession::initiate()" to make the port number selection mechanism (for unicast streams) more robust.
(Thanks to Pierre Ynard for this suggestion.0
2008.11.13:
- Fixed an obscure bug in "BasicTaskScheduler::SingleStep()" in which the call to "handleAlarm()" would
(on rare occasions) modify the set of read handlers in such a way as to be inconsistent with the result of
the earlier call to "select()". We fixed the bug by moving the call to "handleAlarm()" after the socket
handler call. (Thanks to Sigismondo Boschi for tracking down this bug.)
- Fixed a bug in "parseRTSPRequestString()" that could cause a crash when parsing certain weird, non-compliant
requests. (Thanks to Sebastien Escudier for reporting this.)
2008.11.04:
- Fixed a bug in "RTPInterface" that was sometimes causing sockets not to be reclaimed properly by a
RTSP server when streaming RTP/RTCP-over-TCP. (Thanks to Ralf Globisch for tracking this down.)
- Changed the RTSP 'start time' parameter from "float" to "double", to allow for
accurate 'start times' that are very large - e.g., Unix 'epoch' times.
(Thanks to Morgan Toervolt for the suggestion and patch.)
- Made some simplifications to the 'reception stats' code in "RTPSource".
(Thanks to Guy Bonneau for this suggestion.)
- Fixed a minor bug in "QuickTimeFileSink". (Thanks to Pramod Bhagwat.)
2008.10.07:
- Added an optional "timeout" parameter (in seconds) to the 'connecting' RTSP
client commands. (Thanks to Sebastien Escudier for this patch.)
- Increased the size of a "DummySink"s buffer in "MPEG1or2FileServerDemux", to make
it large enough for any PES packet.
- Fixed a minor memory leak in the "createNew()" functions for
"AVIFileSink" and "QuickTimeFileSink" if the output fid did not get created.
(Thanks to Mehmet Ozgul for noting this.)
- Fixed a couple of spelling errors, removed some unnecessary whitespace,
and updated the address of the FSF in the LGPL preamble (thanks to Erik Hovland).
2008.09.02:
- Fixed a minor bug in "RTSPServer". (Thanks to Renato Mauro.)
- Minor improvements fo "FileSink" and "MP3FileSource". (Thanks to Pramod Bhagwat.)
- Changed the default "reclamationTestSeconds" parameter (in "RTSPServer" and "DynamicRTSPServer") from 45 seconds
to 65 seconds, because 60 seconds is the default timeout value expected by (broken) clients that send
RTSP commands rather than RTCP "RR" reports to indicate liveness.
2008.07.25:
- Minor bug fix to "MPEG2TransportStreamFramer" (reset "fTSPCRCount" in "doStopGettingFrames()").
(Thanks to Qiujian Shu for reporting this bug.)
- Modified the previous changes to "QuickTimeFileSink" and "AVIFileSink" so that the
"createNew()" functions return NULL if the output file cannot be opened.
2008.07.24:
- Changed "MultiFramedRTPSource" to handle the very first packet that we receive as
if there were packet loss beforehand. This ensures that we correctly discard any
initial packets that we receive that occur after the start of a (multi-packet) frame.
- Fixed "QuickTimeFileSink" and "AVIFileSink" to close the output file (if it's not stdout or stderr) in the destructor.
2008.07.22:
- Fixed "MPEG2TransportStreamMultiplexor" to use an appropriate stream for our SCR, even if the input contained
its own Program Stream Map.
- More minor changes to the code to make Erik Hovland's code-checking tools happy.
2008.07.06:
- Corrected one of Erik Hovland's memory leak fixes made to the previous revision.
2008.07.05:
- Fixed some memory leaks - and several other mostly cosmetic fixes.
(Thanks to Erik Hovland for noticing these.)
2008.06.26:
- Fixed a bug in "openRTSP" that was sometimes causing an incorrect "Range:" header
to be sent in "PLAY" requests.
2008.06.25:
- Fixed a bug in the headers sent for the RTSP "GET_PARAMETER" and "SET_PARAMETER" commands.
(Thanks to "beilyzhang (at) hotmail" for this report.)
2008.06.05:
- Renamed the "ourSourceAddressForMulticast()" function to the less confusing and more explanatory
"ourIPAddress()".
- The "RTSPClient" change that was made in 2008.04.09 to accommodate multicast
streams apparently broke (some?) unicast streams. This has now been fixed.
- Updated "RTSPClient" to handle weird servers that include a "Content-Length:" header
in the response to the RTSP "SETUP" command. (If we see such a header, we skip over
the data referred to in the header.) (Thanks to Kristian Soerensen for this suggestion.)
- Changed the parsing of lines in "RTSPClient" so that it now accepts \r or \n alone
at the end of each line. (\r\n is preferred, but the standard also allows \r or \n)
(Thanks to David Schueler for this suggestion.)
2008.05.12:
- Made a change to "RTCPInterface" to ensure that "turnOffBackgroundReadHandling()" is called on a socket
as many times as "turnOnBackgroundReadHandling()". Apparently some versions of Windows get upset if this
doesn't happen. (Thanks to Ken Seo for the suggested fix.)
- Fixed a bug in "H263plusVideoStreamParser". (Thanks to Andrey Latin.)
- Added more sanity checking to "JPEGVideoRTPSink".
2008.04.09:
- Corrected a type-related bug in "RTPInterface::handleRead()". (Thanks to Brain Lai for noting this.)
- Fixed a bug in "RTSPClient" that would prevent RTCP "RR" reports from being sent to
the correct multicast address when we are receiving a multicast stream. (Thanks to Changjin Liu for noticing this.)
2008.04.03:
- Fixed a bug that was introduced in the "2007.12.27" release. The "timeout" parameter to the call to
"readSocket" in "SocketDescriptor::tcpReadHandler()" in "RTPInterface.cpp" needed to be initialized
(to zero) first. (Thanks to Lodewijk Loos for alerting us to this problem.)
- Added a new config file "config.bfin-linux-uclibc", and renamed "config.bfin_uclinux" as "config.bfin-uclinux".
(Thanks to Mike Frysinger.)
2008.02.08:
- Added a hack (suggested by "Romain") to "MPEG2TransportStreamFramer" to (perhaps)
produce more accurate per-transport-packet duration estimates for wildly VBR streams.
- Updated "MPEG2TransportStreamMultiplexor" to support the addition of MPEG-4 Audio or Video Elementary Streams.
- Updated "RTSPOverHTTPServer.cpp" (a work in progress) so that it complies properly for some versions of
Visual Studio on Windows. (Thanks to Eric Flickner for noting this.)
2008.01.19:
- Corrected the "getNormalPlayTime()" function - introduced in the previous release - to allow for 'trick play'
scale factors other than 1.
2008.01.18:
- Added a new member function
float MediaSubsession::getNormalPlayTime()
which - given a stream's current presentation time - returns the "Normal Play Time".
This function is useful for RTSP streams.
- Added support for a "a=control:" URL specified in the SDP description at the session level.
2008.01.04:
- Changed the "RTSPClient" timeout - introduced in the previous release - from
5s to 30s.
- Added support for setting and returning the RTSP session start time (as well as the end time).
(This eliminates the need for the "live-starttime.patch" file that VLC was using.)
- Updated some of the system-specific configuration files, to eliminate the need for many of the patches that
the VLC developers added to their code.
2007.12.27:
- Added a 5s timeout to the "RTSPClient" code that checks for RTSP responses.
This mirrors a change that was already being done to VLC's copy of the code.
(This is still a short-term fix, until the "RTSPClient" code is rewritten to
properly use asynchronous I/O, using the event loop.)
- Added a timeout to the "readSocket()" call in "SocketDescriptor::tcpReadHandler()" in "RTPInterface.cpp",
to handle reading RTP-over-TCP data. This allows for the possibility of non-cooperative RTSP clients.
(Thanks to Peter Leese for this suggestion.) This is probably not a complete solution;
more thought is needed...
2007.12.07:
- Fixed "H2633plusVideoFileServerMediaSubsession" to properly use a dynamic RTP payload type, rather than the
static type 34 (which is reserved for the now-obsolete old "video/H263" RTP payload format).
2007.12.06:
- Updated "JPEGVideoRTPSource" to take optional 'default width' and 'default height' parameters.
These parameters can be set by fields in the SDP description, and can be used to specifiy unusually
large frame widths and/or heights. (Thanks to Andrey Filippov.)
2007.11.18:
- Fixed a couple of memory leaks in "DarwinInjector". (Thanks to Eyal Beit-Halachmi for noting these.)
- Removed old 'backwards compatibility' stuff from "FramedSource". (Noone should be relying upon this any more.)
- Fixed a bounds-checking error in "parseRTSPRequestString()" caused by an int vs. unsigned problem.
(Thanks to Luigi Auriemma for noting this.)
- In "RTSPClient.cpp", fixed a couple of "unsigned" vs. "int" nits. (Thanks for Brain Lai for noting this.)
2007.11.01:
- Several of the options to "openRTSP" have now been changed, with two new options added:
-s <initial-seek-time>
-z <scale>
See the "openRTSP" documentation <http://www.live555.com/openRTSP/> for details.
- Fixed a bug in the way that "MPEG4VideoStreamDiscreteFramer" parses 'config' information (for inclusion in
the stream's SDP description). (Thanks to Nicola Bova for helping to identify this bug.)
- Eliminated a potential memory (and socket) leak when allocating server RTP,RTCP socket pairs.
(Thanks to David Pan for reporting this.)
- Updated "ByteStreamFileSource" to treat a 0-byte file read the same as EOF.
- Ensure that we have reasonable OS buffering for writes on non-blocking sockets.
2007.08.03a:
- Removed a debugging printf() that had been left in by mistake. (Thanks to Massimo Zito for noticing this.)
2007.08.03:
- Updated the "RTSPServer" implementation to work better on systems with more than one IP address.
The server will now include - in its RTSP responses - the IP address on which the corresponding incoming request
was received.
2007.07.25:
- Added some sanity checks to various "MediaSink" subclasses, in case "fSource" is NULL.
(Thanks to Andrey Kaminsky for noting one of these.)
2007.07.10:
- Made sure that "MPEG2TransportStreamFramer"s estimate of the average duration of each Transport Packet
gets updated correctly after each 'seek' operation. (Thanks to Massimo Zito for suggesting this.)
- Fixed a bug in "MPEG2TransportStreamFromESSource" that was causing presentation
timestamps to not be generated correctly. (Thanks to Massimo Zito for noticing this.)
2007.07.01:
- Fixed a bug in "RTSPServer" and "RTSPClient" that would cause problems when streaming
files whose names have spaces in them.
- Fixed a bug in "OnDemandServerMediaSubsession::deleteStream". (Thanks to Igor Bukanov.)
- Make the sockets for "RTPSource", "RTCPInstance" and "BasicUDPSource" non-blocking, even though they will be read
from only asynchronously, when packets arrive. The reason for this is that, in some OSs, reads on a blocking
socket can (allegedly) sometimes block, even if the socket was previously reported (e.g., by "select()") as
having data available. (This can supposedly happen if the UDP checksum fails, for example.)
(Thanks to Marc Neuberger for pointing this out.)
- Fixed a bug in "MPEG2TransportFileServerMediaSubsession.cpp" that was causing 2x
fast-forward to fail. (Some debugging code had been left in by mistake.)
2007.05.24:
- Modified "setupDatagramSocket()" to better handle setting "ReceivingInterfaceAddr" when creating a socket
to be used to send/receive multicast.
- Made a couple of minor changes to overcome some compilation errors that some people were apparently seeing.
2007.05.23:
- The RTSP server now includes the "source=" parameter in the response to a RTSP "SETUP" command.
This works around a bug in QuickTime Player that would cause it to not send RTCP "RR" packets
(when playing a unicast stream, and running on Mac OS X). (Thanks to Dave Singer et al at Apple for tracking
down this problem.)
- The RTSP server implementation no longer terminates the session if it returns 400 or 405 errors.
2007.04.24a:
- Fixed a problem in the new "RTSPOverHTTPServer" code that was causing some people compilation problems.
2007.04.24:
- Fixed a typo in "testOnDemandRTSPServer.cpp". (Thanks to Nils Grundback for noticing this.)
- Modified the signature of "RTSPServer::specialClientAccessCheck()" (defined in the previous revision) to add
a new "clientAddr" parameter (a "struct sockaddr_in"), to allow special access checking based on clients' IP
address.
- Make sure that the locale is set to "POSIX" when calling "toupper()" or "tolower()" on human-supplied strings.
(Thanks to Ismail Doenmez for noting this.)
2007.04.20:
- Modified "MPEG2TransportStreamMultiplexor" to set the "discontinuity_indicator" flag for the first
"adaptation_field" in the output Transport Stream.
- Changed "AMRAudioRTPSource" to more accurately report whether/when an interleaved frame's timestamp has
been synchronized using RTCP.
(Thanks to David Bertrand for this patch.)
- Made to a small fix to the previous revision's support for multicast streaming of raw UDP (nonstandard)
- Added a virtual function to "OnDemandServerMediaSubsession" for closing the stream source.
Subclasses can redefine this, if they wish, to do something smarter. (Thanks to Igor Bukanov for this patch.)
- Added support to "RTSPServer" for optionally performing special per-client access control, beyond the
standard Digest Authentication method. (Thanks to Igor Bukanov for this patch.)
- Made a minor optimization to "Groupsock.cpp". (Thanks to Maxim Petrov for this suggestion.)
- Added an initial implementation of RTSP-over-HTTP at the server level (it was already supported at the client level).
(Note: This code has not yet been completed, and doesn't yet work, so don't try to use it.)
2007.02.20:
- Updated "RTSPServer" to support multicast streaming of raw UDP streams (nonstandard).
(Thanks to Aesmund Grammeltvedt for this modification.)
- Made "RTSPClient" a little more robust in case the TCP connection fails.
- Made "RTPSink::rtpmapLine()" virtual (as requested by Andrew Voznytsa).
- Removed an archaic (no longer used) declaration in "groupsock/include/Groupsock.hh".
- Added an optional "allowKasennaProtocol" parameter to "RTSPClient::describeWithPassword()"
(similar to "RTSPClient::describeURL()"). (Thanks to Igor Bukanov for this suggestion.)s
2007.01.17:
- Fixed a bug that would cause the "MPEG2TransportStreamIndexer" application to fail when run on a big-endian
architecture.
- Added a new class "H264VideoFileSink", that prepends each incoming H.264 NAL unit with the prefix 0x000001,
before writing it to the file. Also updated the "openRTSP" code to use this, when receiving H.264/RTP streams.
(Thanks to Chris Kuiper for contributing this.)
- Added a temporary #ifdef to "GroupsockHelper.cpp" to work around a compliation problem when building
for Cygwin.
2007.01.11:
- Improved the "MPEG2IndexFromTransportStream" class to recogize Transport Stream
PAT and PMT (tables). This in turn makes the "MPEG2TransportStreamIndexer"
utility more robust.
- Fixed a minor bug in "MPEG2TransportStreamFromESSource".
2007.01.09:
- Added RTSP server support for 'trick play' operations on MPEG-2 Transport Stream
files. This requires the presence of a ".tsx" index file for each ".ts" file.
(This functionality will shortly be documented on the LIVE555 web site,
and announced on the "live-devel" mailing list.)
- Improved the performance of asynchronous file reading in "ByteStreamFileSource".
(Thanks to Aesmund Grammeltvedt for this suggestion.)
- Added "-D_FILE_OFFSET_BITS=64" to the "COMPILE_OPTS" line for each of the Linux config files, in order to
alleviate possible problems with I/O on large files.
2006.12.31:
- We now implement "ByteStreamFileSource" on Windows using synchronous file reads,
by default. I had thought that Windows XP had fixed the problem - present in
earlier versions of Windows - whereby open files are not treated as select()able
sockets. But apparently the problem is still there.
- Added code that will - probably in the next release, very soon - support server
'trick mode' operations on MPEG-2 Transport Stream files. At present, we have two
new applications - in the "testProgs" directory - that help support this:
"MPEG2TransportStreamIndexer" (to create a special index file for a Transport Stream
file), and "testMPEG2TransportStreamTrickPlay" (to generate a new Transport Stream
file that simulates a 'trick play' operation performed on the original Transport
Stream file). See my forthcoming post to the "live-devel" mailing list for more
details.
- Fixed a bug in the Base64 encoding routine. (Thanks to Sebastian Gracias for reporting this.)
2006.12.08:
- Made sure that each TCP socket used by a "RTSPserver" is non-blocking, so that a slow or hanging client
cannot hang a server. (Thanks to "jers (at) inwind.it" for this suggestion.)
2006.11.16a:
- Oops - fixed a problem with the packaging of the new "mediaServer" code.
2006.11.16:
- Included the code for the new "LIVE555 Media Server" application
(in the "mediaServer" subdirectory). This is a complete RTSP/RTP server, that
will serve any appropriately-formatted file that resides in the current directory.
(More documentation will follow.)
- Updated "QuickTimeFileSink" to support H.264 video in ".mov" or ".mp4" output files.
(Thanks to David Arnold for this.)
- Fixed a potential reference-count related bug in "OnDemandServerMediaSubsession". (Thanks to Jers.)
- Changed the "RTSPClient" constructor from "private:" to "protected:".
2006.10.27:
- "RTSPClient" now recognizes the "Content-Base:" header in RTSP "DESCRIBE" responses.
(Thanks to Derk-Jan Hartman for this suggestion.)
- Updated "MultiFramedRTPSource" to avoid excessive recursion (and thus potential
stack overflow) in some cases when receiving streams that have packet loss.
(Thanks to Erwin Beckers for raising this as an issue.)
- Updated "RTPSink" and "MultiFramedRTPSink" to ensure that a proper RTP timestamp
is set in the RTSP "RTP-Info" header that follows a "PAUSE", and that this timestamp
gets used in the next outgoing RTP packet. (Thanks to David Bertrand for this suggestion.)
- Changed the special implementation of "gettimeofday()" for Windows to return
more accurate results. (Thanks to David Arnold for this change.)
2006.10.18a:
- A minor update to the "MultiFramedRTPSink" change made in the previous release.
2006.10.18:
- Added support for adding optional RTP padding bytes to "MultiFramedRTPSink".
(Thanks to Victor Kozhuhov for this suggestion.)
2006.10.12a:
- Backed out the change that we made in the 2006.09.18 release: We now don't attempt
to setsockopt() SO_REUSEPORT and IP_MULTICAST_LOOP on Windows. (Dave Arnold reports
that doing so leads to UDP packets with TTL=1.)
2006.10.12:
- Fixed a rare memory leak in "MultiFramedRTPSource". (Thanks to David Bertrand for this fix.)
- Made "RTSPServer::lookupServerMediaSession()" virtual, to allow for future
subclasses of "RTSPServer" that - for example - create and add "ServerMediaSession"s
dynamically (depending on whether or not the named file exists).
- Added a "rtspURLPrefix()" member function to "RTSPServer". This returns the
"rtsp://" URL prefix that's common to all of the server's "rtsp://" URLs.
2006.10.07:
- The demo applications (in the "testProgs" directory) that stream MPEG-4
Elementary Stream video files now use a file name "test.m4e" rather than "test.m4v".
This is to avoid confusion, because Apple has coopted the ".m4v" suffix for
MPEG-4 (audio+video) files, which are different.
- Made "MPEG4VideoStreamFramer" more bullet proof against some non-standard MPEG-4 video data.
(Thanks to Maxim Petrov for this suggestion.)
2006.10.05:
- Fixed a minor bug in "MPEG2TransportStreamFromESSource" (thanks to "jeremy at electrosilk.net")
- Changed some class member function and variables from "private" to "protected", in response to a request
from David Bertrand.
- Made "DarwinInjector::createNew()" more bullet proof, by giving the "applicationName" parameter
a default value.
2006.09.20:
- Corrected the bug fix to "H264VideoRTPSink" that was made two revisions ago.
2006.09.18:
- Fixed a bug in the way that "RTPSource" records the maximum sequence number seen so far.
(The bug could be triggered by packets arriving out of order.) Thanks to Mallikharjuna Reddy
for pointing this out.
- When creating new datagram sockets, we now attempt to setsockopt() SO_REUSEPORT and IP_MULTICAST_LOOP,
even on Windows. (A version of Windows prior to XP had problems with this, but it's apparently no longer
a problem.)
2006.09.12:
- Fixed a minor bug in "H264VideoRTPSink". (Thanks to Emiliano Parasassi for noting this.)
- If the "totSessionBW" parameter to "RTCPInstance::RTCPInstance()" is zero, print out an error message,
and use a value of 1 (kbps) instead.
2006.09.09:
- Reenabled asynchronous file reading in "ByteStreamFileSource", after fixing a bug
that could lead to a 'race condition' in some circumstances. (The fix was to call
"FramedSource::afterGetting()" directly - rather than via the event loop - after
delivering data to the downstream object.)
- Updated "MPEG2TransportStreamFromESSource" again. Now, we set the
"PES_packet_length" field to zero if the input data was larger than 2^16 bytes
long. (This is in accordance with the MPEG specifications; thanks to "jeremy at electrosilk.net"
for noticing this..)
2006.09.08:
- Temporarily disabled asynchronous file reading in "ByteStreamFileSource" until we
fix an apparent bug that is causing MPEG streaming to fail.
- Updated "MPEG2TransportStreamFromESSource" to print a warning message if the input source delivers
data in chunks that are too big to make up a PES packet.
2006.09.07:
- Fixed a bug that was preventing the RTCP "RR" packet handler from being called
when we were streaming RTP/RTCP-over-TCP. (Thanks to "zhangzx at rcs-9000.com"
for noticing this.)
2006.08.26:
- Changed the implementation of "ByteStreamFileSource" so that reads from the
open file are now done asynchronously, when data becomes available. This matches
the code's event-driven execution model better than the previous implementation,
which read from files synchronously. It should also perform better in systems
that read from more than one file concurrently.
- Added Victor Kozhuhov's modifications to the WAV file support code, to allow for WAV files that contain
u-law or a-law content (instead of the usual raw PCM).
2006.08.24:
- Fixed the way in which "RTSPServer" handles requests that span more than one
TCP socket read. These reads are now all handled asynchronously, in accordance
with the library's event-driven execution model. (Thanks to Marc Neuberger for noting this.)
- Fixed a memory leak in "MultiFramedRTPSource" that would occur if we received
packets with duplicate sequence numbers, or if we received excessively delayed
packets. (Thanks to David Bertrand for noticing this.)
- Changed the order of statements in "~RTSPClient()" to fix a bug (noted by Brain Lai).
- Changed "base64Encode()" to take a 'length' parameter, so that it will work with input data that
contains '\0' characters. (Thanks to Derk-Jan Hartman for this suggestion.)
- Added support - in "RTSPServer" - for the (non-standard) "x-playNow:" header in RTSP requests.
(Thanks to Rob Casey for this patch.)
- Updated "MediaSession" to parse the (standard) SDP "framerate" attribute (in addition to "x-framerate", which
is non-standard).
- Changed the parent class of "H264VideoStreamFramer" to be "FramedFilter" (to be consistent with other
'Framer' classes) instead of "FramedSource". (Thanks to Jinfeng Zhang for noticing this.)
- Made the "FramedFilter" implementation more robust, in case the supplied input source parameter is NULL.
2006.08.07:
- Changed the way that "OnDemandServerMediaSubsession" creates server ports.
It now chooses server port numbers starting with a specific port number
(which is now an optional parameter to the "OnDemandServerMediaSubsession"
constructor). The default value of this initial port number parameter is 6970.
This matches the port number range used by other common RTSP server implementations,
including Darwin Streaming Server and Helix.
- Changed the criterion for whether to send out a RTCP "SR". (Thanks to David Bertrand.)
- Fixed an obscure bug in "OnDemandServerMediaSubsession::deleteStream()"
(reported by Scott Hayes)
- Removed some archaic code that was developed for a customer several years ago, but
which is no longer used.
2006.07.04:
- Another update to "H264VideoRTPSink" (requested by David Bertrand)
2006.06.28:
- Another update to "H264VideoRTPSink". (Thanks to David Bertrand.)
2006.06.27:
- Updated "H364VideoRTPSink"
- Corrected the definition of MAX_PES_PACKET_SIZE in MPEG2TransportStreamFromPESSource.cpp.
(Thanks to Jiri Pinkava for this fix.)
2006.06.23:
- Fixed some minor issues with the previous addition of "H264VideoRTPSink"
2006.06.22:
- Added "H264VideoRTPSink", for transmitting H.264/RTP streams. (Thanks to
Benoit Quirynen and David Bertrand for funding this work.)
- Changed the default definitions of IP_ADD_SOURCE_MEMBERSHIP and
IP_DROP_SOURCE_MEMBERSHIP (for use if they're not already defined in header files),
to make it more likely that SSM joins will properly fail if SSM is not actually
implemented on the host OS.
- Changed some "delete"s into "delete[]". (Thanks to Wojciech Matyjewicz
and Mathur for reporting these bugs.)
- Made "sapWatch a bit more robust. (Thanks to Jiri Pinkava for this fix.)
2006.05.17:
- Fixed "OnDemandRTSPServer" so that it sets a RTCP "RR" handler,
even if "reuseFirstStream" is True.
- Changed "RTSPServer" (and the "testOnDemandRTSPServer" demo application)
to use a 45-second client liveness timeout, by default. (Previously,
no client liveness checking was being done by default.)
(Note that client liveness timeouts are done only for unicast streams, not multicast.)
- Fixed a bug in the implementation of "BasicHashTable" that arose when
we were using hash tables with multi-word-sized keys.
2006.05.15:
- No change from the previous release, but the installed ".tar.gz" file had
accidentally been deleted.
2006.05.11:
- Cleaned up some code in "BasicTaskScheduler" that was allegedly causing
problems on a Zaurus.
- Changed "TaskScheduler::rescheduleDelayedTask()" so that its "microseconds"
parameter is a "int64_t" (to match "scheduleDelayedTask").
(Thanks to David Bertrand for suggesting this.)
- Updated "ServerMediaSession:::generateSDPDescription()" to change
"a=rtcp: unicast-reflection" to "a=rtcp-unicast: reflection", to
reflect the latest version of the IETF's "draft-ietf-avt-rtcpssm"
Internet-Draft. (This is for Source-Specific Multicast sessions only.)
- Cleaned up "H263plusVideoRTPSink" slightly, to remove an unnecessary
member variable.
- Removed support for the (experimental and non-standard) "X-MCT-TEXT"
payload type.
2006.03.17:
- Fixed a bug in "RTSPClient" (that had been introduced in the 2006.02.15
release) that was stopping RTP-over-TCP reception from working.
2006.03.15:
- Updated "MediaSession" to parse the "s=" and "i=" lines of input SDP
descriptions, and added member functions for returning these string values.
(Thanks to Scott Hays or this.)
- Updated "MPEG2TransportStreamMultiplexor" to use the audio track for PCR
iff there is no video track present.
- Made a change to "liveMedia/include/H263plusVideoStreamFramer.hh" to overcome
an error reported by some nit-picking compilers.
- Fixed a minor bug in "MPEG2TransportStreamFromESSource" (in the way that it
handles EOF on input).
2006.03.03:
- Updated "MPEG4LATMAudioRTPSource" to allow the LATM data length field to
be omitted from the start of each returned audio frame. (The "faad" decoder
(used by VLC, for example) needed this.)
- Renamed "SECOND" in the "BasicUsageEnvironment" library to "DELAY_SECOND"
(and similarly for "ZERO", "MINUTE", "HOUR", "DAY"), to avoid an alleged
name conflict with some other code used by VLC. (Thanks to
Derk-Jan Hartman for this suggestion.)
- Removed some unnecessary code from "testProgs/playCommon.cpp".
2006.02.25:
- Updated the previous change to "MultiFramedRTPSource::doStopGettingFrames()",
to also reset the object's fields. (Thanks to David Bertrand.)
2006.02.15:
- Changed "GetFileSize()" (defined in "liveMedia/include/InputFile.hh") and
"ByteStreamFileSource::fileSize()" to return a "u_int64_t", to allow for
(potentially) large files.
- Changed the "microseconds" parameter to "TaskScheduler::scheduleDelayedTask()"
from "int" to "int64_t". This allows for durations greater than the previous
~2000 second limit.
- Updated "RTSPClient" to support handling RTSP requests sent by the server.
(Some servers send periodic requests back to the client as a keep-alive test.)
At present, we just respond to such requests with a "not allowed" error.
(Thanks to Khanh Mai for this change.)
- Updated "MultiFramedRTPSource::doStopGettingFrames()" to reset the
"ReorderingPacketBuffer". (Thanks to David Bertrand for this fix.)
- Corrected a small bug in the previous "RTSPClient" modification
(noticed by Glen Gray).
- Fixed a bug in "ADTSAudioFileSource" when parsing the optional "crc_check"
field. (Thanks to Paul Li for noticing this.)
2006.01.27:
- Updated "RTSPClient" to:
- allow the "parameterName" parameter to "getMediaSessionParameter()" to be NULL
- add a "setUserAgentString()" member function, to allow clients to
specify an alternative string for "User-Agent:" headers
- parse the optional "timeout" parameter in response "Session:" headers,
and added a "sessionTimeoutParameter()" member function to retrieve it.
(Thanks to Glen Gray for proposing these changes.)
- Fixed "H263plusVideoRTPSource" to properly initialize two member variables
in its constructor. (Thanks to David Bertrand for this fix.)
- Added Bernhard Feiten's support for H.263plus parsing/framing
2006.01.24:
- Corrected the maximum PES packet size (in "MPEG1or2DemuxedElementaryStream.cpp")
to allow for a 6-byte header. (Thanks to Jiri Pinkava for this fix.)
- Fixed "MPEG1or2AudioStreamFramer" to avoid a potential divide-by-zero when
it's fed certain malformed MPEG audio data. (Thanks to Eric Peters for this.)
- Updated the top-level "Makefile.tail" to make it clear that "testProgs" can't
be built until after the 'library' directories are built. This ensures that
parallelizing "make"s don't do the wrong thing.
2006.01.05:
- Updated "MPEG4VideoStreamFramer" to make the parsing of MPEG-4 video a bit
more robust. (Thanks to Khanh Mai for this suggestion.)
2006.01.04:
- Updated "OnDemandServerMediaSubsession" to tear down the stream (thus sending
a RTCP "BYE") when the input source ends, iff the stream does not have a known
duration. (If the stream has a known duration, then we keep the stream alive,
in case a client wants to seek backwards in it.)
2005.12.30:
- Extended the previous release's fix to also work with the RTSP
"OPTIONS" command.
2005.12.29:
- Include (if necessary) authentication headers in the initial HTTP
"GET" and "POST" commands, if we're setting up RTSP-over-HTTP tunneling.
This allows "RTSPClient" to work properly with some Axis cameras, which
require authentication on these HTTP commands.
2005.12.23:
- Fixed the RTCP port number in the RTSP "Transport:" header "port=" part
(for multicast streams).
- Updated the change that we made in version 2005.11.02 so that it also
sets the port number correctly.
2005.12.15:
- Made calls to "select()" more robust, by checking for (and ignoring)
EAGAIN or EINTR errors.
- Fixed a bug in "MPEG4VideoFileServerMediaSubsession" that could occur if a
bad MPEG-4 video file (not containing any initial 'config' data) is read.
(Thanks to Trevor Pering for noticing this.)
- Removed an undocumented, experimental and rarely-used option from "openRTSP".
2005.12.09:
- Updated the RTCP implementation so that reception stats for a SSRC are now kept
around even after a RTCP BYE is received, in case we want to use these stats
for QOS reports. (However, if a SSRC is reaped due to inactivity, then the
reception stats are deleted.)
2005.12.05:
- On some systems (notably FreeBSD), "struct sockaddr_in" includes a "sin_len"
field, which should be set before the struct is used. We now replace declarations
of "struct sockaddr_in" with a macro MAKE_SOCKADDR_IN() (defined in
"groupsock/include/GroupsockHelper.hh"). This macro sets the "sin_len" field
iff "HAVE_SOCKADDR_LEN" is defined on the command line.
(Thanks to Boris Nikolaus for noting this issue.)
- Fixed a bug in the timestamp generation for certain rare MPEG-4 video streams.
(Thanks to Bernhard Feiten for reporting this.)
2005.11.30a:
- Improved the calculation of the per-Transport Packet duration in
"MPEG2TransportStreamFramer", so that the overall transmit duration
tries to match the client playout duration (as determined by PCRs).
- Minor patch to avoid errors when compiling with GCC 4.1.
(Patch contributed by Hanno Boeck.)
- Patch to the special 'Kasenna'-specific support in "RTSPClient".
(Patch contributed by Glen Gray.)
2005.11.11:
- Modified "MPEG2TransportStreamFramer" to take the PCR "discontinuity_indicator"
flag into account when updating the estimated duration of each TS packet.
2005.11.03:
- Minor bug fix to the previous version's update to "RTSPClient".
2005.11.02a:
- Updated the previous release to add a new (optional)
"forceMulticastOnUnspecified" parameter to "RTSPClient::setupMediaSubsession()".
This forces the client to request a multicast stream if the original SDP
response address was unspecified (0.0.0.0). (Note that not all servers
will be able to handle this.) We also handle the "port=" field in RTSP
"SETUP" response "Transport:" headers.
- Fixed "RTSPServer" to include a proper "port=" field in the "SETUP"
"Transport:" response when streaming multicast.
2005.11.02:
- Updated "RTSPClient" to use the "destination=" address in the "SETUP"
response's "Transport:" header - for multicast streams. We do this because
some weird servers (e.g., Axis cameras, reportedly) do not specify the
multicast address earlier, in the "DESCRIBE" response's SDP.
2005.10.28b:
- Added a "rtpTimestampFrequency" parameter (with default value 90000)
to "H263plusVideoRTPSink", "MPEG4ESVideoRTPSink".
2005.10.28a:
- Removed some unnecessary "delete"s, and changed some "delete"s to
"Medium::close()"s. (Minor bug noted by Zhixue Zhang.)
2005.10.28:
- Fixed a potential 'divide by zero' problem in "MP3Internals.cpp".
(Thanks to Eric Peters for noting this.)
2005.10.27:
- Added a "numEntries()" pure virtual function to "HashTable".
(Thanks to David Bertrand for this suggestion.)
2005.10.23:
- When creating a Transport Stream from AC-3 audio input, we now use a stream_id
of 0x06 rather than 0x81.
- Add support for receiving the various G.726 RTP payload formats, described
in RFC 3551.
- Added an implementation of the "doStopGettingFrames()" virtual function to
"BasicUDPSource". (Thanks to Adrian Hornsby for this suggestion.)
- Changed the reimplemented virtual functions in "BasicUsageEnvironment0" and
"BasicTaskScheduler0" from "protected" to "public". (Thanks to David Bertrand
for this suggestion.)
- Added support to "RTSPClient" for the "GET_PARAMETER" RTSP command.
(Thanks to Glen Gray for this.)
- Added a Windows version of the "genWindowsMakefiles" script. This should
make it easier for Windows users to unpack and build the code.
(Thanks to Erwin Herzog for this script.)
2005.10.05:
- Fixed a couple of bugs noticed by David Bertrand.
2005.09.23:
- This software is now called "LIVE555 Streaming Media", and our preferred domain name
is now "live555.com".
2005.09.20:
- Updated "MPEG2TransportStreamMultiplexor" to increase the frequency of PMTs
and PATs in the output Transport Stream.
- More improvements to "MPEG2TransportStreamFromESSource".
- Updated "RTSPServer" to allow for empty stream names from certain non-standard
RTSP clients (such as Amino STBs).
- Fixed "RTSPClient::tearDownMediaSession()" to delete each subsession's
"sessionId" field.
- Fixed a minor memory leak in "RTSPClient" (when implementing HTTP tunneling)
2005.09.09:
- Made the destructors for "BasicUsageEnvironment" and "BasicUsageEnvironment0"
protected rather than public, to match the base class "UsageEnvironment".
- More improvements to "MPEG2TransportStreamFromPESSource" and
"MPEG2TransportStreamFromESSource".
2005.09.06:
- Modified "MPEG2TransportStreamMultiplexor", and added
"MPEG2TransportStreamFromESSource".
2005.08.26:
- Updated "MediaSession" to parse the SDP "a=type:" attribute. (Patch by
Derk-Jan Hartman.)
- Added support to "RTSPClient" for handling Microsoft servers' non-standard use
of the RTSP/RTP protocol. Also, fixed the parsing and generation of floating
point numbers in the RTSP "Range:" and "Scale:" headers to work correctly in
non-POSIX locales. (Thanks to Derk-Jan Hartman for this suggestion.)
- Fixed a memory leak in "MPEG2TransportStreamFromPESSource".
- Changed "MP3StreamState::readFromStream()" from "private" to "protected", to
satisfy a request by Pierre l'Hussiez.
2005.08.09:
- Improved the Transport Stream generation software to (in the future) allow
for generating Transport Streams from Elementary Stream data as well as
from PES packet data.
2005.07.23:
- Improved "H264VideoRTPSource" to properly handle 'aggregate' packets
that contain more than one NAL unit.
2005.07.21:
- We no longer set a RTCP "RR" handler when we're streaming, unicast on-demand,
from a shared input source. (The reason for this is that, in this case,
we also share a RTCP instance for all client sessions (streams).
A better fix will eventually be needed.)
2005.07.19:
- Updated H.264/RTP support.
2005.07.15:
- Oops, DEBUG was not supposed to be defined in "RTSPServer.cpp".
- Added "-D_LARGEFILE_SOURCE=1" to the "COMPILE_OPTS =" line of the various
"config.*linux*" files, to ensure that code that uses "fseeko()" will
compile properly for all Linux systems.
2005.07.13:
- When handling a 'passive' session, we no longer set a RTCP "RR" handler,
because (unlike unicast, on-demand sessions) the RTCP instance usually
outlives RTSP client sessions. (Thanks to Jon Sheller for reporting
this bug.)
2005.07.12:
- Minor updates to the Base64 code for H.264/RTP receiving.
2005.07.10:
- Removed a debugging version of "testOnDemandRTSPServer" that had mistakenly been
left in the proevious revision. If you downloaded the previous revision, then
please download this version instead!
- Fixed "MPEG1or2VideoStreamFramer" to better handle MPEG video streams where the
first GOP time code has a non-zero 'pictures' count.
(Thanks to Eric Peters for reporting this problem.)
- Some enhancements to the Base64 code, for eventual use by "H264VideoRTPSource".
2005.07.08:
- Added - to "RTCPInstance" - the ability to assign 'handler' functions
to be called on the arrival of RTCP "SR" or "RR" packets (as well as "BYE").
We now use this mechanism (specifically, a RTCP "RR" handler) to improve the
optional 'liveness' test for "RTSPServer". (Liveness is now indicated by
either a RTSP command over the TCP connection, or the arrival of a RTCP
"RR" packet.)
- Moved routines for Base64 encoding and decoding into the "liveMedia"
library. (Base64 encoding was already being used by "RTSPClient";
Base64 decoding will soon be used by "H264VideoRTPSource".)
2005.07.01:
- Updated "testOnDemandRTSPServer" to demonstrate AAC audio streaming (from an
ADTS-format file)
- Made some modifications to (supposedly) make the code compile better for
WinCE.
2005.06.30:
- Added support for reading and streaming from AAC audio files in ADTS format.
(Thanks to Manthan Systems for funding this work.)
- Removed duplicate code in "testOnDemandRTSPServer.cpp".
- Removed duplication of a common error message from "RTSPClient.cpp".
2005.06.29:
- Added support for Basic authentication (in addition to Digest authentication)
to "RTSPClient".
- Removed a minor memory leak in "PassiveServerMediaSubsession".
- Improved "MPEG4ESVideoRTPSource" to better note when received RTP packets
begin or end a MPEG-4 'frame'. (Thanks to Saumya Chandra for noting the
limitations of the previous code.)
- Changed some member functions in "PassiveServerMediaSubsession" from
"private" to "protected", to allow subclassing. (Thanks to
Fabrice Aeschbacher for this suggestion.)
2005.06.16:
- Fixed a bug in the generic MPEG (1, 2 or 4) video parsing code that was causing some
MPEG-4 streams not to be parsed correctly.
- Updated "MPEG4VideoStreamFramer" to better handle MPEG-4 video streams that contain
'B' frames. (Now, more accurate presentation times and frame durations are computed
for such streams.)
2005.06.07:
- Modified the Windows-specific code in "ByteStreamFileSource.cpp" to compile properly
under MINGW.
2005.06.04:
- Updated "MPEG2TransportStreamFramer::doStopGettingFrames()" to clear the PID status
table. This makes it possible to handle PCR discontinuities when seeking (e.g.)
within a stream.
- Updated the "ByteStreamFileSource::seekToByte*()" operations to take 64-bit
parameters, to allow for seeking within files that are >4 GB in size.
2005.05.26a:
- Updated the 'seeking' operations in "ByteStreamFileSource" to handle files
that are > 2^31 bytes in size.
2005.05.26:
- Updated "RTCPInstance::setByeHandler()" to (by default) handle only "BYE"s that
come from active participants. This means, for example, that a receiver of a
multicast stream can now quit without its RTCP "BYE" being handled by other
multicast receivers. (By default, multicast receivers will now handle only
"BYE"s that come from the sender.)
- "RTSPServer" now includes "rtptime" in the returned "RTPInfo:" header, because
the bugfix in the previous release also happened to fix the problem that this was
having with QuickTime Player.
2005.05.24:
- Fixed "RTPSink" so that it now resets "fTimestampBase" only on the first time
that a timestamp is ever computed; not on the first time after "startPlaying()"
is called. (Thanks to David Bertrand for noting this.)
2005.05.23:
- Added support to "RTSPServer" for (optionally) reclaiming client connection
state (and stopping the stream) if no command has been received on the
RTSP TCP connection within a specified period of time. This is useful for
use in closed systems where it is known that the RTSP client always uses
the "GET_PARAMETER" command as a periodic 'keep-alive'. It stops the
stream from continuing indefinitely if the client suddenly dies.
2005.05.12:
- Removed some unnecessary floating point code from "MP3Internals.cpp".
(This was causing unnecessary slowness on some hardware without floating point.)
2005.05.09:
- Modified "MPEG2TransportStreamFramer" to give greater weight (0.5) to more recent
data when computing the estimate of per-transport-packet duration. (This causes
it to respond more accurately to sudden changes in bitrate (i.e., in VBR streams).)
- Added some (otherwise unnecessary) null destructors to stop gcc 4.0 from printing
warning messages. (Thanks to Emiliano Parasassi for pointing this out.)
2005.05.05:
- "RTSPServer" now uses separate buffers for requests and responses. (This fixes
an issue that arose in the handling of requests from a set-top box.)
2005.05.04:
- Updated "RTSPServer" to make the parsing of "CSeq:" headers in RTSP requests
more robust.
2005.04.26:
- Made sure that "MultiFramedRTPSource"s properly stop receiving incoming RTP
packets, when they're asked to stop. (This fixes a bug that was being triggered
by some streams that continued sending RTP packets after a RTCP "BYE". Thanks to
Eberhardt Garner for helping track this down.)
- Fixed a minor memory leak in "openRTSP".
- Updated "FramedSource.hh" to no longer (by default) support the old form of
the 'after getting' function.
2005.04.23:
- Added "H264VideoRTPSource", for receiving H.264/RTP streams.
(Thanks to Erik Hellerud for this.)
- Made some minor modifications to "ServerMediaS(ubs)ession",
to support a customer's project.
2005.04.22:
- Improved "MPEG1or2VideoRTPSink" to allow more than one complete video 'slice'
from the same picture to be packed into an outgoing RTP packet.
- Eliminated a bogus "IP_ADD_MEMBERSHIP" error message that Windows (for some
reason) sometimes triggers for no reason.
2005.04.20:
- Changed the name of the (platform-independent) "_close()" function to
"closeSocket()", to prevent an apparent function name conflict in Windows.
2005.04.13:
- Modified "ourSourceAddressForMulticast()" to try the
"gethostname()"/"gethostbyName()" method if the 'multicast loopback' method fails.
- Made some modifications to "ServerMediaSubsession" to support "SIPServer"
(whose implementation is currently in progress).
2005.04.07:
- Fixed a bug in the "base64Encode()" routine in "RTSPClient.cpp".
(Thanks to Raphael Rigo for noticing this.)
- Updated "MPEG1or2VideoStreamDiscreteFramer" to handle the "iFramesOnly" and
"vshPeriod" parameters (just as the original "MPEG1or2VideoStreamFramer"
already does).
2005.03.31:
- Removed some testing code that had accidentally been left in the previous
release. If you use "openRTSP", then please use this release instead of the
previous one.
- Fixed a bug in "RTPServer" when handling streams without stream names.
(The bug had been introduced in version 2005.03.28.)
2005.03.30:
- Improved the support for seeking within RTSP/RTP-streamed MPEG-1 or 2
Program Stream files. (A/V sync after a seek still isn't perfect, though.)
2005.03.28:
- The "RTSPServer" implementation now supports raw-UDP streaming, for those
clients that request it. (This is usually requested only by some specialized
clients - such as set-top boxes - and only for data such as MPEG Transport
Streams where audio/video is muxed together (and no RTP timestamps are needed).)
- Updated the calculation of MP3 sampling frequencies to allow for 'MPEG2.5'
(Thanks to Massimo Buffo for this fix.)
2005.03.23:
- Changed "BasicTaskScheduler::SingleStep()" to call only one read handler during
each iteration of the event loop. This prevents potential problems if
the event loop is called reentrantly from within a read handler.
- Added a new, alternative version of "ByteStreamFileSource::createNew()" that
takes an open file (FILE*) as parameter, instead of a file name.
(Thanks to Mike Yan for this suggestion.)
- Updated the top-level Makefile to build the lower-level directories using
"$(MAKE)" rather than "make". This allows a command other than "make"
(e.g., "gmake") to be used. (Thanks to Sergio.Gelato for this fix.)
- Minor changes to (apparently) make Sun's C++ compiler happy.
(Thanks to Sergio.Gelato for these.)
- Some changes to "RTSPServer" to make it more tolerant of some strange, non-standard
clients.
- Support seeking within RTSP/RTP-streamed MPEG-1 or 2 Program Stream files.
2005.03.11:
Updated "MPEG2TransportStreamFromPESSource" once again to better handle
Program Streams that include a "program_stream_map".
2005.03.10:
- Modified "BasicUDPSource" to make its OS socket receive buffer at least 50 kBytes
(the same as we do for "MultiFramedRTPSource").
2005.03.07:
- Updated "MPEG2TransportStreamFromPESSource" (and thus also the
"testMPEG1or2ProgramToTransportStream" demo application) to handle MPEG
Program Streams that include MPEG-4 Elementary Stream data. (For this to work,
the Program Stream must include a "program_stream_map".)
2005.03.05:
- Modifying "ReceivingInterfaceAddr" now works before receiving
unicast streams. (Previously, it worked only when receiving multicast
streams.) Also, added a new option "-I <interface-ip-address>"
to "openRTSP", to allow the user to specify which interface is used.
(Thanks to Luca Abeni for this patch.)
- Fixed a "delete[]" vs "delete" bug in "MPEG4VideoStreamFramer",
2005.02.28:
- Fixed a bug (that had been introduced in the 2005.01.07 version)
in the MP3 frame<->ADU conversion code.
2005.02.25:
- Fixed some minor memory leaks.
- Made some more changes to prepare for RTSP server seeking within MPEG-1 or 2
Program Stream files. (This is still not done yet.)
2005.02.14:
- Changed the generation of "rtptime" in "RTPInfo:" RTSP headers to use
%u instead of %d. (Thanks to Regis Feneon for noting this.)
- Made some changes to prepare for RTSP server seeking within MPEG-1 or 2
Program Stream files. (This is still not done yet.)
2005.02.09:
- Updated "MultiFramedRTPSink" to allow for frame-specific special headers to
appear before each frame in RTP packets. (This in addition to the (possible)
special header that may appear at the start of the packet.) This functionality
is added using a new virtual function "frameSpecificHeaderSize()" (that,
by default, returns 0.) Thanks to Matt Romaine for this.
- Added a new "BufferedPacket" virtual member function
"getNextEnclosedFrameParameters()", which will (eventually) replace the existing
"nextEnclosedFrameSize()" virtual member function. This (plus a corresponding
change to "MultiFramedRTPSource") now makes it possible to give correct
presentation times to multiple frames within incoming RTP packets.
2005.02.07:
- The "MultiFramedRTPSink::setPacketSizes()" function now applies just to one
specific "MultiFramedRTPSink" object; not to all such objects.
- Added a new version of "RTSPServer::removeServerMediaSession()" that takes
the (string) stream name - rather than the "serverMediaSession" object
- as argument.
2005.01.29:
- We now remove reception and transmission statistics records (from each
"RTPSource" and "RTPSink", respectively), whenever each RTCP SSRC membership
gets 'reaped'. We also added more information to "RTPTransmissionStats".
(Thanks to WIS Technologies for funding this work.)
- Some minor fixes to "JPEGVideoRTPSource". (Thanks to Sergey Khlutchin for
reporting this.)
- Made the "ServerMediaSession" constructor "protected", to allow for
subclassing. (This was requested by Eric Peters.)
- Updated "win32config.Borland" and modified some header files, so that the
code can be built using Borland's "C++ Builder 5.0".
(Thanks to David Wu for this suggestion.)
- Added a "setPacketSizes()" function to "MultiFramedRTPSink" to make it
possible to change the 'maximum' and 'preferred' size of outgoing
RTP packets. (Thanks to Christian Gerstner for this suggestion.)
2005.01.24:
- Some MIME-type parameters in SDP "a=fmtp:" lines are Boolean, taking only values
0 or 1. Sometimes these parameters are set (to 1), without an explicit "=1"
being in the SDP "a=fmtp:" line. (This is not legal, but it sometimes occurs.)
Our SDP parsing code (in "MediaSession.cpp") now checks for this.
2005.01.23:
- More improvements to "AVIFileSink". MPEG-1, 2 or 4, JPEG and H.263 video is
now supported, along with raw PCM or u-law audio. (However, audio is not
yet working perfectly, and MPEG audio is currently not supported at all.)
(Thanks to WIS Technologies for funding this work.)
- Changed the (many) calls to "gettimeofday()" to pass NULL as the 'timezone'
parameter, because this isn't used.
2005.01.13:
- Fixed a bug in "liveMedia/OnDemandServerMediaSubsession.cpp" that was reportedly
causing crashes on some systems. (Thanks to Brian Wang for finding this.)
- Updated "MPEG1or2VideoStreamDiscreteFramer" and
"MPEG4VideoStreamDiscreteFramer" to set appropriate presentation
timestamps for B-frames. (Unlike I and P-frames, B-frames' timestamps are
not monotonically increasing.) (Thanks to WIS Technologies for funding this work.)
2005.01.07:
- Fixed a bug in "JPEGVideoRTPSink" that was causing incorrect packets to
be generated when streaming using non-standard JPEG quantization tables
(which must be included in the RTP packets).
- Updated the handling of incoming MP3 ADUs to allow for the possibility of
receiving ADUs that contain 'ancillary data' at the end. (For example,
ADUs for "mp3Pro" frames are like this.) Note, however, that our
MP3 frame-to-ADU generating code currently doesn't include 'ancillary
data' at the end of the generated MP3 ADUs. This will need to be fixed
in order to be able to correctly *transmit* ADUs for "mp3Pro" frames.
- More work on "AVIFileSink". Recording of MPEG-4 video-only files now works.
2004.12.29:
- Added a new liveMedia 'sink' class - "AVIFileSink" - for writing an AVI-format
file. Note: This is not fully working yet, so don't try using it yet!
(Thanks to WIS Technologies for funding this work.)
2004.12.23:
- Fixed a bug in the previous release (when receiving MPEG-2 Transport RTP streams).
2004.12.22:
- Updated "MPEG4GenericBufferedPacket::nextEnclosedFrameSize() to (i) allow
for "generic" mode, and (ii) properly check for the absence of an
"AU Header section". (Thanks to Erick van Rijk for this suggestion.)
- When receiving a MPEG-2 Transport Stream (either RTP *or* raw-UDP), pass it
through a "MPEG2TransportStreamFramer", so that "durationInMicroseconds" is
set appropriately, based on the stream's embedded PCR values.
(Thanks to Dermot McGahon for this suggestion.)
- Changed the "num_packets_lost" statistics line (printed by "openRTSP -Q")
to format as an int rather than as an unsigned. This is in case this value
is negative (which can happen if duplicate packets are received).
(Thanks to Norbert Donath for noting this.)
2004.12.15:
- Changed the RTSP servers in the various test programs to use port 8554
instead of port 7070 for RTSP (as an alternative to the standard port
554). It turns out that port 8554 is the official IANA-reserved port
number for RTSP (alternative).
- Changed "RTSPClient" to include the "Scale:" header if the scale is being changed
to 1.0 from something else. (Thanks to Matt Romaine for this suggestion.)
2004.12.09:
- Fixed a bug in the handling of "audio/X-MP3-DRAFT-00" RTP streams.
(Thanks to Dhananjay Deshpande for noticing this.)
2004.12.07:
- Updated "RTSPClient" to parse the "Scale:" header (if any) in a response to
a "PLAY" command, and set a corresponding field in the "MediaSession" or
"MediaSubsession" structure.
2004.12.06:
- Fixed a minor bug in "BasicTaskScheduler::SingleStep()" that would be triggered
if the (optional) "maxDelayTime" parameter were unusually large.
- The "RTSPServer" implementation of RTP/RTC-over-TCP streaming will now work even
if the client's RTSP "SETUP" command doesn't include an "interleaved=" field.
2004.11.30:
- Added "RTSPServer" support for the RTSP "Scale:" header, which is used to
implement 'trick play': fast forward and reverse play. The actual implementation
of these depends on the media type; it is currently implemented for MPEG-1 or 2
(including MP3) audio (forward play only), and for WAV (PCM) audio (forward or
reverse play).
(Thanks to Sony Corporation for funding this work.)
2004.11.26:
- Improved "H263plusVideoRTPSource" to better recognize which packets begin
a frame. (This should improve its performance on lossy networks.)
- Improved the parsing of MPEG-1 or 2 audio streams to ignore more bogus
'syncwords'.
- We now look for the 'Xing' VBR Table of Contents, and use this (if present)
to implement seeking within VBR files.
- Updated "ADUFromMP3Source" to allow the internal data buffers to be flushed
(e.g., if there is a discontinuity in the MP3 input data).
- When streaming a seekable MPEG audio stream on demand, insert filters that
convert the input stream to ADU format, and then back to MP3. This allows
us to seek within the stream without being tripped up by the MP3
'bit reservoir' (back-pointer).
2004.11.20:
- Fixed a bug in "MediaSession::initiateByMediaType()". (It was not allowing
for the possibility that a subsession had already been initiated.)
2004.11.19:
- For consistency (and ease of comparison), the "MIMEtype()"
codec name substring for each "MediaSource" subsession is in upper case.
2004.11.18:
- Added an optional "scale" parameter to the "RTSPClient" "play...()"
methods, to allow a client to specify fast forward or rewind 'trick play'.
(Thanks to Dermot McGahon for this suggestion.)
2004.11.16:
- Fixed a bug in the way that "QuickTimeFileSink" records the duration of
multi-channel audio tracks in ".mov" or ".mp4"-format files.
(Thanks to Orban/CRL Inc. for funding this work.)
2004.11.11a:
- Another minor update to "RTSPClient".
2004.11.11:
- Updated the "RTSPServer" implementation to handle the case where a "PLAY"
request does not contain a "Range:" header. (Suggestion by Brian Wang.)
- Reinstated the "MPEG4LATMAudioRTPSource" fix from version "2004.08.24".
(It had accidentally gotten deleted.)
- Included Dermot McGahon's patch to "RTSPClient" to support the bogus
non-standard 'Kasenna' variant of RTSP.
2004.11.09a:
- Fixed the previous revision (RTSP seeking support) to work properly with VLC.
- Fixed a bug that was causing receivers of SSM streams to not receive RTCP packets. (Thanks to Alessandro Gaiarin for reporting this.)
2004.11.09:
- Added support for seeking within streams. This currently works only for
WAV audio file streams, and MPEG audio (include MP3) file sources.
(However, it doesn't yet work properly for VBR MP3 files; this will get fixed.
Also, it doesn't yet work properly with VLC.)
(Thanks to Sony Corporation for funding this work.)
2004.11.06:
- Improved the way that we specify output buffers for "RTPSink" objects.
We now do this using a "maxSize" static member variable (instead of
using a 'number of packets' variable as we did before). We also limit
the size of the output buffer used for RTCP packets, to save space.
- When streaming a MPEG Transport Stream, don't set the RTP 'M' bit.
- When recording a ".mov" or ".mp4" file using "QuickTimeFileSink.cpp",
we no longer fill in the "width" and "height" fields for audio tracks.
2004.11.04:
- When streaming MPEG audio or WAV audio files on demand, we now return the
correct file duration (in the RTSP "Range:" header and the SDP "a=range:"
attribute), so that media players will report the correct stream duration.
(Thanks to Sony Corporation for funding this work.)
- In "MultiFramedRTPSink", we now wait until we receive the first data before
initializing "fNextSendTime" with the current wall-clock time.
(Thanks to Eric Peters for suggesting this.)
2004.11.02:
- Updated the RTSP "Range:" header (in a "PLAY" response) and the SDP "a=range:"
attribute to support streaming from sources with finite durations.
(Such sources can support seeking via RTSP.) The "ServerMediaSubsession"
class now has a "duration()" virtual function. (In the future,
"FileServerMediaSubsession" subclasses will redefine this, so that seeking
within the file will work.)
(Thanks to Sony Corporation for funding this work.)
2004.11.01:
- Added support to "RTSPClient" for streaming RTSP/RTP over HTTP, using the technique
described in Apple's document: <http://developer.apple.com/documentation/QuickTime/
QTSS/Concepts/chapter_2_section_14.html>.
This can be used for streaming from a Darwin Streaming Server from behind a
HTTP-only firewall. (Note that our own RTSP server implementation doesn't yet
implement RTSP-over-HTTP, but this is on the 'to do' list.)
(Thanks to Orban/CRL Inc. and WIS Technologies for funding this work.)
2004.10.28a:
- Fixed "OnDemandServerMediaSubsession" so that "PAUSE"/"PLAY" works properly on
unicast streaming from files.
2004.10.28:
- Removed (perhaps temporarily) the "rtptime=" parameter from the "RTP-Info:" header
that's returned in response to the RTSP "PLAY" command. It appears that this may
be messing up A/V sync in QuickTime Player.
2004.10.26:
- Updated "JPEGVideoRTPSink" (and "JPEGVideoSource") to allow for the
possibility of sending custom quantiziation tables in JPEG/RTP packets.
- Fixed some compile warnings about unused named parameters. (Thanks to
Thiago Correa for these suggestions.)
2004.10.22:
- Added a new "MPEG1or2VideoStreamDiscreteFramer" class, similar to the existing
"MPEG4VideoStreamDiscreteFramer".
2004.10.21:
- Modified the order of SDP lines generated by a RTSP server
(in "ServerMediaSession.cpp") to correspond to the exact order specified by
the SDP RFC. JMIF clients are supposedly anal retentive about this.
(Thanks to Fabrice Aeschbacher for noticing this.)
2004.10.19:
- Updated "MPEG2TransportStreamFramer" to properly handle input data that
doesn't begin with a 'sync' byte (0x47).
2004.10.18:
- Added a new "removeServerMediaSession()" member function to "RTSPServer".
- Updated the implementation of the RTSPServer "RTPInfo:" header to include a
"rtptime=" field.
- Improved the "WindowsAudioInputDevice" trick for making the microphone the
first-listed device. (Thanks to Syncanph Xie for this suggestion.)
2004.10.14:
- Added a new argument "-4" to "openRTSP" (with corresponding updates to
"QuickTimeFileSink"), to generate a "MP4"-format file. (Currently, this
works for MPEG-4 audio only.)
(Thanks to Orban/CRL Inc. for funding this work.)
2004.10.13:
- Fixed a typo that was causing the Windows version not to build.
(Thanks to Thiago Correa for noticing this.)
2004.10.11:
- Updates to "RTSPServer":
- Include a "Date:" header in each response
- Include a "Range:" header in each "PLAY" response.
- Include "RTP-Info:" header in each "PLAY" response.
- Made "SimpleRTPSink" more idiot-proof.
2004.10.07:
- Improved the parser in "MPEG4VideoStreamFramer" to be more tolerant of
bad/unexpected data.
- Moved the code for opening input files by name (which includes a special-case
hack for "stdin") to a single common file - "InputFile.cpp" - to get rid of
duplicated code.
2004.10.04:
- Fixed "UserAuthenticationDatabase::addUserRecord()" (in "RTSPServer.cpp") to
make a copy of the "password" string, before adding it to the hash table.
(The hash table already makes a copy of the "username" (key) string.)
2004.10.03:
- Added support for receiving raw UDP streams (in addition to normal RTP/UDP streams)
(Thanks to Derk-Jan Hartman)
2004.09.30:
- Updated the RTSP server "UserAuthenticationDatabase" to (i) allow for it to
be subclassed, and (ii) allow it to store passwords that are really
md5(<username>:<realm>:<password>)
2004.09.24:
Added support for access control (using digest authentication) to "RTSPServer".
Also, added example code to the "testOnDemandRTSPServer" test program to illustrate
how to use this. (Thanks to Orban/CRL Inc. and WIS Technologies for
funding this work.)
2004.09.22:
- Moved the digest authentication support out of "RTSPClient.cpp"
(and "SIPClient.cpp") into a new file: "DigestAuthentication.cpp". There's also
a corresponding new header file: "DigestAuthentication.hh". This is in preparation
for adding digest authentication support to our RTSP server implementation also.
2004.09.20:
- More improvements to the multi-unicast streaming support (from a single input
source). RTP-over-TCP streaming is now supported in this case. Updated
"testOnDemandRTSPServer" to add a variable "reuseFirstSource" (default: False)
that can be used to implement this.
2004.09.09:
- Made a minor improvement to the multi-unicast streaming support.
2004.09.08:
- Added optional "author" and "copyright" parameters to "DarwinInjector::setDestination()".
- Added an optional "miscSDPLines" parameter to "ServerMediaSession::createNew()",
to allow the caller to add extra SDP lines to the session description.
- Fixed a minor bug in the media tables reclamation code.
- Added still more support for multi-unicast RTSP/RTP streaming from a
single input source. (Thanks to Orban/CRL, Inc. and WIS Technologies for funding
this work.)
2004.09.05:
- We now more gracefully handle malformed "m=" SDP lines. (Thanks to
Derk-Jan Hartman for noticing this problem.)
- In "RTSPClient", we now make the "CSeq" number a static variable, to avoid
potential problems if we connect to the same server with the same URL
more than once. (Thanks to Keith Gurganus for the suggestion.)
- Modified "RTSPServer" to use the destination interface IP address in
its "rtsp://" URL.
2004.09.02:
- Modified "GroupsockHelper.cpp" to allegedly support building for WinCE.
2004.08.26:
- Fixed a bug that could cause "AMRAudioRTPSource"s to not get reclaimed.
(Thanks to Chenglim Ear for reporting this.)
- More support for multi-unicast RTSP/RTP streaming from a single input source.
2004.08.24:
- Modified "LATMAudioRTPSource" to include the initial data length field
in the data that's delivered to a client. (A decoder was needing to see this.)
- Added a new "MPEG4VideoStreamDiscreteFramer" class, as a (more efficient)
alternative to "MPEG4VideoStreamFramer" when the input source is a sequence of
discrete MPEG-4 frames, rather than a byte stream.
- Fixed a minor bug in "Media.cpp". (Thanks to Thiago Correa.)
- Added more support for multi-unicast RTSP/RTP streaming from a single input
source. (This now working, except for TCP connections - to be completed.)
2004.08.17:
- Made the parsing of MPEG-1 or 2 video more robust, in case a Video Sequence Header
doesn't appear exactly where it should.
- Added initial support for multi-unicast RTSP/RTP streaming from a single input
source. (This isn't fully working yet - more support needs to be added.)
2004.08.13:
- Added a "numChannels" parameter to "MPEG4GenericRTPSink" (optional)
and "MPEG4LATMAudioRTPSink".
2004.08.12:
- Fixed a couple of small memory leaks (noticed by Gabriel Bouvigne).
2004.07.31:
- Added support for MPEG-4 LATM audio RTP streaming. (MPEG-4 LATM audio RTP
*receiving* had already been implemented.) (Thanks to Orban/CRL, Inc. for
funding this work.)
2004.07.27:
- Updated the MPEG Program-to-Transport Stream conversion mechanism to set the
correct stream tags depending on whether the input data is MPEG-1 or 2.
2004.07.23:
- Added a "-O" (upper-case letter 'oh') option to "openRTSP". This tells the
program to not send an initial "OPTIONS" request prior to "DESCRIBE".
- Modified "BasicTaskScheduler" to better allow subclassing.
- Added an optional "maximum delay time" option to
"BasicTaskScheduler0::SingleStep()". This allows subclasses to impose a
limit on how long "select()" can delay, in case it wants to also do polling.
2004.07.22:
- Fixed a serious bug that was causing some MPEG Program Stream files to be parsed
incorrectly - especially if they have non-MPEG header data at the front.
- Modified the way in which "Medium" objects are reclaimed, to overcome an
obscure bug.
2004.07.20:
- Added a comment to "DeviceSource.cpp" to clarify the purpose of "fTo", because
several people have gotten this wrong.
- Made ~BasicUsageEnvironment protected (just like ~UsageEnvironment)
- Fixed "samplingFrequencyFromAudioSpecificConfig()" to remove a memory leak.
2004.07.16:
- Fixed a bug in "AMRAudioRTPSource", in the way that it handled input RTP packets
that contained more than one AMR frame.
(Thanks to Gabriel Bouvigne for reporting this problem.)
- We now automatically reclaim the memory that was allocated for the "UsageEnvironment"
"liveMediaPriv" and "groupsockPriv" structures, once their tables become empty.
2004.07.14:
- Updated "QuickTimeFileSink's" MPEG-4 audio recording mechanism again, this time
to support aacPlus as well as regular AAC.
2004.07.13:
- Updated "QuickTimeFileSink" to support recording MPEG-4 audio (including
hint tracks).
- Modified "MPEG4VideoStreamFramer" to allow simplified subclasses that take
discrete frames as input (and therefore don't need a full parser).
2004.07.07:
- Added the (rather bogus) "a=x-qt-text-nam:" and "a=x-qt-text-inf:" attributes
to the SDP descriptions delivered by "RTSPServer" (in response to a "DESCRIBE"
operation). These attributes get the same strings as the "s=" and "i=" lines
(respectively). However, QuickTime Player doesn't do anything with those lines,
but does recognize the "a=x-qt-*" lines.
2004.07.06:
- Modified the code so that it will build for WinCE.
(Thanks to Gabriel Bouvigne for these changes.)
2004.07.02:
- Fixed a bug in HashTable::RemoveNext() (noted by Greg Bothe)
- Added partial support for recording MPEG-4 audio in "QuickTimeFileSink".
(Hinting is not yet working properly for this media type.)
- Added an option to "MPEG1or2AudioStreamFramer" to allow its presentation times
to be resynchronized by its input source.
2004.06.18:
- Fixed a bug in "MPEG1or2AudioStreamFramer" (in the way it was checking for
syncwords at the start of each frame).
- Updated the "MPEGVideoStreamFramer" (base) class to report "fNumTruncatedBytes".
- Increased "OutPacketBuffer::numPacketsLimit" from 20 to 30.
2004.06.17:
- Another improvement to the "MPEG1or2Demux" parsing code.
- Updated "QuickTimeFileSink" to support recording MPEG-4 video tracks into
".mov" files. (There's also basic support for recording MPEG-4 audio, but
this isn't quite working yet.)
2004.06.14:
- Updated "MPEG1or2Demux" to make the checking for a PACK_START_CODE more
robust if it's not immediately present where we expect to see it.
- Fixed a bug in "JPEGVideoRTPSource" that could cause a problem on
64-bit architectures.
(Thanks to Andrey Filippov for noticing this.)
2004.06.11:
- Removed an error from a error message in StreamParser.
2004.06.09:
- Updated the implementation of the aggregate and non-aggregate RTSP "PLAY"
operations to not include a "Range:" header if the 'start' parameter is < 0.
(This is used when resuming from a "PAUSE", for example.)
Also, removed an unnecessary "Range:" header from the "PAUSE" command.
(Thanks to Gabriel Bouvigne for this suggestion.)
- Reimplemented "MultiFramedRTPSource::doGetNextFrame1()" to use iteration
rather than recursion, in the case where a large frame is fragmented over
multiple incoming RTP packets. This avoids the possibility of stack overflow
occurring if there are very large fragmented frames in the input data.
2004.06.07:
- Added optional "start" and "end" parameters to the aggregate "PLAY" operation
in "RTSPClient". (We had already done this for the non-aggregate "PLAY" operation.)
- Made the input banks buffers in "StreamParser" heap-allocated, rather than making
them member variables. This avoids any potential compiler problems with having
such large structures as member variables.
2004.06.03:
- Added the new 'liveMedia' class "MPEG2TransportFileServerMediaSubsession", for
unicast on-demand streaming of MPEG-2 Transport Stream files.
- Added the new test programs "testMPEG2TransportStreamer" and
"testMPEG1or2ProgramToTransportStream", and added support for Transport File
streaming to "testOnDemandRTSPServer".
(Thanks to DVAgroup Inc. for funding this work.)
2004.06.02:
- Fixed "MediaSession" to no longer apply the normal RTP 'M' bit rule
when processing incoming "video/MP2T" (or "video/MP1S" or "video/MP2P")
streams. (For such streams, the 'M' bit does not mean 'end of frame'.)
2004.06.01:
- Updated "RTSPClient" to handle "Session:" headers that have a trailing
";timeout=" part. (Thanks to Gabriel Bouvigne for suggesting this.)
2004.05.31:
- We now handle SDP "m=" lines with an optional <number-or-ports> field
(although we don't actually do anything with this value). Thanks to
Derk-Jan Hartman for this suggestion.
2004.05.29a:
- Made a correction to the previous change.
2004.05.29:
- Added a call to "DarwinInjector" to set the TCP socket's send buffer to 100 kBytes.
2004.05.28:
- Renamed some variables in "MP3Internals.cpp" (and made them static) to
overcome a name conflict seen by the VLC developers. (Thanks to
Derk-Jan Hartman for pointing this out.)
2004.05.26:
- Fixed a bug (apparently introduced with recent header file changes) that
could cause MP3 files to not be read correctly on Windows. (In particular,
this could cause "testMP3Streamer" to not work correctly on Windows.)
Thanks to David Skiba for the bug report.
2004.05.24:
- Added a new member function "lastReceivedSSRC()" to "RTPSource". This makes it
possible for a receiver to demultiplex incoming RTP data based on SSRC.
(Later this functionality should perhaps be added to "(MultiFramed)RTPSource"
instead.)
- More updates to "DarwinInjector".
2004.05.19:
- Another update to "openRTSP" for a customer job.
2004.05.17:
- Added a new test program "testMPEG4VideoToDarwin.cpp" that is similar
to "testMPEG4VideoStreamer", except that instead of transmitting the
video RTP/RTCP packets via multicast, it transmits them - via a RTSP TCP
connection - to a remote Darwin Streaming Server.
2004.05.12:
- Added a new "liveMedia" class - "DarwinInjector" - that can be used to send an
audio and/or video RTP/RTCP stream to a remote Apple 'Darwin' (aka. QuickTime)
Streaming Server, for playing by (potentially multiple) RTSP clients.
- Added a new test program "testMPEG1or2AudioVideoToDarwin.cpp" that is similar
to "testMPEG1or2AudioVideoStreamer", except that instead of transmitting the
audio/video RTP/RTCP packets via multicast, it transmits them - via a RTSP TCP
connection - to a remote Darwin Streaming Server.
2004.05.09:
- Removed a line of junk that had erroneously been left at the start of Makefile.tail.
- The "testRelay" test program has been reprogrammed in the usual liveMedia
'source->sink' style.
2004.05.07:
- Another update to RTSPClient for a customer job.
2004.05.04:
- Added an #include to "BasicUDPSink.cpp" to prevent a compilation problem on
some platforms.
2004.05.02:
- Some updates to RTSPClient and openRTSP for a customer job.
2004.04.27:
- Fixed the round-trip time estimation routine in "RTPSink" to allow for
the possibility of the computed round-trip time being negative. This can
happen if there is clock drift between the sender and receiver, and if the
actual round-trip time was quite small. If this happens, the returned
round-trip time value is zero.
(Thanks to Dixon Siu for alerting us to this issue.)
2004.04.23:
- Updated some #ifdef's so that the code will compile with "mingw" on Windows.
(Thanks to Joey Parrish for this.)
- Added a "BasicUDPSink" class to "liveMedia", for UDP streaming without RTP.
- Added new 'filter' classes to "liveMedia" for
- converting MPEG Program Streams to Transport Streams.
- 'framing' MPEG Transport Streams to return the 'duration' of each Transport
packet (i.e., the inter-packet time gap).
2004.04.09:
- Fixed a byte-ordering bug in the code for streaming from WAV audio files
(used in "testWAVAudioStreamer" and "testOnDemandRTSPServer"). We were converting
16-bit samples from host to network order before streaming them. That was wrong,
because audio samples are always stored in WAV files in little-endian order.
The correct thing to do was to convert from little-endian to big-endian order.
2004.03.27:
- Fixed a minor bug in the top-level Makefile. (Thanks to Matteo Nastasi for
noting this.)
2004.03.27:
- Modified "H261VideoRTPSource" so that it returns individual packet payloads to
the caller, rather than waiting to form complete frames. Also, added a member
function "lastSpecialHeader()" that returns the 4-byte special header for the
most recently-read payload.
2004.03.23:
- Added support for unicast RTSP/RTP streaming from VOB files, and added an example
of this to "testOnDemandRTSPServer".
2004.03.17:
- Made a series of minor bug fixes and improvements suggested by Sony.
2004.03.15:
- Fixed a bug in "OnDemandServerMediaSubsession" (the RTCP instance was being
deleted at the wrong time). (Thanks to Clark Taylor for noticing this.)
- Minor modifications to the 2004.02.26 "RTPSink" changes.
- Updated the "AMRAudioRTPSource" implementation to support 'bandwidth-efficient'
mode. (Warning: This has not yet been tested.)
2004.03.12:
- Updated the "RTSPClient" class to support an aggregate "PAUSE" operation.
2004.03.11:
- Added an implementation of AMR audio RTP receiving ("AMRAudioRTPSource"), to
match the existing"AMRAudioRTPSink". Also, added a new class "AMRAudioFileSink"
(a subclass of "FileSink") that outputs an AMR audio input stream to a file,
including the file 'magic number' and frame headers. "openRTSP" was also updated
to output received AMR audio streams using "AMRAudioFileSink"s.
(Thanks to SIGOS Systemintegration GmbH for funding this work.)
- Cleaned up the "RTPSource" changes that were made in version 2004.02.26.
2004.03.05:
- Updated the "RTSPServer" implementation to properly handle aggregate
operations for which the URL ends with a "/". Some clients, such as
"gmp4player" do this.
2004.03.03a:
- Fixed a bug in "MultiFramedRTPSource.cpp" where we were not properly
skipping over "contributing source" fields, if they were present in the
RTP header. (Thanks to Phillip Bruce for noticing this.)
2004.03.03:
- Fixed the "testMP3Streamer" test program to keep the RTP sink, RTCP instance,
Groupsocks, and RTSP server (if used) open across all iterations of the loop.
(Thanks to Frank Xia for noticing this problem.)
2004.03.02a:
- The previous version accidentally had the built-in RTSP server enabled in
"testMP3Streamer". It should be disabled by default.
2004.03.02:
- Fixed a few potential errors that were found by running "valgrind" on some of
the test programs (on Linux).
2004.03.01:
- Added two new options to "openRTSP" (and "playSIP"):
"-E <max-inter-packet-gap-time>"
Tells the program to close the stream if no new packets have been
received in at least <max-inter-packet-gap-time> seconds.
"-B <input-socket-buffer-size>"
Tells the program to set the network socket input buffer (for each
input stream) to <input-socket-buffer-size> bytes. (This can be useful
when testing QOS for different input buffer sizes.)
(Thanks to SIGOS Systemintegration GmbH for funding this work.)
2004.02.26:
- Added - to "RTPSink" - a database of statistics from incoming RTCP
"Reception Report" (RR) packets. (This mirrors the similar database
for RTCP SR packets that was already part of "RTPSource".) (Thanks to
Clark Taylor for contributing this code.)
2004.02.23:
- Fixed a bug in "MP3ADUinterleaving.cpp" that was causing frame durations
to not be set properly when handling interleaved MP3 ADUs.
2004.02.20a:
- Corrected a typo in the previous "#ifdef"s
2004.02.20:
- Added "#ifdef"s to the two files that #include <strstream.h>, so that they
will compile OK with GCC v3.*. (Thanks to Goetz Waschk for this.)
- Changed the stream parser debugging statements to make it clear that the
use of C++ language exceptions by the stream parsing code is normal, and
is not an error.
2004.02.19:
- Updated the "RTSPServer" implementation to support RTP-over-TCP streaming
(if requested by the client).
2004.02.13:
- Changed the implementation of the "BasicUsageEnvironment" "operator<<"
member functions so that they use "fprintf(stderr, ..." rather than
"cerr << ...". People compiling in some environments were getting
complaints about "cerr" being undefined (presumably because the right
#include files weren't being found). However, everyone should have
"stdio.h". (Thanks to Clark Taylor for this suggestion.)
- Changed the "genMakefiles" script to complain if the user tries to
run it without an "<os-target"> parameter.
2004.02.09:
- Updated "RTSPServer" once again - this time to ensure that each incoming request
is read completely (i.e., up until the trailing <CR><LF><CR><LF>).
(Thanks to Regis Feneon for helping to fix this.)
- Added a new "WAVAudioFileServerMediaSubsession" class to support on-demand
streaming from WAV audio files. Also, updated the "testOnDemandRTSPServer"
test program to illustrate this.
2004.02.05:
- Updated the "WindowsAudioInputDevice" project to build two different versions
of the library: One that uses Windows' built-in mixer; another that doesn't.
2004.02.04:
- Fixed an obscure bug in "MPEG4ESVideoRTPSink" that could (very rarely)
cause incorrect RTP timestamps to be set for the last fragmented packet
of large MPEG-4 frames. This could cause QuickTime Player's video playback
to freeze.
2004.02.03:
- Added new "liveMedia" classes "MPEG1or2FileServerDemux" and
"MPEG1or2DemuxedServerMediaSubsession" for supporting on-demand RTSP/RTP
streaming of MPEG-1 or 2 Program Stream files. Also, updated the
"testOnDemandRTSPServer" test program to support streaming of such
a file.
- We no longer set SO_REUSEPORT for stream (TCP) sockets, because it usually
doesn't make sense to share TCP ports. (As a side effect, this means that it
will no longer be possible to run more than one RTSP server (using the same
TCP port) simultaneously on the same computer - something that should never have
been possible in the first place.)
- Fixed a minor RTSP server bug that was causing incorrect "destination"s to be set
(for multicast streams) in the "SETUP" response "Transport:" header.
2004.01.28:
- Yet another bug fix to "MPEG4VideoStreamFramer", to properly handle the
case where MPEG-4 "GOV" headers don't occur on exact 'second' boundaries.
(Thanks to Michael Niedermayer (via Michael Hess) for clarifying this.)
2004.01.27:
- Fixed a bug in the previously added (but normally "#ifdef"d out)
debugging code in "MultiFramedRTPSource.cpp".
- Made a fix to the (normally "#ifdef"d out) debugging code in
"AC3AudioStreamFramer.cpp". (Thanks to Yigal for noticing this.)
2004.01.24:
- Changed "openRTSP" to use 20 kByte "FileSink" receive buffers by default,
instead of 10 kBytes. (Some frames in MPEG-4 streams were exceeding the
previous limit.)
- Added code to "MultiFramedRTPSource.cpp" to easily let the developer
simulate packet loss.
2004.01.23:
- Changed "RTSPServer" to include a "Content-Base:" header in "DESCRIBE"
responses. This overcomes a bug in QuickTime Player, which sends incorrect
"SETUP" URLs otherwise.
- Fixed a bug in "MPEG4VideoStreamFramer" that was causing some frames
to erroneously be given a duration of 0.
2004.01.22:
- Made another improvement to the "RTSPServer" implementation. It once again
properly handles streams without a stream name (i.e., where the "streamName"
parameter to "ServerMediaSession::createNew()" was NULL.
- Updated the (little-used) "ByteStreamMultiFileSource" class to take
"preferredFrameSize" and "playTimePerFrame" parameters, just like
"ByteStreamFileSource". Also added a member function to ask whether
a new file has just been read from.
2004.01.21:
- Made several improvements/bugfixes to the "RTSPServer" implementation:
- Worked around an apparent bug in QuickTime Player: It sometimes
doesn't include a proper URL in RTSP "SETUP" requests.
- Corrected the 'frame' (really tick) rate and frame duration that
are computed for 'fixed_vop_rate' MPEG-4 video streams.
- Compensated for some buggy MPEG-4 video streams that don't set
timestamp information properly.
- MPEG-4 video end codes will now be included in the outgoing RTP stream,
and received properly by RTSP clients.
- Fixed "RTSPClient" to be more tolerant of RTSP "Transport:" headers that
contain more than one successive ';' character. (Darwin Streaming Server
sometimes does this.)
2004.01.19:
- Changed "RTSPServer" to not create per-session state when handling
"DESCRIBE", but instead to wait until "SETUP". This fixes a problem
that was causing the "VLC" media player to fail to work with our
"RTSPServer" implementation, because VLC uses one RTSP TCP connection
to do the "DESCRIBE", and then another to do "SETUP" and "PLAY".
(Thanks to Emmanuel Dufour for pointing this out.)
- Updated "MPEG4VideoStreamFramer" to include the VIDEO_SEQUENCE_END_CODE
in the output stream if it sees it in the input.
2004.01.10:
- Fixed the "RTSPServer" implementation to properly return a "server_port" field
in the RTSP "SETUP" response for unicast streams. Also, the server ports
(RTP and RTCP) are now chosen separately, and will no longer be the same
as the client ports if the client and server are running on the same machine.
(That did not work on some Linux systems.)
- Fixed a bug in "MP3ADU" that was causing frame durations to not be set properly
when translating between MP3 frames and ADU frames.
2004.01.09:
- Modified "RTSPClient" to handle embedded NULL characters in a SDP
description. (These are not legal, but they have been seen in some cases.)
2004.01.06:
- Modified the FramedSource 'after getting' function signature to take two new
parameters: (1) The number of bytes (if any) that were truncated from the
delivered data, and (2) The duration (in microseconds) of the delivered frame.
For backwards compatibility with old code, the old 'after getting' function
signature is still supported, but will be removed in some future version of
the code. (The "getPlayTime()" function was also removed.)
2003.12.26:
- Made "FramedFilter" objects implement the "stopPlaying()" function by
also calling "stopPlaying()" on their source object.
- Fixed an obscure bug in "RTSPClient".
2003.12.20:
- Made the "video/H263-2000" MIME type use the same RTP payload format as
"video/H263-1998". (Thanks to Norbert Doneth for suggesting this.)
2003.12.19:
- Fixed a minor bug in "RTSPServer" (some allocated memory wasn't being
freed properly). (Thanks to Konstantin Lunin for finding this.)
2003.12.16:
- Added "-DSOCKLEN_T=socklen_t" to the "COMPILE_OPTS =" line in
the file "config.solaris", so that the code will compile
correctly for 64-bit Solaris systems.
2003.11.25:
- Put some error checks back into "WindowsAudioInputDevice".
2003.11.21:
- Some case-insensitive string comparisons weren't working properly in Windows; fixed.
2003.11.19:
- Added a global Boolean variable to flag when RTP I/O over a TCP connection fails.
This hack allows higher-level code to check for this.
2003.11.16:
- Fixed "RTPInterface" to not infinite loop when trying to read from a TCP
connection that has closed.
- Modified "BasicTaskScheduler" to overcome a bug in Windows that sometimes
causes "select()" to fail.
2003.11.13:
- Made "WindowsAudioInputDevice" a bit more robust against broken audio drivers.
2003.11.06:
- Modified "groupsock/inet.c" to allow the system-supplied "random()" and "srandom()"
functions to be used instead of our own "our_..." implementation.
This is done if USE_SYSTEM_RANDOM is defined (e.g., in the "config.*" file).
2003.11.06:
- Modified the "MPEGVideoStreamParser" constructor, in response to a complaint
that some compilers would choke on the old code.
2003.10.30:
- Added a warning output message to "MultiFramedRTPSink::afterGettingFrame1()"
whenever the input frame appears to exceed the maximum buffer size. This
maximum buffer size can be increased by changing
"OutPacketBuffer::numPacketsLimit".
2003.10.27:
- Changed the "MultiFramedRTPSource" error message (added in 2003.10.04) to apply
only to frame sizes > 1000, so that (e.g.) QCELP RTP sources don't trigger it.
2003.10.24:
- Fixed the RTSP server implementation to put SDP lines in the correct order
(as defined by the SDP speecification). Also, added "Cseq:" lines that were
missing from "404" error responses. (Thanks to Bill May for noting these bugs.)
- Improved the implementation of MPEG-4 video framing and streaming.
2003.10.08:
- Fixed a bug in the previous "FileSink" update that was causing "openRTSP"
to crash when recording a MPEG-4 video stream (using the "-m" option).
(Thanks to Jiangzhou Scu for noticing this bug.)
2003.10.07:
- Updated the "FileSink" class to take an optional Boolean parameter
"oneFilePerFrame". If set, a separate file will be output for each
incoming frame. The frame's presentation time is used as a
file name suffix, to distinguish the files.
- Added a new option "-m" to "openRTSP" (and "playSIP"). This option
causes a separate file to be written for each frame (using the
above-mentioned new feature of "FileSink").
2003.10.05:
- Renamed the new openRTSP/playSIP "-S" option to "-b".
2003.10.04:
- Added an error message to "MultiFramedRTPSource" to report when
the client's receive buffer is too small for an incoming frame.
(This could happen with large JPEG frames, for example.)
- Updated the signature to "FileSink" to take an optional 'buffer size'
parameter as argument. (The default value is 10000.)
- Added a "-S <file-sink-buffer-size>" option to "openRTSP" and "playSIP".
2003.09.30:
Improved the default implementation of
"RTPSink::hasBeenSynchronizedUsingRTCP()" to more accurately report
whether or not the most recently-delivered packet's presentation time
was synchronized using RTCP SRs. (Thanks to Luca Abeni for pointing
out the possibility of a problem with the old implementation.)
2003.09.25:
Improved the support for unicast RTSP/RTP streaming. Also, added a new
test program "testOnDemandRTSPServer" that demonstrates how to use this.
2003.09.19:
- Added support for unicast streaming from a "RTSPServer".
(A test program that demonstrates this will be available shortly.)
(Thanks to TNO Fysisch en Elektronisch Laboratorium (Netherlands)
for funding this work.)
- Modified the "strDup()" function to return NULL (instead of crashing)
if passed a NULL parameter.
2003.09.11:
- Another improvement/bugfix to the "MultiFramedRTPSink"
implementation.
- Changed the implementation of "RTSPServer" and "ServerMediaSession"
in preparation for implementing unicast streaming from RTSP servers.
(This is something that's not ready yet, but close...)
2003.09.05:
Fixed the implementation of "JPEGVideoRTPSource" so that it prepends
a proper JFIF JPEG header to the start of each incoming JPEG frame.
This means that programs such as "openRTSP" and "MPlayer" will now
receive/play JPEG/RTP streams correctly.
2003.09.03:
Improved the implementation of "MultiFramedRTPSink" to more efficiently
handle the case where input frames get broken up into multiple outgoing
RTP packets. We now eliminate an uncessary "memmove()" for each
fragment. In particular, this should make MPEG-1 or 2 and motion-JPEG
video streaming more efficient.
2003.09.01:
- Added support for reading and streaming AMR audio files (as defined in
RFC 3267). Also added a new test program "testAMRAudioStreamer".
(Thanks to TNO Fysisch en Elektronisch Laboratorium (Netherlands) for
funding this work.)
2003.08.28a:
- When "openRTSP" writes out a recorded MPEG-4 Elementary Stream video file,
it now writes SDP 'config' information to the front of the file beforehand.
This 'config' information contains VOL etc. headers that can be useful
for playback.
2003.08.28:
- Added 'framer' and RTP sink classes for MPEG-4 Elementary Stream video.
(Thanks to TNO Fysisch en Elektronisch Laboratorium (Netherlands) for
funding this work.)
- Added a new test program "testMPEG4VideoStreamer".
- Fixed a bug with RTP-over-TCP reading that could cause a crash if the
same TCP socket number gets reused for a later stream. Also, made this
code more thread-safe.
2003.08.21:
Renamed all of the MPEG-1 or 2 class and program names from "MPEG*" to
"MPEG1or2*". This is to distinguish these from the classes and programs
that use MPEG-4.
2003.08.19:
Made the maximum buffer size in "MediaSink.cpp" a parameter that can be
set (changed) at runtime. (Reset the default back to 20* packet size)
2003.08.18:
- Fixed "JPEGVideoRTPSink" to use the standard RTP payload format code
(26) for JPEG RTP streams.
- Updated "MediaSink.cpp" to increase the maximum buffer size for incoming
data. This makes it possible to stream large JPEG frames (which are
fragmented over multiple outgoing RTP packets).
2003.08.16:
- Added new classes "AudioRTPSink" and "VideoRTPSink" as parent classes
of the various audio and video RTP sink classes, respectively.
- Added a new "JPEGVideoRTPSink" class, and a "JPEGVideoSource" class
that can be used as an abstract base class for particular JPEG sources.
2003.08.07:
Minor change to "MediaSink".
2003.07.29:
Updated "RTSPClient" to include a "tearDownMediaSession()" operation,
in addition to "tearDownMediaSubsession(). "openRTSP" now uses just
the "tearDownMediaSession()" operation. (Darwin Streaming Server was
barfing with "tearDownMediaSubsession()"). Thanks to Edward Estabrook
for suggesting this.
2003.07.27:
Added a new "-F <fileName-prefix>" option to "openRTSP" (and "playSIP").
This can be useful if you are running "openRTSP" several times,
in the same directory, to play several different RTSP streams
(e.g., from a script). (Thanks to Norbert Donath for this suggestion.)
2003.07.14:
Updated the "WAVAudioFileSource" implementation (and the
"testWAVAudioStreamer" test program) to better report any reason for
a WAV file to be invalid.
2003.07.13:
- Added new filter classes for converting between 16-bit PCM and
8-bit u-law audio, and between host and network order for 16-bit values.
(See "liveMedia/include/uLawAudioFilter.hh" for details.)
- Added a new class "WAVAudioFileSource" for reading/processing
WAV audio files.
- Added a new test program "testWAVAudioStreamer" that reads a WAV
audio file - "test.wav" - and streams it via multicast (using a built-in
RTSP server).
- Updated "MediaSession" to recognize "L8" and "L16" RTP audio streams
(to be handled by "SimpleRTPSource").
2003.07.07:
- Fixed a bug that would cause "vobStreamer" to crash if (incorrectly)
run with no arguments.
- Updated the "test*Streamer" test programs to print out the "rtsp://"
URL of the built-in RTSP server (if it's enabled).
2003.07.01a:
Updated the "WindowsAudioInputDevice" subdirectory to:
- Change the name of the library from "WindowsAudioInputDevice.lib" to
"libWindowsAudioInputDevice.lib".
- Added a console test program - "showAudioInputPorts" - that lists
the audio input ports that are currently available.
2003.07.01:
Added a new subdirectory "WindowsAudioInputDevice", which is a
Windows-specific implementation of the "AudioInputDevice" class.
This can be used by Windows applications to read PCM audio from
a sound card.
2003.06.28:
Added an optional parameter (default, True) to "SimpleRTPSource"
that says whether to use the RTP "M" (marker) bit to indicate the
last (or only) fragment of a video frame. (Suggested by
Cezar Plesca.)
2003.06.27:
Added a "AudioDeviceSource" class to the "liveMedia" library.
This class is a generic audio input device (such as a microphone
or a sound card) - to be subclassed for specific OS platforms.
2003.06.26:
- Updated the "RTSPServer" implementation to respond to "PAUSE"
requests. (It doesnt actually pause the stream; just returns "OK".
This makes QuickTime Player happier.)
- Added a "-o" option to "openRTSP" (and modified "RTSPClient"
accordingly). This option causes openRTSP to send an "OPTIONS" command
to the server, and prints out the response.
2003.06.17:
Added support for MPEG-4 generic RTP sinks. (Currently, only the
"AAC-hbr" audio mode is supported, and only one AAC frame is packed
into each outgoing RTP packet.)
2003.06.13:
- Fixed a bug in "ServerMediaSubsession" that could cause a memory leak.
(Thanks to Frederik Bonte for finding this.)
2003.06.07:
- Fixed a minor bug in "MPEGVideoRTPSink": The RTP "M" bit is now set
only on the last fragment, if a frame is fragmented. (Thanks to
Tym Altman for pointing this out.)
- Improved support for AudioRTPSinks that have more than one audio channel.
2003.05.31:
Fixed a bug in "SimpleRTPSink" that would cause it to not generate correct
RTP timestamps on outgoing packets.
2003.05.29:
Fixed a bug in "RTSPServer" that would cause it to get into an infinite
loop if a client's connection was terminated unexpectedly.
2003.05.28:
Fixed some typos in comments.
2003.05.23:
Some minor changes to reduce the number of bogus warning messages
displayed when compiling using Visual C++.
2003.05.22b:
Fixed a bug in "SIPClient" (thanks to Reini Urban for helping track this
down).
2003.05.22a:
Fixed a couple more minor bugs that were causing "valgrind" to complain.
2003.05.22:
Fixed a bug in "SIPClient" (a field was not getting initialized properly)
2003.05.21:
- Because not all platforms define 'errno' the same way, 'errno' is now
implemented as a pure virtual function "getErrno()" in
"UsageEnvironment". "BasicUsageEnvironment" defines this function to
just return "errno", but other subclasses could implement it in other
ways.
- Added support for setting and reading information in "RTP-Info:"
headers in RTSP "PLAY" response. (Thanks to Romulus Grigoras for
contributing this.)
2003.05.19:
Fixed a bug in "SIPClient" that could cause a crash. (Thanks to
Reini Urban for finding this.)
2003.05.16:
- Removed all calls to "fprintf(stderr, ...)" and "cerr << ..." from
the library code. Instead, we now use "operator<<" virtual functions
that are defined on the "UsageEnvironment". "BasicUsageEnvironment"
defines these by outputting to "cerr", but other subclasses of
"UsageEnvironment" can define them to do console output whichever
way they wish.
2003.05.15:
- Moved the "select()" call in "readSocket()" (GroupsockHelper.cpp) into
a separate function, to allow it to be easily reimplemented
if desired.
- More minor changes to "RTPSource" stats handling, and the "-Q" option
to "openRTSP"/"playSIP".
2003.05.12:
- Restructured "BasicTaskScheduler" as two hierarchical classes:
"BasicTaskScheduler0" (an abstract base class), and
"BasicTaskScheduler".
This makes it easier to subclass (e.g., to reimplement "SingleStep").
A subclass reimplementation would use "BasicTaskScheduler0".
- Removed "our_bcopy()", and use "memmove()" instead, because everyone
seems to implement that.
- Fixed a bug in "RTPSource" that could cause packet loss stats to be
reported incorrectly if the first RTP sequence number received was 0.
2003.05.06:
Minor changes to the "openRTSP" QOS stats reports.
2003.05.05:
Changed the "start" and "end" parameters to
"RTSPClient::playMediaSubsession()" from int to float, for increased
granularity. (Suggestion by Cezar Plesca.)
2003.05.03:
- Added support for pausing/resuming to "RTSPClient".
(Thanks to Romulus Grigoras for contributing this.)
- Fixed a couple of bugs in "SIPClient".
2003.04.28:
- Cleaned up and improved the "DelayQueue" implementation.
(This time it works properly, I hope.)
2003.04.27:
- Temporarily backed out the previous change to "DelayQueue", because it
broke MPEG video streaming (causing it to play too slowly).
2003.04.26:
- Made "DelayQueue" a little more accurate, by adjusting for the time
that has elapsed since the last alarm, when adding a new entry to the queue.
- Fixed a bug in "RTPSource" that could cause packet loss statistics to not
be reported accurately (in RTCP) if incoming packets were misordered.
- Updated "openRTSP" and "playSIP" to take a new "-Q" option, which
prints out QOS data at the end of the session.
2003.04.24:
- Added a mechanism for registering an optional, auxilliary read handler
with a "RTPSource" or "RTCPInstance". Such a handler would get called
after each new packet is read.
- Changed "SimpleRTPSink" to (by default) set the RTP "M" bit on
video streams iff the packet contains the last (or only) fragment of
a frame.
2003.04.23:
- More improvements/fixes to the handling of SSM sessions.
- Fixed a bug in RTSPServer that could cause a crash if the client
quit suddenly.
2003.04.20:
- Updated "MediaSession" to recognize
a=source-filter: incl ...
lines in SDP descriptions (for SSM sessions), and to do the appropriate
SSM-style multicast joins in this case (and also to send back RTCP via
unicast).
- Updated the RTCP implementation to reflect incoming unicast RTCP packets
back to the multicast group in the case where we're a SSM source.
- Update "vobStreamer" and the various "test*Streamer" test programs to
properly behave as SSM sources, when we have specified this.
2003.04.18:
- Updated the "*ServerMediaSession" classes to (optionally) output
SSM-specific information in SDP descriptions.
- Updated "vobStreamer" to choose a random multicast address in the SSM
range.
2003.04.12:
- Fixed "MPEGVideoStreamFramer" to allow for the possibility of
the GOP "time_code" field remaining unchanged in the source stream.
- Elimination of more unnecessary global variables.
2003.04.11:
- Added support for an optional user name and password inside a RTSP
or SIP URL.
- The media lookup table (used in "Media.cpp") is now allocated
dynamically, and stored in the "UsageEnvironment", rather than
being a global variable.
This makes it possible to have different threads, within the same
address spaces, accessing the library code.
(Each thread would need to have its own "UsageEnvironment" and
"TaskScheduler", though.)
2003.04.09:
Changed "BasicTaskScheduler::SingleStep()" to execute only one delay
queue task (along with any data input events) during each iteration.
This prevents a possible livelock if the delay queue always has events
outstanding. (Thanks to Ruth Sadler for pointing this out.)
2003.04.04:
- More improvements to "vobStreamer" (which has also been renamed
from "VOBStreamer".
2003.04.02:
- Made another change to the order that things are closed when exiting
"openRTSP", to help avoid a potential race condition that can occur
when using the "-t" option. (Thanks to Romulus Grigoras for reporting
this.)
- Updated "MPEGDemux" to properly handle the case where someone tries
to read from it after its input source has already closed.
- Several improvements to "VOBStreamer".
- Added "ByteStreamMultiFileSource" to the "liveMedia" library.
This generalizes "ByteStreamFileSource" to allow more than one input
file to be read, in sequence.
2003.04.01:
Fixed a bug in "openRTSP" that could cause it to crash when exiting
(if the "-t" option was used).
2003.03.31:
Added a new test program "VOBStreamer" to "testProgs".
This program reads a "VOB" file (e.g., from a non-encrypted DVD),
and streams the component video (MPEG) and audio (AC3) component streams
using RTP multicast.
(Online documentation to follow...)
2003.03.30:
Added "AC3AudioRTPSource" and "AC3AudioRTPSink".
2003.03.28:
- Fixed a bug in "MPEGVideoStreamFramer" that would cause it to generate
incorrect presentation times if the MPEG video stream started out with
a non-zero 'time_code'.
- Updated "AC3AudioStreamFramer" to allow clients to get the stream's
sampling rate before it reads the first frame.
2003.03.25:
Began adding support for AC3 audio/RTP streaming.
2003.03.22:
Added support for receiving H.261/RTP streams
2003.03.14:
- Removed calls to "strdup()", because that's a C-library function whose
result should not be deleted using "delete" (or "delete[]"). Instead,
we now provide our own C++ equvalent, called "strDup()".
- Also, changed several "delete"s to "delete[]".
(Thanks to Bill Kain for noting the need for this fix.)
2003:03;11:
Updated SIPClient to allow it to use an arbitrary source port number.
This makes it possible to use it on the same host on which a SIP server
is already running.
2003.03.09:
- Made "MediaSession"s parsing of SDP descriptions more robust, to allow for
blank lines in the SDP description. ("Be liberal in what you accept...")
2003.03.07:
- Added an optional "MIME subtype" parameter to "SIPClient", to allow
SIP "INVITE"s to use a dynamic RTP payload format. Updated "playSIP"
accordingly, to add an optional "-D <mime-subtype-name>" argument.
- Modified "FileSink" to close the source (and stop playing) if it gets
an EOF when writing to the output file. (Thanks to Ruud Schramp.)
2003.03.03:
Improved the implementation of "MPEG4GenericRTPSource".
2003.02.28:
- Fixed a bug that would cause RTSP clients to not set the server port
number (for RTCP) correctly in some situations. (Thanks to Alex Pollard.)
- Fixed a bug in "RTSPServer" that would cause "Transport:" headers to not
get generated correctly.
2003.02.27:
- Improved the "MultiFramedRTPSource" implementation to more cleanly handle
packet loss in the case where frames are split into multiple RTP packets.
- Parsed the optional "/<num-channels>" parameter that can appear at the
end of "a=rtpmap:" lines for audio sessions.
2003.02.17:
More work on the experimental '-R <rtsp-url>' option to "playSIP"
(and "openRTSP") that allows it to inject the incoming stream into
a separate RTSP server. This code is now working, although
currently only for a single PCMU or GSM audio stream. Also, RTCP
packets are not yet relayed between the source and destination.
2003.02.16:
Improved RTSPClient and SIPClient to check for (and discard)
any '\r' or '\n' that appears at the start of a response message.
(Some weirdo servers can do this.)
2003.02.10:
Began adding a new option to "playSIP" (and "openRTSP") to allow the
incoming media stream to be injected into a separate, destination
RTSP server. This still needs lots of work...
2003.02.08:
Fixed the "JPEGVideoRTPSource" implementation to properly prepend a
synthesized JPEG header to each received frame of RTP data. This now
makes it possible to receive and play motion-JPEG RTP streams.
2003.02.06a:
- Fixed a bug in the SDP "config" attribute parsing. (This affected
the use of "MPEG4LATMAudioRTPSource".
- Cleaned up the "createNew()" routines in each of the *RTPSource classes.
- Added two new RTPSource classes - "MPEG4ESVideoRTPSource" and
"MPEG4GenericRTPSource", for MPEG-4. However, these have not been
fully implemented yet.
2003.02.06:
Fixed some code that was 64-bit-unsafe. (Thanks to Philipp Thomas for
noticing this.)
2003.02.05:
- Cleaned up "RTSPClient", and added a method for doing an aggregate
"PLAY" operation (in addition to the existing method that does a
"PLAY" on an individual subsession).
- Modified the "openRTSP" test program so that it does a single
aggregate "PLAY", rather than a series of non-aggregate "PLAY"s, one for
each subsession. (RealNetworks' server doesn't support the latter.)
- Added a new routine for parsing "AudioSpecificConfig" strings that
can appear in SDP descriptions.
- Added Morgan Multimedia's implementation of "JPEGVideoRTPSource"
to the "liveMedia" library. (I haven't yet tested this.)
2003.02.04:
Removed "-DUSE_OUR_BZERO=1" from "config.linux", because it no longer
seems to be necessary, and it was breaking compilation for some people.
2003.02.03b:
Added an #include to "BasicUsageEnvironment/Lock.cpp" to fix a problem
that someone encountered with NULL not being defined.
2003.02.03a:
Created a new header file "groupsock/include/NetCommon.h" that contains
all networking-related #includes. This also does the correct #includes
for Windows, allowing Windows code to use Winsock-2 rather than Winsock-1.
Also, modified "win32config" to use a "TARGETOS" of WINNT rather than
WIN95, to make this all work.
Thanks to Doug Kosovic for figuring out the magic incantations
needed to get this all working.
2003.02.03:
- Improved "SIPClient" (in the "liveMedia") library, so that "INVITE"
requests are retransmitted, as necessary, for reliability.
- Added a "-A <rtp-payload-format>" option to "playSIP". This allows the
user to specify which audio RTP payload format should be received.
(At present only static payload formats can be specified, and only
audio codecs - not video.)
2003.01.28:
- Added support (in the "liveMedia" library) for a basic SIP client
- Added a new test program "playSIP", similar to "openRTSP". These two
applications are now built from the same code base.
2003.01.17:
Further improvements to the MPEG-4 audio support. We can now read
(from the "MediaSubsession") the StreamMuxConfig "config" stream that
was present in the SDP description. Also added a routine that parses
such a string, producing binary "AudioSpecificConfig" data.
(See "MPEG4LATMAudioRTPSource.cpp" for details.)
2003.01.16:
Improved support for receiving MPEG-4 LATM audio. Note that currently,
this works only for streams that do not have a StreamMuxConfig present
in the stream.
2003.01.10:
Added basic support for MPEG-4 LATM audio.
2002.12.21:
Fixed a bug in the previous update to "QuickTimeFileSink"
2002.12.20:
- Another change to "QuickTimeFileSink", again to change the way that track
durations are computed for ".mov" files. Now, each track's duration is
set to be the maximum of (i) the sum of the sample durations listed
in the 'stts' atom, and (ii) the the sum of the durations listed in the
track's 'edit list' (if any).
- Updated the MP3 file parsing code to check for a 'Xing' VBR header in
the first frame. ("liveCaster" can use this information to print more
sensible information about each file that it streams.)
2002.12.10:
Yet another change to "QuickTimeFileSink", this time to make sure that
the duration of video tracks corresponds exactly to the sum of video
sample durations listed in the 'stts' atom.
2002.11.30:
Renamed "TaskScheduler::blockMyself()" to "doEventLoop()", to better
describe what this member function actually does.
2002.11.25:
Another change to "QuickTimeFileSink". Now, when synchronzed tracks
are requested, the durations of video frame samples are adjusted so
that they correspond to actual RTP presentation times. (This is not
done for audio samples, however, because having audio samples vary
in duration might break audio codecs.)
2002.11.22:
Updated "QuickTimeFileSink" once again - this time to add more statistics
to the 'udta'/'hinf' atom for each generated hint track.
2002.11.18:
Modified the support for creating hint tracks in "QuickTimeFileSink" so
that it it now works properly for H.263+ video sessions.
2002.11.15:
- Made a small modification to "groupsock/GroupsockHelper.hh" to ensure that
it compiles on all platforms.
- Modified "MP3FileSource" so that it can handle layer I or layer II files,
as well as layer III (MP3).
2002.11.14:
Updated "QuickTimeFileSink" to support (optional) hint tracks in output
QuickTime files. Also added a "-H" option to "openRTSP" that
(when used with "-q") will add hint tracks to the output ".mov" file.
(Note that the hint tracks currently don't work well for H.263+ video
tracks, and currently don't work at all for QCELP.)
2002.11.04:
Updated the expiration date in "openRTSP.cpp"
2002.10.22:
- Undid the previous change. The top-level Unix Makefile now does
cd <dir> ; make
once again. Unfortunately "--directory" doesn't seem to work properly
with the version of "make" that's installed with FreeBSD.
- Changed the implementation of the "-n" option in "openRTSP". If "-y"
is also specified, then the user will be notified only if (i) data has
arrived for all subsessions, and (ii) all subsessions have been
synchronized.
2002.10.21:
Changed the top-level Unix Makefile to do
make --directory=<dir>
rather than
cd <dir>; make
as the latter apparently didn't work with cygwin.
(Thanks to "Sycotic" Smith for the tip.)
2002.10.20:
- Updated "QuickTimeFileSink" once again to improve the implementation of
synchronized audio/video tracks in output QuickTime files.
- Added a configuration file for "cygwin". (Thanks to "Sycotic" Smith
for working on this.)
2002.10.19:
Updated "QuickTimeFileSink" to use QuickTime Edit Lists to synchronize
the media tracks. (It appears that this does not always produce playable
QuickTime files, so this implementation may have to be changed later.)
2002.10.11:
Fixed a bug in "MultiFramedRTPSource" that could cause a RTP receiver to
hang if it received a malformed RTP packet with no data after a special,
media-specific header.
2002.10.10:
Fixed the "RTSPClient" implementation so that it now understands
"Content-Length" as well as "Content-length". (This now allows it
to work with our own RTSP server implementation once again!)
2002.10.07:
Improved the implementation of RTP (and RTCP) reception to eliminate an
unnecessary "memmove()" each time a packet is received.
2002.10.04:
Updated the "liveMedia" library to support optionally sending and receiving
RTP and RTCP packets over a TCP connection (e.g., the TCP connection used
for a RTSP session). Also, updated the "openRTSP" test program to take
an optional "-t" argument, meaning: stream over TCP.
2002.10.01:
Fixed the modification to "MultiFramedRTPSource" that was made in the
2002.08.29 release, and also made a corresponding change to
"QuickTimeFileSink", so that it now correctly records H.263+/RTP streams
once again.
2002.09.30:
- Removed the "Media::addNew()" member function, because it was always
called each time a new Media object was created. Instead, its
function was just moved into the Media::Media() constructor.
- Made another fix to "testMPEGAudioVideoStreamer".
2002.09.28:
Fixed a bug in "testMPEGAudioVideoStreamer" that could cause a crash when
its input file was being read for the 2nd or more time. (Also updated
"liveMedia/FramedSource.cpp".)
2002.09.27:
Updated "QCELPAudioRTPSource" so that "hasBeenSynchronizedUsingRTCP()"
returns True only after a full interleave cycle of RTP packets has been
received. This ensures that when it returns true, the receiver will
be reading a frame that came from a synchronized RTP packet.
2002.09.26:
- Fixed QCELPAudioRTPSource so that it now returns correct presentation
timestamps on each frame that is read from it (even if the input data
was interleaved).
- Updated QuickTimeFileSink to correctly write ".mov" files for half-rate
QCELP audio tracks.
2002.09.25:
Added a new test program - "sapWatch" - that reads and prints SDP/SAP
announcements (sent to the default SDP/SAP directory)
2002.09.24:
- Fixed a bug in "QCELPAudioRTPSource"
- The RTCP implementation now properly recognizes incoming RTCP
reports from other processes on the same computer. (Previously, these
would be rejected as being loop-back packets.)
2002.09.19:
- Updated "RTPSource"s so that an accurate "presentationTime" variable
is now returned whenever a client reads from such a source. These times
are kept accurate by RTCP "Sender Report" packets sent by the sender.
2002.09.13:
- Improved the "BasicHashTable" implementation so that it's
no longer a quick-and-dirty hack.
- Changed the parameter signature to "ByteStreamFileSource" so that the
"playTimePerFrame" parameter is now an unsigned (microseconds) instead
of a float. This eliminates a round-off problem.
2002.09.11:
Modified "ByteStreamFileSource::doGetNextFrame()" so that - if the
"playTimePerFrame" parameter was set - the presentation time gets set
based on this, rather than the current 'wall clock' time.
2002.09.06:
Updated "win32config.Borland" based on feedback by Vesselin Kostadinov.
(Also updated an #ifdef in "liveMedia/include/Media.hh")
2002.09.05:
Added code to ignore an "EAGAIN" error on a 'groupsock' read.
(This can happen in Linux.)
2002.09.03:
Fixed a bug in the RTSP server implementation that could
have caused a memory smash.
2002.08.30:
Added header files containing version strings (and corresponding integers)
for each library. Client code can use these to print out version
information, or check for version compatibility.
2002.08.29:
Modified "MultiFramedRTPSource" and its subclasses to properly handle
the case where a frame is fragmented over several successive incoming
RTP packets. Each subclass's implementation of "processSpecialHeader()"
can choose between having incomplete fragments returned immediately to
the client (the default behavior), or waiting until all of the fragments
have arrived. The implementation of "H263plusVideoRTPSource" was changed
to do the latter (because the current "ffmpeg" H.263+ decoder relies upon
getting complete frames for input).
Added an optional "applicationName" parameter to "RTSPClient::createNew()",
and updated the RTSP client implementation to add a "User-Agent:" field,
which will contain this "applicationName" string (if present).
2002.08.27:
Added an optional Boolean parameter "iFramesOnly" to
"MPEGVideoStreamFramer::createNew()". If this parameter is True,
then the framer object will return only data from "I" frames.
(By default, this parameter is False, meaning that all frames will
be returned.) This parameter can be used to reduce the bandwidth
of streamed MPEG (1 or 2) video.
2002.08.06:
Changed "groupsock/GroupsockHelper.cpp" to do a "#include <errno.h>"
rather than "extern int errno". The latter was apparently breaking in
some versions of Linux.
2002.08.05:
Added support for the video/MP2P MIME type (RFC 2250 MPEG Program Streams)
2002.06.25:
Source file distribution copied from live.sourceforge.net