live555 unofficial archive - list

2024.11.28

Changelog

- Updated the signature of "doEventLoop()" to match that of "triggerEvent()", by using
  "std::atomic_char" as the 'watch variable' type (if NO_STD_LIB is not defined)
- Performed the annual update of the copyright years near the start of each file

Checksums

2024.10.31

Changelog

- Yet another fix to the (excrutiatingly tricky) SRTP/ROC-handling code.
  (Thanks to Jean-Baptiste Renou.)

Checksums

2024.10.30

Changelog

- Another fix to the code for SRTP streaming: Make sure that the RTCP instance's
  cryptographic context gets updated whenever the RTP sink's cryptographic context changes.
  (Thanks again to Jean-Claude Saget.)

Checksums

2024.10.29

Changelog

- A fix to the previous release fixing code for streaming SRTP to a new client from an ongoing stream.
  (Thanks again to Jean-Claude Saget.)

Checksums

2024.10.24

Changelog

- Another change to the code for streaming SRTP to a new client from an ongoing stream:
  If the ROC changes, then generate a new SDP description, but not a new stream source or
  RTP sink.  (Thanks to Jean-Claude Saget for reporting this issue.)

Checksums

2024.10.11

Changelog

- Fixed another RTSP server bug in the implementation of RTP-over-TCP streaming.
  (Thanks again to Sangjun Park.)

Checksums

2024.10.10

Changelog

- Fixed a stack-use-after-return bug in the RTSP server implementation.
  (Thanks to Sangjun Park for reporting this.)

Checksums

2024.10.09

Changelog

- Fixed a RTSP server bug in the implementation of RTP-over-TCP streaming that could cause
  a "RTSPClientConnection" object to be accessed after it had been deleted.
  (Thanks to Sangjun Park for reporting this issue.)

Checksums

2024.09.29

Changelog

- Fixed a bug in "ProxyServerMediaSession.cpp" that could cause an 'access after free' error
  if the proxy server's "-V" option were used.  (Thanks to Andrey Radchenko for reporting this.)

Checksums

2024.09.25

Changelog

- Fixed another bug in SRTP streaming from a "reuseFirstSource" stream: Make sure we use
  the same keying material for each client.

Checksums

2024.09.24

Changelog

- Removed an experimental version of "testOnDemandRTSPServer.cpp" (for streaming via SRTP)
  that had acceidentally been left in the previous release.

Checksums

2024.09.20

Changelog

- Ensure that, when streaming SRTP, any change to the server's ROC (rollover counter)
  gets sent to the RTSP client (in the SDP description), if it joins an ongoing stream.
  (Thanks to Yahia Benmoussa for reporting this issue.)

Checksums

2024.08.01

Changelog

- Updated "ServerMediaSession::generateSDPDescription()" to treat "time_t" as (long long).
  (Thanks to Godmar for reporting this.)

Checksums

2024.06.26

Changelog

- Updated the "OnDemandServerMediaSubsession" implementation to output an error message
  if the "sink->startPlaying()" call failed (e.g., due to its source not being
  compatible with the sink).  This makes some common errors (e.g, a proper 'framer' not
  being used) easier to detect.

Checksums

2024.05.30

Changelog

- Fixed a mistake that caused the config file "config.raspberrypi" to not appear in
  the distribution.  (It's there now.)

Checksums

2024.05.15

Changelog

- Added a new config file "config.raspberrypi" that is known to work for
  building the code on/for a Raspberry Pi 5.

Checksums

2024.05.05

Changelog

- Updated "QuickTimeFileSink" to add support for recording H.265 video streams.
  (This is not fully working yet; it appears to have some bugs.)

Checksums

2024.04.19

Changelog

- Updated "MPEG2TransportStreamFramer" to ignore big jumps (2x or more) in the estimate
  for the duration of each Transport packet.  This is likely caused by an unexpected
  jump in the PCR (not indicated by "discontinuity_indicator").
  (This is in response to a report from Andy Hawkins.)

Checksums

2024.04.14

Changelog

- Added constant strings and ints to each library that allow you to get the library version
  at runtime, rather than just at compile time.  For example, for the "liveMedia" library,
  these are:
  	extern char const* const liveMediaLibraryVersionStr;
	extern int const liveMediaLibraryVersionInt;
  (Thanks to Paul Westlund for this suggestion.)

Checksums

2024.03.08

Changelog

- Changed "ServerTLSState::setup()" (in "TLSState.cpp") to call
  "SSL_CTX_use_certificate_chain_file()" instead of "SSL_CTX_use_certificate_file()",
  to allow the server operator to specify a chain of certificates, rather than just one.
  (Thanks to Raphael Schlarb for this suggestion.)

Checksums

2024.02.28

Changelog

- Updated the code for "dateHeader()" (in "RTSPCommon.cpp") to avoid using "strftime()",
  because that can produce a localized date string that violates the RTSP specification
  (which uses section 3.3.1 of RFC 2068 (the HTTP/1.1 specification) to define the "Date:"
  header).  (Thanks to Lauri Nurmi for reporting the problem, and providing a patch.)

Checksums

2024.02.23

Changelog

- Updated the code for "dateHeader()" (in "RTSPCommon.cpp") to use "NULL" instead of "nullptr";
  the latter was causing compilation problems for someone.

Checksums

2024.02.15

Changelog

- Updated the RTCP implementation so that reception stats for a SSRC are no longer deleted,
  even if a SSRC is reaped due to RTCP inactivity (no RTCP "SR" reports received recently).

Checksums

2023.11.30

Changelog

- In the implementation of the "MPEGVideoStreamFramer" class, gave "TimeCode::operator==()"
  the "const" qualifier, to make some compilers happy.
  (Thanks to Dmitry Bely for the report)
- Performed the annual update of the copyright years near the start of each file

Checksums

2023.11.08

Changelog

- Changed the signature to the virtual function "getRTPSinkandRTCP()" (in "ServerMediaSubession",
  and its subclasses "OnDemandServerMediaSession" and "PassiveServerMediaSubsession")
  to make its 'result' arguments "rtpSink" and "rtcp" no longer "const *".  There was no
  real reason to make those "const *".  (Thanks to Andy Hawkins for prompting this.)

Checksums

2023.11.07

Changelog

- In the class "GenericMediaServer", made the variables "fServerMediaSessions",
  "fClientConnections", and "fClientSessions" 'protected' rather than 'private',
  to allow subclasses to access them if desired.

Checksums

2023.10.30

Changelog

- Fixed a bug in "deleteEventTrigger()" that had accidentally been introduced during the
  change to 'event trigger' implementation back in June.
  (Thanks to Jörg Dommaschk for reporting this.)

Checksums

2023.07.24

Changelog

- Updated the event trigger implementation once again, to allow for the possibility of
  developers redefining MAX_NUM_EVENT_TRIGGERS (it must always be <= the number of bits
  in an "EventTriggerId", though.  (Thanks to Jan Rørgaard Hansen for this suggestion.)

Checksums

2023.06.20

Changelog

- Updated the event trigger implementation again - in the case where "NO_STD_LIB" is
  defined.  In this case, "fTriggersAwaitingHandling" is implemented as an array of
  "Boolean volatile"s, rather than as a 32-bit bitmap.  This should make 'race conditions'
  less likely even if "NO_STD_LIB" is defined (though you should use the preferred, default
  implementation - that uses an array of "std::atomic_flag"s - if possible).

Checksums

2023.06.16

Changelog

- Changed the (default) implementation of 'event triggers' in "BasicTaskScheduler" to
  implement "fTriggersAwaitingHandling" using "std:atomic_flag"s, rather than as a bitmap.
  This should overcome 'race conditions' that some users experienced when calling
  "triggerEvent()" from a non-LIVE555 thread.  (Thanks to Jan Rørgaard Hansen for reporting
  this issue.)
  Note that this is the first time the LIVE555 code has required the C++ standard library.
  (If you cannot use the C++ standard library, then you can compile the code - but getting the
  old behavior - by defining "NO_STD_LIB".)
- Minor change to "RTSPCommon.cpp" to overcome a compilation error in XCode on Mac OS X.

Checksums

2023.06.14

Changelog

- Fixed a bug in the Matroska file parsing code that could sometimes cause a 'use after free'
  error.  (Thanks to Meng Ruijie, Martin Mirchev, and "jerry testing" for reporting this.)

Checksums

2023.06.10

Changelog

- Minor change to "GroupsockHelper.cpp" to overcome a compilation error in XCode on Mac OS X.

Checksums

2023.06.08

Changelog

- Updated the "dateHeader()" function in "RTSPCommon.cpp" to use "gmtime_r()" instead of
  the older, non-thread-safe "gmtime()".  (Thanks to Russell Greene for the patch.)

Checksums

2023.05.10

Changelog

- Fixed a minor memory leak in the "RTSPServer" code.
  (Thanks to Zhudong Jie for reporting this.)

Checksums

2023.03.30

Changelog

- Calls to "send()" and "sendto()" now explicitly take "MSG_NOSIGNAL" rather than 0 as the
  'flags' parameter.  In most systems, 0 seems to work, but apparently not in
  Debian Linux.  (Thanks to Eric Beuque for reporting this.)

Checksums

2023.01.19

Changelog

- 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".)

Checksums

2023.01.11

Changelog

- 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

Checksums

2022.12.01

Changelog

- Yet another fix to the previous fix for RTSP-over-HTTP streaming.

Checksums

2022.11.30

Changelog

- The previous version's fix to "RTSPClient" (for RTSP-over-HTTP streaming) was incomplete.
  This should fix it for real.

Checksums

2022.11.29

Changelog

- 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.

Checksums

2022.11.19

Changelog

- 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.)

Checksums

2022.10.01

Changelog

- 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.

Checksums

2022.09.30

Changelog

- 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.)

Checksums

2022.07.14

Changelog

- (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).

Checksums

2022.06.16

Changelog

- 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.)

Checksums

2022.06.14

Changelog

- 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.

Checksums

2022.04.26

Changelog

- A minor update to the previous release, to ensure that we don't call "delete[]" on an
  uninitialized pointer.

Checksums

2022.04.15

Changelog

- Fixed a "fprintf()" argument-order-evaluation bug in the "mikeyParse" demo application.
  (Thanks to Taeho Kim for reporting this.)

Checksums

2022.04.12

Changelog

- 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.)

Checksums

2022.02.07

Changelog

- 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.

Checksums

2022.01.21

Changelog

- 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.)

Checksums

2022.01.17

Changelog

- 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.)

Checksums

2022.01.11

Changelog

- 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.)

Checksums

2022.01.06

Changelog

- 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.)

Checksums

2021.12.18

Changelog

- 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

Checksums

2021.12.07

Changelog

- 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.)

Checksums

2021.11.23

Changelog

- 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.

Checksums

2021.11.14

Changelog

- 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.)

Checksums

2021.11.10

Changelog

- 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.)

Checksums

2021.11.01

Changelog

- 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.

Checksums

2021.10.31

Changelog

- 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.

Checksums

2021.10.28

Changelog

- 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.

Checksums

2021.10.20

Changelog

- 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.)

Checksums

2021.08.24

Changelog

- 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.

Checksums

2021.08.19

Changelog

- Updated the "readSocket()" code in "GroupsockHelper.cpp" to eliminate another possible
  "depends on uninitialised value" report from 'valgrind'.  (Thanks to Dmitry Kostromin)

Checksums

2021.08.18

Changelog

- Updated the "readSocket()" code in "GroupsockHelper.cpp" to eliminate a
  "depends on uninitialised value" report from 'valgrind'.  (Thanks to Dmitry Kostromin)

Checksums

2021.08.17

Changelog

- Updated the 'groupsock' "setPortNum()" function to not rely upon the "ss_family" family
  field, in case it's uninitialized.

Checksums

2021.08.14

Changelog

- Fixed a minor bug in the previous release ("delete" should have been "delete[]")

Checksums

2021.08.09

Changelog

- 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.)

Checksums

2021.08.06

Changelog

- 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.)

Checksums

2021.08.04

Changelog

- 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.

Checksums

2021.07.20

Changelog

- 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.)

Checksums

2021.07.10

Changelog

- 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.)

Checksums

2021.06.29

Changelog

- 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.)

Checksums

2021.06.25

Changelog

- 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.)

Checksums

2021.05.22

Changelog

- 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.)

Checksums

2021.05.17

Changelog

- 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.)

Checksums

2021.05.03

Changelog

- 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.)

Checksums

2021.04.06

Changelog

- Fixed a bad #define in "liveMedia/include/MPEG2TransportStreamAccumulator.hh"

Checksums

2021.04.05

Changelog

- 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.)

Checksums

2021.03.22

Changelog

- 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.)

Checksums

2021.03.17

Changelog

- Removed extraneous code from "MPEG2TransportStreamAccumulator.hh".  (Also, include that
  header file in "liveMedia.hh".)

Checksums

2021.03.16

Changelog

- 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.)

Checksums

2021.02.11

Changelog

- 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).

Checksums

2021.02.09

Changelog

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

Checksums

2021.02.05

Changelog

- 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.

Checksums

2021.01.29

Changelog

- Renamed the 'groupsock' function "ourIPAddress()" to "ourIPv4Address()".
  (We also define a function "ourIPv6Address()", though for now this just returns a null
   IPv6 address.)

Checksums

2021.01.28

Changelog

- Fixed the "config.macosx-no-openssl" configuration file (it had been accidentally trying to
  link with SSL and crypto libraries).

Checksums

2021.01.21

Changelog

- 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()".)

Checksums

2021.01.20

Changelog

- Updated the implementations of several helper functions in "groupsock/GroupsockHelper.cpp"
  to work with IPv6 (once we support it).

Checksums

2021.01.18

Changelog

- 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.

Checksums

2021.01.17

Changelog

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

Checksums

2021.01.16

Changelog

- Fixed minor bug in "RawVideoRTPSource".  (Thanks to Yahia Benmoussa.)

Checksums

2021.01.14

Changelog

- 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.)

Checksums

2021.01.13

Changelog

- Fixed a memory leak in the "MIKEYPayload" class.  (Thanks to Micha Kalfon for reporting this.)

Checksums

2021.01.09

Changelog

- 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()".

Checksums

2021.01.01

Changelog

- Updated the 'groupsock' "setupDatagramSocket()" and "setupStreamSocket()" to take
  an 'address family' parameter, in preparation for eventual support for IPv6.

Checksums

2020.12.23

Changelog

- 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.

Checksums

2020.12.13

Changelog

- 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.)

Checksums

2020.12.12

Changelog

- Updated the "groupsock" "socketJoin/LeaveGroup()" functions to take
  "struct sockaddr_storage const&" as parameter, in preparation for eventual support for IPv6.

Checksums

2020.12.11

Changelog

- 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.

Checksums

2020.12.10

Changelog

- 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.

Checksums

2020.12.09

Changelog

- 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.

Checksums

2020.12.08

Changelog

- Updated the "Groupsock::addDestination()" and "Groupsock::changeDestinationParameters()"
  functions to take a "struct sockaddr_storage" as parameter, in preparation for
  eventual support for IPv6.

Checksums

2020.12.07

Changelog

- Updated the interface to the 'groupsock' "GroupEId" class to use "struct sockaddr_storage",
  in preparation for eventual support for IPv6.

Checksums

2020.12.06

Changelog

- Allow for parsing (and generating) "IP IP6" in SDP descriptions,
  for when we later support IPv6.

Checksums

2020.12.05

Changelog

- 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

Checksums

2020.12.04

Changelog

- Updated "RTCPInstance::(un)setSpecificRRHandler()" to take "struct sockaddr_storage"
  as parameter, in more preparation for eventual support for IPv6.

Checksums

2020.12.03

Changelog

- Updated "AddressPortLookupTable"s member functions to take "struct sockaddr_storage"
  as parameter, in more preparation for eventual support for IPv6.

Checksums

2020.12.02

Changelog

- Updated the "ServerMediaSubsession" "getStreamParameters()" virtual function to
  take "struct sockadd_storage" as parameters, in preparation for eventual support for IPv6.

Checksums

2020.12.01

Changelog

- More cleanup of the "groupsock" and "liveMedia" libraries,
  in more preparation for eventual support for IPv6.

Checksums

2020.11.30

Changelog

- Updated "RTSPServer.cpp" again to replace another "sockaddr_in" with "sockaddr_storage",
  in more preparation for eventual support for IPv6.

Checksums

2020.11.29

Changelog

- Updated the 'groupsock' "GroupEId" implementation (but not yet the interface) to
  use "sockaddr_storage", in preparation for eventual support for IPv6.

Checksums

2020.11.28

Changelog

- Updated the packet output routines in the "groupsock" library to use "sockaddr_storage",
  in preparation for eventual support for IPv6

Checksums

2020.11.27

Changelog

- 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.)

Checksums

2020.11.26

Changelog

- 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.

Checksums

2020.11.25

Changelog

- 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

Checksums

2020.11.22

Changelog

- 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.)

Checksums

2020.11.21

Changelog

- 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.)

Checksums

2020.11.20

Changelog

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

Checksums

2020.11.19

Changelog

- 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)

Checksums

2020.11.05

Changelog

- 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.)

Checksums

2020.11.03

Changelog

- 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.)

Checksums

2020.10.16

Changelog

- 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()".

Checksums

2020.08.19

Changelog

- Fixed a bug in "QuickTimeFileSink" that could cause malformed "esds" atoms to be
  generated.  (Thanks to Chris Paucar for reporting this issue.)

Checksums

2020.08.18

Changelog

- 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.

Checksums

2020.08.12

Changelog

- Fixed a bug in the handling of pausing, when streaming from (multi-track) Matroska files.

Checksums

2020.08.11

Changelog

- Fixed another bug in the handling of seeking within Matroska files.

Checksums

2020.08.10

Changelog

- Fixed a bug in the handling of seeking within Matroska files.
  (Thanks to Jim Ham for reporting this problem.)

Checksums

2020.08.09

Changelog

- 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.

Checksums

2020.08.05

Changelog

- More cleanup of the implementation of "RawVideoRTPSink".

Checksums

2020.07.31

Changelog

- Cleaned up the implementation of "RawVideoRTPSink".

Checksums

2020.07.21

Changelog

- 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.)

Checksums

2020.07.09

Changelog

- 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.)

Checksums

2020.06.25

Changelog

- Fixed a memory leak in the "sha1()" function (a "EVP_MD_CTX" object was not being deleted).
  (Thanks to Amir Perlman for reporting this.)

Checksums

2020.06.23

Changelog

- 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.)

Checksums

2020.06.22

Changelog

- Fixed a typo in the previous release that could cause a compilation problem for some
  developers.  (Thanks to Eric Beuque for reporting this.)

Checksums

2020.05.15

Changelog

- 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).

Checksums

2020.05.14

Changelog

- 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.)

Checksums

2020.05.13

Changelog

- Made the "MPEG2TransportStreamMultiplexor" segmentation mechanism (used by "HLSSegmenter")
  more robust in case the Transport Stream PTS is not monotonic non-decreasing.

Checksums

2020.04.24

Changelog

- 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.)

Checksums

2020.04.12

Changelog

- 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.)

Checksums

2020.04.06

Changelog

- 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.

Checksums

2020.03.06

Changelog

- Fixed a problem in "H264or5VideoStreamFramer.cpp" that was allegedly causing problems
  compiling for Windows.

Checksums

2020.02.25

Changelog

- Added full support for the "LIVE555 HLS Proxy" ("live555HLSProxy") application, which
  is documented at:
      http://live555.com/hlsProxy/

Checksums

2020.02.24

Changelog

- 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).

Checksums

2020.02.23

Changelog

- 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.

Checksums

2020.02.11

Changelog

- 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.

Checksums

2020.01.28

Changelog

- Fixed a bug (accidentally introduced in version 2020.01.10 that had caused "openRTSP"s
  -K option to stop working.

Checksums

2020.01.24

Changelog

- 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

Checksums

2020.01.23

Changelog

- Removed stray characters that had been accidentally left in "mikeyParse.cpp" (in "testProgs")

Checksums

2020.01.19

Changelog

- 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.

Checksums

2020.01.11

Changelog

- 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.)

Checksums

2020.01.10a

Changelog

- Removed a stray character that had accidentally been inserted into "config.linux-with-shared-libraries",
  preventing it from being used.

Checksums

2020.01.10

Changelog

- 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.)

Checksums

2020.01.09

Changelog

- 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.)

Checksums

2019.12.30

Changelog

- 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.

Checksums

2019.12.27

Changelog

- 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.)

Checksums

2019.12.13

Changelog

- 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.

Checksums

2019.12.10

Changelog

- Improved the handling of "npt" (Normal Play Time) times in the RTSP "Range:" header.
  (Thanks to Denis Genestier.)

Checksums

2019.12.07

Changelog

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

Checksums

2019.12.05

Changelog

- Fixed a memory leak in the RTSP "REGISTER" command implementation
  (that I had failed to catch in the previous release).

Checksums

2019.12.04

Changelog

- 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

Checksums

2019.11.22

Changelog

- Fixed a bug in the previous revision's fix to the "RTSPClient" URL parsing code.

Checksums

2019.11.11

Changelog

- 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.)

Checksums

2019.11.06

Changelog

- 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.

Checksums

2019.11.05

Changelog

- 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").

Checksums

2019.11.04

Changelog

- 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".)

Checksums

2019.11.03

Changelog

- 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.

Checksums

2019.10.20

Changelog

- Added a function "currentSegmentDuration()" to "MPEG2TransportStreamMultiplexor".
  (This is useful only if we had previously configured the multiplexor to do timed segmentation.)

Checksums

2019.10.11

Changelog

- Some minor changes to prevent compilation errors with older, dumb compilers.

Checksums

2019.10.10

Changelog

- 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.)

Checksums

2019.09.30

Changelog

- 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.)

Checksums

2019.09.18

Changelog

- 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)

Checksums

2019.09.17

Changelog

- Added some more debugging statements to "RTSPServer.cpp" in hope of resolving an issue that
  someone has seen with the "LIVE555 Proxy Server".

Checksums

2019.08.28

Changelog

- 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.)

Checksums

2019.08.16

Changelog

- 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.)

Checksums

2019.08.12

Changelog

- 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.)

Checksums

2019.08.11

Changelog

- Updated the previous release by supporting (in our demultiplexor) more Transport Stream
  elementary "stream_type"s.

Checksums

2019.08.10

Changelog

- 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'.)

Checksums

2019.07.27

Changelog

- 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.

Checksums

2019.06.28

Changelog

- Changed the visibility of some fields of "PassiveServerMediaSubsession" from "private:"
  to "protected:" - as requested by Zhang Qian.

Checksums

2019.05.29

Changelog

- Fixed a bug in the "H264or5VideoStreamDiscreteFramer" code (if the "includeStartCodeInOutput"
  parameter is 1) that was added in version 2019.03.06.

Checksums

2019.05.21

Changelog

- 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.)

Checksums

2019.05.12

Changelog

- 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.)

Checksums

2019.05.03

Changelog

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

Checksums

2019.04.24

Changelog

- Changed the visibility of some member functions from "private:" to "protected:", to make them
  accessible to subclasses - as requested by Chris Paucar.

Checksums

2019.03.06

Changelog

- 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.)

Checksums

2019.02.27

Changelog

- Fixed a bug in "parseAuthorizationHeader()" that could cause a memory access error for
  some malformed headers.
  (Thanks to Mans van Someren for reporting this.)

Checksums

2019.02.03

Changelog

- 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.)

Checksums

2018.12.14

Changelog

- 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.)

Checksums

2018.11.26

Changelog

- 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.)

Checksums

2018.10.17

Changelog

- 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.)

Checksums

2018.10.10

Changelog

- Updated the #ifdefs in "GroupsockHelper.cpp" to account for recent changes to 'Android'.
  (Thanks to Brian Chase for providing a patch.)

Checksums

2018.09.18

Changelog

- Fixed a bug in "RawVideoRTPSink".  (Thanks to Denis Genestier.)

Checksums

2018.09.10

Changelog

- Fixed a potential 'double deletion' in "RawVideoRTPSource.cpp". (Thanks to Denis Genestier.)

Checksums

2018.09.06

Changelog

- Removed some stray files that had accidentally been left in the previous release.

Checksums

2018.09.05

Changelog

- 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.)

Checksums

2018.08.28a

Changelog

- Oops, the previous version wasn't building properly; it's fixed now.

Checksums

2018.08.27

Changelog

- Fixed a problem (in "GroupsockHelper.cpp") that could cause compilation problems on Mac OS X.

Checksums

2018.08.05

Changelog

- 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.)

Checksums

2018.07.07

Changelog

- Fixed a problem with the "openRTSP" application, if it's run with both the "-c" and "-P "
  options.  (Thanks to Giancarlo for noticing this.)

Checksums

2018.07.01

Changelog

- 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.)

Checksums

2018.04.25

Changelog

- Fixed the implementation of "unpackBandwidthEfficientData()" in "AMRAudioRTPSource", to ensure
  that we can never overflow the output buffer.  (Thanks to GRIMM for reporting this issue.)

Checksums

2018.02.28

Changelog

- Updated "RTSPClient" to properly handle a completely empty response to "GET_PARAMETER".
  (Thanks to Eric Heurtel for noting this issue.)

Checksums

2018.02.26

Changelog

- Added protection against an alleged potential memory leak in
  "OnDemandServerMediaSubsession::setSDPLinesFromRTPSink()".

Checksums

2018.02.18

Changelog

- 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.

Checksums

2018.02.12

Changelog

- 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.

Checksums

2018.01.29

Changelog

- Made some minor changes that supposedly make the code build better for some versions of Windows

Checksums

2018.01.24

Changelog

- 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).

Checksums

2017.10.28

Changelog

- 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.)

Checksums

2017.09.12

Changelog

- 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.)

Checksums

2017.07.18

Changelog

- 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.)

Checksums

2017.06.04

Changelog

- 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.)

Checksums

2017.05.24

Changelog

- 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.)

Checksums

2017.04.26

Changelog

- 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.)

Checksums

2017.04.10

Changelog

- 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.)

Checksums

2017.01.26

Changelog

- 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.)

Checksums

2016.11.28

Changelog

- 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.)

Checksums

2016.11.17

Changelog

- 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.)

Checksums

2016.11.06

Changelog

- 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.

Checksums

2016.11.03

Changelog

- 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.)

Checksums

2016.10.29

Changelog

- Performed the annual update of the copyright years and license near the start of each file

Checksums

2016.10.21

Changelog

- 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.

Checksums

2016.10.11

Changelog

- After building the source code, we now display a message reminding the developer about our FAQ.

Checksums

2016.09.22

Changelog

- 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).

Checksums

2016.09.19

Changelog

- 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.

Checksums

2016.09.12

Changelog

- 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.)

Checksums

2016.09.08

Changelog

- 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.

Checksums

2016.09.05

Changelog

- 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.)

Checksums

2016.08.27

Changelog

- 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.)

Checksums

2016.08.07

Changelog

- 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.)

Checksums

2016.07.19

Changelog

- 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.)

Checksums

2016.06.26

Changelog

- 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.

Checksums

2016.06.23

Changelog

- 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.)

Checksums

2016.06.22

Changelog

- 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.)

Checksums

2016.05.20

Changelog

- 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.

Checksums

2016.05.18

Changelog

- 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.

Checksums

2016.05.17

Changelog

- Made a (mostly inconsequential) fix to the previous bugfix for "MultiFramedRTPSink".

Checksums

2016.05.16

Changelog

- 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.

Checksums

2016.04.21

Changelog

- 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

Checksums

2016.04.01

Changelog

- 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.)

Checksums

2016.03.16

Changelog

- 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).

Checksums

2016.03.14

Changelog

- 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.)

Checksums

2016.02.22

Changelog

- 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.)

Checksums

2016.02.09

Changelog

- Added an option "-E " to "openRTSP".
  (Thanks to Hans Maes for suggesting this.)

Checksums

2016.02.08

Changelog

- Fixed a bug that was causing "playSIP" to crash.
  (Thanks to Vilaysak Thipavong for reporting this.)

Checksums

2016.01.29

Changelog

- 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

Checksums

2016.01.24

Changelog

- Updated "ProxyServerMediaSession.cpp" to add some 'internal error' debugging fprintf()s
  to try to catch a possible bug that was reported recently.

Checksums

2016.01.20

Changelog

- 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.)

Checksums

2016.01.16

Changelog

- 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.

Checksums

2016.01.12

Changelog

- 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.)

Checksums

2015.12.22

Changelog

- 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.

Checksums

2015.11.09

Changelog

- 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.)

Checksums

2015.10.29

Changelog

- 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.

Checksums

2015.10.12

Changelog

- 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.)

Checksums

2015.09.24

Changelog

- 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.)

Checksums

2015.08.07

Changelog

- 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).

Checksums

2015.08.06

Changelog

- 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.

Checksums

2015.07.31

Changelog

- 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.)

Checksums

2015.07.19

Changelog

- 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.

Checksums

2015.06.25

Changelog

- 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.)

Checksums

2015.06.24

Changelog

- 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.

Checksums

2015.06.21

Changelog

- 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.

Checksums

2015.06.07

Changelog

- 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.

Checksums

2015.06.04

Changelog

- 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.)

Checksums

2015.05.31

Changelog

- 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.)

Checksums

2015.05.28

Changelog

- 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.)

Checksums

2015.05.12

Changelog

- 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.)

Checksums

2015.05.03

Changelog

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

Checksums

2015.04.22

Changelog

- 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.)

Checksums

2015.04.16

Changelog

- 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.)

Checksums

2015.04.15

Changelog

- 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.)

Checksums

2015.04.01

Changelog

- 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++.

Checksums

2015.03.19

Changelog

- 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".)

Checksums

2015.03.16

Changelog

- Made a small change to the "BasicTaskScheduler" implementation to reduce the likelihood of
  a race condition with external thread(s) calling "triggerEvent()".

Checksums

2015.03.06a

Changelog

- Oops - forgot to add '\0'-termination to the previous fix.

Checksums

2015.03.01

Changelog

- 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.)

Checksums

2015.02.26

Changelog

- 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.)

Checksums

2015.02.23

Changelog

- Fixed a bug in "OnDemandServerMediaSubsession::getCurrentNPT()".
  (Thanks to Gilles Chanteperdrix for noting this.)

Checksums

2015.02.17

Changelog

- Latest version of the "LIVE555 Streaming Media" code (reinstalled due to a server crash).

Checksums

2015.02.13

Changelog

- Oops - removed the "#define DEBUG" that had inadvertently been left in "RTCP.cpp" in
 the previous version.

Checksums

2015.02.10

Changelog

- 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.)

Checksums

2015.02.05

Changelog

- Made the "ProxyServerMediaSession" code a bit more 'bulletproof'.

Checksums

2015.01.27

Changelog

- 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.)

Checksums

2015.01.19

Changelog

- Fixed an obscure bug in "RTSPClient" that might conceivably have caused a crash if it received
 a completely empty RTSP response.

Checksums

2015.01.04

Changelog

- 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.

Checksums

2014.12.17

Changelog

- Updated "RTSPServerSupportingHTTPStreaming" to make sure that the data stream source gets closed
  when it's no longer needed.

Checksums

2014.12.16

Changelog

- 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.)

Checksums

2014.12.13

Changelog

- 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.)

Checksums

2014.12.11

Changelog

- 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.)

Checksums

2014.12.09

Changelog

- Needed to make the "QuickTimeFileSink" constructor and destructor protected: to allow subclassing.

Checksums

2014.12.08

Changelog

- 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.

Checksums

2014.11.28

Changelog

- 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.)

Checksums

2014.11.12

Changelog

- We had forgotten to initialize the "RTSPClient" member variable "fAllowBasicAuthentication"
  that we introduced in the previous version.

Checksums

2014.11.07

Changelog

- 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.

Checksums

2014.11.01

Changelog

- 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.

Checksums

2014.10.28

Changelog

- 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.

Checksums

2014.10.21

Changelog

- 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).

Checksums

2014.09.22

Changelog

- 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.)

Checksums

2014.09.11

Changelog

- 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.)

Checksums

2014.08.26

Changelog

- 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.

Checksums

2014.07.25

Changelog

- 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.

Checksums

2014.07.04

Changelog

- 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.)

Checksums

2014.06.28

Changelog

- Fixed another bug in the RTSP server's handling of incoming Base-64-encoded requests.

Checksums

2014.05.27

Changelog

- 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...)

Checksums

2014.04.23

Changelog

- 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.

Checksums

2014.03.25

Changelog

- 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.

Checksums

2014.02.04

Changelog

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

Checksums

2014.01.21

Changelog

- 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.

Checksums

2014.01.13

Changelog

- Changed the implementation of "Authenticator::reclaimDigestResponse()" to do a "delete[]"
  rather than a "free()", because we had previously changed "our_MD5Data()" from C code that
  called "malloc()" to C++ code that called "new[]".
  (Thanks to Michel Promonet for reporting this issue.)
- Added support for streaming H.265 tracks from Matroska files.
- Fixed a bug (introduced in the previous version) that would cause a RTSP server streaming from
  a Matroska file containing H.264 video to report an incorrect "profile_level_id" value.
- Added support for indexing (and subsequent 'trick play' (seeking) operation on) Transport Stream
  files that contain H.265 video.  (This has not been fully tested yet.)
- Added a new demo application "testH265VideoToTransportStream", similar to the existing
  "testH264VideoToTransportStream".
- Changed the implementation of the (rarely-called) "Socket::changePort()" function so
  that the new socket gets the same 'receive buffer size' and 'send buffer size' that
  the old socket had.  (Thanks to Cristian Jerez for noting this issue.)

Checksums

2014.01.11

Changelog

- Updated the "ourIPAddress()" code in "groupsock/GroupsockHelper.cpp" to use
  "ReceivingInterfaceAddr" as our IP address, if it was set to something other than INADDR_ANY.
  (Thanks to Gilles Chanteperdrix for this suggestion.)
- Added a new class "H265VideoRTPSink" for streaming H.265 video.
- Added a new class "H265VideoFileServerMediaSubsession" for streaming an H.265 file from a RTSP
  server, similar to the existing "H264VideoFileServerMediaSubsession" class.
- Created a new abstract base class "H264or5VideoStreamDiscreteFramer", and made
  "H264VideoStreamDiscreteFramer" and "H265VideoStreamDiscreteFramer" subclasses of this.
  (This eliminated some duplicate code.)  Note, however, that now "H264VideoStreamDiscreteFramer"
  is no longer a subclass of "H264VideoStreamFramer".  (Ditto for "H265*".)  This means that any
  existing code that might have cast a "H264VideoStreamDiscreteFramer" as
  a "H264VideoStreamFramer" will now be broken, and will need to change.
- Updated the "LIVE555 Media Server" application (currently, just the source code version)
  to allow it to stream from H.265 Elementary Stream ("*.265") files.
- Updated the "testOnDemandRTSPServer" demo application to allow it to stream from
  an H.265 Elementary Stream file ("test.265").
- Fixed a potential (though unlikely) problem in "H264VideoRTPSink" that might
  have caused an incorrect "profile_level_id" value to be set in SDP descriptions
  (due to the presence of 'emulation bytes' in the SPS NAL unit).
- Updated the "FileSink" implementation to make it work better when the "oneFilePerFrame" flag
  is set.  Now, the right thing will happen if "addFrame()" is called more than once before
  "afterGettingFrame()" is called - as is done by "H264VideoFileSink" (to prepend a 'start code').
  Also, if successive frames happen to have the same presentation time, we now use a filename
  suffix to distinguish them.  (Before, the second frame's data would overwrite the first.)
- Improved the "openRTSP" command's error messages when the user gives it incompatible
  command-line options.

Checksums

2013.12.05

Changelog

- Fixed a line of code in "RTPInterface.cpp" that was breaking 'Win64' compilers.
  (Thanks to the VLC developers for noting this.)

Checksums

2013.11.29

Changelog

- Updated the previous bug fix to close another vulnerability.  All applications that include
  RTSP server or RTSP client SHOULD UPGRADE to the latest version of the code!
  (Thanks to iSEC Partners  for discovering and reporting this bug.)

Checksums

2013.11.26

Changelog

- Fixed a serious buffer overflow bug in RTSP command parsing.  Because this bug was a security
  hole (potentially allowing an attacker to cause arbitrary code execution), all applications
  that include a RTSP server or RTSP client SHOULD UPGRADE to the latest version of the code!
  (Note that RTSP clients are affected, because they - like RTSP servers - can receive RTSP
  commands.)
  (Thanks to iSEC Partners  for discovering and reporting this bug.)
- In "StreamState::endPlaying()"("OnDemandServerMediaSubsession.cpp"), removed the call to
  "RTPInterface::clearServerRequestAlternativeByteHandler()" (when streaming RTP-over-TCP)
  that we had added in version 2013.07.31.  This was preventing the "RTSPClientConnection"
  object (and its socket) from being deleted when the client closed its end of the TCP connection
  following a "TEARDOWN".
  (Thanks to Bruno Abreu for reporting this problem.)

Checksums

2013.11.25

Changelog

- Made a minor change to the random retransmission interval used in "ProxyServerMediaSession".

Checksums

2013.10.25

Changelog

- Updated the "TCPStreamSink" code to check for an 'EPIPE' errno if the "send()" fails, because apparently - in this case -
  the socket can still be considered 'writable' (by "select()"), even though it's no longer usable.
  (Thanks to Park Chan for suggesting this.)

Checksums

2013.10.09

Changelog

- Updated the signature of "RTSPServerWithREGISTERProxying::createNew()" to take a Boolean "streamOverTCP" parameter
  (default value: False), which tells the server whether or not to enable RTP/RTCP-over-TCP streaming for each newly created
  "ProxyServerMediaSession".
  (Thanks to Bob Bischan for bringing this to our attention.)

Checksums

2013.09.27

Changelog

- When a RTSP client requests RTP/RTCP over TCP streaming, we now close the datagram sockets that would have otherwise been
  used for receiving RTP and RTCP, because we know that they're no longer needed.

Checksums

2013.08.31

Changelog

- Fixed an obscure bug in the "RTPInterface" implementation that could cause a "SocketDescriptor" object to get deleted twice
  (when receiving RTP-over-TCP).  (Thanks to Subhankar Saha for reporting this bug, and tracking down the cause.)

Checksums

2013.08.28

Changelog

- Updated "H264VideoStreamFramer" to Improve (the accuracy and efficiency of) the test whether the current NAL unit
  ends an 'access unit'.  (This also fixes a bug reported by Philipp Schrader.)
- Fixed a minor memory leak in "RTCPInstance::setSpecificRRHandler()" (if this function is called more than once).
  (Thanks to Eric Pronovost for the report.)

Checksums

2013.08.16

Changelog

- Fixed a bug in "MatroskaFileParser" that was causing it not to parse 8-byte float values properly.
- Added parsing of some previously unknown Matroska ids.
- Corrected two diagnostic output messages in "MatroskaFileParser".
- Corrected a disgnostic output message in "testWAVAudioStreamer" (if the audio is converted to u-law).

Checksums

2013.07.16

Changelog

- Fixed a problem that might cause a crash when deleting a "RTSPServer" object while a RTP-over-TCP stream was
  currently taking place.  (Thanks to Piers Hawksley for reporting this.)
- Fixed a minor memory leak in "RTSPClient" when it sends a HTTP "GET" command for RTSP-over-HTTP tunneling.
  (Thanks to Jianliang Zhang for reporting this.)
- Moved the "parseScaleHeader()" function to "RTSPCommon.hh", to make it available to subclasses of "RTSPServer".
  (Thanks to Michel Promonet for the suggestion.)

Checksums

2013.04.30

Changelog

- The bugfix in the previous version was incomplete.  This should fix it for real.

Checksums

2013.04.06

Changelog

- Updated the change to the proxying code that we made in version 2013.04.04.  By default, we now *never* send "GET_PARAMETER"
  as our 'liveness indicator' command, because some IP cameras seem to crash whenever they receive "GET_PARAMETER".
  (The old code that sent "GET_PARAMETER" is still there, but #ifdef'd out, in case anyone wants to send "GET_PARAMETER".)
- Increased "OutPacketBuffer::maxSize" in the "live555ProxyServer" application to 100,000 bytes, to accommodate some camera servers
  that send ridiculously large frames.  (Note, however, that if the back-end network (from the proxy to clients) has any significant
  packet loss, then these ridiculously large frames might not end up getting delivered to clients.  Instead, you should fix your
  back-end server to not send frames this large.)
- Updated the "RTPReceptionStats" code (in "liveMedia/RTPSource.cpp") to eliminate the possible use of some uninitialized variables
  (if a RTCP "RR" report is sent before we have received any RTP packets).  (Thanks to Michel Promonet for noting this.)

Checksums

2013.03.23

Changelog

- Updated our RTSP server implementation so that we send an initial RTCP "SR" packet before sending the first RTP packet.
  This will make it likely (though still not certain) that the receiver will immediately start getting RTCP-synchronized
  presentation times.
  (Note that client application code must still allow for the possibility of initial presentation times not being RTCP-synchronized,
  in case they don't receive this initial "SR" packet (or in case they are streaming from a server other than this one).)
- Updated the "RTSPClient" NAT 'hole punching' hack that we made in version 2012.02.03 so that it also sends dummy packets
  on the RTCP port, as well as the RTP port.  This increases the chance that clients that are behind a NAT will receive the
  initial RTCP "SR" packet that we noted above.
- The RTSP server modification that we made in version 2013.02.27 (to better support "PLAY" requests with no "Range:" header)
  had a bug computing the current 'normal play time' if more than one such consecutive "PLAY" requests were received.
  This is now fixed.  (Thanks to 'kingaceck' for reporting this.)

Checksums

2013.03.07

Changelog

- The bugfix that we made in version 2013.02.11 was accidentally backed out in version 2013.02.27.  We restore it here.
- Fixed a bug that could cause problems if a server streamed from the same Matroska file more than once.
  (Thanks to Sebastien Escudier for noting this.)
- Fixed a couple of cases where the "testRTSPClient" and "openRTSP" applications were not delete[]ing the "resultString"
  in RTSP response handler functions.  (This caused a minor memory leak, although only in situations where RTSP commands failed.)

Checksums

2013.02.27

Changelog

- When the RTSP server receives a "PLAY" request with no "Range:" header, it now includes a "Range:" header in its response,
  using the stream's current 'normal play time' as the start time.  This allows receiving clients to correctly compute
  'normal play time' after such a request (e.g., after PLAYing following a PAUSE).
  (Thanks to Sebastien Escudier for raising this issue.)
  To implement this, we added a new virtual function "getCurrentNPT()" to "ServerMediaSubsession" (and subclasses).
- Fixed "RTSPClient" to properly handle "SETUP" responses that (erroneously) do not contain a "Transport:" header.
  (Thanks to Eric Huertel for noting this.)
- Changed the destructors of "AVIFileSink" and "QuickTimeFileSink" to delete chained data structures iteratively,
  rather than recursively, to avoid possible stack overflow if these chains are very long.
  (Thanks to Anton Chmelev for this suggestion.)
- Removed some unused member fields from a few classes.

Checksums

2013.02.11

Changelog

- Fixed an obscure bug in the way that "RTSPClient" handles some responses.  (Thanks to Michel Promonet for finding this.)

Checksums

2013.01.25

Changelog

- Added a fix to "StreamReplica::doStopGettingFrames()" so that it doesn't try to 'deactivate'
  a replica that hasn't yet been activated.  (Thanks to Bruno Abreu.)

Checksums

2013.01.23

Changelog

- Added a hack to "StreamReplicator" to handle the case of a replica being deleted
  while it's in the process of having a frame delivered to it.
  (Thanks to Bruno Abreu.)
- Made a minor fix to the way that "FileSink" reacts to any error that it gets when writing its target file.
  (We also made the "continuePlaying()" function "protected:".)  (Thanks to Bruno Abreu.)

Checksums

2013.01.19

Changelog

Made several changes to the implementation of "ProxyServerMediaSession" (and related classes):
- Fixed a bug in the way that it was resetting its state whenever it needs to close, then reopen its connection
  with the back-end server.
- We now reset the connection whenever the "OPTIONS" command returns any error, not just when we lose the RTSP connection.
- We change the periodic 'liveness' command that we send to the back-end server.  When possible, we send a (empty) "GET_PARAMETER"
  command, rather than "OPTIONS" (because some servers erroneously use "GET_PARAMETER" - rather than RTCP "RR" packets - to
  indicate client liveness).
- Added some more debugging (verbose) output.

Checksums

2013.01.15

Changelog

- Updated the "RTSPClient" parsing code to ignore "RTP-Info:" headers (in "PLAY" responses) that don't define *both* the
  "seq" and "rtptime" parameters.  We need both of those parameters to be present in order for the "RTP-Info:" header to be useful
  to us.
- Some minor changes to the library "Makefile.head" and "Makefile.tail" files.
- Made a minor fix to the debugging output from the "testRTSPClient" demo application, to display the 'seconds' part of
  presentation times as "int"s, rather than "unsigned".

Checksums

2013.01.05

Changelog

- Fixed some Makefile definitions what were apparently breaking in some versions of Windows.
  (Thanks to Claes Erlandsson for noting this.)
- Added a new virtual function hack - "specialClientUserAccessCheck() - to allow subclasses of "RTSPServer" to perform an
  additional access check on a user, after the username has already been validated using digest authentication.
  (This is in addition to the existing "specialClientAccessCheck()" hack that allows subclasses to do an additional acces check
  *before* digest authentication.)  (Thanks to Chris Richardson for the suggestion.)

Checksums

2012.12.23

Changelog

- Fixed the "install" Makefile target in the previous release (stupid Makefile syntax!).

Checksums

2012.12.18

Changelog

- Updated the "MatroskaFile" implementation to signal that the input file has been parsed even if the specified file name
  doesn't exist.  (In particular, this stops the "testOnDemandRTSPServer" demo application from blocking if the test files
  "test.mkv" or "test.webm" do not exist.  I don't know why this wasn't caught before...)

Checksums

2012.12.15

Changelog

- Added an experimental new configuration file "config.linux-with-shared-libraries", for building for Linux with shared libraries
  only (i.e., no static libraries).  (Thanks to Benjamin Drung for proposing and assisting with this.)

Checksums

2012.11.30

Changelog

- Fixed another bug in the "ProxyServerMediaSession" destructor: We need to delete the "MediaSession" object before we delete
  the "ProxyRTSPClient" object, in case the "MediaSession"s RTP/RTCP objects have an 'alternative byte handler' reference back
  to the "ProxyRTSPClient".  (Thanks to Sergei Bastrakov for reporting this.)

Checksums

2012.11.22

Changelog

- Fixed a minor memory leak in "RTSPServer::closeAllClientSessionsForServerMediaSession()".  (Thanks to Matt Norman.)
- Fixed an issue that caused "sapWatch" to fail to compile for at least one version of Debian.  (Thanks to Alessio Treglia.)

Checksums

2012.11.16

Changelog

- Added a new configuration file "config.iphone-simulator" for building for Apple's iPhone simulator (running on a Mac).
  (Note that we already had a configuration file "config.iphoneos" for building for the iPhone (or iPad) itself.)
- Updated "SIPClient" and the "playSIP" demo application with a fix (suggested by Frederic Nadeau) to make "playSIP" send
  RTCP "RR" packets back to the correct address.  This is a hack, and should be fixed by upgrading "SIPClient" to make it
  asyncronous (like "RTSPClient").

Checksums

2012.11.08

Changelog

- Updated the (Windows-only) implementation of "gettimeofday()" to be 'thread safe' (and also work correctly in WinCE).
  (Thanks to Simon Roehrl.)
- Made a change to the implementation of "RTPSink::convertToRTPTimestamp()" to overcome a possible integer overflow problem.
  (Thanks to Simon Roehrl for noting this issue.)

Checksums

2012.10.24

Changelog

- Made the "addNewInputSource()" function of "MPEG2TransportStreamFromESSource" "protected:", to allow subclasses of
  "MPEG2TransportStreamFromESSource" to support adding new kinds of input stream, if desired.

Checksums

2012.10.18

Changelog

- Updated the "RTPInterface" RTP/RTCP-over-TCP handling code to properly handle the case where we know about the
  'stream channel id' for an embedded RTP or RTCP packet, but haven't yet registered a read handler function for it.
  (This can occur in rare situations if our server starts sending RTP or RTCP packets before sending the RTSP "PLAY" response,
  and the client (e.g., VLC) doesn't start reading from its input source until after it receives the "PLAY" response.)
  (Thanks to Ralf Globisch for noticing this issue, and proposing a solution.)

Checksums

2012.10.04

Changelog

- Updated the fix that we made in version 2012.09.11: When a "RTSPClient" requests RTP/RTCP-over-TCP streaming, it is
  prepared to handle incoming RTP/RTCP-over-TCP data as soon as it receives the "SETUP" response, but doesn't start sending
  RTCP "RR" packets until after it receives the "PLAY" response.

Checksums

2012.09.13

Changelog

- Minor bugfix in "RTSPClient" when implementing RTSP-over-HTTP: Don't enqueue "POST" request records (after sending the command),
  because we don't expect a response to this request.  (Thanks to Daniel Peng.)
- Print an error message (in "RTCP.cpp" and "MultiFramedRTPSource.cpp") when we hit a buffer limit when reading
  a (RTCP or RTP) packet over TCP.
- Increased MAX_PACKET_SIZE in "MultiFramedRTPSource.cpp" (for reading incoming packets) to 20000, because of a report
  of a server sending packets larger than 10000 bytes.
- Added support for receiving the "application/VND.ONVIF.METADATA" RTP payload format.  This is just a XML document packed into
  simple RTP packets (but with the "M" bit used to indicate the end of the document).
  (Thanks to Michel Promonet for this suggestion.)
- Updated the meaning of the "doNormalMBitRule" parameter to "SimpleRTPSource::createNew()" and "SimpleRTPSink::createNew()".
  It now applies for all media types other than "audio".  (Previously, it applied only to "video".)
  This change makes it possible to use "doNormalMBitRule" = True for the "application/VND.ONVIF.METADATA" RTP payload format.

Checksums

2012.08.31

Changelog

- Fixed a bug in "WAVAudioFileServerMediaSubsession" that could cause problems when seeking within very large WAV files.
  (Thanks to 'Raph' for noting this problem.)
- Fixed a bug in "VorbisAudioRTPSink".  (Thanks to Owen Wallace for reporting this.)

Checksums

2012.08.20

Changelog

- Added optional RTSP server and RTSP client support for streams that are indexed by 'absolute' time - i.e., using strings
  of the form "YYYYMMDDTHHMMSSZ" or "YYYYMMDDTHHMMSS.Z".
  - For RTSP server developers (i.e., developers who have their own subclasses of "OnDemandServerMediaSubsession"):
    - To automatically have your streams advertised (in their SDP description) as supporting absolute time indexing,
      reimplement (in your subclass) the virtual function:
        "virtual void getAbsoluteTimeRange(char*& absStartTime, char*& absEndTime) const;"
	  (see "liveMedia/include/ServerMediaSession.hh").
      This function should set "absStartTime" to a string value (of the form noted above), and should set "absEndTime" to
      a corresponding string value, if the stream has an end time, otherwise NULL.
    - To implement seeking by absolute time, reimplement (in your subclass) the virtual function:
        "virtual void seekStreamSource(FramedSource* inputSource, char*& absStart, char*& absEnd);"
	  (see "liveMedia/include/OnDemandServerMediaSubsession.hh").
      "absStart" (and "absEnd", if non-NULL) are strings (of the form noted above).
      (The function *may* change them, to make them more accurate.)
  - For RTSP client developers:
    - To check whether a stream supports indexing by absolute time,
      call "MediaSession::absStartTime()" or "MediaSubsession::absStartTime()", and check whether this (string) value is non-NULL.
    - To play a stream, indexed by absolute time, call one of the new, alternative forms of "RTSPClient::sendPlayCommand()"
      that take "absStartTime" (and optional "absEndTime") strings as parameters.
      (see "liveMedia/include/RTSPClient.hh")
- Updated the "BasicTaskScheduler" class to make the 'maxSchedulerGranularity' time (in microseconds) an optional parameter to
  "BasicTaskScheduler::createNew()".  This parameter (default value: 10000 (i.e., 10 ms)) specifies the maximum time that we
  wait (in "select()") before returning to the event loop to handle non-socket or non-timer-based events,
  such as 'triggered events'.  You can change this is you wish (but only if you know what you're doing!),
  or set it to 0, to specify no such maximum time.
  (You should set it to 0 only if you know that you will not be using 'event triggers'.)

Checksums

2012.07.26

Changelog

- Made the "RTPInterface" code for handling RTP/RTCP-over-TCP a little more robust.
- Updated the "WAVAudioFileSource" WAV-file parser to skip any extraneous 'chunks' between RIFF and FORMAT.
  (Thanks to Sid Price for suggesting this.)

Checksums

2012.06.26

Changelog

- Moved the code for ignoring the SIGPIPE signal to "RTSPCommon.cpp", and made it a function.  We now call this function from
  the "RTSPClient" code, as well as the "RTSPServer" code.  (Thanks to Barry Stump for the suggestion.)
- Added a new public member flag "describeCompletedFlag" to "ProxyServerMediaSession".  This can be used as a 'watch variable'
  in a call to "doEventLoop()", to 'block' in the event loop until the back-end "DESCRIBE" command sent for a newly-created
  "ProxyServerMediaSession" has completed.

Checksums

2012.05.17

Changelog

- Changed the implementation of "RTSPServer::removeServerMediaSession(char const* streamName)" to not
  call "lookupServerMediaSession()", in case that (virtual) function has been overridden in a subclass to do something different.
  Now we just call the hash table 'remove' function directly.  (Thanks to Bruno Abreu for bringing this to our attention.)
- Updated the "config.iphoneos" configuration file.  (Developers may need to change the definition of "IOS_VERSION", however.)
- Added "#include " to "MPEG4GenericRTPSink.cpp", because some systems apparently need this to define "tolower()".
  (Thanks to Michel Promonet for noting this.)

Checksums

2012.05.03

Changelog

- Fixed the "testReplicator" demo application code to actually do what it claims - transmit one replica stream via UDP,
  while writing the other replica stream to a file.
  (We had accidentally omitted the line that transmits one replica stream via UDP.)
- Fixed a bug in the implementation of "StreamReplicator::deleteReplica()".  (Thanks to Bruno Abreu for reporting this.)
- Fixed a bug in "RTSPServer" that would occur if you tried to add two different "ServerMediaSession" objects using the same
  stream name.  (Thanks to Vadim Kosarev for noting this.)
- Added "-DXLOCALE_NOT_USED=1" to "config.cygwin" (on the suggestion of Warren Young).

Checksums

2012.04.27

Changelog

- Modified the "RTSPClient" implementation to be more careful about not accessing the "RTSPClient" object's state after
  calling "handleRequestError()", in case the handler function handles the error by deleting the "RTSPClient" object itself.
  (The "testRTSPClient" demo application does this, for example.)  (Thanks to Gord Umphrey for reporting a problem,
  and to Guy Bonneau for pointing out this as a possible cause.)
- Fixed a typo in the "Makefile.tail" file for the "mediaServer" directory.  (Thanks to 'Nix Lo' for the report.)
- Removed an unneeded "typedef" from "Locale.hh"; it was causing compiler warnings.  (Thanks to Barry Stump and Warren Young
  for reporting this.)

Checksums

2012.04.21

Changelog

- Made some cosmetic changes to the "live555ProxyServer" code, prior to its official announcement.

Checksums

2012.04.04

Changelog

- Made some changes to "H264VideoRTPSink" and "T140TextRTPSink" to correct some minor bugs.
- Improved the way that "H264VideoStreamDIscreteFramer" detects and reports NAL units that erroneously begin with
  MPEG 'start codes'.
- Fixed a bug in the way in which the "ServerMediaSession" reference count is updated by "RTSPServer::RTSPClientSession" objects.
  (Thanks to Daniel Liu for reporting this.)
- Modified the "MultiFramedRTPSource" code to optimize the case when the 'packet reordering threshold' has been set to 0.
  (Doing this is not recommended, however, unless you're only going to be on networks where packet reordering is extremely
  unlikely.)
- Added a new member function "reassignInputSource()" to "FramedFilter", to allow a filter's input source to be changed.
- Changed some comments in "testRTSPClient.cpp" to make it clearer that if you (for whatever reason) choose to reclaim the
  "UsageEnvironment" and "TaskScheduler" objects, then you can do so only *outside* the event loop (e.g., in "main()", after
  "doEventLoop()" has returned).

Checksums

2012.02.29

Changelog

- We no longer define RTSPCLIENT_SYNCHRONOUS_INTERFACE by default.  Consequently, the old, now-deprecated 'synchronous' "RTSPClient"
  interface will no longer be available, by default.  If you still want this, however, you can get it by "#define"ing
  RTSPCLIENT_SYNCHRONOUS_INTERFACE before "RTSPClient.hh" gets included the first time.
- Modified the 'multicast loopback' mechanism for getting our own IP address to check the source address of the received
  multicast packet, to make sure that it's valid (e.g., not 127.0.0.1).  (Thanks to Stefan Spurling for this suggestion.)
- Updated "MediaSubsession::initiate()" to better handle the (relatively rare) case of UDP-only (i.e., non-RTP) streams that
  specify a port number in the SDP description.  In this case, because RTP is not being used, we accept the provided port number
  even if it's odd, and we don't bother creating a RTCP 'groupsock'.  (Thanks to John Orr for this suggestion.)

Checksums

2012.02.04

Changelog

- Updated "WAVAudioFileSource" to read from its input file asynchronously,
  if possible, rather than doing a synchronous (blocking) read.

Checksums

2012.01.26

Changelog

- We now make the "MediaLookupTable" class visible in the header file "include/Media.hh".  This allows developers to, if they wish,
  iterate over the whole set of "Medium" objects that they've created.
  (Thanks to Aviad Rozenhek for this suggestion.)
- "HashTable::Iterator::create()" now takes a "HashTable const&" as parameter, rather than a "HashTable&".
  (This makes it possible for iterators to work on (references to) hash tables that we've declared as const - for more type safety.)

Checksums

2012.01.25

Changelog

- Added a new class "MPEG2TransportUDPServerMediaSubsession" (a subclass of "OnDemandServerMediaSubsession") that can be used
  to build a RTSP server that can takes a UDP (raw UDP or RTP/UDP) Transport Stream as input (via IP multicast, or unicast).
  We also updated the "testOnDemandRTSPServer" demo application to show how a RTSP server can take input from the
  (IP multicast) Transport Stream sent by the "testMPEG2TransportStreamer" demo application.
  (Thanks to Achraf Gazdar for this suggestion.)
- Added a new demo application (in "testProgs") "testMPEG2TransportReceiver"
  (which can receive the MPEG-2 Transport/RTP stream sent by "testMPEG2TransportStreamer")

Checksums

2012.01.13

Changelog

- Fixed a bug in "StreamReplicator" that could cause 'replica deactivation' code to be executed more than once on the same replica,
  with bad results.  (Thanks to Mike Stewart for reporting this.)
- Updated the 'connect()'-result test in "RTSPClient.cpp" to check for EWOULDBLOCK as well as EINPROGRESS.
  (Windoze systems can apparently return EWOULDBLOCK.  Thanks to Jeff Shanab for the suggestion.)

Checksums

2012.01.07

Changelog

- Added a new "liveMedia" class "StreamReplicator".  This can be used to create an arbitrary number of 'replicas' of an input
  stream.  We also added a new demo application "testReplicator" (in "testProgs") that demonstrates how to use this class.
- Made a small change to "testRTSPClient" to account for the possibility of a RTCP "BYE" being received after having sent a
  RTSP "TEARDOWN".

Checksums

2011.12.23

Changelog

- Added a new demo application "testRTSPClient" to the "testProgs" directory.  If you're developing your own RTSP client
  application (or want to embed RTSP client functionality into a larger application), then "testRTSPClient" is a better model
  for this than "openRTSP" (because "openRTSP" was designed to be a standalone application, and is complex, with a large number
  of options).
- Fixed a bug in "MultiFramedRTPSource" that could cause an incorrect count of 'truncated' bytes to get reported if the receiving
  sink's buffer size was too large to fit a complete incoming frame.  (Even worse, this bug might also cause a frame of invalid
  data (that should have been truncated from the previous frame) to get delivered to the sink.)

Checksums

2011.12.20

Changelog

- Fixed a "RTSPServer" bug in handling commands (such as "GET_PARAMETER" or "SET_PARAMETER") that have a "Content-Length:" header,
  specifying extra bytes at the end of the message.  (The bug usually affected only RTP-over-TCP streams, not RTP-over-UDP.)
  (Thanks to Jer Morrill for bringing this bug to our attention.)
- We no longer make the 'groupsock' "reuseFlag" a static variable, in case the library is being accessed by multiple threads.
  Instead, we now make it part of the "groupsockPriv" memory that's part of each "UsageEnvironment".
  (Thanks to Michel Promonet for noting this issue.)

Checksums

2011.12.02

Changelog

- Updated the "H264VideoStreamFramer" implementation to avoid triggering a "StreamParser" internal error, even for extremely
  large NAL units.

Checksums

2011.11.29

Changelog

- Updated "MPEG2TransportStreamMultiplexor" to change the Program Map PID from 0x10 to 0x30.  (Thanks to Chris Richardson,
  who noted that PIDs below 0x30 are not valid for ATSC or DVB (although they may be valid for other Transport Streams).)
- Updated the "NetAddressList()" constructor (for resolving names->IP addresses) to use "getaddrinfo()" - if available - rather
  than the older, deprecated "gethostbyname()" function.  Also, the "ourIPAddress()" code (in "GroupsockHelper.cpp") now uses
  the "NetAddressList()" code (if the initial multicast loopback method fails) to look up our host name.

Checksums

2011.11.28

Changelog

- Use "uintptr_t" and "intptr_t" in a few places, where appropriate, to eliminate compiler warnings when compiing for 64-bits.
  (Thanks to the VLC developers for this suggestion.)
- When we create each (datagram or stream) socket, set the 'close on exec' property (if we can).
  (Thanks to the VLC developers for this suggestion.)

Checksums

2011.11.27

Changelog

- Updated the definition and implementation of the "Locale" class to - if possible - use "newlocale()" rather than "setlocale()".
  The reason for this is that - on some systems - "setlocale()" may not be thread safe.
  (Thanks to the VLC developers for this suggestion.)

  IMPORTANT NOTE: Some systems - e.g., FreeBSD - do not have the "xlocale.h" header file that defines "newlocale()".
  This means that we had to #ifdef the code, and continue to use the old implementation (using "setlocale()"),
  if XLOCALE_NOT_USED is defined.  We have updated the "config.freebsd" configuration file to add "-DXLOCALE_NOT_USED=1"
  to the compile flags.  However, if there are other systems that have "locale.h" but not "xlocale.h", then their configuration
  files will need to be updated also.  If you find such a system, then please let us know (using the "live-devel" mailing list).
- Updated the 'IP address finding' code in "groupsock/GroupsockHelper.cpp" to use "getaddrinfo()" - if available - rather than
  the older, deprecated "gethostbyname()" function.
  (Thanks to the VLC developers for this suggestion.)
- Made the "RTSPClient" member function "setBaseURL()" protected rather than private, to allow subclass constructors to,
  if they wish, construct and set the "rtsp://" URL in the body of their constructor, rather than in the call to the parent
  "RTSPClient" constructor.  (If they want to do this, then they should first pass "NULL" as the "rtspURL" parameter in the
  parent constructor.)
  (Thanks to Jeff Shanab for this suggestion.)

Checksums

2011.11.26

Changelog

- We no longer use "inet_ntoa()" (or "our_inet_ntoa()"), because it's not safe if called from multiple threads.
  Instead, we now use our own "AddressString" class (defined in "groupsock/include/NetAddress.hh").
  E.g., instead of calling
      our_inet_addr(addr)
  we now call
      AddressString(addr).val()
  (Thanks to the VLC developers for noting the problem with "inet_ntoa()".)
- Updated the "WindowsAudioInputDevice" code to make it work better with Unicode.  (Thanks to Jeff Shanab.)

Checksums

2011.11.20

Changelog

- Fixed "RTCP.cpp" to not call a "BYE" handler (if one's set) until the very end of the incoming RTCP report handler member
  function.  This is to allow for the (common) possibility of the "BYE" handler causing "this" to get deleted.
  (Thanks to Jeff Shanab for noticing this.)
- Updated some counters used by "MPEG2TransportStreamFramer" from "unsigned long" to "u_int64_t", to better support streams
  that last for several days.  (Thanks to Tim Shackleton for this fix.)
- Modified the "RTSPServer" code to properly handle weird RTSP clients that ask for RAW UDP streaming, but also specify two
  port numbers in the "client_port=" part of the "Transport:" header.
  (Thanks to "homepuh(at)yandex.ru" for this suggestion.)
- Made a small change to the "VP8VideoRTPSource" implementation to reflect a minor change (the addition of the "K" header flag)
  in the most recent IETF Internet-Draft (draft-ietf-payload-vp8-02.txt)
- Added an #ifndef to "Boolean.hh" to deal with a Windows development environment that already defines (not "#define"s)
  "True" and "False".  (Thanks to Jeff Shanab for this suggestion.)

Checksums

2011.11.08

Changelog

- Added "VorbisAudioRTPSink" and "VorbisAudioRTPSource" for sending/receiving Vorbos audio RTP streams (based on RFC 5215).
- Added "VP8VideoRTPSink" and "VP8VideoRTPSource" for sending/receiving VP8 video RTP streams.
- Added support for extracting and streaming Vorbis audio tracks from Matroska (including WEBM) files.
- Added support for extracting and streaming VP8 video tracks from Matroska (including WEBM) files.
- Updated the "testOnDemandRTSPServer" and "LIVE555MediaServer" (source-code version only) applications to support streaming
  from ".webm' files.
- Fixed frame durations for data extracted from Matroska tracks that don't have a 'default duration'.
- Fixed a memory leak in "RTSPClient::sendOptionsCmd()".  (Thanks to Gregg Mattinson for reporting this.)
  (Note, however, that "sendOptionsCmd()" - and other functions in the synchronous interface - are currently deprecated.
  Developers should now be using the asynchronous "RTSPClient" interface instead.)

Checksums

2011.11.02

Changelog

- Updated the Matroska file parsing code to be more tolerant of extremely large frames (larger than the "StreamParser"
  "BANK_SIZE"), and bogus data - to avoid tripping into parser 'internal errors'.
- Added an #ifndef/#endif around the "NoReuse dummy;" statement in "RTSPServer.cpp".  This allows a developer - at compile time -
  to allow a "RTSPServer" to run even if there is already a server using the same port.  (The only time you should do this is
  if you anticipate restarting a server immediately after it exits, when the old server is still in a TIME_WAIT state, and
  you're sure that no other server will ever be running with the same port number.)
  (Suggestion by Chris Richardson.)

Checksums

2011.10.27

Changelog

- Added support for seeking within streams that are demultiplexed from a Matroska file.
- Modified the signatures of the virtual functions "ServerMediaSubsession::seekStream()"
  and "OnDemandServerMediaSubsession::seekStreamSource()" to make the "seekNPT" parameter a "double&" rather than a "double".
  This makes it possible for subclasses to make slight changes to the specified seek position when they implement seeking.
  (This is necessary for seeking within Matroska-demuxed streams, because 'cue points' in Matroska files can be coarse-grain.)
- Made a slight modification to "openRTSP" so that it sets the play duration correctly if the RTSP seek position changes as
  a result of the RTSP "PLAY" command.
- Changed the implementation of "ReorderingPacketBuffer" in "MultiFramedRTPSource" to use a doubly-linked list rather than
  a singly-linked list.  This makes it more efficient to add new packets to the list after a packet loss has occurred
  (while we wait for the 'reordering threshold' to expire).  (As always, most of the "ReorderingPacketBuffer" code gets called
  only if a packet is lost (or reordered) in the input stream; not in the common case where all packets arrive in order.)
  (Thanks to Ralf Schroeder for this suggestion.)
- Made the implementation of the "our_random()" function more robust in case it's called concurrently by multiple threads.
  (Of course, as explained in the FAQ, you should calling LIVE555 code from multiple threads only if each thread uses its own
  "UsageEnvironment" and "TaskScheduler" object.)
  (Thanks to Michael Margold for raising this issue.)
- Fixed the way that you can specify - in the C/C++ preprocessor - that you want to use the system-supplied "random()" and
  "srandom()" functions, rather than our own versions.  You can do this by defining USE_SYSTEM_RANDOM (e.g., in a "config." file).

Checksums

2011.10.09

Changelog

- Updated "RTSPServer" to better support multiple "/" characters (i.e., subdirectories) in URL - i.e., improving the modification
  that we made back in version 2011.08.13.
- Added an #include to "RTSPCommon.hh" to overcome a compilation problem that some
  people had when using Borland development tools on Windows.

Checksums

2011.10.05

Changelog

- Added support for RTSP/RTP streaming, on demand, from a Matroska ('.mkv') file.  The video, audio, and subtitle tracks (if any)
  within the file are demultiplexed and streamed separately, via RTP.  We currently support H.264 video, AAC, AC3 and MP3 audio,
  and text subtitles.  Sometime in the future, we will also support WEBM ('.webm') Matroska files, with VP8 video and Vorbis audio.
  (We don't currently support seeking within the underlying  Matroska file (to implement RTSP seeking), but hope to do so
  in the future.)
  We also updated the "testOnDemandRTSPServer" demo application and the "LIVE555 Media Server" (currently, just the source-code
  version - not the prebuilt application binary versions) to support streaming from '.mkv' files.
- Added a new "RTPSink" subclass "T140TextRTPSink" to implement the 'text conversation' RTP payload format defined
  by RFC 4103.  (Note, however, that the optional support for 'redundancy' - as described in that RFC - is not yet supported.)
  We had already implemented the *reception* of this RTP payload format (using "SimpleRTPSource").
  We use this payload format to stream 'subtitle' tracks from Matroska files.
- Added a new configuration file "config.macosx-32bit" for generating 32-bit-only binaries for Mac OS X.
  (Thanks to Robert Wolff for contributing this.)
- Added a mechanism for (optionally) setting a callback function on a "RTPSink" - to be called if a send of data over
  the sink's socket fails.  (Contributed by Ralf Globisch.)
- Made a minor change to "MultiFramedRTPSink" to ensure that the "doSpecialFrameHandling()" virtual function gets called
  even when sending RTP packets that contain a 0-length payload.
- Fixed a minor memory leak in "H264VideoRTPSink" (the intermediate 'fragmenter' object wasn't getting deleted properly)

Checksums

2011.09.19

Changelog

- We now set RTCP "RR" handlers for "PassiveServerMediaSubsession"s.  As a result, client sessions for multicast streams
  will no longer time out - as long as the clients send RTCP "RR" packets which the server can receive.
- Added a new public member function "setSPSandPPS()" to "H264VideoStreamFramer".  This lets you initialize a
  "H264VideoStreamFramer" (or a "H264VideoStreamDiscreteFramer") with SPS and PPS NAL units, in case these do not appear
  early (or at all) in the input stream.
- Made some performance improvements to "H264VideoFileServerMediaSubsession" and "MPEG4VideoFileServerMediaSubsession".
- Fixed a bug in "H264VideoRTPSink" that could cause input source processing to not get stopped properly if the sink gets deleted.

Checksums

2011.09.02

Changelog

- Updated "MultiFramedRTPSource" to more cleanly handle the situation where the sender's SSRC changes.  We don't yet support
  streams that contain multiple SSRCs, but we can handle streams where the SSRC changes occasionally - e.g., because a multicast
  source has been restarted.  (When the SSRC changes, we don't check the RTP sequence number of the first packet.)
  (Thanks to Dmitriy Vasil'ev for bringing this issue to our attention.)

Checksums

2011.08.22

Changelog

- Updated the "RTSPServer" code to handle a rare condition whereby "handleRequestBytes()" gets called recursively.
  (This can happen only when we handle a "DESCRIBE" by re-calling the event loop (e.g., to wait for SDP parameters to
  become available).)  If this happens, we need to make sure that we don't delete the "RTSPClientSession" object until we leave the
  outermost call.  (Thanks to Vadim Kosarev for identifying the problem, and proposing the solution.)

Checksums

2011.08.20

Changelog

- Modified the "MediaSession" and "MediaSubsession" classes to make it possible for developers to add support for receiving
  new RTP payload formats, without having to modify the "MediaSession" or "MediaSubsession" code itself.  To do this, developers
  define their own subclasses of "MediaSession" and "MediaSubsession".  For more details, see the comment near the top of
  "liveMedia/include/MediaSession.hh"

Checksums

2011.08.13

Changelog

- Updated the "RTSPServer" implementation to allow multiple "/" characters in the "rtsp://" URL.  This allows the
  "LIVE555 Media Server" to stream from subdirectories.  (Thanks to Mike Williams for this suggestion.)
- Updated the "RTSPClient" code to more cleanly handle our server's (empty) responses to RTSP "GET_PARAMETER" commands.
  (Thanks to Sebastien Escudier for noting this issue.)
- Updated the "StreamParser" code to allow parsers to test whether we've seen EOF on the input stream.  We also modified
  the "H264VideoStreamParser" code to use this, and fix a bug which was causing it to omit the last NAL unit in the input file.
- Updated "JPEGVideoRTPSource" to generate correct (or at least more correct) JPEG headers when the input stream contains just
  one quantization header.
- Added a 'cast' to the "RTSPServerSupportingHTTPStreaming" code to overcome a compilation problem that some people may
  have been seeing.

Checksums

2011.07.21

Changelog

- Changed some member variables from "private:" to "protected:", to make subclassing easier.
  (Requested by Mojtaba Nouri and James Stafford.)
- Added a sanity check to the "RTP-over-TCP" handling code in "RTPInterface.cpp" to alleviate a strange condition (perhaps a bug)
  that Jeremy Noring saw.

Checksums

2011.07.18

Changelog

- Added a new, optional extension to "RTSPServer" - called "RTSPServerSupportingHTTPStreaming" - that supports streaming
  to iPhones and iPads, using Apple's "HTTP Live Streaming" mechanism.  (For this to work, the files being streamed *must* be
  MPEG Transport Stream files with H.264 video, and must also be 'indexed' (using the same 'index file' mechanism that we use
  for 'trick play').  (The "live555MediaServer" source code has been updated to support this, as an option.)
- Fixed a bug in the various "*Streamer" demo applications that stream from the same input file, in a loop.  We weren't calling
  "stopPlaying()" on the "RTPSink" object at the end of each loop.  This bug directly affected only "testH264VideoStreamFramer",
  but was theoretically an issue for other demo applications as well.  (Thanks to Sergey Kosov for reporting this.)

Checksums

2011.07.15a

Changelog

- Removed some experimental new code that had accidentally been left in the "mediaServer" directory.

Checksums

2011.07.08

Changelog

- Updated the RTSP server implementation to check the "Content-Length:" header - if present - in incoming requests.  Most commands
  don't include extra data after the , and thus don't need a "Content-Length:" header.  However, two commands
  - GET_PARAMETER and SET_PARAMETER - include extra data, and thus have a "Content-Length:" header.  We now check this value,
  to make sure that we've received all of the required data for each request.
  (Thanks to Matt Schuckmannn for reporting this issue.)

Checksums

2011.07.06

Changelog

- Modified the change to "ByteStreamFileSource" that we made in version 2011.06.12.  We now call "read()" only if we know that
  the underlying file is non-seekable.  Otherwise - if the file is seekable - we call "fread()", as we did prior to 2011.06.12.
  (Reading from the file using "read()" doesn't work properly if we're also seeking within the file.
  This is why Transport Stream 'trick play' got broken by 2011.06.12, but should be working again now.)

Checksums

2011.07.05

Changelog

- Updated "MPEG2IndexFromTransportStream" to make "MPEG2TransportStreamIndexer" more robust when it sees PCR timestamps decreasing
  in time (something that shouldn't happen).  (Thanks to Mojtaba Nouri for providing an example Transport Stream file that
  illustrates this.)
- Fixed a bug in "MPEG2IndexFromTransportStream" that could cause the "MPEG2TransportStreamIndexer" utility to hang when it
  saw bogus data appear before a MPEG system code.  (Thanks to Julian Scheel for reporting this issue.)
- Modified the "BasicTaskScheduler" implementation to add "dumySocket" only to "fReadSet", but not to "fWriteSet" or "fExceptionSet".
  This should continue to work around the Windows bug (where "select()" returns an error if no sockets are present in "fReadSet"),
  but without causing "select()" to keep returning unnecessarily (chewing up CPU).  (Thanks to Matt Schuckmann for reporting this.)
- We now make all files in the source code distribution read-only, by default.  Developers can, of course, change the permissions
  of any of these files to make them writeable, but having them be read-only by default helps emphasize that modifying the
  supplied source code is discouraged.  Instead, developers should - if possible - extend the supplied source code using
  C++ subclassing.  For more information, see the FAQ: http://www.live555.com/liveMedia/faq.html#modifying-and-extending

Checksums

2011.06.16

Changelog

- Updated "AC3AudioRTPSink" and "AC3AudioRTPSource" to conform to RFC 4184, which defines the RTP payload format for AC-3 audio.
  Previously, we were using a different, incompatible payload format (that had been defined by an initial draft document, but
  which differed from that defined in the final RFC.  Unfortunately, this means that older clients that use our code
  - including existing binary versions of VLC and MPlayer - will no longer be able to play AC-3/RTP streams from our server
  (until they are rebuilt using this newest version of our library).
- Updated "AC3AudioStreamFramer" - and added a new class "AC3AudioFileServerMediaSubsession" - to support streaming from an AC-3
  audio file.  We also added this support to the "testOnDemandRTSPServer" demo application, and to the "LIVE555 Media Server"
  (currently just the source code; not the prebuilt binary versions).
  (Thanks to Ashwani Kathuria for suggesting this.)
- Moved the definition of "class StreamState" from "OnDemandServerMediaSubsession.cpp" to "OnDemandServerMediaSubsession.hh".
  Even though "class StreamState" is used only internally, in the implementation of "OnDemandServerMediaSubsession", moving its
  definition to the header file makes it possible for subclasses of "OnDemandServerMediaSubsession" to access it.

Checksums

2011.06.14

Changelog

- Fixed a race condition in "H264VideoFileServerMediaSubsession" and "MPEG4VideoFileServerMediaSubsession" that could have been
  triggered when two separate clients tried to stream the same file concurrently.  (Thanks to Bruno Abreu for reporting this.)
- Fixed a minor bug in "Authenticator::operator=()": we were not freeing the LHS object's memory before doing the
  assignment.  (Thanks to Sawan Das for noting this.)
- Updated "config.iphoneos" to change LIBRARY_LINK from "ar cr " to "libtool -s -o ", just as we did for "config.macosx" in the
  previous release.

Checksums

2011.06.12

Changelog

- Updated the RTCP implementation to (if we're a SSM source) reflect incoming RTCP packets back to the multicast group
  *only* if the packet originated from another host.  This means that we won't reflect packets that come from other
  processes on our own host.  The reason for this is that we can't reliably distinguish such packets from packets that were
  actually looped back from us.  (We must not 'reflect' such packets, otherwise we risk a packet storm.)
- Updated the "ByteStreamFileSource" code to make the underlying socket non-blocking.  We also read data using "read()"
  rather than "fread()", to eliminate blocking (if READ_FROM_FILES_SYNCHRONOUSLY is not defined).  (This change should
  affect only reading from pipes, not regular files.)  (Thanks to Tyson Wiser for noting this issue.)
- Updated the "DelayQueue" destructor to make sure that any remaining delay queue entries are destroyed.
  (Thanks to "Mr. Xiao" and Luke Kucalaba for (independently) reporting this issue.)
- Updated "config.macosx" to change LIBRARY_LINK from "ar cr " to "libtool -s -o ", because someone reported that "ar"
  didn't work for them.
- Added support for receiving the "audio/EAC3" RTP payload format (which is handled the same way as "audio/AC3").
  (Thanks to Gregory McGarry for the patch.)

Checksums

2011.05.25

Changelog

- Fixed a bug in "RTSPClient" which was causing clients to crash if servers returned a 401 error code, but without a
  "WWW-Authenticate:" header.  (Thanks to Sebastien Escudier for reporting this.)

Checksums

2011.03.14

Changelog

- Updated the "MPEG2TransportFileServerMediaSubsession" to use the "streamDuration" parameter (if >0.0) to limit
  the number of Transport Packets that are streamed from the source file.  (This happens only if the file is indexed.)
  This allows the server to implement finite RTSP ranges for such streams.
- Fixed a minor bug in "OnDemandServerMediaSubsession" if "reuseFirstSource" is set.  (Thanks to Andreas Gaer for noting this.)

Checksums

2011.03.05

Changelog

- Changed the signature of the "OnDemandServerMediaSubsession::seekStreamSource()"
  virtual function to add a "streamDuration" field.  This field (if >0.0) tells
  the implementation how much data to stream before ending with EOF.
  Our RTSPServer implementation now uses this to implement finite RTSP ranges
  (as specified in the "Range:" header).  As with seeking, only some codecs currently
  implement this: MP3 audio, WAV audio, and DV video.
- We now support streaming from IMA ADPCM ("DVI4") WAV files.
- When streaming MP3 audio files or indexed MPEG Transport Stream Files, we now compute a more accurate bitrate estimate
  (for use in computing RTCP packet frequencies).

Checksums

2011.01.24

Changelog

- Fixed a bug that was accidentally introduced in version 2011.01.10, and which crashes VLC (when VLC is used to play a
  "rtsp://" URL).  To avoid the bug, VLC should therefore use this version or later.

Checksums

2011.01.10

Changelog

- Updated "RTSPClient" so that the new asynchronous interface can handle RTSP URLs that contain a ":@"
  before the server host name/address.  This had been supported in the old synchronous interface, but when we implemented the
  new asynchronous interface, we had forgotten to implement it there as well.
- Made a change to the implementation (but not the default behavior) of "RTSPServer" to allow for the possibility of a subclass
  implementing HTTP streaming (using the same HTTP port that we use to support RTSP-over-HTTP tunneling).

Checksums

2010.12.14

Changelog

- Oops - there was a serious bug in the 'event trigger' implementation in the previous release.
  IMPORTANT: You should upgrade to this new version if you plan to use the 'event trigger' mechanism!
  (Thanks to "P.J." for noticing the bug in the previous version.)

Checksums

2010.12.05

Changelog

- Significantly improved our support for streaming H.264 video.  In particular, "H264VideoStreamFramer"
  and "H264VideoStreamDiscreteFramer" (a new class) act like their corresponding MPEG4 versions: "H264VideoStreamFramer" reads
  an H.264 Video Elementary Stream byte stream (e.g., from a file), and "H264VideoStreamDiscreteFramer" reads discrete H.264 video
  NAL units (i.e., one-at-a-time), e.g., from an H.264 video encoder.  (Note that developers no longer need to subclass
  "H264VideoStreamFramer".)  We also added a new demo application - "testH264VideoStreamer" - for streaming from
  an H.264 Elementary Stream Video file via multicast.  "testOnDemandRTSPServer" and "live555MediaServer" were also updated to
  stream H.264 Video Elementary Stream files.
- Added a sanity check to "MultiFramedRTPSink" and "BasicUDPSink" to allow for the possibility of the system clock jumping ahead
  in time, and thereby messing up the calculation of how long to wait before sending the next packet.
  (Thanks to Anders Chen for noting this issue.)
- Fixed bugs in "AMRAudioRTPSource" and "QCELPAudioRTPSource" that might sometimes cause an event handler to try to reference
  objects that had already been deleted.  (Thanks to David Cailliere for detecting the problem with "AMRAudioRTPSource";
  it turns out that "QCELPAudioRTPSource" had the same problem.)

Checksums

2010.11.17

Changelog

- Added new a member function "setAuthenticationDatabase()" to "RTSPServer".  This allows a server's manager to change
  (or disable) authentication at runtime.  (Thanks to Jeremy Norling for suggesting this functionality.)

Checksums

2010.10.28

Changelog

- Updated "JPEGVideoRTPSource" amd "JPEGVideoRTPSink" to support optional "Restart Marker Headers" in the outgoing RTP packet.
  (We already supported such headers in *incoming* JPEG/RTP packets ("JPEGVideoRTPSource").)
  If "type()" (defined by the "JPEGVideoSource" subclass) returns a value in [64,127], then the "JPEGVideoSource" subclass must
  also redefine "restartInterval()" to return a non-zero value.
  (Thanks to Cristiano Belloni for suggesting this addition.)

Checksums

2010.10.15

Changelog

- Added server support for RTSP/RTP-over-HTTP tunneling.  We added a new "RTSPServer" member function
      Boolean setUpTunnelingOverHTTP(Port httpPort);
  to (attempt to) set up tunneling on the specified HTTP port number.
  We also updated the "testOnDemandRTSPServer" and "live555MediaServer" applications to try to set up HTTP tunneling
  on port 80, then port 8000, and then finally port 8080.

Checksums

2010.09.25

Changelog

- Disabled the code for "Groupsock::multicastSendOnly()", because it was apparently causing SSM multicast packets to not be
  received by other applications on the same host (at least, for some systems).

Checksums

2010.07.29

Changelog

- Fixed a bug in RTP-over-TCP that was sometimes causing a socket to (attempt to be) read after it had already been closed.
  (Thanks to Wilton @ Invent Vision for reporting this bug.)
- Fixed some bugs in the way that RTP reception statistics were being generated and reported.  (Thanks to David Cailliere.)
- Added a new config file "config.linux-64bit" that should work better than "config.linux" for building for 64-bit Linux systems.

Checksums

2010.07.13

Changelog

- Updated the "openRTSP" and "playSIP" applications to use the new asynchronous "RTSPClient" interface.
- Made the "readSocket()" routine more bullet-proof against Windows brain damage that was apparently causing problems with
  Windows RTSP clients that do RTP-over-TCP.
  (Thanks to Kamil Dobkowski for this suggestion.)

Checksums

2010.06.22

Changelog

- Fixed another bug in the new "RTSPClient" implementation (thanks to Sebastien Escudier); we were not recognizing
  "npt=now-" in "Range:" headers.
- Fixed a bug in "openRTSP" (reported by Kenneth Ljungh).  We were closing output files before issuing a RTSP "TEARDOWN" command.
  This problem was exposed only with the new "RTSPClient" implementation, because it reenters the event loop (thereby possibly
  handling incoming RTP packets) after the sending of the "TEARDOWN", before it gets handled and responded to.
  We have now fixed the "openRTSP" code to not close output files until after the RTSP "TEARDOWN" has been completed.

Checksums

2010.06.18

Changelog

- Fixed a bug in the new "RTSPClient" implementation (reported by Sebastien Escudier) - that was causing problems
  when streaming from some RTSP-enabled video cameras.

Checksums

2010.06.15

Changelog

- Removed the "blockUntilReadable()" function, because it's no longer needed, now that all socket reads are asynchronous.
  This means that "readSocket()" no longer calls "select()", which should improve the performance of applications.
- Improved the processing of RTP/RTCP/RTSP-over-TCP (possibly fixing some bugs in the process).
- Fixed bugs in the new "RTSPClient" implementation of "GET_PARAMETER" and "SET_PARAMETER".
  (Thanks to Denis Charmet for reporting this.)

Checksums

2010.06.11

Changelog

- Fixed some potential memory access errors in the previous version of "RTSPClient".
- Removed code from "RTSPClient" that was supposed to deal with buggy (Microsoft?) servers, but which in reality was causing
  clients to not know the duration of time-bounded streams properly.
- Modified the new RTSP client implementation of "RTSP-over-HTTP" to make it more consistent with the old implementation.
  (Doug Porter reported a problem with the implementation in release 2010.05.29.)
- "AMRAudioSource" (and therefore its subclasses also) were not redefining the "MIMEtype()" virtual function.  Fixed this.
  (Thanks to Adam Mich for reporting this.)
- Fixed a minor problem that was causing some "UsageEnvironment"-allocated tables not to get deleted under some circumstances.

Checksums

2010.05.29

Changelog

- Made a major change to the interface and implementation of "RTSPClient", to make it perform operations asynchronously
  - i.e., without blocking.  Each operation that performs a RTSP command now takes a 'response handler' function as parameter.
  The operation returns immediately, but the 'response handler' function will get called later, when a response arrives
  (or if an error occurs).
  For backwards compatibility, the old 'synchronous' interface still remains, and is implemented using the new 'asynchronous'
  interface.  (However, the old 'synchronous' interface should not be used for new applications, and it will likely be removed
  in a few months.)
  For now, the demo application "openRTSP" still uses the old interface, but will be rewritten over the next few weeks to use the
  new "RTSPClient" interface.
- Modified the "TaskScheduler" definition yet again, because it was too complicated.  There's now just one virtual function
  for setting/clearing socket handlers:
  "virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData) = 0;"
  where "conditionSet" is a combination of SOCKET_READABLE, SOCKET_WRITABLE, and SOCKET_EXCEPTION.
  For backwards compatibility, the existing "turnOnBackgroundReadHandling()" and "turnOffBackgroundReadHandling()" functions
  are retained, but are now implemented using "setBackgroundHandling()".
  See "UsageEnvironment/include/UsageEnvironment.hh" for details.

Checksums

2010.05.28

Changelog

- Updated the previous revision of "TaskScheduler" to add two more new virtual functions
  "turnOnBackgroundExceptionHandling()" and "turnOffBackgroundExceptionHandling()",
  because it turns out that Windows needs them for checking on a failed remote "connect()"
  (behaving differently from Posix, which requires only select()ing the socket for
  writing, not an error).

Checksums

2010.05.27

Changelog

- Updated "TaskScheduler" (and our supplied example subclass "BasicTaskScheduler") to include new virtual functions
  "turnOnBackgroundWriteHandling()" and "turnOffBackgoundWriteHandling()".  These are the same as the "Read" versions,
  except that they are for checking when a socket becomes writable.  (They will be used to implement the new, upcoming
  'asynchronous' implementation of "RTSPClient".)
  We also modified the signature of "setResultErrMsg()" to take an optional "err" parameter.  (If  non-zero, this will be used
  instead of "getErrno()".)
- Added a "config.iphoneos" (for cross-compiling on a Mac for the iPhone).  (Thanks to Mark Vasilkov.)

Checksums

2010.04.09

Changelog

- Fixed a bug in the way that "AMRAudioRTPSource" reimplements "hasBeenSynchronizedUsingRTCP()".
  (Thanks to Ralf Globisch for reporting this bug.)
- Increased "SegmentQueueSize" in "MP3ADU.cpp" from 10 to 20, to allow for some unusually-VBR MP3 files that neeed this.
  (Thanks to Dirk Raffel for reporting this problem.)
- Changed the implementation of "parseRangeHeader()" in "RTSPCommon.cpp", in preparation for upcoming changes to "RTSPClient".

Checksums

2010.04.01

Changelog

- Fixed the "openRTSP" code so that it no longer restricts the play time duration (using the "-d" option), because there is no
  no longer any practical limit on the duration that gets passed to "TaskScheduler::scheduleDelayedTask()"
  (because it is microseconds in 64 bits).
  (Thanks to Brad Thomas for this suggestion.)
- Removed some obsolete (and unused) code from the "RTSPClient" implementation, in preparation for a major reworking of this code.

Checksums

2010.03.16

Changelog

- Made more improvements to "QuickTimeFileSink".  (Thanks to Wolfgang Breyha.)

Checksums

2010.03.08

Changelog

- Fixed a rare bug that could sometimes cause RTSP clients to reuse the same (ephemeral) port number.
  (Thanks to Andro Debevere for reporting this.)
- Made changes to "config.armlinux", suggested by Rafael Carre.
- Removed a "|| defined(__CYGWIN32__)" test from "groupsock/GroupsockHelper.cpp", because it's no longer needed.
  (Cygwin has apparently now fixed the bug that made that necessary.)
  (Thanks to Tatterdemalian Anzulovic for reporting this.)

Checksums

2010.02.10

Changelog

- Fixed a possible 1-byte overflow in "RTSPClient::setupMediaSubsession()".  (Thanks to Martin Bonnin for reporting this.)
- Make "parseCLine()" a bit more robust against certain technically illegal, but still parseable SDP "c=" lines.
  (Thanks to Aurelien Nephtali for this suggestion.)

Checksums

2010.01.22

Changelog

- Changed the implementation of "Socket::changePort()" once again, beause it was reported that the change made in version
  2010.01.15 didn't work.  Note, however, that this change also introduces a new function
	     virtual void moveSocketHandling(int oldSocketNum, int newSocketNum) = 0;
  to the "TaskScheduler" API.  We have implemented this for "BasicTaskScheduler".  If you implement your own subclass of
  "TaskScheduler", then you will need to implement this new function as well.

Checksums

2010.01.16

Changelog

- Added ""#include " to "groupsock/NetInterface.cpp".  This was tripping up some people.
  (Thanks to Ben Hutchings for noticing this.)

Checksums

2010.01.13

Changelog

- Added support for streaming/receiving DV video via RTP (using the RTP payload format defined in RFC 3189.
  (Thanks to Ben Hutchings for his help.)

Checksums

2010.01.11

Changelog

- Increased the default "FileSink" buffer size in "openRTSP" from 20000 to 100000, because the previous limit was being bumped into
  too many times.
- Added #include "GroupsockHelper.hh" to "DVVideoStreamFramer.cpp", because it defines "gettimeofday()".

Checksums

2009.11.27

Changelog

- Temporarily hacked the RTSP server code to not include "GET_PARAMETER" as an available option in the response to the "OPTIONS"
  command.  This will stop VLC from using "GET_PARAMETER" as a client 'liveness' indicator.  This is something that we don't
  need, because we already use clients' RTCP "RR" packets as a 'liveness' indicator, and because sending "GET_PARAMETER" over a
  RTP-over-TCP session causes problems with our current implementation.  (This hack will be removed when we fix the problem with
  RTP-over-TCP.)

Checksums

2009.11.12

Changelog

- Made "BasicTaskScheduler::DelayQueue.cpp" more robust against an apparent compiler error on some platforms (e.g., Mac OS X)
  that was leading to "select() fails: Invalid argument" errors.
- Added a new compilation configuration file: "config.avr32-linux".  (Thanks to Jorge Munoz Castiner.)
- Made some minor changes to "groupsock/GroupsockHelper.cpp", "liveMedia/InputFile.cpp" and "liveMedia/OutputFile.cpp"
  to make these files compile (or compile better) for WinCE.  (Thanks to Pierre Ynard for these fixes.)

Checksums

2009.09.28

Changelog

- Added an optional "timeout" parameter to "DarwinInjector::setDestination()".  (Suggested by Jeremy Noring.)
- Added support for receiving the "text/T140" RTP payload format.  (Suggested by Pierre Ynard.)

Checksums

2009.09.21

Changelog

- Added patches proposed by Ben Hutchings to (i) improve the top-level Makefile; (ii) build better static libraries (on
  Linux, FreeBSD, and Mac OS X); (iii) have RTSP servers set "b=AS:" lines in their SDP (and set an appropriate socket send buffer
  size), and (iv) have RTSP (and other SDP) clients interpret the "b=AS:" line (if present) to set the socket receive buffer.
- Changed two source files in the "groupsock" project to use the (current standard)  #include file.
- Increased RTSP_PARAM_STRING_MAX to 200 (request by Stuart Rawling)

Checksums

2009.09.04

Changelog

- Fixed "BasicTaskScheduler"s workaround to a Windows bug (thanks to Vityusha Vinokurov).
- Fixed "DelayQueue::synchronize()" to allow for the possibility of the system clock being reset back in time.
  (Thanks to Sebastien Escudier for pointing out this issue.)
- Made "H264VideoRTPSink::auxSDPLine()" "protected:" rather than "private:" (following a request from Stuart Rawling)

Checksums

2009.07.28

Changelog

- Updated "QuickTimeFileSink" to add a "stss" atom for video streams, following a suggestion by Gerardo Ares.
  (At present we just 'guess' which video 'samples' (frames) are 'key frames', so this might not work properly on some
  video streams.)
- Modified the "config.uClinux" configuration file, following a suggestion by Chetan Raj.
- Changed "RTSPClient"s implementation of the RTSP "TEARDOWN" command to always act as if the command succeeded, regardless of
  the actual response from the server (because, from the client's point of view, the session has ended).
  (This overcomes a potential memory leak, pointer out by Stuart Rawling.)

Checksums

2009.07.09

Changelog

- Modified the RTSP server implementation to - for streams where there is a known duration - always include a range end time
  in the RTSP "PLAY" response, even if the client did not specify one in the "PLAY" request.  This allows VLC's client
  'trick play' to (mostly) work.
- Updated "MediaSession::initiate()" to eliminate a possible memory leak if we get an error in socket creation.
  (Thanks to Denis Charmet.)
- Made a minor change to "MultiFramedRTPSink" to make monitoring/debugging easier.  (Thanks to Guy Bonneau.)
- Begun adding support for DV video.  However, this implementation is still incomplete.  DO NOT USE IT!

Checksums

2009.06.02

Changelog

- Updated the MPEG Transport Stream multiplexor implementation to allow for H.264 video.  (Thanks to Massimo Zito.)
- Updated "MultiFramedRTPSink" to allow for subclasses for RTP payload formats (such as DV, coming soon) that impose
  a granularity on RTP fragment sizes.

Checksums

2009.04.20

Changelog

- Fixed "BasicUsageEnvironment::getErrno()" to always (under Windows) return
  "WSAGetLastError()" (and to just ignore the "errno" variable>.
  Also fixed a few places in the code where we were still using "errno"
  instead of calling "getErrno()"

Checksums

2009.04.07

Changelog

- Changed many "char*" variables to "char const*" to eliminate possible compiler warnings.
  (Thanks to Sebastien Escudier for pointing out this issue.)

Checksums

2009.02.23

Changelog

- Changed the way in which 'trick mode' transport streams are generated, so that each
  video I-frame is included in the output Transport Stream no more than once.
  This means that now - for low scale values - the output frame rate, and bit rate,
  will be les than that of the original file.  (Beforehand, we maintained the same
  frame rate, which meant that - because each output frame is an I-frame - the output
  stream's bit rate was always significantly larger than the original.  This caused
  problems for some clients.)
- Changed the 'client liveness' checking code in the "RTSPServer" implementation so that it deletes the
  "RTSPClientSession" object even for multicast streams.
- Made a minor fix to an error report in "RTSPClient".  (Thanks to Igor Milavec.)

Checksums

2009.01.26

Changelog

- Updated the header file for "rtcp_from_spec.c" to make the call to "exit()" a noop.
  (Thanks to Chris Silvers for raising this issue.)
- Changed the definition of "RTSPClientSession" (in "RTSPServer") to make it protected (and also to make its
  command handler functions protected and virtual), to allow developers to subclass it (to change the
  implementation of some commands).
  (Thanks to Yedidia Amit for suggesting this.)
- Fixed a minor bug in "scheduleNextQOSMeasurement()" (in the "openRTSP" implementation).
  (Thanks to Gabriele De Luca for noticing this.)

Checksums

2008.12.20

Changelog

- Removed - from "MultiFramedRTPSource.cpp" - the historical sanity check for bizarrely delayed packets.
  Accepting such bizarro packets causes problems in the code; it's best not to accept them at all.
- Added to "FramedFilter" a new public function "detachInputSource()" that sets the filter's input source
  to NULL.  This is useful if you want to close the filter independently of closing its input source.
  (Thanks to Alex Cichowski for this suggestion.)
- Modified the header file for "MultiFramedRTPSink" to make its implementation of the "stopPlaying()" virtual
  function public.  (Thanks to Guy Bonneau for this suggestion.)
- Changed "MediaSession::initiate()" to make the port number selection mechanism (for unicast streams) more robust.
  (Thanks to Pierre Ynard for this suggestion.0

Checksums

2008.11.13

Changelog

- Fixed an obscure bug in "BasicTaskScheduler::SingleStep()" in which the call to "handleAlarm()" would
  (on rare occasions) modify the set of read handlers in such a way as to be inconsistent with the result of
  the earlier call to "select()".  We fixed the bug by moving the call to "handleAlarm()" after the socket
  handler call.  (Thanks to Sigismondo Boschi for tracking down this bug.)
- Fixed a bug in "parseRTSPRequestString()" that could cause a crash when parsing certain weird, non-compliant
  requests.  (Thanks to Sebastien Escudier for reporting this.)

Checksums

2008.11.04

Changelog

- Fixed a bug in "RTPInterface" that was sometimes causing sockets not to be reclaimed properly by a
  RTSP server when streaming RTP/RTCP-over-TCP.  (Thanks to Ralf Globisch for tracking this down.)
- Changed the RTSP 'start time' parameter from "float" to "double", to allow for
  accurate 'start times' that are very large - e.g., Unix 'epoch' times.
  (Thanks to Morgan Toervolt for the suggestion and patch.)
- Made some simplifications to the 'reception stats' code in "RTPSource".
  (Thanks to Guy Bonneau for this suggestion.)
- Fixed a minor bug in "QuickTimeFileSink". (Thanks to Pramod Bhagwat.)

Checksums

2008.10.07

Changelog

- Added an optional "timeout" parameter (in seconds) to the 'connecting' RTSP
  client commands.  (Thanks to Sebastien Escudier for this patch.)
- Increased the size of a "DummySink"s buffer in "MPEG1or2FileServerDemux", to make
  it large enough for any PES packet.
- Fixed a minor memory leak in the "createNew()" functions for
  "AVIFileSink" and "QuickTimeFileSink" if the output fid did not get created.
  (Thanks to Mehmet Ozgul for noting this.)
- Fixed a couple of spelling errors, removed some unnecessary whitespace,
  and updated the address of the FSF in the LGPL preamble (thanks to Erik Hovland).

Checksums

2008.09.02

Changelog

- Fixed a minor bug in "RTSPServer".  (Thanks to Renato Mauro.)
- Minor improvements fo "FileSink" and "MP3FileSource".  (Thanks to Pramod Bhagwat.)
- Changed the default "reclamationTestSeconds" parameter (in "RTSPServer" and "DynamicRTSPServer") from 45 seconds
  to 65 seconds, because 60 seconds is the default timeout value expected by (broken) clients that send
  RTSP commands rather than RTCP "RR" reports to indicate liveness.

Checksums

2008.07.25

Changelog

- Minor bug fix to "MPEG2TransportStreamFramer" (reset "fTSPCRCount" in "doStopGettingFrames()").
  (Thanks to Qiujian Shu for reporting this bug.)
- Modified the previous changes to "QuickTimeFileSink" and "AVIFileSink" so that the
  "createNew()" functions return NULL if the output file cannot be opened.

Checksums

2008.07.24

Changelog

- Changed "MultiFramedRTPSource" to handle the very first packet that we receive as
  if there were packet loss beforehand.  This ensures that we correctly discard any
  initial packets that we receive that occur after the start of a (multi-packet) frame.
- Fixed "QuickTimeFileSink" and "AVIFileSink" to close the output file (if it's not stdout or stderr) in the destructor.

Checksums

2008.07.22

Changelog

- Fixed "MPEG2TransportStreamMultiplexor" to use an appropriate stream for our SCR, even if the input contained
  its own Program Stream Map.
- More minor changes to the code to make Erik Hovland's code-checking tools happy.

Checksums

2008.07.06

Changelog

- Corrected one of Erik Hovland's memory leak fixes made to the previous revision.

Checksums

2008.06.26

Changelog

- Fixed a bug in "openRTSP" that was sometimes causing an incorrect "Range:" header
  to be sent in "PLAY" requests.

Checksums

2008.06.05

Changelog

- Renamed the "ourSourceAddressForMulticast()" function to the less confusing and more explanatory
  "ourIPAddress()".
- The "RTSPClient" change that was made in 2008.04.09 to accommodate multicast
  streams apparently broke (some?) unicast streams.  This has now been fixed.
- Updated "RTSPClient" to handle weird servers that include a "Content-Length:" header
  in the response to the RTSP "SETUP" command.  (If we see such a header, we skip over
  the data referred to in the header.)  (Thanks to Kristian Soerensen for this suggestion.)
- Changed the parsing of lines in "RTSPClient" so that it now accepts \r or \n alone
  at the end of each line.  (\r\n is preferred, but the standard also allows \r or \n)
  (Thanks to David Schueler for this suggestion.)

Checksums

2008.05.12

Changelog

- Made a change to "RTCPInterface" to ensure that "turnOffBackgroundReadHandling()" is called on a socket
  as many times as "turnOnBackgroundReadHandling()".  Apparently some versions of Windows get upset if this
  doesn't happen.  (Thanks to Ken Seo for the suggested fix.)
- Fixed a bug in "H263plusVideoStreamParser".  (Thanks to Andrey Latin.)
- Added more sanity checking to "JPEGVideoRTPSink".

Checksums

2008.04.09

Changelog

- Corrected a type-related bug in "RTPInterface::handleRead()".  (Thanks to Brain Lai for noting this.)
- Fixed a bug in "RTSPClient" that would prevent RTCP "RR" reports from being sent to
  the correct multicast address when we are receiving a multicast stream. (Thanks to Changjin Liu for noticing this.)

Checksums

2008.04.03

Changelog

- Fixed a bug that was introduced in the "2007.12.27" release.  The "timeout" parameter to the call to
  "readSocket" in "SocketDescriptor::tcpReadHandler()" in "RTPInterface.cpp" needed to be initialized
  (to zero) first.  (Thanks to Lodewijk Loos for alerting us to this problem.)
- Added a new config file "config.bfin-linux-uclibc", and renamed "config.bfin_uclinux" as "config.bfin-uclinux".
  (Thanks to Mike Frysinger.)

Checksums

2008.02.08

Changelog

- Added a hack (suggested by "Romain") to "MPEG2TransportStreamFramer" to (perhaps)
  produce more accurate per-transport-packet duration estimates for wildly VBR streams.
- Updated "MPEG2TransportStreamMultiplexor" to support the addition of MPEG-4 Audio or Video Elementary Streams.
- Updated "RTSPOverHTTPServer.cpp" (a work in progress) so that it complies properly for some versions of
  Visual Studio on Windows.  (Thanks to Eric Flickner for noting this.)

Checksums

2008.01.19

Changelog

- Corrected the "getNormalPlayTime()" function - introduced in the previous release - to allow for 'trick play'
  scale factors other than 1.

Checksums

2008.01.04

Changelog

- Changed the "RTSPClient" timeout - introduced in the previous release - from
  5s to 30s.
- Added support for setting and returning the RTSP session start time (as well as the end time).
  (This eliminates the need for the "live-starttime.patch" file that VLC was using.)
- Updated some of the system-specific configuration files, to eliminate the need for many of the patches that
  the VLC developers added to their code.

Checksums

2007.12.27

Changelog

- Added a 5s timeout to the "RTSPClient" code that checks for RTSP responses.
  This mirrors a change that was already being done to VLC's copy of the code.
  (This is still a short-term fix, until the "RTSPClient" code is rewritten to
  properly use asynchronous I/O, using the event loop.)
- Added a timeout to the "readSocket()" call in "SocketDescriptor::tcpReadHandler()" in "RTPInterface.cpp",
  to handle reading RTP-over-TCP data.  This allows for the possibility of non-cooperative RTSP clients.
  (Thanks to Peter Leese for this suggestion.)  This is probably not a complete solution;
  more thought is needed...

Checksums

2007.12.07

Changelog

- Fixed "H2633plusVideoFileServerMediaSubsession" to properly use a dynamic RTP payload type, rather than the
  static type 34 (which is reserved for the now-obsolete old "video/H263" RTP payload format).

Checksums

2007.11.18

Changelog

- Fixed a couple of memory leaks in "DarwinInjector".  (Thanks to Eyal Beit-Halachmi for noting these.)
- Removed old 'backwards compatibility' stuff from "FramedSource".  (Noone should be relying upon this any more.)
- Fixed a bounds-checking error in "parseRTSPRequestString()" caused by an int vs. unsigned problem.
  (Thanks to Luigi Auriemma for noting this.)
- In "RTSPClient.cpp", fixed a couple of "unsigned" vs. "int" nits.  (Thanks for Brain Lai for noting this.)

Checksums

2007.11.01

Changelog

- Several of the options to "openRTSP" have now been changed, with two new options added:
	  -s 
	  -z 
  See the "openRTSP" documentation  for details.
- Fixed a bug in the way that "MPEG4VideoStreamDiscreteFramer" parses 'config' information (for inclusion in
  the stream's SDP description).  (Thanks to Nicola Bova for helping to identify this bug.)
- Eliminated a potential memory (and socket) leak when allocating server RTP,RTCP socket pairs.
  (Thanks to David Pan for reporting this.)
- Updated "ByteStreamFileSource" to treat a 0-byte file read the same as EOF.
- Ensure that we have reasonable OS buffering for writes on non-blocking sockets.

Checksums

2007.08.03a

Changelog

- Removed a debugging printf() that had been left in by mistake.  (Thanks to Massimo Zito for noticing this.)

Checksums

2007.07.25

Changelog

- Added some sanity checks to various "MediaSink" subclasses, in case "fSource" is NULL.
  (Thanks to Andrey Kaminsky for noting one of these.)

Checksums

2007.07.10

Changelog

- Made sure that "MPEG2TransportStreamFramer"s estimate of the average duration of each Transport Packet
  gets updated correctly after each 'seek' operation.  (Thanks to Massimo Zito for suggesting this.)
- Fixed a bug in "MPEG2TransportStreamFromESSource" that was causing presentation
  timestamps to not be generated correctly.  (Thanks to Massimo Zito for noticing this.)

Checksums

2007.07.01

Changelog

- Fixed a bug in "RTSPServer" and "RTSPClient" that would cause problems when streaming
  files whose names have spaces in them.
- Fixed a bug in "OnDemandServerMediaSubsession::deleteStream".  (Thanks to Igor Bukanov.)
- Make the sockets for "RTPSource", "RTCPInstance" and "BasicUDPSource" non-blocking, even though they will be read
  from only asynchronously, when packets arrive.  The reason for this is that, in some OSs, reads on a blocking
  socket can (allegedly) sometimes block, even if the socket was previously reported (e.g., by "select()") as
  having data available.  (This can supposedly happen if the UDP checksum fails, for example.)
  (Thanks to Marc Neuberger for pointing this out.)
- Fixed a bug in "MPEG2TransportFileServerMediaSubsession.cpp" that was causing 2x
  fast-forward to fail.  (Some debugging code had been left in by mistake.)

Checksums

2007.05.24

Changelog

- Modified "setupDatagramSocket()" to better handle setting "ReceivingInterfaceAddr" when creating a socket
  to be used to send/receive multicast.
- Made a couple of minor changes to overcome some compilation errors that some people were apparently seeing.

Checksums

2007.04.20

Changelog

- Modified "MPEG2TransportStreamMultiplexor" to set the "discontinuity_indicator" flag for the first
  "adaptation_field" in the output Transport Stream.
- Changed "AMRAudioRTPSource" to more accurately report whether/when an interleaved frame's timestamp has
  been synchronized using RTCP.
  (Thanks to David Bertrand for this patch.)
- Made to a small fix to the previous revision's support for multicast streaming of raw UDP (nonstandard)
- Added a virtual function to "OnDemandServerMediaSubsession" for closing the stream source.
  Subclasses can redefine this, if they wish, to do something smarter.  (Thanks to Igor Bukanov for this patch.)
- Added support to "RTSPServer" for optionally performing special per-client access control, beyond the
  standard Digest Authentication method.  (Thanks to Igor Bukanov for this patch.)
- Made a minor optimization to "Groupsock.cpp".  (Thanks to Maxim Petrov for this suggestion.)
- Added an initial implementation of RTSP-over-HTTP at the server level (it was already supported at the client level).
  (Note: This code has not yet been completed, and doesn't yet work, so don't try to use it.)

Checksums

2007.02.20

Changelog

- Updated "RTSPServer" to support multicast streaming of raw UDP streams (nonstandard).
  (Thanks to Aesmund Grammeltvedt for this modification.)
- Made "RTSPClient" a little more robust in case the TCP connection fails.
- Made "RTPSink::rtpmapLine()" virtual (as requested by Andrew Voznytsa).
- Removed an archaic (no longer used) declaration in "groupsock/include/Groupsock.hh".
- Added an optional "allowKasennaProtocol" parameter to "RTSPClient::describeWithPassword()"
  (similar to "RTSPClient::describeURL()").  (Thanks to Igor Bukanov for this suggestion.)s

Checksums

2007.01.17

Changelog

- Fixed a bug that would cause the "MPEG2TransportStreamIndexer" application to fail when run on a big-endian
  architecture.
- Added a new class "H264VideoFileSink", that prepends each incoming H.264 NAL unit with the prefix 0x000001,
  before writing it to the file.  Also updated the "openRTSP" code to use this, when receiving H.264/RTP streams.
  (Thanks to Chris Kuiper for contributing this.)
- Added a temporary #ifdef to "GroupsockHelper.cpp" to work around a compliation problem when building
  for Cygwin.

Checksums

2007.01.11

Changelog

- Improved the "MPEG2IndexFromTransportStream" class to recogize Transport Stream
  PAT and PMT (tables).  This in turn makes the "MPEG2TransportStreamIndexer"
  utility more robust.
- Fixed a minor bug in "MPEG2TransportStreamFromESSource".

Checksums

2007.01.09

Changelog

- Added RTSP server support for 'trick play' operations on MPEG-2 Transport Stream
  files.  This requires the presence of a ".tsx" index file for each ".ts" file.
  (This functionality will shortly be documented on the LIVE555 web site,
  and announced on the "live-devel" mailing list.)
- Improved the performance of asynchronous file reading in "ByteStreamFileSource".
  (Thanks to Aesmund Grammeltvedt for this suggestion.)
- Added "-D_FILE_OFFSET_BITS=64" to the "COMPILE_OPTS" line for each of the Linux config files, in order to
  alleviate possible problems with I/O on large files.

Checksums

2006.12.31

Changelog

- We now implement "ByteStreamFileSource" on Windows using synchronous file reads,
  by default.  I had thought that Windows XP had fixed the problem - present in
  earlier versions of Windows - whereby open files are not treated as select()able
  sockets.  But apparently the problem is still there.
- Added code that will - probably in the next release, very soon - support server
  'trick mode' operations on MPEG-2 Transport Stream files.  At present, we have two
  new applications - in the "testProgs" directory - that help support this:
  "MPEG2TransportStreamIndexer" (to create a special index file for a Transport Stream
  file), and "testMPEG2TransportStreamTrickPlay" (to generate a new Transport Stream
  file that simulates a 'trick play' operation performed on the original Transport
  Stream file).  See my forthcoming post to the "live-devel" mailing list for more
  details.
- Fixed a bug in the Base64 encoding routine.  (Thanks to Sebastian Gracias for reporting this.)

Checksums

2006.12.08

Changelog

- Made sure that each TCP socket used by a "RTSPserver" is non-blocking, so that a slow or hanging client
  cannot hang a server.  (Thanks to "jers (at) inwind.it" for this suggestion.)

Checksums

2006.11.16a

Changelog

- Oops - fixed a problem with the packaging of the new "mediaServer" code.

Checksums

2006.10.27

Changelog

- "RTSPClient" now recognizes the "Content-Base:" header in RTSP "DESCRIBE" responses.
  (Thanks to Derk-Jan Hartman for this suggestion.)
- Updated "MultiFramedRTPSource" to avoid excessive recursion (and thus potential
  stack overflow) in some cases when receiving streams that have packet loss.
  (Thanks to Erwin Beckers for raising this as an issue.)
- Updated "RTPSink" and "MultiFramedRTPSink" to ensure that a proper RTP timestamp
  is set in the RTSP "RTP-Info" header that follows a "PAUSE", and that this timestamp
  gets used in the next outgoing RTP packet.  (Thanks to David Bertrand for this suggestion.)
- Changed the special implementation of "gettimeofday()" for Windows to return
  more accurate results.  (Thanks to David Arnold for this change.)

Checksums

2006.10.18a

Changelog

- A minor update to the "MultiFramedRTPSink" change made in the previous release.

Checksums

2006.10.12a

Changelog

- Backed out the change that we made in the 2006.09.18 release: We now don't attempt
  to setsockopt() SO_REUSEPORT and IP_MULTICAST_LOOP on Windows. (Dave Arnold reports
  that doing so leads to UDP packets with TTL=1.)

Checksums

2006.10.07

Changelog

- The demo applications (in the "testProgs" directory) that stream MPEG-4
  Elementary Stream video files now use a file name "test.m4e" rather than "test.m4v".
  This is to avoid confusion, because Apple has coopted the ".m4v" suffix for
  MPEG-4 (audio+video) files, which are different.
- Made "MPEG4VideoStreamFramer" more bullet proof against some non-standard MPEG-4 video data.
  (Thanks to Maxim Petrov for this suggestion.)

Checksums

2006.09.20

Changelog

- Corrected the bug fix to "H264VideoRTPSink" that was made two revisions ago.

Checksums

2006.09.18

Changelog

- Fixed a bug in the way that "RTPSource" records the maximum sequence number seen so far.
  (The bug could be triggered by packets arriving out of order.)  Thanks to Mallikharjuna Reddy
  for pointing this out.
- When creating new datagram sockets, we now attempt to setsockopt() SO_REUSEPORT and IP_MULTICAST_LOOP,
  even on Windows.  (A version of Windows prior to XP had problems with this, but it's apparently no longer
  a problem.)

Checksums

2006.09.12

Changelog

- Fixed a minor bug in "H264VideoRTPSink".  (Thanks to Emiliano Parasassi for noting this.)
- If the "totSessionBW" parameter to "RTCPInstance::RTCPInstance()" is zero, print out an error message,
  and use a value of 1 (kbps) instead.

Checksums

2006.09.09

Changelog

- Reenabled asynchronous file reading in "ByteStreamFileSource", after fixing a bug
  that could lead to a 'race condition' in some circumstances.  (The fix was to call
  "FramedSource::afterGetting()" directly - rather than via the event loop - after
  delivering data to the downstream object.)
- Updated "MPEG2TransportStreamFromESSource" again.  Now, we set the
  "PES_packet_length" field to zero if the input data was larger than 2^16 bytes
  long.  (This is in accordance with the MPEG specifications; thanks to "jeremy at electrosilk.net"
  for noticing this..)

Checksums

2006.09.08

Changelog

- Temporarily disabled asynchronous file reading in "ByteStreamFileSource" until we
  fix an apparent bug that is causing MPEG streaming to fail.
- Updated "MPEG2TransportStreamFromESSource" to print a warning message if the input source delivers
  data in chunks that are too big to make up a PES packet.

Checksums

2006.09.07

Changelog

- Fixed a bug that was preventing the RTCP "RR" packet handler from being called
  when we were streaming RTP/RTCP-over-TCP.  (Thanks to "zhangzx at rcs-9000.com"
  for noticing this.)

Checksums

2006.08.26

Changelog

- Changed the implementation of "ByteStreamFileSource" so that reads from the
  open file are now done asynchronously, when data becomes available.  This matches
  the code's event-driven execution model better than the previous implementation,
  which read from files synchronously.  It should also perform better in systems
  that read from more than one file concurrently.
- Added Victor Kozhuhov's modifications to the WAV file support code, to allow for WAV files that contain
  u-law or a-law content (instead of the usual raw PCM).

Checksums

2006.08.24

Changelog

- Fixed the way in which "RTSPServer" handles requests that span more than one
  TCP socket read.  These reads are now all handled asynchronously, in accordance
  with the library's event-driven execution model.  (Thanks to Marc Neuberger for noting this.)
- Fixed a memory leak in "MultiFramedRTPSource" that would occur if we received
  packets with duplicate sequence numbers, or if we received excessively delayed
  packets.  (Thanks to David Bertrand for noticing this.)
- Changed the order of statements in "~RTSPClient()" to fix a bug (noted by Brain Lai).
- Changed "base64Encode()" to take a 'length' parameter, so that it will work with input data that
  contains '\0' characters.  (Thanks to Derk-Jan Hartman for this suggestion.)
- Added support - in "RTSPServer" - for the (non-standard) "x-playNow:" header in RTSP requests.
  (Thanks to Rob Casey for this patch.)
- Updated "MediaSession" to parse the (standard) SDP "framerate" attribute (in addition to "x-framerate", which
  is non-standard).
- Changed the parent class of "H264VideoStreamFramer" to be "FramedFilter" (to be consistent with other
  'Framer' classes) instead of "FramedSource".  (Thanks to Jinfeng Zhang for noticing this.)
- Made the "FramedFilter" implementation more robust, in case the supplied input source parameter is NULL.

Checksums

2006.08.07

Changelog

- Changed the way that "OnDemandServerMediaSubsession" creates server ports.
  It now chooses server port numbers starting with a specific port number
  (which is now an optional parameter to the "OnDemandServerMediaSubsession"
  constructor).  The default value of this initial port number parameter is 6970.
  This matches the port number range used by other common RTSP server implementations,
  including Darwin Streaming Server and Helix.
- Changed the criterion for whether to send out a RTCP "SR".  (Thanks to David Bertrand.)
- Fixed an obscure bug in "OnDemandServerMediaSubsession::deleteStream()"
  (reported by Scott Hayes)
- Removed some archaic code that was developed for a customer several years ago, but
  which is no longer used.

Checksums

2006.07.04

Changelog

- Another update to "H264VideoRTPSink" (requested by David Bertrand)

Checksums

2006.06.28

Changelog

- Another update to "H264VideoRTPSink".  (Thanks to David Bertrand.)

Checksums

2006.06.27

Changelog

- Updated "H364VideoRTPSink"
- Corrected the definition of MAX_PES_PACKET_SIZE in MPEG2TransportStreamFromPESSource.cpp.
  (Thanks to Jiri Pinkava for this fix.)

Checksums

2006.06.23

Changelog

- Fixed some minor issues with the previous addition of "H264VideoRTPSink"

Checksums

2006.06.22

Changelog

- Added "H264VideoRTPSink", for transmitting H.264/RTP streams.  (Thanks to
  Benoit Quirynen and David Bertrand for funding this work.)
- Changed the default definitions of IP_ADD_SOURCE_MEMBERSHIP and
  IP_DROP_SOURCE_MEMBERSHIP (for use if they're not already defined in header files),
  to make it more likely that SSM joins will properly fail if SSM is not actually
  implemented on the host OS.
- Changed some "delete"s into "delete[]".  (Thanks to Wojciech Matyjewicz
  and Mathur for reporting these bugs.)
- Made "sapWatch a bit more robust.  (Thanks to Jiri Pinkava for this fix.)

Checksums

2006.05.17

Changelog

- Fixed "OnDemandRTSPServer" so that it sets a RTCP "RR" handler,
  even if "reuseFirstStream" is True.
- Changed "RTSPServer" (and the "testOnDemandRTSPServer" demo application)
  to use a 45-second client liveness timeout, by default.  (Previously,
  no client liveness checking was being done by default.)
  (Note that client liveness timeouts are done only for unicast streams, not multicast.)
- Fixed a bug in the implementation of "BasicHashTable" that arose when
  we were using hash tables with multi-word-sized keys.

Checksums

2006.05.15

Changelog

- No change from the previous release, but the installed ".tar.gz" file had
  accidentally been deleted.

Checksums

2006.05.11

Changelog

- Cleaned up some code in "BasicTaskScheduler" that was allegedly causing
  problems on a Zaurus.
- Changed "TaskScheduler::rescheduleDelayedTask()" so that its "microseconds"
  parameter is a "int64_t" (to match "scheduleDelayedTask").
  (Thanks to David Bertrand for suggesting this.)
- Updated "ServerMediaSession:::generateSDPDescription()" to change
  "a=rtcp: unicast-reflection" to "a=rtcp-unicast: reflection", to
  reflect the latest version of the IETF's "draft-ietf-avt-rtcpssm"
  Internet-Draft.  (This is for Source-Specific Multicast sessions only.)
- Cleaned up "H263plusVideoRTPSink" slightly, to remove an unnecessary
  member variable.
- Removed support for the (experimental and non-standard) "X-MCT-TEXT"
  payload type.

Checksums

2006.03.17

Changelog

- Fixed a bug in "RTSPClient" (that had been introduced in the 2006.02.15
  release) that was stopping RTP-over-TCP reception from working.

Checksums

2006.03.15

Changelog

- Updated "MediaSession" to parse the "s=" and "i=" lines of input SDP
  descriptions, and added member functions for returning these string values.
  (Thanks to Scott Hays or this.)
- Updated "MPEG2TransportStreamMultiplexor" to use the audio track for PCR
  iff there is no video track present.
- Made a change to "liveMedia/include/H263plusVideoStreamFramer.hh" to overcome
  an error reported by some nit-picking compilers.
- Fixed a minor bug in "MPEG2TransportStreamFromESSource" (in the way that it
  handles EOF on input).

Checksums

2006.03.03

Changelog

- Updated "MPEG4LATMAudioRTPSource" to allow the LATM data length field to
  be omitted from the start of each returned audio frame.  (The "faad" decoder
  (used by VLC, for example) needed this.)
- Renamed "SECOND" in the "BasicUsageEnvironment" library to "DELAY_SECOND"
  (and similarly for "ZERO", "MINUTE", "HOUR", "DAY"), to avoid an alleged
  name conflict with some other code used by VLC.  (Thanks to
  Derk-Jan Hartman for this suggestion.)
- Removed some unnecessary code from "testProgs/playCommon.cpp".

Checksums

2006.02.25

Changelog

- Updated the previous change to "MultiFramedRTPSource::doStopGettingFrames()",
  to also reset the object's fields.  (Thanks to David Bertrand.)

Checksums

2006.02.15

Changelog

- Changed "GetFileSize()" (defined in "liveMedia/include/InputFile.hh") and
  "ByteStreamFileSource::fileSize()" to return a "u_int64_t", to allow for
  (potentially) large files.
- Changed the "microseconds" parameter to "TaskScheduler::scheduleDelayedTask()"
  from "int" to "int64_t".  This allows for durations greater than the previous
  ~2000 second limit.
- Updated "RTSPClient" to support handling RTSP requests sent by the server.
  (Some servers send periodic requests back to the client as a keep-alive test.)
  At present, we just respond to such requests with a "not allowed" error.
  (Thanks to Khanh Mai for this change.)
- Updated "MultiFramedRTPSource::doStopGettingFrames()" to reset the
  "ReorderingPacketBuffer".  (Thanks to David Bertrand for this fix.)
- Corrected a small bug in the previous "RTSPClient" modification
  (noticed by Glen Gray).
- Fixed a bug in "ADTSAudioFileSource" when parsing the optional "crc_check"
  field.  (Thanks to Paul Li for noticing this.)

Checksums

2006.01.27

Changelog

- Updated "RTSPClient" to:
  - allow the "parameterName" parameter to "getMediaSessionParameter()" to be NULL
  - add a "setUserAgentString()" member function, to allow clients to
    specify an alternative string for "User-Agent:" headers
  - parse the optional "timeout" parameter in response "Session:" headers,
    and added a "sessionTimeoutParameter()" member function to retrieve it.
  (Thanks to Glen Gray for proposing these changes.)
- Fixed "H263plusVideoRTPSource" to properly initialize two member variables
  in its constructor.  (Thanks to David Bertrand for this fix.)
- Added Bernhard Feiten's support for H.263plus parsing/framing

Checksums

2006.01.24

Changelog

- Corrected the maximum PES packet size (in "MPEG1or2DemuxedElementaryStream.cpp")
  to allow for a 6-byte header.  (Thanks to Jiri Pinkava for this fix.)
- Fixed "MPEG1or2AudioStreamFramer" to avoid a potential divide-by-zero when
  it's fed certain malformed MPEG audio data.  (Thanks to Eric Peters for this.)
- Updated the top-level "Makefile.tail" to make it clear that "testProgs" can't
  be built until after the 'library' directories are built. This ensures that
  parallelizing "make"s don't do the wrong thing.

Checksums

2006.01.05

Changelog

- Updated "MPEG4VideoStreamFramer" to make the parsing of MPEG-4 video a bit
  more robust.  (Thanks to Khanh Mai for this suggestion.)

Checksums

2006.01.04

Changelog

- Updated "OnDemandServerMediaSubsession" to tear down the stream (thus sending
  a RTCP "BYE") when the input source ends, iff the stream does not have a known
  duration.  (If the stream has a known duration, then we keep the stream alive,
  in case a client wants to seek backwards in it.)

Checksums

2005.12.30

Changelog

- Extended the previous release's fix to also work with the RTSP
  "OPTIONS" command.

Checksums

2005.12.29

Changelog

- Include (if necessary) authentication headers in the initial HTTP
  "GET" and "POST" commands, if we're setting up RTSP-over-HTTP tunneling.
  This allows "RTSPClient" to work properly with some Axis cameras, which
  require authentication on these HTTP commands.

Checksums

2005.12.23

Changelog

- Fixed the RTCP port number in the RTSP "Transport:" header "port=" part
  (for multicast streams).
- Updated the change that we made in version 2005.11.02 so that it also
  sets the port number correctly.

Checksums

2005.12.15

Changelog

- Made calls to "select()" more robust, by checking for (and ignoring)
  EAGAIN or EINTR errors.
- Fixed a bug in "MPEG4VideoFileServerMediaSubsession" that could occur if a
  bad MPEG-4 video file (not containing any initial 'config' data) is read.
  (Thanks to Trevor Pering for noticing this.)
- Removed an undocumented, experimental and rarely-used option from "openRTSP".

Checksums

2005.12.09

Changelog

- Updated the RTCP implementation so that reception stats for a SSRC are now kept
  around even after a RTCP BYE is received, in case we want to use these stats
  for QOS reports.  (However, if a SSRC is reaped due to inactivity, then the
  reception stats are deleted.)

Checksums

2005.12.05

Changelog

- On some systems (notably FreeBSD), "struct sockaddr_in" includes a "sin_len"
  field, which should be set before the struct is used.  We now replace declarations
  of "struct sockaddr_in" with a macro MAKE_SOCKADDR_IN() (defined in
  "groupsock/include/GroupsockHelper.hh").  This macro sets the "sin_len" field
  iff "HAVE_SOCKADDR_LEN" is defined on the command line.
  (Thanks to Boris Nikolaus for noting this issue.)
- Fixed a bug in the timestamp generation for certain rare MPEG-4 video streams.
  (Thanks to Bernhard Feiten for reporting this.)

Checksums

2005.11.30a

Changelog

- Improved the calculation of the per-Transport Packet duration in
  "MPEG2TransportStreamFramer", so that the overall transmit duration
  tries to match the client playout duration (as determined by PCRs).
- Minor patch to avoid errors when compiling with GCC 4.1.
  (Patch contributed by Hanno Boeck.)
- Patch to the special 'Kasenna'-specific support in "RTSPClient".
  (Patch contributed by Glen Gray.)

Checksums

2005.11.11

Changelog

- Modified "MPEG2TransportStreamFramer" to take the PCR "discontinuity_indicator"
  flag into account when updating the estimated duration of each TS packet.

Checksums

2005.11.02a

Changelog

- Updated the previous release to add a new (optional)
  "forceMulticastOnUnspecified" parameter to "RTSPClient::setupMediaSubsession()".
  This forces the client to request a multicast stream if the original SDP
  response address was unspecified (0.0.0.0).  (Note that not all servers
  will be able to handle this.)  We also handle the "port=" field in RTSP
  "SETUP" response "Transport:" headers.
- Fixed "RTSPServer" to include a proper "port=" field in the "SETUP"
  "Transport:" response when streaming multicast.

Checksums

2005.11.02

Changelog

- Updated "RTSPClient" to use the "destination=" address in the "SETUP"
  response's "Transport:" header - for multicast streams.  We do this because
  some weird servers (e.g., Axis cameras, reportedly) do not specify the
  multicast address earlier, in the "DESCRIBE" response's SDP.

Checksums

2005.10.28b

Changelog

- Added a "rtpTimestampFrequency" parameter (with default value 90000)
  to "H263plusVideoRTPSink", "MPEG4ESVideoRTPSink".

Checksums

2005.10.28a

Changelog

- Removed some unnecessary "delete"s, and changed some "delete"s to
  "Medium::close()"s.  (Minor bug noted by Zhixue Zhang.)

Checksums

2005.10.05

Changelog

- Fixed a couple of bugs noticed by David Bertrand.

Checksums

2005.09.20

Changelog

- Updated "MPEG2TransportStreamMultiplexor" to increase the frequency of PMTs
  and PATs in the output Transport Stream.
- More improvements to "MPEG2TransportStreamFromESSource".
- Updated "RTSPServer" to allow for empty stream names from certain non-standard
  RTSP clients (such as Amino STBs).
- Fixed "RTSPClient::tearDownMediaSession()" to delete each subsession's
  "sessionId" field.
- Fixed a minor memory leak in "RTSPClient" (when implementing HTTP tunneling)

Checksums

2005.08.26

Changelog

- Updated "MediaSession" to parse the SDP "a=type:" attribute.  (Patch by
  Derk-Jan Hartman.)
- Added support to "RTSPClient" for handling Microsoft servers' non-standard use
  of the RTSP/RTP protocol.  Also, fixed the parsing and generation of floating
  point numbers in the RTSP "Range:" and "Scale:" headers to work correctly in
  non-POSIX locales.  (Thanks to Derk-Jan Hartman for this suggestion.)
- Fixed a memory leak in "MPEG2TransportStreamFromPESSource".
- Changed "MP3StreamState::readFromStream()" from "private" to "protected", to
  satisfy a request by Pierre l'Hussiez.

Checksums

2005.08.09

Changelog

- Improved the Transport Stream generation software to (in the future) allow
  for generating Transport Streams from Elementary Stream data as well as
  from PES packet data.

Checksums

2005.07.23

Changelog

- Improved "H264VideoRTPSource" to properly handle 'aggregate' packets
  that contain more than one NAL unit.

Checksums

2005.07.21

Changelog

- We no longer set a RTCP "RR" handler when we're streaming, unicast on-demand,
  from a shared input source.  (The reason for this is that, in this case,
  we also share a RTCP instance for all client sessions (streams).
  A better fix will eventually be needed.)

Checksums

2005.07.19

Changelog

- Updated H.264/RTP support.

Checksums

2005.07.15

Changelog

- Oops, DEBUG was not supposed to be defined in "RTSPServer.cpp".
- Added "-D_LARGEFILE_SOURCE=1" to the "COMPILE_OPTS =" line of the various
  "config.*linux*" files, to ensure that code that uses "fseeko()" will
  compile properly for all Linux systems.

Checksums

2005.07.13

Changelog

- When handling a 'passive' session, we no longer set a RTCP "RR" handler,
  because (unlike unicast, on-demand sessions) the RTCP instance usually
  outlives RTSP client sessions.  (Thanks to Jon Sheller for reporting
  this bug.)

Checksums

2005.07.12

Changelog

- Minor updates to the Base64 code for H.264/RTP receiving.

Checksums

2005.07.10

Changelog

- Removed a debugging version of "testOnDemandRTSPServer" that had mistakenly been
  left in the proevious revision.  If you downloaded the previous revision, then
  please download this version instead!
- Fixed "MPEG1or2VideoStreamFramer" to better handle MPEG video streams where the
  first GOP time code has a non-zero 'pictures' count.
  (Thanks to Eric Peters for reporting this problem.)
- Some enhancements to the Base64 code, for eventual use by "H264VideoRTPSource".

Checksums

2005.07.08

Changelog

- Added - to "RTCPInstance" - the ability to assign 'handler' functions
  to be called on the arrival of RTCP "SR" or "RR" packets (as well as "BYE").
  We now use this mechanism (specifically, a RTCP "RR" handler) to improve the
  optional 'liveness' test for "RTSPServer".  (Liveness is now indicated by
  either a RTSP command over the TCP connection, or the arrival of a RTCP
  "RR" packet.)
- Moved routines for Base64 encoding and decoding into the "liveMedia"
  library.  (Base64 encoding was already being used by "RTSPClient";
  Base64 decoding will soon be used by "H264VideoRTPSource".)

Checksums

2005.07.01

Changelog

- Updated "testOnDemandRTSPServer" to demonstrate AAC audio streaming (from an
  ADTS-format file)
- Made some modifications to (supposedly) make the code compile better for
  WinCE.

Checksums

2005.06.30

Changelog

- Added support for reading and streaming from AAC audio files in ADTS format.
  (Thanks to Manthan Systems for funding this work.)
- Removed duplicate code in "testOnDemandRTSPServer.cpp".
- Removed duplication of a common error message from "RTSPClient.cpp".

Checksums

2005.06.16

Changelog

- Fixed a bug in the generic MPEG (1, 2 or 4) video parsing code that was causing some
  MPEG-4 streams not to be parsed correctly.
- Updated "MPEG4VideoStreamFramer" to better handle MPEG-4 video streams that contain
  'B' frames.  (Now, more accurate presentation times and frame durations are computed
  for such streams.)

Checksums

2005.06.07

Changelog

- Modified the Windows-specific code in "ByteStreamFileSource.cpp" to compile properly
  under MINGW.

Checksums

2005.06.04

Changelog

- Updated "MPEG2TransportStreamFramer::doStopGettingFrames()" to clear the PID status
  table.  This makes it possible to handle PCR discontinuities when seeking (e.g.)
  within a stream.
- Updated the "ByteStreamFileSource::seekToByte*()" operations to take 64-bit
  parameters, to allow for seeking within files that are >4 GB in size.

Checksums

2005.05.26a

Changelog

- Updated the 'seeking' operations in "ByteStreamFileSource" to handle files
 that are > 2^31 bytes in size.

Checksums

2005.05.24

Changelog

- Fixed "RTPSink" so that it now resets "fTimestampBase" only on the first time
  that a timestamp is ever computed; not on the first time after "startPlaying()"
  is called.  (Thanks to David Bertrand for noting this.)

Checksums

2005.05.23

Changelog

- Added support to "RTSPServer" for (optionally) reclaiming client connection
  state (and stopping the stream) if no command has been received on the
  RTSP TCP connection within a specified period of time.  This is useful for
  use in closed systems where it is known that the RTSP client always uses
  the "GET_PARAMETER" command as a periodic 'keep-alive'.  It stops the
  stream from continuing indefinitely if the client suddenly dies.

Checksums

2005.05.12

Changelog

- Removed some unnecessary floating point code from "MP3Internals.cpp".
  (This was causing unnecessary slowness on some hardware without floating point.)

Checksums

2005.05.09

Changelog

- Modified "MPEG2TransportStreamFramer" to give greater weight (0.5) to more recent
  data when computing the estimate of per-transport-packet duration.  (This causes
  it to respond more accurately to sudden changes in bitrate (i.e., in VBR streams).)
- Added some (otherwise unnecessary) null destructors to stop gcc 4.0 from printing
  warning messages.  (Thanks to Emiliano Parasassi for pointing this out.)

Checksums

2005.05.05

Changelog

- "RTSPServer" now uses separate buffers for requests and responses.  (This fixes
  an issue that arose in the handling of requests from a set-top box.)

Checksums

2005.04.26

Changelog

- Made sure that "MultiFramedRTPSource"s properly stop receiving incoming RTP
  packets, when they're asked to stop.  (This fixes a bug that was being triggered
  by some streams that continued sending RTP packets after a RTCP "BYE".  Thanks to
  Eberhardt Garner for helping track this down.)
- Fixed a minor memory leak in "openRTSP".
- Updated "FramedSource.hh" to no longer (by default) support the old form of
  the 'after getting' function.

Checksums

2005.04.23

Changelog

- Added "H264VideoRTPSource", for receiving H.264/RTP streams.
  (Thanks to Erik Hellerud for this.)
- Made some minor modifications to "ServerMediaS(ubs)ession",
  to support a customer's project.

Checksums

2005.04.22

Changelog

- Improved "MPEG1or2VideoRTPSink" to allow more than one complete video 'slice'
  from the same picture to be packed into an outgoing RTP packet.
- Eliminated a bogus "IP_ADD_MEMBERSHIP" error message that Windows (for some
  reason) sometimes triggers for no reason.

Checksums

2005.04.20

Changelog

- Changed the name of the (platform-independent) "_close()" function to
  "closeSocket()", to prevent an apparent function name conflict in Windows.

Checksums

2005.04.13

Changelog

- Modified "ourSourceAddressForMulticast()" to try the
  "gethostname()"/"gethostbyName()" method if the 'multicast loopback' method fails.
- Made some modifications to "ServerMediaSubsession" to support "SIPServer"
  (whose implementation is currently in progress).

Checksums

2005.04.07

Changelog

- Fixed a bug in the "base64Encode()" routine in "RTSPClient.cpp".
  (Thanks to Raphael Rigo for noticing this.)
- Updated "MPEG1or2VideoStreamDiscreteFramer" to handle the "iFramesOnly" and
  "vshPeriod" parameters (just as the original "MPEG1or2VideoStreamFramer"
  already does).

Checksums

2005.03.11

Changelog

  Updated "MPEG2TransportStreamFromPESSource" once again to better handle
  Program Streams that include a "program_stream_map".

Checksums

2005.03.07

Changelog

- Updated "MPEG2TransportStreamFromPESSource" (and thus also the
  "testMPEG1or2ProgramToTransportStream" demo application) to handle MPEG
  Program Streams that include MPEG-4 Elementary Stream data.  (For this to work,
  the Program Stream must include a "program_stream_map".)

Checksums

2005.03.05

Changelog

- Modifying "ReceivingInterfaceAddr" now works before receiving
  unicast streams.  (Previously, it worked only when receiving multicast
  streams.)  Also, added a new option "-I "
  to "openRTSP", to allow the user to specify which interface is used.
  (Thanks to Luca Abeni for this patch.)
- Fixed a "delete[]" vs "delete" bug in "MPEG4VideoStreamFramer",

Checksums

2005.02.14

Changelog

- Changed the generation of "rtptime" in "RTPInfo:" RTSP headers to use
  %u instead of %d.  (Thanks to Regis Feneon for noting this.)
- Made some changes to prepare for RTSP server seeking within MPEG-1 or 2
  Program Stream files.  (This is still not done yet.)

Checksums

2005.02.09

Changelog

- Updated "MultiFramedRTPSink" to allow for frame-specific special headers to
  appear before each frame in RTP packets.  (This in addition to the (possible)
  special header that may appear at the start of the packet.)  This functionality
  is added using a new virtual function "frameSpecificHeaderSize()" (that,
  by default, returns 0.)  Thanks to Matt Romaine for this.
- Added a new "BufferedPacket" virtual member function
  "getNextEnclosedFrameParameters()", which will (eventually) replace the existing
  "nextEnclosedFrameSize()" virtual member function.  This (plus a corresponding
  change to "MultiFramedRTPSource") now makes it possible to give correct
  presentation times to multiple frames within incoming RTP packets.

Checksums

2005.02.07

Changelog

- The "MultiFramedRTPSink::setPacketSizes()" function now applies just to one
  specific "MultiFramedRTPSink" object; not to all such objects.
- Added a new version of "RTSPServer::removeServerMediaSession()" that takes
  the (string) stream name - rather than the "serverMediaSession" object
  - as argument.

Checksums

2005.01.29

Changelog

- We now remove reception and transmission statistics records (from each
  "RTPSource" and "RTPSink", respectively), whenever each RTCP SSRC membership
  gets 'reaped'.  We also added more information to "RTPTransmissionStats".
  (Thanks to WIS Technologies for funding this work.)
- Some minor fixes to "JPEGVideoRTPSource".  (Thanks to Sergey Khlutchin for
  reporting this.)
- Made the "ServerMediaSession" constructor "protected", to allow for
  subclassing.  (This was requested by Eric Peters.)
- Updated "win32config.Borland" and modified some header files, so that the
  code can be built using Borland's "C++ Builder 5.0".
  (Thanks to David Wu for this suggestion.)
- Added a "setPacketSizes()" function to "MultiFramedRTPSink" to make it
  possible to change the 'maximum' and 'preferred' size of outgoing
  RTP packets.  (Thanks to Christian Gerstner for this suggestion.)

Checksums

2005.01.24

Changelog

- Some MIME-type parameters in SDP "a=fmtp:" lines are Boolean, taking only values
  0 or 1.  Sometimes these parameters are set (to 1), without an explicit "=1"
  being in the SDP "a=fmtp:" line.  (This is not legal, but it sometimes occurs.)
  Our SDP parsing code (in "MediaSession.cpp") now checks for this.

Checksums

2005.01.13

Changelog

- Fixed a bug in "liveMedia/OnDemandServerMediaSubsession.cpp" that was reportedly
  causing crashes on some systems.  (Thanks to Brian Wang for finding this.)
- Updated "MPEG1or2VideoStreamDiscreteFramer" and
  "MPEG4VideoStreamDiscreteFramer" to set appropriate presentation
  timestamps for B-frames.  (Unlike I and P-frames, B-frames' timestamps are
  not monotonically increasing.)  (Thanks to WIS Technologies for funding this work.)

Checksums

2005.01.07

Changelog

- Fixed a bug in "JPEGVideoRTPSink" that was causing incorrect packets to
  be generated when streaming using non-standard JPEG quantization tables
  (which must be included in the RTP packets).
- Updated the handling of incoming MP3 ADUs to allow for the possibility of
  receiving ADUs that contain 'ancillary data' at the end.  (For example,
  ADUs for "mp3Pro" frames are like this.)  Note, however, that our
  MP3 frame-to-ADU generating code currently doesn't include 'ancillary
  data' at the end of the generated MP3 ADUs.  This will need to be fixed
  in order to be able to correctly *transmit* ADUs for "mp3Pro" frames.
- More work on "AVIFileSink".  Recording of MPEG-4 video-only files now works.

Checksums

2004.12.29

Changelog

- Added a new liveMedia 'sink' class - "AVIFileSink" - for writing an AVI-format
  file.  Note: This is not fully working yet, so don't try using it yet!
  (Thanks to WIS Technologies for funding this work.)

Checksums

2004.12.23

Changelog

- Fixed a bug in the previous release (when receiving MPEG-2 Transport RTP streams).

Checksums

2004.12.22

Changelog

- Updated "MPEG4GenericBufferedPacket::nextEnclosedFrameSize() to (i) allow
  for "generic" mode, and (ii) properly check for the absence of an
  "AU Header section".  (Thanks to Erick van Rijk for this suggestion.)
- When receiving a MPEG-2 Transport Stream (either RTP *or* raw-UDP), pass it
  through a "MPEG2TransportStreamFramer", so that "durationInMicroseconds" is
  set appropriately, based on the stream's embedded PCR values.
  (Thanks to Dermot McGahon for this suggestion.)
- Changed the "num_packets_lost" statistics line (printed by "openRTSP -Q")
  to format as an int rather than as an unsigned.  This is in case this value
  is negative (which can happen if duplicate packets are received).
  (Thanks to Norbert Donath for noting this.)

Checksums

2004.12.15

Changelog

- Changed the RTSP servers in the various test programs to use port 8554
  instead of port 7070 for RTSP (as an alternative to the standard port
  554).  It turns out that port 8554 is the official IANA-reserved port
  number for RTSP (alternative).
- Changed "RTSPClient" to include the "Scale:" header if the scale is being changed
  to 1.0 from something else.  (Thanks to Matt Romaine for this suggestion.)

Checksums

2004.12.09

Changelog

- Fixed a bug in the handling of "audio/X-MP3-DRAFT-00" RTP streams.
  (Thanks to Dhananjay Deshpande for noticing this.)

Checksums

2004.12.07

Changelog

- Updated "RTSPClient" to parse the "Scale:" header (if any) in a response to
  a "PLAY" command, and set a corresponding field in the "MediaSession" or
  "MediaSubsession" structure.

Checksums

2004.11.30

Changelog

- Added "RTSPServer" support for the RTSP "Scale:" header, which is used to
  implement 'trick play': fast forward and reverse play.  The actual implementation
  of these depends on the media type; it is currently implemented for MPEG-1 or 2
  (including MP3) audio (forward play only), and for WAV (PCM) audio (forward or
  reverse play).
  (Thanks to Sony Corporation for funding this work.)

Checksums

2004.11.26

Changelog

- Improved "H263plusVideoRTPSource" to better recognize which packets begin
  a frame.  (This should improve its performance on lossy networks.)
- Improved the parsing of MPEG-1 or 2 audio streams to ignore more bogus
  'syncwords'.
- We now look for the 'Xing' VBR Table of Contents, and use this (if present)
  to implement seeking within VBR files.
- Updated "ADUFromMP3Source" to allow the internal data buffers to be flushed
  (e.g., if there is a discontinuity in the MP3 input data).
- When streaming a seekable MPEG audio stream on demand, insert filters that
  convert the input stream to ADU format, and then back to MP3.  This allows
  us to seek within the stream without being tripped up by the MP3
  'bit reservoir' (back-pointer).

Checksums

2004.11.20

Changelog

 - Fixed a bug in "MediaSession::initiateByMediaType()".  (It was not allowing
   for the possibility that a subsession had already been initiated.)

Checksums

2004.11.19

Changelog

- For consistency (and ease of comparison), the "MIMEtype()"
  codec name substring for each "MediaSource" subsession is in upper case.

Checksums

2004.11.18

Changelog

- Added an optional "scale" parameter to the "RTSPClient" "play...()"
  methods, to allow a client to specify fast forward or rewind 'trick play'.
  (Thanks to Dermot McGahon for this suggestion.)

Checksums

2004.11.16

Changelog

- Fixed a bug in the way that "QuickTimeFileSink" records the duration of
  multi-channel audio tracks in ".mov" or ".mp4"-format files.
  (Thanks to Orban/CRL Inc. for funding this work.)

Checksums

2004.11.11a

Changelog

- Another minor update to "RTSPClient".

Checksums

2004.11.11

Changelog

- Updated the "RTSPServer" implementation to handle the case where a "PLAY"
  request does not contain a "Range:" header.  (Suggestion by Brian Wang.)
- Reinstated the "MPEG4LATMAudioRTPSource" fix from version "2004.08.24".
  (It had accidentally gotten deleted.)
- Included Dermot McGahon's patch to "RTSPClient" to support the bogus
  non-standard 'Kasenna' variant of RTSP.

Checksums

2004.11.09a

Changelog

- Fixed the previous revision (RTSP seeking support) to work properly with VLC.
- Fixed a bug that was causing receivers of SSM streams to not receive RTCP packets.  (Thanks to Alessandro Gaiarin for reporting this.)

Checksums

2004.11.09

Changelog

- Added support for seeking within streams.  This currently works only for
  WAV audio file streams, and MPEG audio (include MP3) file sources.
  (However, it doesn't yet work properly for VBR MP3 files; this will get fixed.
  Also, it doesn't yet work properly with VLC.)
  (Thanks to Sony Corporation for funding this work.)

Checksums

2004.11.06

Changelog

- Improved the way that we specify output buffers for "RTPSink" objects.
  We now do this using a "maxSize" static member variable (instead of
  using a 'number of packets' variable as we did before).  We also limit
  the size of the output buffer used for RTCP packets, to save space.
- When streaming a MPEG Transport Stream, don't set the RTP 'M' bit.
- When recording a ".mov" or ".mp4" file using "QuickTimeFileSink.cpp",
  we no longer fill in the "width" and "height" fields for audio tracks.

Checksums

2004.11.04

Changelog

- When streaming MPEG audio or WAV audio files on demand, we now return the
  correct file duration (in the RTSP "Range:" header and the SDP "a=range:"
  attribute), so that media players will report the correct stream duration.
  (Thanks to Sony Corporation for funding this work.)
- In "MultiFramedRTPSink", we now wait until we receive the first data before
  initializing "fNextSendTime" with the current wall-clock time.
  (Thanks to Eric Peters for suggesting this.)

Checksums

2004.11.02

Changelog

- Updated the RTSP "Range:" header (in a "PLAY" response) and the SDP "a=range:"
  attribute to support streaming from sources with finite durations.
  (Such sources can support seeking via RTSP.)  The "ServerMediaSubsession"
  class now has a "duration()" virtual function.  (In the future,
  "FileServerMediaSubsession" subclasses will redefine this, so that seeking
  within the file will work.)
  (Thanks to Sony Corporation for funding this work.)

Checksums

2004.11.01

Changelog

- Added support to "RTSPClient" for streaming RTSP/RTP over HTTP, using the technique
  described in Apple's document: .
  This can be used for streaming from a Darwin Streaming Server from behind a
  HTTP-only firewall.  (Note that our own RTSP server implementation doesn't yet
  implement RTSP-over-HTTP, but this is on the 'to do' list.)
  (Thanks to Orban/CRL Inc. and WIS Technologies for funding this work.)

Checksums

2004.10.28a

Changelog

- Fixed "OnDemandServerMediaSubsession" so that "PAUSE"/"PLAY" works properly on
  unicast streaming from files.

Checksums

2004.10.26

Changelog

- Updated "JPEGVideoRTPSink" (and "JPEGVideoSource") to allow for the
  possibility of sending custom quantiziation tables in JPEG/RTP packets.
- Fixed some compile warnings about unused named parameters.  (Thanks to
  Thiago Correa for these suggestions.)

Checksums

2004.10.22

Changelog

- Added a new "MPEG1or2VideoStreamDiscreteFramer" class, similar to the existing
  "MPEG4VideoStreamDiscreteFramer".

Checksums

2004.10.21

Changelog

- Modified the order of SDP lines generated by a RTSP server
  (in "ServerMediaSession.cpp") to correspond to the exact order specified by
  the SDP RFC.  JMIF clients are supposedly anal retentive about this.
  (Thanks to Fabrice Aeschbacher for noticing this.)

Checksums

2004.10.19

Changelog

- Updated "MPEG2TransportStreamFramer" to properly handle input data that
  doesn't begin with a 'sync' byte (0x47).

Checksums

2004.10.18

Changelog

- Added a new "removeServerMediaSession()" member function to "RTSPServer".
- Updated the implementation of the RTSPServer "RTPInfo:" header to include a
  "rtptime=" field.
- Improved the "WindowsAudioInputDevice" trick for making the microphone the
  first-listed device.  (Thanks to Syncanph Xie for this suggestion.)

Checksums

2004.10.14

Changelog

- Added a new argument "-4" to "openRTSP" (with corresponding updates to
  "QuickTimeFileSink"), to generate a "MP4"-format file.  (Currently, this
  works for MPEG-4 audio only.)
  (Thanks to Orban/CRL Inc. for funding this work.)

Checksums

2004.10.04

Changelog

- Fixed "UserAuthenticationDatabase::addUserRecord()" (in "RTSPServer.cpp") to
  make a copy of the "password" string, before adding it to the hash table.
  (The hash table already makes a copy of the "username" (key) string.)

Checksums

2004.09.24

Changelog

  Added support for access control (using digest authentication) to "RTSPServer".
  Also, added example code to the "testOnDemandRTSPServer" test program to illustrate
  how to use this. (Thanks to Orban/CRL Inc. and WIS Technologies for
  funding this work.)

Checksums

2004.09.02

Changelog

- Modified "GroupsockHelper.cpp" to allegedly support building for WinCE.

Checksums

2004.08.26

Changelog

- Fixed a bug that could cause "AMRAudioRTPSource"s to not get reclaimed.
  (Thanks to Chenglim Ear for reporting this.)
- More support for multi-unicast RTSP/RTP streaming from a single input source.

Checksums

2004.08.24

Changelog

- Modified "LATMAudioRTPSource" to include the initial data length field
  in the data that's delivered to a client.  (A decoder was needing to see this.)
- Added a new "MPEG4VideoStreamDiscreteFramer" class, as a (more efficient)
  alternative to "MPEG4VideoStreamFramer" when the input source is a sequence of
  discrete MPEG-4 frames, rather than a byte stream.
- Fixed a minor bug in "Media.cpp". (Thanks to Thiago Correa.)
- Added more support for multi-unicast RTSP/RTP streaming from a single input
  source.  (This now working, except for TCP connections - to be completed.)

Checksums

2004.08.17

Changelog

- Made the parsing of MPEG-1 or 2 video more robust, in case a Video Sequence Header
  doesn't appear exactly where it should.
- Added initial support for multi-unicast RTSP/RTP streaming from a single input
  source.  (This isn't fully working yet - more support needs to be added.)

Checksums

2004.08.13

Changelog

- Added a "numChannels" parameter to "MPEG4GenericRTPSink" (optional)
  and "MPEG4LATMAudioRTPSink".

Checksums

2004.07.31

Changelog

- Added support for MPEG-4 LATM audio RTP streaming.  (MPEG-4 LATM audio RTP
  *receiving* had already been implemented.)  (Thanks to Orban/CRL, Inc. for
  funding this work.)

Checksums

2004.07.27

Changelog

- Updated the MPEG Program-to-Transport Stream conversion mechanism to set the
  correct stream tags depending on whether the input data is MPEG-1 or 2.

Checksums

2004.07.23

Changelog

- Added a "-O" (upper-case letter 'oh') option to "openRTSP".  This tells the
  program to not send an initial "OPTIONS" request prior to "DESCRIBE".
- Modified "BasicTaskScheduler" to better allow subclassing.
- Added an optional "maximum delay time" option to
  "BasicTaskScheduler0::SingleStep()".  This allows subclasses to impose a
  limit on how long "select()" can delay, in case it wants to also do polling.

Checksums

2004.07.22

Changelog

- Fixed a serious bug that was causing some MPEG Program Stream files to be parsed
  incorrectly - especially if they have non-MPEG header data at the front.
- Modified the way in which "Medium" objects are reclaimed, to overcome an
  obscure bug.

Checksums

2004.07.20

Changelog

- Added a comment to "DeviceSource.cpp" to clarify the purpose of "fTo", because
  several people have gotten this wrong.
- Made ~BasicUsageEnvironment protected (just like ~UsageEnvironment)
- Fixed "samplingFrequencyFromAudioSpecificConfig()" to remove a memory leak.

Checksums

2004.07.16

Changelog

- Fixed a bug in "AMRAudioRTPSource", in the way that it handled input RTP packets
  that contained more than one AMR frame.
  (Thanks to Gabriel Bouvigne for reporting this problem.)
- We now automatically reclaim the memory that was allocated for the "UsageEnvironment"
  "liveMediaPriv" and "groupsockPriv" structures, once their tables become empty.

Checksums

2004.07.14

Changelog

- Updated "QuickTimeFileSink's" MPEG-4 audio recording mechanism again, this time
  to support aacPlus as well as regular AAC.

Checksums

2004.07.07

Changelog

- Added the (rather bogus) "a=x-qt-text-nam:" and "a=x-qt-text-inf:" attributes
  to the SDP descriptions delivered by "RTSPServer" (in response to a "DESCRIBE"
  operation).  These attributes get the same strings as the "s=" and "i=" lines
  (respectively).  However, QuickTime Player doesn't do anything with those lines,
  but does recognize the "a=x-qt-*" lines.

Checksums

2004.07.06

Changelog

- Modified the code so that it will build for WinCE.
  (Thanks to Gabriel Bouvigne for these changes.)

Checksums

2004.07.02

Changelog

- Fixed a bug in HashTable::RemoveNext() (noted by Greg Bothe)
- Added partial support for recording MPEG-4 audio in "QuickTimeFileSink".
  (Hinting is not yet working properly for this media type.)
- Added an option to "MPEG1or2AudioStreamFramer" to allow its presentation times
  to be resynchronized by its input source.

Checksums

2004.06.18

Changelog

- Fixed a bug in "MPEG1or2AudioStreamFramer" (in the way it was checking for
  syncwords at the start of each frame).
- Updated the "MPEGVideoStreamFramer" (base) class to report "fNumTruncatedBytes".
- Increased "OutPacketBuffer::numPacketsLimit" from 20 to 30.

Checksums

2004.06.17

Changelog

- Another improvement to the "MPEG1or2Demux" parsing code.
- Updated "QuickTimeFileSink" to support recording MPEG-4 video tracks into
  ".mov" files.  (There's also basic support for recording MPEG-4 audio, but
  this isn't quite working yet.)

Checksums

2004.06.14

Changelog

- Updated "MPEG1or2Demux" to make the checking for a PACK_START_CODE more
  robust if it's not immediately present where we expect to see it.
- Fixed a bug in "JPEGVideoRTPSource" that could cause a problem on
  64-bit architectures.
  (Thanks to Andrey Filippov for noticing this.)

Checksums

2004.06.11

Changelog

- Removed an error from a error message in StreamParser.

Checksums

2004.06.09

Changelog

- Updated the implementation of the aggregate and non-aggregate RTSP "PLAY"
  operations to not include a "Range:" header if the 'start' parameter is < 0.
  (This is used when resuming from a "PAUSE", for example.)
  Also, removed an unnecessary "Range:" header from the "PAUSE" command.
  (Thanks to Gabriel Bouvigne for this suggestion.)
- Reimplemented "MultiFramedRTPSource::doGetNextFrame1()" to use iteration
  rather than recursion, in the case where a large frame is fragmented over
  multiple incoming RTP packets.  This avoids the possibility of stack overflow
  occurring if there are very large fragmented frames in the input data.

Checksums

2004.06.07

Changelog

- Added optional "start" and "end" parameters to the aggregate "PLAY" operation
  in "RTSPClient".  (We had already done this for the non-aggregate "PLAY" operation.)
- Made the input banks buffers in "StreamParser" heap-allocated, rather than making
  them member variables.  This avoids any potential compiler problems with having
  such large structures as member variables.

Checksums

2004.06.03

Changelog

- Added the new 'liveMedia' class "MPEG2TransportFileServerMediaSubsession", for
  unicast on-demand streaming of MPEG-2 Transport Stream files.
- Added the new test programs "testMPEG2TransportStreamer" and
  "testMPEG1or2ProgramToTransportStream", and added support for Transport File
  streaming to "testOnDemandRTSPServer".
  (Thanks to DVAgroup Inc. for funding this work.)

Checksums

2004.06.02

Changelog

- Fixed "MediaSession" to no longer apply the normal RTP 'M' bit rule
  when processing incoming "video/MP2T" (or "video/MP1S" or "video/MP2P")
  streams.  (For such streams, the 'M' bit does not mean 'end of frame'.)

Checksums

2004.05.29a

Changelog

- Made a correction to the previous change.

Checksums

2004.05.24

Changelog

- Added a new member function "lastReceivedSSRC()" to "RTPSource".  This makes it
  possible for a receiver to demultiplex incoming RTP data based on SSRC.
  (Later this functionality should perhaps be added to "(MultiFramed)RTPSource"
  instead.)
- More updates to "DarwinInjector".

Checksums

2004.05.19

Changelog

- Another update to "openRTSP" for a customer job.

Checksums

2004.05.17

Changelog

- Added a new test program "testMPEG4VideoToDarwin.cpp" that is similar
  to "testMPEG4VideoStreamer", except that instead of transmitting the
  video RTP/RTCP packets via multicast, it transmits them - via a RTSP TCP
  connection - to a remote Darwin Streaming Server.

Checksums

2004.05.12

Changelog

- Added a new "liveMedia" class - "DarwinInjector" - that can be used to send an
  audio and/or video RTP/RTCP stream to a remote Apple 'Darwin' (aka. QuickTime)
  Streaming Server, for playing by (potentially multiple) RTSP clients.
- Added a new test program "testMPEG1or2AudioVideoToDarwin.cpp" that is similar
  to "testMPEG1or2AudioVideoStreamer", except that instead of transmitting the
  audio/video RTP/RTCP packets via multicast, it transmits them - via a RTSP TCP
  connection - to a remote Darwin Streaming Server.

Checksums

2004.05.09

Changelog

- Removed a line of junk that had erroneously been left at the start of Makefile.tail.
- The "testRelay" test program has been reprogrammed in the usual liveMedia
  'source->sink' style.

Checksums

2004.05.04

Changelog

- Added an #include to "BasicUDPSink.cpp" to prevent a compilation problem on
  some platforms.

Checksums

2004.05.02

Changelog

- Some updates to RTSPClient and openRTSP for a customer job.

Checksums

2004.04.27

Changelog

- Fixed the round-trip time estimation routine in "RTPSink" to allow for
  the possibility of the computed round-trip time being negative.  This can
  happen if there is clock drift between the sender and receiver, and if the
  actual round-trip time was quite small.  If this happens, the returned
  round-trip time value is zero.
  (Thanks to Dixon Siu for alerting us to this issue.)

Checksums

2004.04.23

Changelog

- Updated some #ifdef's so that the code will compile with "mingw" on Windows.
  (Thanks to Joey Parrish for this.)
- Added a "BasicUDPSink" class to "liveMedia", for UDP streaming without RTP.
- Added new 'filter' classes to "liveMedia" for
  - converting MPEG Program Streams to Transport Streams.
  - 'framing' MPEG Transport Streams to return the 'duration' of each Transport
  packet (i.e., the inter-packet time gap).

Checksums

2004.04.09

Changelog

- Fixed a byte-ordering bug in the code for streaming from WAV audio files
  (used in "testWAVAudioStreamer" and "testOnDemandRTSPServer").  We were converting
  16-bit samples from host to network order before streaming them.  That was wrong,
  because audio samples are always stored in WAV files in little-endian order.
  The correct thing to do was to convert from little-endian to big-endian order.

Checksums

2004.03.27

Changelog

- Fixed a minor bug in the top-level Makefile.  (Thanks to Matteo Nastasi for
  noting this.)

Checksums

2004.03.27

Changelog

- Modified "H261VideoRTPSource" so that it returns individual packet payloads to
  the caller, rather than waiting to form complete frames.  Also, added a member
  function "lastSpecialHeader()" that returns the 4-byte special header for the
  most recently-read payload.

Checksums

2004.03.23

Changelog

- Added support for unicast RTSP/RTP streaming from VOB files, and added an example
  of this to "testOnDemandRTSPServer".

Checksums

2004.03.17

Changelog

- Made a series of minor bug fixes and improvements suggested by Sony.

Checksums

2004.03.15

Changelog

- Fixed a bug in "OnDemandServerMediaSubsession" (the RTCP instance was being
  deleted at the wrong time).  (Thanks to Clark Taylor for noticing this.)
- Minor modifications to the 2004.02.26 "RTPSink" changes.
- Updated the "AMRAudioRTPSource" implementation to support 'bandwidth-efficient'
  mode.  (Warning: This has not yet been tested.)

Checksums

2004.03.12

Changelog

- Updated the "RTSPClient" class to support an aggregate "PAUSE" operation.

Checksums

2004.03.05

Changelog

- Updated the "RTSPServer" implementation to properly handle aggregate
  operations for which the URL ends with a "/".  Some clients, such as
  "gmp4player" do this.

Checksums

2004.02.26

Changelog

- Added - to "RTPSink" - a database of statistics from incoming RTCP
  "Reception Report" (RR) packets.  (This mirrors the similar database
  for RTCP SR packets that was already part of "RTPSource".)  (Thanks to
  Clark Taylor for contributing this code.)

Checksums

2004.02.20a

Changelog

- Corrected a typo in the previous "#ifdef"s

Checksums

2004.02.19

Changelog

- Updated the "RTSPServer" implementation to support RTP-over-TCP streaming
  (if requested by the client).

Checksums

2004.02.13

Changelog

- Changed the implementation of the "BasicUsageEnvironment" "operator<<"
  member functions so that they use "fprintf(stderr, ..." rather than
  "cerr << ...".  People compiling in some environments were getting
  complaints about "cerr" being undefined (presumably because the right
  #include files weren't being found).  However, everyone should have
  "stdio.h".  (Thanks to Clark Taylor for this suggestion.)
- Changed the "genMakefiles" script to complain if the user tries to
  run it without an " parameter.

Checksums

2004.02.09

Changelog

- Updated "RTSPServer" once again - this time to ensure that each incoming request
  is read completely (i.e., up until the trailing ).
  (Thanks to Regis Feneon for helping to fix this.)
- Added a new "WAVAudioFileServerMediaSubsession" class to support on-demand
  streaming from WAV audio files.  Also, updated the "testOnDemandRTSPServer"
  test program to illustrate this.

Checksums

2004.02.05

Changelog

- Updated the "WindowsAudioInputDevice" project to build two different versions
  of the library: One that uses Windows' built-in mixer; another that doesn't.

Checksums

2004.02.04

Changelog

- Fixed an obscure bug in "MPEG4ESVideoRTPSink" that could (very rarely)
  cause incorrect RTP timestamps to be set for the last fragmented packet
  of large MPEG-4 frames.  This could cause QuickTime Player's video playback
  to freeze.

Checksums

2004.02.03

Changelog

- Added new "liveMedia" classes "MPEG1or2FileServerDemux" and
  "MPEG1or2DemuxedServerMediaSubsession" for supporting on-demand RTSP/RTP
  streaming of MPEG-1 or 2 Program Stream files.  Also, updated the
  "testOnDemandRTSPServer" test program to support streaming of such
  a file.
- We no longer set SO_REUSEPORT for stream (TCP) sockets, because it usually
  doesn't make sense to share TCP ports.  (As a side effect, this means that it
  will no longer be possible to run more than one RTSP server (using the same
  TCP port) simultaneously on the same computer - something that should never have
  been possible in the first place.)
- Fixed a minor RTSP server bug that was causing incorrect "destination"s to be set
  (for multicast streams) in the "SETUP" response "Transport:" header.

Checksums

2004.01.28

Changelog

- Yet another bug fix to "MPEG4VideoStreamFramer", to properly handle the
  case where MPEG-4 "GOV" headers don't occur on exact 'second' boundaries.
  (Thanks to Michael Niedermayer (via Michael Hess) for clarifying this.)

Checksums

2004.01.27

Changelog

- Fixed a bug in the previously added (but normally "#ifdef"d out)
  debugging code in "MultiFramedRTPSource.cpp".
- Made a fix to the (normally "#ifdef"d out) debugging code in
  "AC3AudioStreamFramer.cpp".  (Thanks to Yigal for noticing this.)

Checksums

2004.01.24

Changelog

- Changed "openRTSP" to use 20 kByte "FileSink" receive buffers by default,
  instead of 10 kBytes.  (Some frames in MPEG-4 streams were exceeding the
  previous limit.)
- Added code to "MultiFramedRTPSource.cpp" to easily let the developer
  simulate packet loss.

Checksums

2004.01.23

Changelog

- Changed "RTSPServer" to include a "Content-Base:" header in "DESCRIBE"
  responses.  This overcomes a bug in QuickTime Player, which sends incorrect
  "SETUP" URLs otherwise.
- Fixed a bug in "MPEG4VideoStreamFramer" that was causing some frames
  to erroneously be given a duration of 0.

Checksums

2004.01.22

Changelog

- Made another improvement to the "RTSPServer" implementation.  It once again
  properly handles streams without a stream name (i.e., where the "streamName"
  parameter to "ServerMediaSession::createNew()" was NULL.
- Updated the (little-used) "ByteStreamMultiFileSource" class to take
  "preferredFrameSize" and "playTimePerFrame" parameters, just like
  "ByteStreamFileSource".  Also added a member function to ask whether
  a new file has just been read from.

Checksums

2004.01.21

Changelog

- Made several improvements/bugfixes to the "RTSPServer" implementation:
  - Worked around an apparent bug in QuickTime Player: It sometimes
  doesn't include a proper URL in RTSP "SETUP" requests.
  - Corrected the 'frame' (really tick) rate and frame duration that
  are computed for 'fixed_vop_rate' MPEG-4 video streams.
  - Compensated for some buggy MPEG-4 video streams that don't set
  timestamp information properly.
- MPEG-4 video end codes will now be included in the outgoing RTP stream,
  and received properly by RTSP clients.
- Fixed "RTSPClient" to be more tolerant of RTSP "Transport:" headers that
  contain more than one successive ';' character.  (Darwin Streaming Server
  sometimes does this.)

Checksums

2004.01.19

Changelog

- Changed "RTSPServer" to not create per-session state when handling
  "DESCRIBE", but instead to wait until "SETUP".  This fixes a problem
  that was causing the "VLC" media player to fail to work with our
  "RTSPServer" implementation, because VLC uses one RTSP TCP connection
  to do the "DESCRIBE", and then another to do "SETUP" and "PLAY".
  (Thanks to Emmanuel Dufour for pointing this out.)
- Updated "MPEG4VideoStreamFramer" to include the VIDEO_SEQUENCE_END_CODE
  in the output stream if it sees it in the input.

Checksums

2004.01.10

Changelog

- Fixed the "RTSPServer" implementation to properly return a "server_port" field
  in the RTSP "SETUP" response for unicast streams.  Also, the server ports
  (RTP and RTCP) are now chosen separately, and will no longer be the same
  as the client ports if the client and server are running on the same machine.
  (That did not work on some Linux systems.)
- Fixed a bug in "MP3ADU" that was causing frame durations to not be set properly
  when translating between MP3 frames and ADU frames.

Checksums

2004.01.09

Changelog

- Modified "RTSPClient" to handle embedded NULL characters in a SDP
  description.  (These are not legal, but they have been seen in some cases.)

Checksums

2004.01.06

Changelog

- Modified the FramedSource 'after getting' function signature to take two new
  parameters: (1) The number of bytes (if any) that were truncated from the
  delivered data, and (2) The duration (in microseconds) of the delivered frame.
  For backwards compatibility with old code, the old 'after getting' function
  signature is still supported, but will be removed in some future version of
  the code.  (The "getPlayTime()" function was also removed.)

Checksums

2003.12.26

Changelog

- Made "FramedFilter" objects implement the "stopPlaying()" function by
  also calling "stopPlaying()" on their source object.
- Fixed an obscure bug in "RTSPClient".

Checksums

2003.12.20

Changelog

- Made the "video/H263-2000" MIME type use the same RTP payload format as
  "video/H263-1998".  (Thanks to Norbert Doneth for suggesting this.)

Checksums

2003.12.19

Changelog

- Fixed a minor bug in "RTSPServer" (some allocated memory wasn't being
  freed properly).  (Thanks to Konstantin Lunin for finding this.)

Checksums

2003.12.16

Changelog

- Added "-DSOCKLEN_T=socklen_t" to the "COMPILE_OPTS =" line in
  the file "config.solaris", so that the code will compile
  correctly for 64-bit Solaris systems.

Checksums

2003.11.25

Changelog

- Put some error checks back into "WindowsAudioInputDevice".

Checksums

2003.11.21

Changelog

- Some case-insensitive string comparisons weren't working properly in Windows; fixed.

Checksums

2003.11.19

Changelog

- Added a global Boolean variable to flag when RTP I/O over a TCP connection fails.
  This hack allows higher-level code to check for this.

Checksums

2003.11.16

Changelog

- Fixed "RTPInterface" to not infinite loop when trying to read from a TCP
  connection that has closed.
- Modified "BasicTaskScheduler" to overcome a bug in Windows that sometimes
  causes "select()" to fail.

Checksums

2003.11.13

Changelog

- Made "WindowsAudioInputDevice" a bit more robust against broken audio drivers.

Checksums

2003.11.06

Changelog

- Modified "groupsock/inet.c" to allow the system-supplied "random()" and "srandom()"
  functions to be used instead of our own "our_..." implementation.
  This is done if USE_SYSTEM_RANDOM is defined (e.g., in the "config.*" file).

Checksums

2003.11.06

Changelog

- Modified the "MPEGVideoStreamParser" constructor, in response to a complaint
that some compilers would choke on the old code.

Checksums

2003.10.30

Changelog

- Added a warning output message to "MultiFramedRTPSink::afterGettingFrame1()"
  whenever the input frame appears to exceed the maximum buffer size.  This
  maximum buffer size can be increased by changing
  "OutPacketBuffer::numPacketsLimit".

Checksums

2003.10.27

Changelog

- Changed the "MultiFramedRTPSource" error message (added in 2003.10.04) to apply
only to frame sizes > 1000, so that (e.g.) QCELP RTP sources don't trigger it.

Checksums

2003.10.24

Changelog

- Fixed the RTSP server implementation to put SDP lines in the correct order
(as defined by the SDP speecification).  Also, added "Cseq:" lines that were
missing from "404" error responses.  (Thanks to Bill May for noting these bugs.)
- Improved the implementation of MPEG-4 video framing and streaming.

Checksums

2003.10.08

Changelog

- Fixed a bug in the previous "FileSink" update that was causing "openRTSP"
to crash when recording a MPEG-4 video stream (using the "-m" option).
(Thanks to Jiangzhou Scu for noticing this bug.)

Checksums

2003.10.07

Changelog

- Updated the "FileSink" class to take an optional Boolean parameter
"oneFilePerFrame".  If set, a separate file will be output for each
incoming frame.  The frame's presentation time is used as a
file name suffix, to distinguish the files.
- Added a new option "-m" to "openRTSP" (and "playSIP").  This option
causes a separate file to be written for each frame (using the
above-mentioned new feature of "FileSink").

Checksums

2003.10.05

Changelog

- Renamed the new openRTSP/playSIP "-S" option to "-b".

Checksums

2003.10.04

Changelog

- Added an error message to "MultiFramedRTPSource" to report when
the client's receive buffer is too small for an incoming frame.
(This could happen with large JPEG frames, for example.)
- Updated the signature to "FileSink" to take an optional 'buffer size'
parameter as argument.  (The default value is 10000.)
- Added a "-S " option to "openRTSP" and "playSIP".

Checksums

2003.09.30

Changelog

Improved the default implementation of
"RTPSink::hasBeenSynchronizedUsingRTCP()" to more accurately report
whether or not the most recently-delivered packet's presentation time
was synchronized using RTCP SRs.  (Thanks to Luca Abeni for pointing
out the possibility of a problem with the old implementation.)

Checksums

2003.09.25

Changelog

Improved the support for unicast RTSP/RTP streaming.  Also, added a new
test program "testOnDemandRTSPServer" that demonstrates how to use this.

Checksums

2003.09.19

Changelog

- Added support for unicast streaming from a "RTSPServer".
  (A test program that demonstrates this will be available shortly.)
  (Thanks to TNO Fysisch en Elektronisch Laboratorium (Netherlands)
  for funding this work.)
- Modified the "strDup()" function to return NULL (instead of crashing)
  if passed a NULL parameter.

Checksums

2003.09.05

Changelog

Fixed the implementation of "JPEGVideoRTPSource" so that it prepends
a proper JFIF JPEG header to the start of each incoming JPEG frame.
This means that programs such as "openRTSP" and "MPlayer" will now
receive/play JPEG/RTP streams correctly.

Checksums

2003.09.03

Changelog

Improved the implementation of "MultiFramedRTPSink" to more efficiently
handle the case where input frames get broken up into multiple outgoing
RTP packets.  We now eliminate an uncessary "memmove()" for each
fragment.  In particular, this should make MPEG-1 or 2 and motion-JPEG
video streaming more efficient.

Checksums

2003.09.01

Changelog

- Added support for reading and streaming AMR audio files (as defined in
RFC 3267).  Also added a new test program "testAMRAudioStreamer".
(Thanks to TNO Fysisch en Elektronisch Laboratorium (Netherlands) for
funding this work.)

Checksums

2003.08.28a

Changelog

- When "openRTSP" writes out a recorded MPEG-4 Elementary Stream video file,
it now writes SDP 'config' information to the front of the file beforehand.
This 'config' information contains VOL etc. headers that can be useful
for playback.

Checksums

2003.08.21

Changelog

Renamed all of the MPEG-1 or 2 class and program names from "MPEG*" to
"MPEG1or2*".  This is to distinguish these from the classes and programs
that use MPEG-4.

Checksums

2003.08.19

Changelog

Made the maximum buffer size in "MediaSink.cpp" a parameter that can be
set (changed) at runtime.  (Reset the default back to 20* packet size)

Checksums

2003.08.16

Changelog

- Added new classes "AudioRTPSink" and "VideoRTPSink" as parent classes
of the various audio and video RTP sink classes, respectively.
- Added a new "JPEGVideoRTPSink" class, and a "JPEGVideoSource" class
that can be used as an abstract base class for particular JPEG sources.

Checksums

2003.07.29

Changelog

Updated "RTSPClient" to include a "tearDownMediaSession()" operation,
in addition to "tearDownMediaSubsession().  "openRTSP" now uses just
the "tearDownMediaSession()" operation.  (Darwin Streaming Server was
barfing with "tearDownMediaSubsession()").  Thanks to Edward Estabrook
for suggesting this.

Checksums

2003.07.27

Changelog

Added a new "-F " option to "openRTSP" (and "playSIP").
This can be useful if you are running "openRTSP" several times,
in the same directory, to play several different RTSP streams
(e.g., from a script).  (Thanks to Norbert Donath for this suggestion.)

Checksums

2003.07.14

Changelog

Updated the "WAVAudioFileSource" implementation (and the
"testWAVAudioStreamer" test program) to better report any reason for
a WAV file to be invalid.

Checksums

2003.07.07

Changelog

- Fixed a bug that would cause "vobStreamer" to crash if (incorrectly)
run with no arguments.
- Updated the "test*Streamer" test programs to print out the "rtsp://"
URL of the built-in RTSP server (if it's enabled).

Checksums

2003.05.06

Changelog

Minor changes to the "openRTSP" QOS stats reports.

Checksums

2003.04.26

Changelog

- Made "DelayQueue" a little more accurate, by adjusting for the time
that has elapsed since the last alarm, when adding a new entry to the queue.
- Fixed a bug in "RTPSource" that could cause packet loss statistics to not
be reported accurately (in RTCP) if incoming packets were misordered.
- Updated "openRTSP" and "playSIP" to take a new "-Q" option, which
prints out QOS data at the end of the session.

Checksums

2003.04.24

Changelog

- Added a mechanism for registering an optional, auxilliary read handler
with a "RTPSource" or "RTCPInstance".  Such a handler would get called
after each new packet is read.
- Changed "SimpleRTPSink" to (by default) set the RTP "M" bit on
video streams iff the packet contains the last (or only) fragment of
a frame.

Checksums

2003.04.20

Changelog

- Updated "MediaSession" to recognize
  a=source-filter: incl ...
lines in SDP descriptions (for SSM sessions), and to do the appropriate
SSM-style multicast joins in this case (and also to send back RTCP via
unicast).
- Updated the RTCP implementation to reflect incoming unicast RTCP packets
back to the multicast group in the case where we're a SSM source.
- Update "vobStreamer" and the various "test*Streamer" test programs to
properly behave as SSM sources, when we have specified this.

Checksums

2003.04.18

Changelog

- Updated the "*ServerMediaSession" classes to (optionally) output
SSM-specific information in SDP descriptions.
- Updated "vobStreamer" to choose a random multicast address in the SSM
range.

Checksums

2003.04.12

Changelog

- Fixed "MPEGVideoStreamFramer" to allow for the possibility of
the GOP "time_code" field remaining unchanged in the source stream.
- Elimination of more unnecessary global variables.

Checksums

2003.04.11

Changelog

- Added support for an optional user name and password inside a RTSP
or SIP URL.
- The media lookup table (used in "Media.cpp") is now allocated
dynamically, and stored in the "UsageEnvironment", rather than
being a global variable.
This makes it possible to have different threads, within the same
address spaces, accessing the library code.
(Each thread would need to have its own "UsageEnvironment" and
"TaskScheduler", though.)

Checksums

2003.04.09

Changelog

Changed "BasicTaskScheduler::SingleStep()" to execute only one delay
queue task (along with any data input events) during each iteration.
This prevents a possible livelock if the delay queue always has events
outstanding.  (Thanks to Ruth Sadler for pointing this out.)

Checksums

2003.04.04

Changelog

- More improvements to "vobStreamer" (which has also been renamed
from "VOBStreamer".

Checksums

2003.03.31

Changelog

Added a new test program "VOBStreamer" to "testProgs".
This program reads a "VOB" file (e.g., from a non-encrypted DVD),
and streams the component video (MPEG) and audio (AC3) component streams
using RTP multicast.
(Online documentation to follow...)

Checksums

2003.03.25

Changelog

Began adding support for AC3 audio/RTP streaming.

Checksums

2003.03.22

Changelog

Added support for receiving H.261/RTP streams

Checksums

2003.03.14

Changelog

- Removed calls to "strdup()", because that's a C-library function whose
result should not be deleted using "delete" (or "delete[]").  Instead,
we now provide our own C++ equvalent, called "strDup()".
- Also, changed several "delete"s to "delete[]".
(Thanks to Bill Kain for noting the need for this fix.)

Checksums

2003.03.03

Changelog

Improved the implementation of "MPEG4GenericRTPSource".

Checksums

2003.02.28

Changelog

- Fixed a bug that would cause RTSP clients to not set the server port
number (for RTCP) correctly in some situations.  (Thanks to Alex Pollard.)
- Fixed a bug in "RTSPServer" that would cause "Transport:" headers to not
get generated correctly.

Checksums

2003.02.27

Changelog

- Improved the "MultiFramedRTPSource" implementation to more cleanly handle
packet loss in the case where frames are split into multiple RTP packets.
- Parsed the optional "/" parameter that can appear at the
end of "a=rtpmap:" lines for audio sessions.

Checksums

2003.02.17

Changelog

More work on the experimental '-R ' option to "playSIP"
(and "openRTSP") that allows it to inject the incoming stream into
a separate RTSP server.  This code is now working, although
currently only for a single PCMU or GSM audio stream.  Also, RTCP
packets are not yet relayed between the source and destination.

Checksums

2003.02.16

Changelog

Improved RTSPClient and SIPClient to check for (and discard)
any '\r' or '\n' that appears at the start of a response message.
(Some weirdo servers can do this.)

Checksums

2003.02.10

Changelog

Began adding a new option to "playSIP" (and "openRTSP") to allow the
incoming media stream to be injected into a separate, destination
RTSP server.  This still needs lots of work...

Checksums

2003.02.08

Changelog

Fixed the "JPEGVideoRTPSource" implementation to properly prepend a
synthesized JPEG header to each received frame of RTP data.  This now
makes it possible to receive and play motion-JPEG RTP streams.

Checksums

2003.02.06a

Changelog

- Fixed a bug in the SDP "config" attribute parsing.  (This affected
the use of "MPEG4LATMAudioRTPSource".
- Cleaned up the "createNew()" routines in each of the *RTPSource classes.
- Added two new RTPSource classes - "MPEG4ESVideoRTPSource" and
"MPEG4GenericRTPSource", for MPEG-4.  However, these have not been
fully implemented yet.

Checksums

2003.02.03a

Changelog

Created a new header file "groupsock/include/NetCommon.h" that contains
all networking-related #includes.  This also does the correct #includes
for Windows, allowing Windows code to use Winsock-2 rather than Winsock-1.
Also, modified "win32config" to use a "TARGETOS" of WINNT rather than
WIN95, to make this all work.

Thanks to Doug Kosovic for figuring out the magic incantations
needed to get this all working.

Checksums

2003.02.03

Changelog

- Improved "SIPClient" (in the "liveMedia") library, so that "INVITE"
requests are retransmitted, as necessary, for reliability.
- Added a "-A " option to "playSIP".  This allows the
user to specify which audio RTP payload format should be received.
(At present only static payload formats can be specified, and only
audio codecs - not video.)

Checksums

2003.01.28

Changelog

- Added support (in the "liveMedia" library) for a basic SIP client
- Added a new test program "playSIP", similar to "openRTSP".  These two
applications are now built from the same code base.

Checksums

2003.01.17

Changelog

Further improvements to the MPEG-4 audio support.  We can now read
(from the "MediaSubsession") the StreamMuxConfig "config" stream that
was present in the SDP description.  Also added a routine that parses
such a string, producing binary "AudioSpecificConfig" data.
(See "MPEG4LATMAudioRTPSource.cpp" for details.)

Checksums

2003.01.10

Changelog

Added basic support for MPEG-4 LATM audio.

Checksums

2002.12.21

Changelog

Fixed a bug in the previous update to "QuickTimeFileSink"

Checksums

2002.12.10

Changelog

Yet another change to "QuickTimeFileSink", this time to make sure that
the duration of video tracks corresponds exactly to the sum of video
sample durations listed in the 'stts' atom.

Checksums

2002.11.18

Changelog

Modified the support for creating hint tracks in "QuickTimeFileSink" so
that it it now works properly for H.263+ video sessions.

Checksums

2002.11.14

Changelog

Updated "QuickTimeFileSink" to support (optional) hint tracks in output
QuickTime files.  Also added a "-H" option to "openRTSP" that
(when used with "-q") will add hint tracks to the output ".mov" file.
(Note that the hint tracks currently don't work well for H.263+ video
tracks, and currently don't work at all for QCELP.)

Checksums

2002.11.04

Changelog

Updated the expiration date in "openRTSP.cpp"

Checksums

2002.10.22

Changelog

- Undid the previous change.  The top-level Unix Makefile now does
      cd  ; make
once again.  Unfortunately "--directory" doesn't seem to work properly
with the version of "make" that's installed with FreeBSD.
- Changed the implementation of the "-n" option in "openRTSP".  If "-y"
is also specified, then the user will be notified only if (i) data has
arrived for all subsessions, and (ii) all subsessions have been
synchronized.

Checksums

2002.10.21

Changelog

Changed the top-level Unix Makefile to do
	make --directory=
rather than
       cd ; make
as the latter apparently didn't work with cygwin.
(Thanks to "Sycotic" Smith for the tip.)

Checksums

2002.10.19

Changelog

Updated "QuickTimeFileSink" to use QuickTime Edit Lists to synchronize
the media tracks.  (It appears that this does not always produce playable
QuickTime files, so this implementation may have to be changed later.)

Checksums

2002.10.11

Changelog

Fixed a bug in "MultiFramedRTPSource" that could cause a RTP receiver to
hang if it received a malformed RTP packet with no data after a special,
media-specific header.

Checksums