Security
Headlines
HeadlinesLatestCVEs

Headline

CVE-2019-15232

Live555 before 2019.08.16 has a Use-After-Free because GenericMediaServer::createNewClientSessionWithId can generate the same client session ID in succession, which is mishandled by the MPEG1or2 and Matroska file demultiplexors.

CVE
#vulnerability#web#ios#android#mac#windows#apple#linux#debian#cisco#dos#intel#c++#perl#buffer_overflow#huawei#auth#ssh#sap#ssl

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©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 "

Related news

Scanvus now supports Vulners and Vulns.io VM Linux vulnerability detection APIs

Hello everyone! Great news for my open source Scanvus project! You can now perform vulnerability checks on Linux hosts and docker images not only using the Vulners.com API, but also with the Vulns.io VM API. It’s especially nice that all the code to support the new API was written and contributed by colleagues from Vulns.io. […]

CVE: Latest News

CVE-2023-50976: Transactions API Authorization by oleiman · Pull Request #14969 · redpanda-data/redpanda
CVE-2023-6905
CVE-2023-6903
CVE-2023-6904
CVE-2023-3907