2024-03-08: - Changed "ServerTLSState::setup()" (in "TLSState.cpp") to call "SSL_CTX_use_certificate_chain_file()" instead of "SSL_CTX_use_certificate_file()", to allow the server operator to specify a chain of certificates, rather than just one. (Thanks to Raphael Schlarb for this suggestion.) 2024.02.28: - Updated the code for "dateHeader()" (in "RTSPCommon.cpp") to avoid using "strftime()", because that can produce a localized date string that violates the RTSP specification (which uses section 3.3.1 of RFC 2068 (the HTTP/1.1 specification) to define the "Date:" header). (Thanks to Lauri Nurmi for reporting the problem, and providing a patch.) 2024.02.23: - Updated the code for "dateHeader()" (in "RTSPCommon.cpp") to use "NULL" instead of "nullptr"; the latter was causing compilation problems for someone. 2024.02.15: - Updated the RTCP implementation so that reception stats for a SSRC are no longer deleted, even if a SSRC is reaped due to RTCP inactivity (no RTCP "SR" reports received recently). 2023.11.30: - In the implementation of the "MPEGVideoStreamFramer" class, gave "TimeCode::operator==()" the "const" qualifier, to make some compilers happy. (Thanks to Dmitry Bely for the report) - Performed the annual update of the copyright years near the start of each file 2023.11.08: - Changed the signature to the virtual function "getRTPSinkandRTCP()" (in "ServerMediaSubession", and its subclasses "OnDemandServerMediaSession" and "PassiveServerMediaSubsession") to make its 'result' arguments "rtpSink" and "rtcp" no longer "const *". There was no real reason to make those "const *". (Thanks to Andy Hawkins for prompting this.) 2023.11.07: - In the class "GenericMediaServer", made the variables "fServerMediaSessions", "fClientConnections", and "fClientSessions" 'protected' rather than 'private', to allow subclasses to access them if desired. 2023.10.30: - Fixed a bug in "deleteEventTrigger()" that had accidentally been introduced during the change to 'event trigger' implementation back in June. (Thanks to Jörg Dommaschk for reporting this.) 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 " 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(, ); on your newly-created "RTSPServer" object (before you enter the event loop to start handling requests) - where is the (string) pathname of a certificate file, and 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 " 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 " 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 " command-line option if the "REGISTER" command is also implemented (i.e., with "-R"). Now, when we handle "REGISTER", the and 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 " 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 " 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 and/or 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 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-", or "npt=-". (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 "->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 " option to work with the "-F " 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 " 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 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 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 ' 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 " 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 ') 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 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 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 '%' 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 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 '%' 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 " 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 " 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.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=-". (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 " 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 , 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 ":@" 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=-" or "port=". (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 " 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) #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 -z See the "openRTSP" documentation 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 " 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: . 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(::) 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 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 " Tells the program to close the stream if no new packets have been received in at least seconds. "-B " Tells the program to set the network socket input buffer (for each input stream) to 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 , 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 " 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 ). (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 " 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 " 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 " 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 "/" parameter that can appear at the end of "a=rtpmap:" lines for audio sessions. 2003.02.17: More work on the experimental '-R ' 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 " 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 ; 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= rather than cd ; 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 " 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