./net/liblive, Set of C++ libraries for multimedia streaming

[ CVSweb ] [ Homepage ] [ RSS ] [ Required by ] [ Add to tracker ]


Branch: CURRENT, Version: 20141211, Package name: liblive-20141211, Maintainer: pkgsrc-users

This package contains a set of C++ libraries for multimedia streaming,
using open standard protocols (RTP/RTCP, RTSP, SIP). These libraries can
be used to build streaming applications. The libraries are already being
used to implement applications such as "liveCaster" and "playRTPMPEG" (for
streaming MP3 audio using RTP/RTCP). The libraries can also be used to
stream, receive, and process MPEG or H.263+ video, and several audio
codecs. They can easily be extended to support additional (audio or video)
codecs, and can also be used to build basic RTSP or SIP clients and
servers, and have been used to add streaming support to existing media
player applications, such as "MPlayer". (For some specific examples of
how these libraries can be used, see the included test programs.)


Required to build:
[pkgtools/cwrappers]

Master sites:

Filesize: 613.973 KB

Version history: (Expand)


CVS history: (Expand)


   2022-03-24 20:36:29 by Thomas Klausner | Files touched by this commit (8)
Log message:
liblive: Fix whitespace issue when linking.
   2021-10-26 13:07:15 by Nia Alarie | Files touched by this commit (958)
Log message:
net: Replace RMD160 checksums with BLAKE2s checksums

All checksums have been double-checked against existing RMD160 and
SHA512 hashes

Not committed (merge conflicts...):

net/radsecproxy/distinfo

The following distfiles could not be fetched (fetched conditionally?):

./net/citrix_ica/distinfo citrix_ica-10.6.115659/en.linuxx86.tar.gz
./net/djbdns/distinfo dnscache-1.05-multiple-ip.patch
./net/djbdns/distinfo djbdns-1.05-test28.diff.xz
./net/djbdns/distinfo djbdns-1.05-ignoreip2.patch
./net/djbdns/distinfo djbdns-1.05-multiip.diff
./net/djbdns/distinfo djbdns-cachestats.patch
   2021-10-07 16:43:07 by Nia Alarie | Files touched by this commit (962)
Log message:
net: Remove SHA1 hashes for distfiles
   2019-11-03 12:45:59 by Roland Illig | Files touched by this commit (255)
Log message:
net: align variable assignments

pkglint -Wall -F --only aligned --only indent -r

No manual corrections.
   2018-01-07 14:04:44 by Roland Illig | Files touched by this commit (583)
Log message:
Fix indentation in buildlink3.mk files.

The actual fix as been done by "pkglint -F */*/buildlink3.mk", and was
reviewed manually.

There are some .include lines that still are indented with zero spaces
although the surrounding .if is indented. This is existing practice.
   2017-07-13 15:15:25 by Thomas Klausner | Files touched by this commit (4)
Log message:
Honor LDFLAGS, fixes RELRO build.
   2015-11-04 01:35:47 by Alistair G. Crooks | Files touched by this commit (748)
Log message:
Add SHA512 digests for distfiles for net category

Problems found with existing digests:
	Package haproxy distfile haproxy-1.5.14.tar.gz
	159f5beb8fdc6b8059ae51b53dc935d91c0fb51f [recorded]
	da39a3ee5e6b4b0d3255bfef95601890afd80709 [calculated]

Problems found locating distfiles:
	Package bsddip: missing distfile bsddip-1.02.tar.Z
	Package citrix_ica: missing distfile citrix_ica-10.6.115659/en.linuxx86.tar.gz
	Package djbdns: missing distfile djbdns-1.05-test25.diff.bz2
	Package djbdns: missing distfile djbdns-cachestats.patch
	Package djbdns: missing distfile 0002-dnscache-cache-soa-records.patch
	Package gated: missing distfile gated-3-5-11.tar.gz
	Package owncloudclient: missing distfile owncloudclient-2.0.2.tar.xz
	Package poink: missing distfile poink-1.6.tar.gz
	Package ra-rtsp-proxy: missing distfile rtspd-src-1.0.0.0.tar.gz
	Package ucspi-ssl: missing distfile ucspi-ssl-0.70-ucspitls-0.1.patch
	Package waste: missing distfile waste-source.tar.gz

Otherwise, existing SHA1 digests verified and found to be the same on
the machine holding the existing distfiles (morden).  All existing
SHA1 digests retained for now as an audit trail.
   2014-12-13 10:20:02 by Thomas Klausner | Files touched by this commit (8) | Package updated
Log message:
Update to 20141211. Set LICENSE.

2014.12.11:
- Changed our implementation of "setBackgroundHandling()" and \ 
"moveBackgroundHandling()" in
  "BasicTaskScheduler" to check for (and disallow) socket numbers \ 
>= FD_SETSIZE,
  because <sys/select.h> has a bug (at least, in most systems) that causes \ 
buffer overflow
  in this case.  (Thanks to Michel Promonet for pointing this out.)

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

2014.12.08:
- Fixed a bug in parsing 'absolute' RTSP "Range:" headers with no end time.
  (Thanks to Ken Chow for reporting this.)
- Added a new option "-K" to "openRTSP, to tell the client to \ 
periodically send "OPTIONS"
  requests as 'keep-alives' for buggy servers that don't use incoming RTCP \ 
"RR" packets to
  indicate client liveness.  (Thanks to Peter Schlaile for this suggestion.)
- Added a new 'protected' virtual member function \ 
"noteRecordedFrame()" to "QuickTimeFileSink".
  This function is called whenever a frame is recorded to the output file.
  The default implementation of this virtual function does nothing, but \ 
subclasses can redefine
  it if they wish.

2014.11.28:
- When "RTSPClient" parses a RTSP response, we first skip over any \ 
blank lines that may be at
  the start of the response.  This can happen if the previous response (e.g., to \ 
a "DESCRIBE")
  contained extra whitespace.
  (Thanks to ilwoo Nam for giving an example of a server that exhibited this \ 
behavior.)

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

2014.11.07:
- Added a new "RTSPClient" member function \ 
"disallowBasicAuthentication()" that you can call if
  you don't want a RTSP client to perform 'basic' authentication (whcih involves \ 
sending
  the username and password over the network), even if the server asks for this.
  (Thanks to Tomasz Pala for this suggestion.)
- Updated the debugging printout code in "RTCP.cpp" to identify all \ 
known RTCP payload types,
  even if we don't currently handle them.  We also - when doing debugging \ 
printout - parse and
  print out the contents of SDES RTCP packets.

2014.11.01:
- Updated "RTSPClient" so that it reuses \ 
"fCurrentAuthenticator" if we previously
  updated it with data from a "WWW-Authenticate:" response, even if a \ 
non_NULL
  "authenticator" parameter was passed as a parameter to the command.  \ 
This reduces the
  number of authetication exchanges that take place if the server asks for \ 
authentication
  on more than one command in a RTSP session.
  (Thanks to Tomasz Pala for this suggestion.)
- Updated "DigestAuthenticator" to allow for the possibility of \ 
"username" or "password"
  being NULL.
- Updated the "RTSPServer" implementation to add an access check \ 
before the first "SETUP"
  (the one that doesn't include a session id), because it's possible, in \ 
principle, for a client
  to send such a "SETUP" without first sending a "DESCRIBE". \ 
 Therefore, we need to perform
  access checks on both commands.

2014.10.28:
- Added support for the VP9 video RTP payload format (sending and receiving), \ 
including the
  demultiplexing and streaming of a VP9 video track from a Matroska-format file.
- Made "VP8VideoRTPSource" more robust against a bad first-byte header \ 
field in the payload.

2014.10.21:
- Increased the max output packet size for "MultiFramedRTPSink" and \ 
"RTCPInstance" from 1448
  to 1456, because we had a report of problems when proxying incoming JPEG/RTP \ 
packets of this
  size (and because 1456 bytes still gives a packet size of no more than 1500 \ 
bytes when we add
  in IP, UDP, and UMTP headers).

2014.10.20:
- Increased the RTSP request and response buffer sizes from 10000 to 20000 \ 
bytes, because we
  saw a RTSP stream (VP8 video) that had an extremely large \ 
"configuration=" string that was
  hiting the previous limit.

2014.10.16:
- Fixed the "RTSPServer" implementation to handle a rare race \ 
condition that could cause a
  "ServerMediaSession" object to be deleted while it was being used to \ 
implement "DESCRIBE".
  (Thanks to Michel Promonet for reporting this.)

2014.10.07:
- Fixed a bug in the "MultiFramedRTPSource" implementation where we \ 
weren't properly checking the
  size of incoming RTP packets that have the "CC" field (i.e., number \ 
of "CSRC" fields) non-zero.
- Updated "Groupsock::output()" to be a virtual function.  (This makes \ 
it possible to implement
  "Groupsock" subclasses that implement 'bump-in-the-stack' protocols \ 
(such as SRT(C)P) below
  RTP/RTCP.)

2014.10.03:
- Fixed a problem in the "timestampString()" routine that occurs if \ 
"time_t" is 64 bits, but
  we're on a 32-bit machine.  (Thanks to Deanna Earley for reporting this.)
- Updated the debugging output code in "RTCP.cpp" to make it clearer \ 
that SDES and APP packets
  are not invalid; just not (yet) handled by us.

2014.09.22:
- Changed the way in which the "RTSPServer" code handles incoming \ 
"OPTIONS" commands that contain
  a "Session:" header.  If the "Session:" header contains a \ 
session id that does not exist, then
  we now return a "Session Not Found" error (even though the handling \ 
of the "OPTIONS" command is
  not session-specific).  This new behavior will help proxy servers (that use \ 
our "RTSPServer"
  implementation as a 'back-end' server) better detect when the back-end server \ 
has restarted
  while streaming.  (Thanks to Jonathan Brady for noticing this issue.)

2014.09.11:
- Note that the signature of the virtual function \ 
"RTSPServer::lookupServerMediaSession()" has
  changed.  It now takes an extra (in) parameter "Boolean \ 
isFirstLookupInSession".
  If you have subclassed "RTSPServer" and redefined this function, you \ 
must update your
  redefinition to match this new signature.
- Fixed a bug in the "DynamicRTSPServer" code (used by the \ 
"LIVE555 Media Server") that
  had been introduced in version 2014.07.12, and was causing streaming from \ 
multi-stream files
  to fail.  (Thanks to Gilles Chanteperdrix for noting this.)

2014.08.26:
- Fixed a bug that was introduced in version 2014.03.25 that could cause \ 
excessive CPU usage
  for servers that stream from a single source to both RTP/UDP and RTP/TCP clients.
  Thanks to Chris Richardson for noting this.

2014.08.23:
- Added a new function "attrVal_strToLower()" to \ 
"MediaSubsession".  This returns a string
  attribute as a lower-case string.  ("mode" SDP attributes are now \ 
looked up using this function.)
  (Thanks to James Huang for noting a problem that made this necessary.)
- Added an alternative form of "strDupSize()" (in the \ 
"UsageEnvironment" library) that
  also returns the size of the allocated buffer.

2014.07.25:
- Fixed an obscure bug in "RTPInterface::sendPacket()" when sending a \ 
packet over TCP.
  (Thanks to "ChaSeop Im" for reporting this.)
- Added "-DXLOCALE_NOT_USED" to the "COMPILE_OPTS" line in \ 
the "config.solaris*" configuration
  files, because someone claimed that this was necessary in order to build the \ 
code for Solaris.

2014.07.18:
- Made the "RTSPServer" code more robust, to allow for the possibility \ 
of the same substream
  being "SETUP" by the same client more than once.  (This could cause \ 
a crash when streaming a
  MPEG Program Stream file, and potentially for other file types as well.)
  (Thanks to Yann Fleutot of "Stormshield" for reporting this.)
- Changed some error message output code that was allegedly causing compiler \ 
errors in Debian Linux.

2014.07.13:
- Corrected the previous revision's change to "groupsock/NetCommon.h" \ 
to remove a definition
  of "int8_t", because that's apparently already defined for Windows.
  (Thanks to Victor Kulichkin for noting this.)

2014.07.12:
- Updated the "DynamicRTSPServer" code (used by the "LIVE555 \ 
Media Server") so that it
  creates a new "ServerMediaSession" object for each new request for a \ 
file.  (Any existing
  "ServerMediaSession" for the file will be removed, but any existing \ 
client for that
  "ServerMediaSession" will continue streaming.)  This allows for the \ 
possibility of
  the underlying file changing size between successive requests.
  (Thanks to Nadir Raimondo for the suggestion.)
- Updated "groupsock/NetCommon.h" to add some new size-specific int \ 
definitions that apparently
  weren't already defined for some Windows compilers.

2014.07.04:
- Added an update to "MPEG2TransportStreamMultiplexor" and \ 
"MPEG2TransportStreamFromESSource"
  that makes it possible to (optionally) specify a PID for a multiplexed stream.
  (Currently, only the low 8 bits of this PID will be used.)
  The default behavior remains: Use the 8-bit 'stream_id' as the PID.
  (Thanks to Piers Hawksley for the patch.)

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

2014.06.27:
- Fixed a bug in the RTSP server's handling of incoming Base-64-encoded requests \ 
(when handling
  RTSP-tunneled-over-HTTP) that get split over more than one network read.
  (Thanks to Piers Hawksley for the reporting the problem, and providing \ 
diagnostic output to
  help track down the bug.)
- Made the RTP/RTCP-over-TCP implementation more robust, by stopping all use of \ 
the socket
  if any write to the socket should fail.

2014.06.24:
- Fixed a bug in "MPEG2IndexFromTransportStream" that was causing it \ 
to print out error messages
  (but otherwise work OK) when it saw Transport Packets with \ 
"adaptation_field_control" == 2.
  (Thanks to Nadir Raimondo for reporting this.)
- Added an "#ifndef" around the definition of OUR_PROGRAM_NUMBER in \ 
MPEG2TransportStreamMultiplexor.cpp,
  to allow it to be defined as a different value.  (Suggestion by Piers Hawksley.)
- Fixed (extremely minor and inconsequential) memory leaks in \ 
"MatroskaFile" and "StreamReplicator".
- Changed "UsageEnvironment::reclaim()" to return a Boolean value: \ 
True if it was actually
  able to reclaim the object's memory; False otherwise.

2014.05.27:
- Updated the "BasicTaskScheduler" 'dummy socket' hack (to work around \ 
a bug in Windows'
  "select()" implementation) to make the dummy socket number a member \ 
variable.  This allows
  us to close this socket in the "BasicTaskScheduler" destructor.  \ 
(Apparently this matters
  to some people...)

2014.05.25:
- Changed the way in which we set the maximum output packet size for RTCP, \ 
because the previous
  hack (in "RTCP.cpp") wasn't 'thread safe'.  (Thanks to Liao ChunWei \ 
for noting this.)
- Moved "ourMD5.hh" from the "liveMedia" directory to the \ 
"liveMedia/include" directory,
  so as to make it accessible to applications.
  We also added a new function "our_MD5DataRaw()", which is similar to \ 
the existing
  "our_MD5Data()", except that it returns the digest as a 'raw' \ 
16-byte buffer, rather than
  as an ASCII hex string.
- Added a "RemoveNext()" function to \ 
"AddressPortLookupServer".  (It just calls
  "HashTable::RemoveNext()".)

2014.05.14:
- Fixed a bug in the way we implemented a timeout on blocking writes in \ 
"RTPInterface" in
  the previous version.
- Added the ability to receive the "audio/G722" RTP payload format \ 
(using "SimpleRTPSource").

2014.05.08:
- Updated the 'blocking send()' hack in \ 
"RTPInterface::sendDataOverTCP()" so that the
  'blocking send()' (if called) will have a timeout (default value: 500 ms), \ 
rather than
  blocking indefinitely (which might happen if the TCP connection has hung for \ 
some reason).
  (If you wish, you can change this by compiling "RTPInterface.cpp" with
   RTPINTERFACE_BLOCKING_WRITE_TIMEOUT_MS defined to be some other value.  A \ 
value of 0 means:
   Don't timeout - i.e., the previous behavior.)
  If the 'blocking send()' does time out, then the socket is closed, which will \ 
cause all
  network activity (RTSP,RTP,RTCP) on the socket to cease.  (If this is a RTSP \ 
server,
  then all state for the connection will eventually be reclaimed normally.)
  (Thanks to Gord Umphrey for suggesting the 'setsockopt()' call that sets the \ 
timeout.)
- Removed the "profile_level_id" parameter from the 'optional' variants of
  "H264VideoRTPSink::createNew()", because this value can instead be \ 
extracted from the
  SPS NAL unit (after removing 'emulation' bytes).
  Simularly, we removed the "profileSpace", "profileId", \ 
"tierFlag", "levelId", and
  "interopConstraintsStr" parameters from the 'optional' variants of
  "H265VideoRTPSink::createNew()", because these values can instead be \ 
extracted from the
  VPS NAL unit (again, after removing 'emulation' bytes).

2014.04.23:
- Added a new function "RTSPServer::disableStreamingRTPOverTCP()" that \ 
you can call - on a
  RTSP server - to deny clients that request RTP/RTCP-over-TCP streaming.
- Made the constructors and destructors for the classes \ 
"RTSPServer::RTSPClientConnection"
  and "RTSPServer::RTSPClientSession" 'protected' rather than \ 
'public', because objects of these
  classes should be created only via the "createNewClientConnection()" and
  "createNewClientSession()" virtual functions, and destroyed only by \ 
the "RTSPServer" code.
- Change the "reuse_connection" Transport parameter for our RTSP \ 
"REGISTER" command to be a
  simple flag (present, or not present), rather than a parameter that takes a value.
  (This change is also noted in the most recent update of our Internet-Draft:
  "draft-finlayson-rtsp-register-command-01.txt")
- Fixed a compilation error in "OggFileServerDemux.cpp" that occurred \ 
when DEBUG is defined.

2014.03.25:
- We can now handle incoming RTCP packets that are multiplexed on the same port \ 
as RTP packets.
  A "RTCPInstance" does this by 'registering' itself with the \ 
corresponding "RTPSource".
  The "RTPSource" network handler then forwards any multiplexed RTCP \ 
packets to the
  "RTCPInstance".
  Multiplexed RTP/RTCP packets are signaled by an "a=rtcp-mux" line in \ 
the SDP descriptor.
- Allow a RTP-transmitting server to (optionally) multiplex RTCP on the same \ 
port as RTP.
  If this is done, a "a=rtcp-mux" line (as defined in RFC 5761) will \ 
be automatically added
  to the SDP description.
  Also, if this option is chosen, the RTP (and RTCP) port may be odd-numbered.
  For "OnDemandServerMediaSubsession"s, this option is specified via a \ 
parameter
  "multiplexRTCPWithRTP" (default value: False) in the constructor, or \ 
using a new
  public member function "multiplexRTCPWithRTP()".
  For "PassiveServerMediaSubsession"s, this option is specified by \ 
passing (in "createNew()")
  a "rtcpInstance" parameter that has the same 'groupsock' as the \ 
"rtpSink" parameter.
  NOTE: RTSP clients that are built using previous versions of this library (or \ 
perhaps using
  some other software) will not handle RTCP that's multiplexed with RTP.  \ 
Therefore, this
  option should be enabled ONLY IF you know that all RTSP clients will be using \ 
this version
  of the software, or later.
- Fixed a bug in "QuickTimeFileSink" and "AVIFileSink" that \ 
could apparently cause a NULL
  pointer to be dereferenced.  (Thanks to Martijn van den Broek for reporting this.)
- Fixed an issue in the "RTPInterface" code that could cause \ 
"SetSpecificRRHandler()" to not
  work properly when RTP/RTCP is being carried over TCP.

2014.03.18:
- Fixed a bug in "H264VideoFileServerMediaSubsession" (and \ 
"H265VideoFileServerMediaSubsession"
  and "MPEG4VideoFileServerMediaSubsession") that could cause a crash \ 
(due to a 'race condition')
  if the input file ended before 'configuration' data could be extracted.
  (Thanks to Robert Sujker for finding and analyzing this problem.)

2014.03.17:
- Fixed a bad "#ifndef" in "DVVideoRTPSource.hh"

2014.03.16:
- Added support for demultiplexing and streaming Opus audio tracks from \ 
Matroska/Webm files.

2014.02.26:
- Updated the H.265/RTP implementation to remove the "tx-mode" \ 
attribute, to conform to the latest
  version of the H.265 RTP payload format specification.
- Added a new function "OutPacketBuffer::increaseMaxSizeTo()" that \ 
sets "OutPacketBuffer::maxSize"
  to a new value only if it's bigger than the current value.  Thanks to Michael \ 
Brimer for
  motivating this.
- Fixed a couple of minor code 'nits' that Nikolai Vorontsov discovered using a \ 
code analyzer.

2014.02.19:
- Fixed a bug that was causing some bytes to be deleted when receiving H.265/RTP \ 
streams.
  (Thanks for Michel Promonet for bringing this to our attention.)
- Added support for streaming Opus audio tracks from Ogg files.  Also updated \ 
"OpusFileSink"
  (which is used by "openRTSP") to write Opus audio streams into \ 
Ogg-format files.
- Updated the "ProxyServerMediaSession" implementation - and thus the \ 
"LIVE555 Proxy Server"
  to support proxying of Opus audio RTSP/RTP streams.
- Added a "test.opus" file option to the \ 
"testOnDemandRTSPServer" demo application.
- Made minor changes to "OggFileParser.cpp" to eliminate compiler \ 
warnings on some platforms.

2014.02.17:
- Added a new class "TheoraVideoRTPSource" to implement reception of \ 
Theora Video RTP streams.
- Updated "ProxyServerMediaSession" to support proxying of Theora \ 
video RTSP/RTP streams.
- Updated the signature of "TheoraVideoRTPSink::createNew()" to remove \ 
the "width", "height",
  and "pf" parameters, because we can extract these from the \ 
'identification' header parameter.

2014.02.13:
- Added support for streaming Theora video tracks from Matroska files.
- Updated "OutputSocket::write()" to do a "setsockopt()" \ 
call to set the TTL, even if
  the TTL is 0.  (As before, however, we don't do the "setsockopt()" \ 
call if the TTL is the
  same as before (an optimization.)  (Thanks to Daniel Martinez Contador for the \ 
suggestion.)
- Changed the "RTSPServer" destructor to delete \ 
"RTSPClientSession" objects before deleting
  "RTSPClientConnection" objects.  We do this because each \ 
"RTSPClientSession" object
  is created from a "RTSPClientConnection", and passes its \ 
"RTSPClientConnection" object to
  "handleAlternativeRequestByte()" (for RTP-over-TCP streaming).

2014.02.10:
- Added classes ("OggFile", "OggFileServerDemux") for \ 
demultiplexing and streaming from 'Ogg'
  files.  At present, only 'Vorbis' audio tracks can be streamed.  Later, \ 
however, we'll also
  support 'Theora' video and 'Opus' audio.
- Added support for streaming from an Ogg-format file (named \ 
"test.ogg") to the
  "testOnDemandRTSPServer" demo application.
- Added a new demo application "testOggStreamer" (similar to the \ 
existing "testMKVStreamer") for
  streaming an Ogg-format file via IP multicast.
- Added support for streaming from Ogg-format files (with filename suffix \ 
".ogg", ".ogv", or
  ".opus") to the "LIVE555 Media Server".  (Note, however, \ 
that we don't yet support streaming
  Theora video tracks or Opus audio tracks from Ogg-format files.  That will \ 
come later.)
- Updated "MPEG2IndexFromTransportStream.cpp" to check for the prefix \ 
0x00 0x00 0x01 before
  assuming that a Transport Stream payload begins a PES packet (if \ 
"payload_unit_start_indicator"
  is set).
- Made "ServerMediaSession::generateSDPDescription()" more \ 
bullet-proof against the possibility
  of media subsession SDP lines' length changing from the first time they are \ 
calculated, and
  the second time.  (Thanks to Michael Brimer for raising this issue.)
- Updated the "LIVE555 Media Server" code to eliminated a potential \ 
problem if more than one
  Matroska (or Ogg)-format file were being streamed concurrently.  (The 'watch \ 
variables' used
  for setting up "ServerMediaSubsession"s for these files are no \ 
longer global variables.)
- Fixed a minor bug in "openRTSP" that could cause a 'double free' if \ 
the RTSP "PLAY" command failed.

2014.02.08:
- We now properly handle "Range:" headers of the form \ 
"a=npt=now-".  (The previous version had
  appeared to handle this, but didn't do so properly.)

2014.02.07:
- Updated the RTSP server's "Range:" header parsing routine to \ 
properly handle a "Range:" header
  of the form "npt= -0", which can be given when requesting reverse play.
  (Thanks to Manickam Nambirajan for noting this problem.)

2014.02.04:
- Added a new class "OggFileSink" for writing data (from a Vorbis \ 
audio, Theora video, or
  Opus audio track) into an 'Ogg'-format file.  (This writes only a single track \ 
to the file;
  it does not multiplex multiple tracks into the file.)
  Also updated the "openRTSP" application to use this class when \ 
recording incoming Vorbis audio,
  Theora video, or Opus audio RTP streams, so that the resulting files can be played
  directly by media players.
- Exported the "calculateCRC()" routine that \ 
"MPEG2TransportStreamMultiplexor" uses to
  calculate its CRCs, because the same CRC algorithm ends up being used in Ogg files.
- Made the "testMKVStreamer" demo application more robust when \ 
handling unknown track types.
- Updated the Matroska file parsing code to ignore tracks that exist, but which \ 
don't have
  a MIME (media) type that we know about.
- Changed "TheoraVideoRTPSink::createNew()" to no longer take a 'RTP \ 
timestamp frequency' as
  parameter, because the RTP payload format specification states that a \ 
frequency of 90000 Hz
  MUST be used.
- Removed some duplicate code that was being used in both \ 
"VorbisAudioRTPSink"
  and "TheoraVideoRTPSink".

2014.01.29:
- Updated the "RTSPServer" code to properly handle RTSP \ 
"PLAY" requests that have a "Range:"
  header of "npt=now-", "npt=now-<endTime>", or \ 
"npt=-<endTime>".
  (Thanks to Manickam Nambirajan for bringing this to our attention.)

2014.01.28:
- Removed a lot of code duplication from the \ 
"*MatroskaFileServerMediaSubsession" classes,
 by defining and implementing a base class \ 
"MatroskaFileServerMediaSubsession".
 We also added a new member functions \ 
"MatroskaFile::createSourceForStreaming()" and
 "MatroskaFile::createRTPSinkForTrackNumber()" which create - from a \ 
track in a Matroska file -
 source and "RTPSink" objects suitable for streaming.  These functions \ 
are used not only
 to implement the \ 
"MatroskaFileServerMediaSubsession::createNewStreamSource()" and
 "MatroskaFileServerMediaSubsession::createNewRTPSink()" virtual \ 
functions, but also to
 support multicast streaming from a Matroska file.
- We added a new 'test program' "testMKVStreamer", for streaming from \ 
a Matroska file via
  IP multicast.

2014.01.24:
- The previous version's change to \ 
"OnDemandServerMediaSubsession::getStreamParameters()"
  inadvertently broke RTP-over-TCP streaming.  This version fixes it again.
  (Thanks to KC Chao for noting the problem.)
- Considerably simplified the parsing and accessing of "a=fmtp:" SDP \ 
attributes
  (in "MediaSession.cpp").  Now, instead of having individual member \ 
variables and accessor
  functions for a set of 'hard-wired' attribute names, we automatically parse \ 
and record *any*
  attribute that happens to appear in a "a=fmtp:" SDP line, and have \ 
general-purpose accessor
  functions - MediaSubsession::attrVal_str/int/unsigned/bool() - that can lookup any
  "a=fmtp:" attribute by name (returning an appropriate 'null' value \ 
if it wasn't present in
  the SDP description).  (For backwards-compatibility, however, we have kept a \ 
few of the
  most commonly-used old accessor functions, such as \ 
"fmtp_spropparametersets()".)
  This will simplify the adding of support for new RTP payload formats.

2014.01.21:
- Updated the implementation of \ 
"OnDemandServerMediaSubsession::getStreamParameters()" to
  not create 'destination' objects (i.e., "RTPSink"s, \ 
"RTCPInstance"s, and their "groupsock"s)
  if the 'client port number' parameter is 0.  For normal RTSP streaming, this \ 
will never be the
  case.  However, it will be the case when "getStreamParameters()" is \ 
called as a hack when
  setting up HTTP Live Streaming.  Consequently, extraneous UDP sockets will no \ 
longer be created
  when HTTP Live Streaming is set up.

2014.01.20:
- Fixed another bug in "TCPStreamSink" (hopefully the last one for a \ 
while :-)

2014.01.19:
- Fixed a bug in "TCPStreamSink" that could cause a crash in servers \ 
that implement HTTP Live
  Streaming.  (Thanks to Park Chen for bringing this to our attention.)
- Added a non-static version of "FramedSource::handleClosure()".  This \ 
allows code
  to call "<object>->handleClosure()"rather than the unwieldy \ 
"FramedSource::handleClosure(this)".

2014.01.18:
- Fixed a bug in "RTSPServer" whereby it would access a \ 
recently-deleted "RTSPClientSession"
  object shortly after handling "TEARDOWN".  (Thanks to Michel \ 
Promonet for reporting this.)

2014.01.17:
- Fixed a bug in "H265VideoRTPSource" (when reconstructing the first \ 
fragment of a fragmented
  NAL unit).

2014.01.16:
- Added a "H265VideoFileSink" class, similar to the existing \ 
"H264VideoFileSink".
  Also updated the "openRTSP" application to write received H.265 \ 
Streams using this new class.
- Updated the "ProxyServerMediaSession" code (and thus also the \ 
"LIVE555 Proxy Server") to
  handle proxying of H.265/RTP streams.
- Fixed a bug in "H264VideoRTPSink" (and "H265VideoRTPSink") \ 
- introduced in previous versions
  - that would have prevented proxy servers from working properly on H.264 (and \ 
H.265) streams.

2014.01.15:
- Implemented "H265VideoRTPSource" for receiving H.265/RTP streams.
- Make "H264VideoRTPSource" more robust against unusually short NAL units.
- Fixed an incorrect #ifndef in "H265VideoStreamDiscreteFramer.hh"

2014.01.14:
- In the "TCPStreamSink" destructor, we now make sure that all pending \ 
background handling on the
  output (TCP) socket has been disabled. (Thanks to Park Chan for bringing this \ 
to our attention.)

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

2014.01.11:
- Updated the "ourIPAddress()" code in \ 
"groupsock/GroupsockHelper.cpp" to use
  "ReceivingInterfaceAddr" as our IP address, if it was set to \ 
something other than INADDR_ANY.
  (Thanks to Gilles Chanteperdrix for this suggestion.)
- Added a new class "H265VideoRTPSink" for streaming H.265 video.
- Added a new class "H265VideoFileServerMediaSubsession" for streaming \ 
a 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
  a H.265 Elementary Stream file ("test.265").
- Fixed a potential (though unlikely) problem in "H264VideoRTPSink" \ 
that might
  have caused an incorrect "profile_level_id" value to be set in SDP \ 
descriptions
  (due to the presence of 'emulation bytes' in the SPS NAL unit).
- Updated the "FileSink" implementation to make it work better when \ 
the "oneFilePerFrame" flag
  is set.  Now, the right thing will happen if "addFrame()" is called \ 
more than once before
  "afterGettingFrame()" is called - as is done by \ 
"H264VideoFileSink" (to prepend a 'start code').
  Also, if successive frames happen to have the same presentation time, we now \ 
use a filename
  suffix to distinguish them.  (Before, the second frame's data would overwrite \ 
the first.)
- Improved the "openRTSP" command's error messages when the user gives \ 
it incompatible
  command-line options.

2014.01.07:
- Added "Host:" headers to the HTTP "GET" and \ 
"POST" requests that "RTSPClient" sends when
  setting up RTSP/RTP/RTCP tunneling over HTTP.  Some HTTP servers complain if \ 
the "Host:" header
  isn't present.  (Thanks to Victor Gottardi for reporting this issue.)
- Added initial support for H.265 video, by defining two new classes \ 
"H265VideoStreamFramer" and
  "H265VideoStreamDiscreteFramer".  Because H.265 is similar to H.265, \ 
these classes - along with
  their old H.264 equivalent ("H264VideoStreamFramer" and \ 
"H264VideoStreamDiscreteFramer") are
  now subclassed from a single abstract class "H264or5VideoStreamFramer".
  Support for H.265 is still a 'work in progress'; we still need to define new \ 
RTP source and
  sink classes for it, along with RTSP server and Matroska demultiplexing \ 
support, as well
  as new and updated test programs.
- Cleaned up the "RTSPServer" request handling code to improve the \ 
handling of session ids in
  requests.  (We also now make sure that a valid session id in *any* request \ 
will cause the
  request to be counted as indicating 'liveness' on the session.)
- Removed some old, unused code from "MP3StreamState".

2013.12.31:
- In "BasicUsageEnvironment", moved the implementation of the \ 
constants "DELAY_MINUTE",
  "DELAY_HOUR", and "DELAY_DAY" from \ 
"DelayQueue.hh" to "DelayQueue.cpp", because of a report
  that some compilers were allegedly having problems with the previous code.
- In "groupsock/GroupsockHelper.cpp", changed a couple of "#ifdef \ 
ANDROID"s
  to "#ifdef __ANDROID__", because the latter definition is allegedly \ 
what 'Android' uses.

2013.12.29:
- Rewrote our MD5 implementation (and, in particular, the \ 
"our_MD5Data()" function) in C++.
- Updated the years in the copyright notice on each file.

2013.12.21:
- Fixed a potential 'double free' issue in "MediaSession.cpp".
  (Thanks to ChanMin Kim for noticing this.)
- Updated "RTSPClient" to move the code that sends short 'dummy' UDP \ 
packets (to improve the
  chances of receiving packets from a server that's behind a NAT) into its own \ 
member function.
  Also, we now call this before sending a "PLAY" command, rather than \ 
after receiving the response
  to a "SETUP" command.  (This is so that the packets will also be \ 
sent when resuming after
  a "PAUSE"; thanks to Gilles Chanteperdrix for this suggestion.)
- Added a Windows-specific definition to one file to compensate for the fact \ 
that the "fileno()"
  function is deprecated in recent versions of Windows.

2013.12.18:
- Added an implementation of a new class "TheoraVideoRTPSink" - for \ 
Theora video.
  (This was developed using the "VorbisAudioRTPSink" code as a base;
  thanks to Gilles Chanteperdrix.)
- Updated the new "openRTSP -P <interval-in-seconds>" option to \ 
work with the
  "-F <filename-prefix>" option, if you also specified \ 
"-q", "-4", or "-i".

2013.12.17:
- Removed a stray #define DEBUG from "RTSPServer.cpp"

2013.12.16:
- Fixed a bug in the "RTSPServer" code that was causing it not to \ 
handle pipelined
  Base64-encoded requests (sent over a RTSP-over-HTTP connection) properly.  \ 
Also updated the
  "parseRTSPRequestString()" code to make it more tolerant of \ 
whitespace (or NULL) characters
  at the start of requests; we now skip over them.
  (Thanks to Bob Bischan for providing an example that illustrated this problem.)

2013.12.15:
- Updated the "ProxyServerMediaSession" code to change the way in \ 
which the code can create
  an instance of your subclass of "ProxyRTSPClient" (if you've defined \ 
one).
  Previously, this was done by calling a virtual function - but that didn't \ 
work, because it was
  being called from the "ProxyServerMediaSession" constructor.  Now, \ 
instead, you will
  define a (non-member) function that returns a new object of your \ 
"ProxyRTSPClient" subclass,
  and then (in the constructor of your "ProxyServerMediaSession" \ 
subclass) pass this function
  as a parameter to the constructor of the parent class (i.e., \ 
"ProxyServerMediaSession").
  (Thanks to Craig Matsuura for bringing this problem to our attention.)
- Fixed a bug in "QuickTimeFileSink" and "AVIFileSink": When \ 
closing the object, we need to call
  "stopGettingFrames()" on each input source.
- Added a new option "-P <interval-in-seconds>" to \ 
"openRTSP".  This option tells "openRTSP"
  to write a new output file periodically.
- Updated "RTSPServer" to add an optional "timeout=" \ 
parameter to the end of the "Session:" header
  in each "SETUP" response (unless "fReclamationTestSeconds" \ 
was 0).  (Note that compliant
  RTSP/RTP clients are still expected to send RTCP "RR" packets, which \ 
the server uses to note
  client liveness.)

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

2013.12.04:
- Updated the "sendDataOverTCP()" function (in \ 
"RTPInterface.cpp") to allow for the possibility of
  one of the "send()" calls partially succeeding - i.e., writing some, \ 
but not all, of its data.
- Fixed a couple of minor bugs.  (Thanks to "maksqwe1@ukr.net".)

2013.12.03:
- Made a minor change to the "ProxyRTSPClient" code to prevent a \ 
potential divide-by-zero
  error.

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

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

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

2013.11.15:
- Fixed a bug that might cause a "MediaSink" to incorrectly continue \ 
operating after its input
  source object has indicated that it's closed.  (Thanks to Michel Promonet for \ 
reporting this.)

2013.11.14:
- Added a new option "-g" to "openRTSP" and \ 
"playSIP" to allow the user to specify an
  alternative user agent in outgoing requests.  (Thanks to Marco Vlahovic for \ 
the suggestion.)

2013.11.10:
- Updated the Matroska file parsing code to better handle skipping over very \ 
large tracks
  (such as embedded file attachments).  (Thanks to Michel Promonet for reporting \ 
this issue.)

2013.11.06:
- Changed the function "MatroskaDemux::newDemuxedTrack()" to return \ 
'preferred' tracks
  (based on the file's language preference) only.  This mirrors the functionality of
  "MatroskaFileServerDemux::newServerMediaSubsession()", and makes it \ 
easier for applications
  to iterate through the tracks of a demultiplexed Matroska file.
- Added an optional "preferredLanguage" parameter to \ 
"MatroskaFileServerDemux::createNew()"
  (to mirror the corresponding parameter that's in \ 
"MatroskaFile::createNew()").
- Cleaned up the "MatroskaFile.hh" header file to remove some \ 
definitions that should not
  be exposed to developers.
- The "ServerMediaSession" and "ServerMediaSubsession" \ 
destructors had accidentally been made
  public.  Changed them to be protected instead.  (Thanks to Michel Promonet for \ 
noting this.)

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

2013.10.24:
- Fixed a bug in "ByteStreamMemoryBufferSource":" The \ 
fLimitNumBytesToStream" member variable was not being initialized.
  (Thanks to Park Chan for reporting this.)

2013.10.22:
- Added a new class "RTSPRegisterSender" that sends (and handles the \ 
response to) our custom RTSP "REGISTER" command.
  This class uses a "RTSPClient" to do the sending, thereby \ 
simplifying the handling of the RTSP response, and also
  handing authentication.  We also use this class to improve and simplify the \ 
implementation of "RTSPServer::registerStream()".
- Added a new demo application "registerRTSPStream" to the \ 
"testProgs" directory.  This application can be used to send
  a custom RTSP "REGISTER" command to a RTSP client or proxy server.  \ 
(Note, however, that servers that wish to register their
  own streams should continue to use the \ 
"RTSPServer::registerStream()" method to do so - not this \ 
application.)
- Updated the "LIVE555 Proxy Server" application to take an optional \ 
'-U <username> <password>' command-line option.
  This option specifies a username,password pair to use to authenticate (if \ 
necessary) incoming "REGISTER" commands.
- Added the ability to authenticate incoming RTSP "REGISTER" commands, \ 
and added a new option "-k <username> <password>"
  to "openRTSP" to allow the user (in combination with the \ 
"-R" option) to specify access control on incoming REGISTER commands.
- Added the ability for "RTSPServer" subclasses to have different \ 
'authentication databases' for different RTSP commands.
- Moved some of the implementation of "RTSPClient::sendRequest()" into \ 
a new virtual function "setRequestFields()".
  This makes it easier for a subclass to implement a new custom RTSP command, if \ 
desired.  (We now use this to implement
  the sending of our custom "REGISTER" command.)
- Reordered the member function implementations in "RTSPClient.cpp" to \ 
better match the order that they're defined
  in "RTSPClient.hh".

2013.10.18:
- Updated the implementation of the "REGISTER" command to conform with \ 
our recent IETF Internet-Draft
  ("draft-finlayson-rtsp-register-command-00").  The \ 
"RTSPServer::registerStream()" function has been modified accordingly \ 
to take
  two new optional parameters: "receiveOurStreamViaTCP" (Boolean), and \ 
"proxyURLSuffix" (string).
- Made the "RTSPServer" code's parsing of "Transport:" \ 
headers a little more robust.

2013.10.16:
- Updated the way that "RTSPClient" sends "OPTIONS" \ 
commands.  If we are currently part of a session, then we add a
  "Session:" header to the request.
- Changed the HTTP version - used in our RTSP-over-HTTP implementation - from \ 
1.0 to 1.1.  (I don't think this matters at all,
  but most HTTP used elsewhere is version 1.1.)

2013.10.11:
- Fixed a bug in the interpretation of bits in the 'video-specific header' in \ 
"MPEG1or2VideoRTPSource", when slices
  are present.  (Thanks to David Verbieren for reporting this.)
- Fixed "RTSPServerWithREGISTERProxying" to include \ 
"REGISTER_REMOTE" in the list of supported command names returned in \ 
response
  to an "OPTIONS" command.  (Thanks to Bob Bischan for noting this.)

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

2013.10.08:
- Updated "RTSPServerWithREGISTERProxying" to automatically generate a \ 
proxy stream name "registeredProxyStream-N"
  for the URL of each proxy stream that's created using the "REGISTER" \ 
or "REGISTER_REMOTE" command, rather than trying to use
  the suffix in the back-end stream URL - in case that's excessively complex \ 
(e.g., with parameters).

2013.10.07:
- The "LIVE555 Proxy Server" was not properly passing the 'verbosity \ 
level' (specified by the "-v" or "-V" option)
  to a new "ProxyServerMediaSubsession" object created as a result of \ 
a RTSP "REGISTER" command (handled if the "-R"
  option was given).  To fix this we needed to update the signature of \ 
"RTSPServerWithREGISTERProxying::createNew()"
  to take a new "verbosityLevelForProxying" optional parameter.
  (Thanks to Bob Bischan for bringing this to our attention.)

2013.10.03:
- Updated the "socketJoinGroup()" and "socketJoinGroupSSM()" \ 
functions to set the IP_MULTICAST_ALL socket option to 0,
  if that option is defined.  (The P_MULTICAST_ALL socket option is defined in \ 
modern versions of Linux to overcome
  a bug in the Linux kernel's default behavior.  This option, when set to 0, \ 
ensures that we receive only packets that were sent
  to the specified IP multicast address, even if some other process on the same \ 
system has joined a different multicast group
  with the same port number.)
  (Thanks to Michel Promonet for the suggestion.)
- Made some changes to the server implementation of RTSP-over-HTTP to \ 
potentially make it possible for web browsers to
  use this.

2013.10.02:
- Updated the change made in version 2013.09.27 to ensure that we don't have any \ 
background reading still taking
  place on the datagram sockets that we close when we switch to \ 
RTP/RTCP-over-TCP streaming.

2013.10.01:
- Made a minor fix to the previous release (to stop the proxy server from \ 
attempting to send a "PAUSE" command
  immediately after it receives a RTCP "BYE" from the back-end server).

2013.09.30:
- Updated the way that the "ProxyServerMediaSession" code handles a \ 
RTCP "BYE" packet from the back-end server.  It now
  treats this as if the connection to the back-end server had closed, by \ 
reopening the connection, and sending another "DESCRIBE".
  (Thanks to Yogev Cohen for the suggestion.)

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

2013.09.18:
- Fixed an obscure bug - triggered by the "ProxyServerMediaSession" \ 
code - that could sometimes cause a previously deleted object
  to be accessed.  (Thanks to Yogev Cohen for reporting this.)

2013.09.11:
- It turns out that the fix that we'd made back in version 2012.10.04 to (try \ 
to) prevent RTCP reports from being sent over
  TCP connections prematurely was incomplete.  (It had prevented only \ 
"SR" reports - not "RR" - from being sent.)
  This version fixes this.  (Thanks to Stanley Biggs for reporting this.)
- Made an update to the previous change to the way that "openRTSP" \ 
handles the "-Q" option.

2013.09.08:
- Made a minor change to the way that "openRTSP" handles the \ 
"-Q" option (to address an issue that someone reported).

2013.09.07:
- Improved the bugfix that was in the previous release (because that fix still \ 
had a deleted object being accessed).

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

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

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

2013.08.15:
- Fixed the implementation of the 'trimTrailingZeros' option in \ 
"base64Decode()" so that it trims only extraneous 'padding' bytes.
  (Thanks to Chris Richardson for the suggestion.)
- Changed the way that some "RTSPServer" command implementations call \ 
"setRTSPResponse()", to make it more obvious to developers
  how a subclass could reimplement these commands.

2013.08.05:
- Updated the "openRTSP" client application so that we no longer wait \ 
for a response to the "TEARDOWN" command if we were
  signaled (via "kill -HUP") to end.  (This ensures that the program \ 
will end even if the server hangs on the "TEARDOWN" command.)
- Fixed a tiny memory leak that can sometimes occur when destroying a \ 
"RTSPClient" object.  (Thanks to Michel Promonet.)

2013.07.31:
- Changed "setServerRequestAlternativeByteHandler()" to be a static \ 
member function of "RTPInterface", because it doesn't
  need to refer to a specific "RTPInterface" object.  Also added a \ 
corresponding function
  "clearServerRequestAlternativeByteHandler()" (that just sets the \ 
'handler' and 'client data' parameters to NULL).
  We also make sure that we call this latter function in the \ 
"RTSPClient" destructor.  This fixes the *real* bug that
  Andrey Shvyrkin reported.)
- Added a new "-C" option to "openRTSP" to specify that the \ 
RTSP client should ask for a multicast stream, if the server doesn't
  already specify one.  (Note that not all servers will support this.)  (Thanks \ 
to Michel Promonet for the suggestion.)

2013.07.30:
- Moved the call to "RTPInterface::stopNetworkReading()" from the \ 
"RTCPInstance" and "(MultiFramed)RTPSource" destructors to \ 
the
  "RTPInterface" destructor.  This means that it will also be called \ 
when a "RTPSink" is destroyed.  Even though a "RTPSink"
  doesn't actually do any 'network reading', calling \ 
"stopNetworkReading()" when it's destroyed will cause its socket to \ 
get
  deregistered properly if it's streaming RTP-over-TCP.  (This fixes a bug that \ 
was reported by Andrey Shvyrkin.)

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

2013.07.03:
- Fixed some minor memory leaks in "RTPInterface".  (Thanks to Chris \ 
Richardson.)

2013.06.30:
- Fixed an obscure bug in our implementation of RTP/RTCP-over-TCP that could \ 
cause a "select()" error (due to an already-closed
  socket being checked) if the TCP connection was not closed cleanly.
  (Thanks to Andrey for reporting and helping track this bug down.)
- Updated the implementation of "RTSPServer"s handling of \ 
RTSP-over-HTTP to allow for the possibility of the input Base64
  command string containing whitespace.  We now strip this whitespace (if any) \ 
before calling "base64Decode()" on the data.
  (Thanks to Chris Richardson for this suggestion.)
- Added a new, alternative version of "base64Decode()" that takes the \ 
length of the input string as a parameter.
  This saves a call to "strlen()" if we already know the length of the \ 
input string.
- In "MPEG2TransportStreamMultiplexor.cpp", we rename the constants \ 
"PAT_FREQUENCY" and "PMT_FREQUENCY" to the more accurate
  names "PAT_PERIOD" and "PMT_PERIOD".

2013.06.18:
- We now support two new, custom RTSP requests: "REGISTER" and \ 
"REGISTER_REMOTE".  These RTSP requests are currently non-standard;
  however, we will be submitting an IETF Internet-Draft document that describes them.
  These requests make it possible for a server (or some 3rd party) to \ 
'advertise' a RTSP stream (given by a "rtsp://" URL) to
  a RTSP client application, or to a proxy server.  The client application - or \ 
proxy server - can then start accessing this
  RTSP stream, as it normally would.  However, as a special feature (if the \ 
request name was "REGISTER" and not "REGISTER_REMOTE"),
  the client application or proxy server gets to reuse the TCP connection that \ 
was used to send the "REGISTER" request.
  This can be useful if the server is behind a firewall or NAT, but the client \ 
application (or proxy server) is on
  the public Internet.
  To send a "REGISTER" request (for an existing stream, described by a \ 
"ServerMediaSession" object that was added to a "RTSPServer"
      object), call the new member function
	   "RTSPServer::registerStream()"
      specifying the remote client (or proxy server)'s name or IP address, and \ 
port number.
  To create a simple server that accepts incoming "REGISTER" (or \ 
"REGISTER_REMOTE") requests, and then creates a new \ 
"RTSPClient"
      object to handle the "rtsp://" URL specified by each such \ 
incoming request, create a
	 "HandlerServerForREGISTERCommand"
      object, by calling \ 
"HandlerServerForREGISTERCommand::createNew()" (see \ 
"liveMedia/include/RTSPClient.hh").
      (For an illustration of this, note how we implement the new '-R' \ 
command-line option for the "openRTSP" application.)
  To create a proxy server that automatically accepts incoming \ 
"REGISTER" (or "REGISTER_REMOTE") requests, and proxies the
      "rtsp://" URL specified by each such incoming request, create a
         "RTSPServerWithREGISTERProxying"
      rather than a usual "RTSPServer".
      (For an illustration of this, note how we implement the new '-R' \ 
command-line option for the "LIVE555 Proxy Server".)
- Added a new command-line option '-R' to the "LIVE555 Proxy Server" \ 
application.  This option tells the server to accept incoming
  "REGISTER" (or "REGISTER_REMOTE") requests - telling the \ 
server about a new stream to proxy.  This also allows a 'back-end'
  server to "REGISTER" one or more of its streams with the proxy \ 
server - with the proxy server then getting to reuse
  the TCP connection that the server had used to contact the proxy server.  \ 
(This can be useful if the 'back-end' server is behind
  a firewall or NAT, with the proy server being on the public Internet; in this \ 
case, you may also wish to use the "-t" option,
  telling the proxy server to also request RTP-over-TCP streaming from the \ 
back-end server.)
  Note also that if you give the '-R' option to the "LIVE555 Proxy \ 
Server", then you no longer need to specify any back-end
  "rtsp://" URL(s) on the command line (though you still may do this).
- Added a new command-line option '-R' (or '-R <port-num>') to the \ 
"openRTSP" RTSP client demo application.
  This option - which can be given instead of a "rtsp://" URL - tells \ 
"openRTSP" to wait - on the specified port number - for
  an incoming "REGISTER" or "REGISTER_REMOTE" request, \ 
announcing a "rtsp://" URL.  When it receives such a request, it opens \ 
and
  streams from the specified "rtsp://" URL, as normal.
  (If <port-num> is omitted from the '-R' option, then \ 
"openRTSP" will choose (and display) its own port number.)
- Some RTSP clients apparently periodically send an "OPTIONS" request \ 
- with a "Session:" id - to indicate client liveness.
  This is of dubious legality (and these clients should really be sending RTCP \ 
"RR"s anyway), but we now recognize such requests
  as indicating client 'liveness'.  (Thanks to Chris Richardson for the suggestion.)

2013.06.14:
- Updated the constructor to "RTSPClient" (and its subclasses - in \ 
particular "ProxyRTSPClient") to add a
  'socket number to server' parameter.  This socket number (if >=0) is the \ 
socket of an existing TCP connection to the
  server.  This allows you to create a RTSP client object from an existing TCP \ 
connection.  (If this is done, the supplied
  "rtsp://" URL must point to the server that's at the endpoint of the \ 
TCP connection.)
  The "RTSPClient::createNew()" function also takes a 'socket number \ 
to server' parameter, but this has a default value of -1,
  so existing code that creates "RTSPClient"s using only the \ 
"createNew()" function will not need to change.
- Fixed a very minor bug (that would, in practice, likely never get triggered) \ 
in the "H264VideoStreamParser" code.
  (Thanks to Julien Vary for the report.)

2013.06.06:
- Removed a "#define DEBUG 1" that had accidentally been left in \ 
"RTSPServer.cpp".  (Thanks to Warren Young for noting this.)

2013.05.30:
- Support for the old, deprecated 'synchronous' "RTSPClient" interface \ 
has now been completely removed.  Developers have had
  three years now to upgrade to using the asynchronous "RTSPClient" \ 
interface.
- We temporarily disabled the RTCP "BYE"-sending change that we made \ 
in version 2013.04.23, because that doesn't work correctly
  for multiple clients that are streaming from the same data source (i.e., if \ 
"reuseFirstSource" is True).
  (This means that once again, for now, RTCP "BYE"s will not get sent \ 
when "closeAllClientSessionsForServerMediaSession()" or
  "deleteServerMediaSession()" is called.  However, this will get \ 
fixed in some future release.)
  (Thanks to Subhankar Saha for noting this.)
- We now recogize the "width" and "height" parameters in \ 
"a=fmtp:" SDP lines.  These parameters are non-standard, but
  are sometimes used to specify the video width and/or height.  (Thanks to Claes \ 
Erlandsson.)
- Added "protected:" "setRTSPResponse()" function shortcuts \ 
to "RTSPClientSession", so that subclasses of \ 
"RTSPClientSession"
  can call them, if desired.
  (Thanks to Scott Taylor for the suggestion.)
- Changed the definition of "Boolean" (for newer Windows compilers) \ 
from a #define to a typedef.
- Moved "BitVector.hh" to the liveMedia "include" directory, \ 
so that applications can use the "BitVector" class, if desired.
- Removed <cr> characters that were at the end of each line of \ 
"config.armlinux".
- Began adding support for a new, custom "REGISTER" \ 
(server->client) RTSP command.  This is not finished, so don't use it yet.

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

2013.04.29:
- Fixed a bug that was introduced in version 2013.04.21 when we added an \ 
optimization for handling RTP-over-TCP channels.
  (Sometimes a "SocketDescriptor" structure might have been accessed \ 
just after it was deleted.)

2013.04.23:
- Make sure that the "RTSPServer" sends a RTCP "BYE" \ 
whenever a "ServerMediaSubsession" object is deleted.  In particular,
  a RTCP "BYE" will now be sent (for each subsession) whenever \ 
"closeAllClientSessionsForServerMediaSession()" or
  "deleteServerMediaSession()" is called.
- Fixed a bug that would sometimes cause a proxy RTSP server to send invalid \ 
RTCP reports to front-end clients.

2013.04.22:
- Fixed a bug in the support for decoding '%<hex><hex>' sequences \ 
defined in version 2013.03.31
- Updated the #ifdef in "Boolean.hh" to allow Windows developers to \ 
use our "Boolean" type even if "bool" is defined.
  (To do this, define "USE_LIVE555_BOOLEAN" on the command line.)

2013.04.21:
- Fixed a bug in "MultiFramedRTPSource" that could cause a buffer data \ 
structure to be accessed after deletion in rare
  circumstances (if a RTP-over-TCP read failed).  (This may fix a problem \ 
reported by Jeff Shanab.)
- Modified the way that the "RTPInterface" code handles the reading \ 
and processing of RTP-over-TCP channels, to perform better
  in the case when we are not handling all subsessions of a RTSP stream.  \ 
(Thanks to Colin Caughie for this suggestion.)
- Updated the "MPEG2TransportStreamMultiplexor::doGetNextFrame()" \ 
implementation to occasionally complete delivery
  to its downstream object by returning to the event loop, rather than by \ 
calling "FramedSource;:afterGetting()" directly.
  This eliminates the possibility of stack overflow caused by excessively large \ 
input frames.
  (Thanks to Markus Schumann for bringing this issue to our attention.)

2013.04.16:
- Added a #define to the "testRTSPClient" code to specify that the \ 
application requests, by default, RTP/UDP streaming.
  If you wish, you can easily change this to request RTP-over-TCP streaming.
- Made "RTPSource::curPacketRTPTimestamp()" "private:", to \ 
make it clear that receiving (client) code never needs to see
  RTP timestamps, because the RTP timestamp <-> presentation time \ 
translation is done automatically by our software.
- Moved some "RTPSink" member functions from "public:" to \ 
"protected:", because they're not intended to be used outside
  this class (or by the RTCP implementation).
- Updated the "RTPInterface" code to ensure that the socket hash table \ 
is always deleted when it's empty, to further satisfy
  memory-leak obsessive people.
- Made some minor changes to the "ProxyServerMediaSession" code to \ 
avoid some compiler warnings.

2013.04.08:
- Some systems needed to #include <ctype.h> in "RTSPCommon.cpp" \ 
to compile "isdigit()", used by the code that we added in
  version 2013.03.31.  (Thanks to Michel Promonet for noting this.)

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

2013.04.05:
- Updated the "RTSPClient" implementation of "GET_PARAMETER" \ 
to handle response stringss that don't begin with the parameter name.
  In this case, we return the entire result string.

2013.04.04:
- Because at least one IP camera out there seems to crash whenever it receives a \ 
"GET_PARAMETER" command, even though it
  reported - in response to our earlier "OPTIONS" command - that it \ 
supported "GET_PARAMETER", we updated the
  "ProxyServerMediaSession" code to send "GET_PARAMETER" as \ 
a 'liveness' command only if the server earlier reported
  (in the "SETUP" response's "Session:" header) a non-zero \ 
"timeout" parameter.  (Thanks to Roman Gaufman for demonstrating
  such a buggy server.)

2013.04.01:
- Our "ProxyServerMediaSession" code can now proxy JPEG video RTP \ 
streams.  (It does so by copying the raw JPEG/RTP payloads from
  a "SimpleRTPSource" to a "SimpleRTPSink", without \ 
interpreting the JPEG-specific header fields at all.  We also had to add
  a hack for 'copying' the RTP 'M' bit as well.)
- Some minor changes to eliminate some compiler warnings.

2013.03.31:
- Added support for decoding '%<hex><hex>' sequences if they exist \ 
in RTSP URL stream names.  (This allows media server file
  names to contain spaces, or non-ASCII UTF-8 characters, for example.)  (Thanks \ 
to Warren Young for proposing this.)
- Our "ProxyServerMediaSession" code currently does not support the \ 
proxying of JPEG video or AMR audio streams
  (because the data output by the "RTPSource" object is not in a form \ 
that can be fed directly into the corresponding
  "RTPSink" object).  This may be fixed sometime in the future, but, \ 
in the meantime, we output an error message
  (when in 'verbose' output mode) if we try to proxy such streams.

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

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

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

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

2013.02.05:
- Fixed an obscure bug in "MultiFramedRTPSource": When such a source \ 
is 'stopped', we need to make sure that any pending delivery
  to the downstream object has also been unscheduled.  (Thanks for Claes \ 
Erlandsson for helping to track this down.)
- Updated "liveMedia/include/InputFile.hh" to reflect the fact that \ 
WinCE - like other versions of Windows - supposedly does not
  support treating open files as "select()"able sockets.  (Thanks to \ 
Simon Roehrl.)
- Updated "config.iphoneos" and "config.iphone-simulator" to \ 
update "IOS_VERSION" to 6.1

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

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

2013.01.22:
- Improved the way that proxy RTSP servers respond to a back-end stream \ 
signaling its closure (by sending a RTCP "BYE").
  (This also fixes a bug (and abort) that some people were seeing in this situation.)

2013.01.21:
- Fixed a bug in the "RTSPServer" request parsing code that we changed \ 
in version 2013.01.18.  (It wasn't properly parsing
  RTSP requests that ended with the "CSeq:" header.)  (Thanks to \ 
Rafael Gil for noting this.)
- The "LIVE555 Media Server" (currently just the source code version, \ 
not the pre-built binary versions)
  now support streaming from ".vob" files (i.e., VOB files, containing \ 
MPEG-2 video and AC-3 audio).

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

2013.01.18:
- Changed the "RTSPServer" request parsing code so that it passes only \ 
the first incoming request's header portion to
  the call to "parseRTSPRequestString()".  Previously, it was passing \ 
the entire input buffer, which could cause
  "parseRTSPRequestString()" to return incorrect results if more than \ 
one request was pipelined, and the first request
  did not include a "Content-Length:" header, but some subsequent \ 
pipelined request did.
- More changes to some Makefile definitions that were apparently breaking in \ 
some versions of Windows.

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

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

2013.01.04:
- Fixed a bug in the RTSP server handling of "RTSP-over-HTTP" that \ 
could cause a crash in unusual circumstances.
  (Thanks to Chris Richardson for noting this.)
- Removed a bogus, unnecessary binary file that had somehow found its way into \ 
the "liveMedia" directory.

2013.01.03:
- Fixed a bug in our RTSP server's implementation of RTSP-over-HTTP that could \ 
cause a "Bad file descriptor" select() error
  to occur when a RTSP-over-HTTP session gets closed.  (Thanks to Rafael Gil for \ 
bringing this to our attention.)
- Updated the "BasicTaskScheduler" implementation to print out some \ 
extra debugging information if the "select()" call failed
  (e.g., with a "Bad file descriptor" error).  Because these errors \ 
are typically caused by an invalid socket number
  (i.e., a socket number that had already been closed) being used in \ 
"select()", we now print out the sockets that were
  being used in the "select()" call.

2012.12.24:
- Argh! Really fixed this time.

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

2012.12.22:
- In the previous release, we had forgotten to add an "install:" \ 
target to the top-level Makefile.  (Thanks to Benjamin Drung for
  noting this.)

2012.12.21:
- Updated the support for building shared libraries - first introduced in \ 
version 2012.12.15 - to add an "install:" Makefile
  rule, and to make symbolic links to alternative names of the shared libraries. \ 
 (Thanks to Benjamin Drung.)

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

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

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

2012.11.29:
- Fixed a bug in "ProxyServerMediaSession" that would be triggered if \ 
a "RTSPServer" that uses such an object were deleted.
  (This also fixes a memory leak that would occur if a proxy's back-end server \ 
failed, but then restarted.)
  (Thanks to Sergei Bastrakov for reporting this bug.)

2012.11.28:
- Fixed a bug in "ProxyRTSPClient" that was causing some background \ 
tasks to not be halted when a "ProxyServerMediaSession" is
  deleted.  (Thanks to Sergei Bastrakov for bringing this to our attention.)

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

2012.11.17:
- Fixed a bug in "ProxyRTSPClient".  When we discover that the \ 
connection to the back-end server has failed, we need to
  close any existing front-end RTSP client connections before we delete all of \ 
the "ProxyServerMediaSubsession"s.
  The signature to "ProxyServerMediaSession::createNew()" has also \ 
changed; it now takes a pointer to the "RTSPServer" as parameter.

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

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

2012.11.05:
- Made the "ProxyServerMediaSubsession" implementation a little more \ 
robust, by making sure that an object doesn't try to handle
  reception of a RTCP "BYE" after it's been deleted.
- Updated "config.iphoneos" to update "LINK_OPTS" to fix a \ 
linking problem (and also update "IOS_VERSION" to 6.0).
  (Thanks to Chris Ballinger.)

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

2012.10.22:
- Updated "AVIFileSink" to add an index at the end.  (Thanks to \ 
"qiuchangyong qiuchangyong".)
- Updated the "MediaSession" implementation to accept \ 
"audio/OPUS" as a valid RTP payload format (which can be implemented
  using a "SimpleRTPSource").

2012.10.21:
- Fixed a bug in "PresentationTimeSessionNormalizer".  (Thanks to \ 
Bruno Marchand.)

2012.10.19:
- Fixed a bug in the way that our RTSP proxy implementation reinitializes itself \ 
after reestablishing connectivity with the
  back-end server.  It now deletes all "ProxyServerMediaSubsession"s, \ 
so that they will get reestablished when the response
  to the new "DESCRIBE" command comes back.  (This also makes it \ 
possible for the back-end stream to restart with different
  parameters.)  (Thanks to Aashish Kaushik for reporting this problem.)
- Moved the definition of the "PresentationTimeSessionNormalizer" and \ 
"PresentationTimeSubessionNormalizer" classes to
  "include/ProxyServerMediaSession.hh", so that developers can use \ 
them if they wish.  (Note, though, that those classes were
  intended for use only within our "ProxyServerMediaSession" (etc.) \ 
implementation, so don't complain if they don't do what you
  want.)
- Added a "#ifndef RTSP_BUFFER_SIZE"/"#endif" around the \ 
definition of RTSP_BUFFER_SIZE in "liveMedia/include/RTSPServer.hh",
  to allow this definition to be changed at compile time if desired.  \ 
(Suggestion from Matt Schuckmann.)

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

2012.10.17:
- Maved "RTSPClient::reset()" from "private:" to \ 
"protected:", and made "ProxyRTSPClient::reset()" call \ 
"RTSPClient::reset()"
  (at the end).  This causes the "ProxyRTSPClient" object to properly \ 
get reset (and, in particular, the 'session id' to get
  reset) if we have to restart a connection with a back-end server.
  (Thanks to Aashish Kaushik for reporting this issue.)
- Made the implementation of ending RTP/RTCP-over-TCP a little more efficient \ 
(by implementing each packet send using 2 calls
  to "send()", rather than 4).

2012.10.16:
- Updated our implementation of sending RTP/RTCP-over-TCP so that if the initial \ 
'$' send() succeeds, we force the send()s of
  the remaining data (the 'stream channel id', packet size, and packet data) to \ 
succeed, even if it means that we have to
  temporarily block by doing so.  This makes servers whose RTP/RTCP-over-TCP \ 
streams exceed the capacity of the network
  handle this a bit more gracefully, avoiding the possibility that 'incomplete' \ 
packet data will appear on receivers'
  TCP connections.

2012.10.12:
- We backed out the change that we made (back in version 2012.06.12) to ignore \ 
SDP-specified port numbers for unicast streams,
  because this broke our SIP client (which has no way of telling the server that \ 
it wants to use a different port number).
  Now, if you want to ignore SDP-specified port numbers, you'll need to compile \ 
"MediaSession.cpp" with the definition
  -DIGNORE_UNICAST_SDP_PORTS=1

2012.10.11:
- Fixed a bug that would cause "playSIP" to crash if run without a \ 
username/password parameter.  (Thanks to Sam Machin.)
- Added "#include <errno.h>" to \ 
"groupsock/include/NetCommon.h", to reduce the likelihood of compiler \ 
warning messages
  when compiling for Windows.  (Thanks to Bruno Marchand for the suggestion.)
- Updated "StreamReplicator" to call "stopPlaying()" on the \ 
upstream source if/when all replicas have closed.
  (Thanks to Bruno Marchand for the suggestion.)

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

2012.10.01:
- Made the code for receiving RTP/RTSP-over-TCP streams a little more robust.  \ 
(Thanks to Rex Wolf.)
- Made a minor fix to the way that "SIPClient" sends a \ 
"BYE".  (Thanks to Frederic Nadeau.)
- Made the "fDestinationsHashTable" field in \ 
"OnDemandServerMediaSubsession" "protected:" rather than \ 
"private:", to allow
  subclasses to access it, if desired.  (They should only do lookups in the \ 
table, though.)
  (Thanks to Matt Schuckmann for this suggestion.)

2012.09.27:
- Fixed the RTSP proxying implementation so that the presentation times of \ 
relayed frames are properly aligned with
  'wall clock' time, so that receivers will get these presentation times \ 
accurately (using RTCP).  We also defer RTCP "SR"
  reports on the outgoing ('front-end') streams until the incomong streams' \ 
presentation times have been RTCP-synchronized
  (because until then, the incoming presentation times are not accurate).
  (Thanks to Bruno Marchand for bringing this issue to our attention.)
- Updated the "ProxyRTSPClient" implementation so that if the \ 
connection to the back-end server fails, it tries to restore the
  connection by sending a new "DESCRIBE" command. This is more \ 
reliable (especially for back-end servers that use authentication.)
  (Thanks to Lei Wu for this suggestion.)
- Added optional Boolean parameters to the "createNew()" functions for \ 
the "MPEG4VideoStreamDiscreteFramer",
  "MPEG1or2VideoStreamDiscreteFramer", and \ 
"DVVideoStreamFramer" filters, to specify that the input frames' \ 
presentation
  times should be passed through unmodified.  (The default behavior for these \ 
filters is to modify at least some presentation
  times.)  This parameter is necessary for our RTSP proxying implementation \ 
(because it wants to relay frames' presentation times
  unmodified.)
- Updated "RTSPClient.hh" to move the "fCSeq" and \ 
"fCurrentAuthenticator" from "private:" to \ 
"protected:".
  This makes it possible for subclasses to implement variants of RTSP commands.
  (Thanks to Matt Schuckmann for this suggestion.)
- Updated the "MediaSession" implementation to accept \ 
"audio/ILBC" as a valid RTP payload format (which can be implemented
  using a "SimpleRTPSource").
- Added a "usesTCPTransport()" Boolean function to \ 
"RTSPServer::RTSPClientSession" so that subclasses can easily know \ 
whether
  (at least one subsession of) the session is being streamed via TCP.
- Removed a small piece of unnecessary code from the "testRTSPClient" \ 
code.  (Thanks to Anton Zvyagintsev for noticing this.)

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

2012.09.12:
- Fixed a bug in the URL parsing code in "RTSPCommon.cpp" that would \ 
cause parsing to fail for RTSP urls that don't have any
  slashes after the "host" or "host:port" part.  (Such URLs \ 
would usually be used only for operations - such as "OPTIONS" - on the
  entire server.)  (Thanks to Tamas Vincze for reporting this.)

2012.09.11:
- Fixed a problem whereby a "RTSPClient" streaming RTP/RTCP-over-TCP \ 
would sometimes send its first RTCP "RR" packet before
  the server had had a chance to handle the "PLAY" command.  This \ 
caused a problem for our server, because it would receive
  the RTCP "RR" packet over the RTSP command connection, before it \ 
knew how to deal with this.
  (Thanks to Ralf Globisch for reporting this issue.)
- Fixed a bug in "MPEG2TransportStreamFromESSource": Its destructor \ 
wasn't stopping the delivery from upstream objects.
  (Thanks to Jing Li for reporting this.)
- Updated "AVIFileSink" to add a 'start code' before each H.264 NAL \ 
unit that it writes to the file.
  (Thanks to 'giuchangyong' for the suggestion.)
- Added "-DTIME_BASE=int" to the COMPILE_OPTS for each of the \ 
"config.macosx*" configuration files (because someone reported
  that it seems to be necessary for them).

2012.09.07:
- The socket error handling improvement that we made back in version 2012.07.24 \ 
inadvertently broke a workaround that we had
  made (much earlier) for a bug in Windows.  This caused problems for some \ 
Windows clients that receive via RTP-over-TCP.
  This version should fix those problems.
- Modified the implementation of \ 
"MatroskaFileParser::parseEBMLVal_float()" to remove some aliasing \ 
that might cause
  some compilers to generate incorrect code when optimizing.  (Thanks to 'Owen' \ 
for noting this issue.)

2012.09.06:
- Fixed a bug in "RTSPServer" that would cause incorrect RTSP \ 
responses to be sent back in response to "PAUSE"
  (and some "GET_PARAMETER" and "SET_PARAMETER") commands.  \ 
(Thanks to Matthias Meding for reporting this.)

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

2012.08.30:
- Fixed an obscure bug in the "MatroskaFile" constructor if the \ 
specified input file does not exist.
  Also, fixed an obscure bug in "RTSPServer" if it receives a \ 
malformed request.
  (Thanks to Kevin Kuo for reporting this.)

2012.08.29:
- The private->protected change to "fPreferredFrameSize" in the \ 
previous release was done in the wrong header file.  It should
  have been done in "WAVAudioFileSource.hh", not \ 
"ByteStreamFileSource.hh".

2012.08.28:
- Added a new 'filter' class "EndianSwap24", for byte-swapping 24-bit \ 
values between little and big-endian.
- Updated "WAVAudioFileServerMediaSubsession" to support the streaming \ 
of 24-bit (or 20-bit) WAV audio files.
  (Thanks to 'Raph' for this suggestion, and for providing an example file.)
- Brought the "testWAVAudioStreamer" demo application up-to-date, by \ 
increasing the variety of WAV file formats that it can support.
- Added a "-U <absolute-start-time-string>" option to \ 
"openRTSP", to support seeking by 'absolute' time (if, of course, the
  server supports this).  (Thanks to Michel Promonet for this suggestion.)
- Updated the RTSP server implementation so that, by default, if a client tries \ 
to "PLAY" a stream using an 'absolute' time,
  then the server will refuse by sending back a regular (NPT) "Range:" \ 
header instead.  (If you want the server to handle
  seeking by 'absolute' time, then you need to reimplement \ 
"ServerMediaSession::seekStream()" or
  "OnDemandServerMediaSubsession::seekStreamSource()".)
- Made the "fPreferredFrameSize" variable in \ 
"ByteStreamFileSource.hh" "protected:" rather than \ 
"private:", to allow subclasses
  of "WAVAudioFileSource" to change its value, if desired.

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

2012.08.17:
- Fixed the RTSP server support for MPEG Transport Stream 'trick play' to stream \ 
the correct amount of data when a stream
  'duration' is specified for fast forward or reverse play.  (Thanks to Michael \ 
Boom for reporting this bug.)
- Made some changes to "liveMedia/include/RTSPServer.hh" to make old \ 
compilers happy.

2012.08.12:
- Modified the change to the definitions of EINTR, EAGAIN, EINPROGRESS, \ 
EDOULDBLOCK in "groupsock/include/NetCommon.h"
  (made in the previous release) to ensure that they are always mapped to the \ 
"WSA*" equivalents.

2012.08.08
- A major update to the RTSP server implementation.  A single RTSP client \ 
session (i.e, the streaming of one particular stream
  to one particular client) can now use an arbitrary number (>=1) of TCP \ 
connections.
  For more details, see:
      http://lists.live555.com/pipermail/live-devel/2012-July/015571.html
- Put #ifndef/#endif around the (Windows-only) definitions of EINTR, EAGAIN, \ 
EINPROGRESS, EDOULDBLOCK in
  "groupsock/include/NetCommon.h", in case they are already defined by \ 
the system's header files.
  (Thanks to Hyunho Kim for bringing this to our attention.)
- Made a small modification to "H264VideoStreamFramer.cpp" to \ 
eliminate some 'unused variable' compiler warnings
  (when compiling without DEBUG defined).

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

2012.07.24:
- Updated the "RTPInterface" code to better handle socket errors when \ 
reading from TCP sockets.  (Thanks to Barry Stump for
  bringing this issue to our attention.)
- Made sure that some code that calls "fileno()" for doing \ 
asynchronous file reading never gets compiled under Windows
  (where all file reading is synchronous), because some versions of Windows \ 
redefine the result type of "fileno()".
  (Thanks to Sid Price for bringing this to our attention.)
- A member variable of "ProxyServerMediaSession" was not being \ 
initialized correctly (causing a "valgrind" error).
  (Thanks to Jesus Leganes for reporting this.)
- Removed some unnecessary "abort()" calls from the code.

2012.07.18:
- Fixed a minor bug in the "H264VideoStreamParser" code that could \ 
sometimes cause a very short trailing NAL unit to not
  get parsed properly.  (Thanks to John McNamara for reporting this issue.)
- Made some changes to RTSP header parsing, to make it more robust.  (Thanks to \ 
Lionel Orry for the suggestion.)

2012.07.14:
- Updated the RTSP server code to properly handle "Range:" headers of \ 
the form "npt=-<endtime>".
  (Thanks to Michael Boom for bringing this to our attention.)

2012.07.06:
- Modified the implementation of \ 
"ServerMediaSession::generateSDPDescription()" to ignore (skip over) \ 
subsessions that use
  medium or codec names that we don't understand.  (Previously, subsessions like \ 
this would cause a NULL SDP description to be
  returned.)  This allows "ProxyServerMediaSession" to properly handle \ 
sessions like this.  (Thanks to Kiran Thakkar for
  alerting us to an example that illustrated this problem.)

2012.07.03:
- Moved "ProxyRTSPClient" - which had previously been hidden inside \ 
the implementation of "ProxyServerMediaSession" - to
  the "ProxyServerMediaSession.hh" header file, in case developers \ 
want to subclass it.  We also define a new virtual function
  "ProxyServerMediaSession::createNewProxyRTSPClient()" whichh can be \ 
reimplemented to create such subclasses.
  (Thanks to Jesus Leganes for this suggestion.)
- Made "RTSPClient::sendRequest()" a virtual function, and made it \ 
"protected:" rather than "private:", in case subclasses
  want to redefine it (e.g., to do additional functions such as logging).
  (Thanks to Jesus Leganes for this suggestion.)

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

2012.06.23:
- Fixed a bug in "H264VideoStreamParser" that affected the \ 
"testH264VideoToTransportStream" demo application.
  (Thanks to John McNamara for helping to debug the problem.)
- We no longer set a non-default "FileSink" buffer size in the \ 
"testH264VideoToTransportStream" demo application, because the
  "FileSink" is fed by a "MPEG2TransportStreamFromESSource", \ 
ehich delivers only one 188-byte Transport Stream packet at a time.

2012.06.17:
- Fixed a bug in "HTTP Live Streaming" server support.  (Thanks to \ 
Daniel Wang for reporting the problem.)
- Updated the implementation of "triggerEvent()" in \ 
"BasicTaskScheduler" to avoid a possible race condition (if \ 
"triggerEvent()"
  is called from a non-LIVE555 thread).  (Thanks to Matthais Doering for noting \ 
this issue.)
- Updated the "ProxyServerMediaSession" code to ensure that all \ 
front-end "RTCPInstance" objects are created with non-zero
  bandwidth estimates.

2012.06.12:
- If a SDP description specifies a port number for a unicast stream, then we \ 
still choose an ephemeral client port number,
  just as we would if the SDP description had not specified a port number (the \ 
usual case). Renato Mauro reports that some Sony
  network cameras do this; this change lets the client choose a different port \ 
number (which is useful if one host is receiving
  from more than one such camera at once).
- Fixed some minor bugs with Matroska file parsing.  (Thanks to Petr Novak.)
- A field in "RTPTransmissionStats" was not being initialized in the \ 
constructor.  (Thanks to Michel Promonet for noting this.)
- Updated "UsageEnvironment/include/Boolean.hh" to use the 'bool' type \ 
defined for "MSVC++ 8.0, Visual Studio 2005 and higher",
  if that development environment is being used.  Also, fixed a few places in \ 
the code where we were using boolean types
  incorrectly.  (Thanks to Nikolai Vorontsov for these suggestions.)

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

2012.05.11:
- Really fixed the bug in the implementation of \ 
"StreamReplicator::deleteReplica()" that I was supposed to have fixed \ 
in
  the previous revision.  (Thanks to Bruno Abreu for setting us straight.)
- Fixed the signature of \ 
"MultiFramedRTPSink::curFragmentationOffset()" to return an \ 
"unsigned" rather than a "Boolean".
  (Thanks to Nikolai Vorontsov for noticing this.)

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

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

2012.04.26:
- Added a debugging error message to various "*Sink" classes, to warn \ 
when the "numTruncatedBytes" parameter in the 'after getting'
  function is >0.  When this happens, you need to increase the \ 
"bufferSize" parameter in the appropriate "*::createNew()" \ 
call.
- Changed the buffer size used by the "testH264VideoToTransportStream" \ 
demo application from 10000 to 100000, because input H.264
  NAL units are often larger than 10000 bytes.
- Changed the default 'buffer size' parameter in \ 
"H264VideoFileSink::createNew()" from 10000 to 100000, because input \ 
H.264
  NAL units are often larger than 10000 bytes.
- Changed the signature of "AuxHandlerFunc()" (used by the \ 
"setAuxilliaryReadHandler()" hack) to pass "packetSize" by \ 
reference
  instead of by value.  (Thanks to Keary Griffin for this suggestion; he was \ 
using this mechanism to implement SRTP.)
- Changed the way that we disable the handling of SIGPIPE signals in \ 
"RTSPServer.cpp" (so that the server doesn't get killed
  when clients, running on the same host, get killed).  (Phillipe Clavel \ 
reported that the old method
  - "signal(SIGPIPE, SIG_IGN);" - wasn't working properly on Mac OS X.)

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

2012.04.18:
- Added "ProxyServerMediaSession" - a subclass of \ 
"ServerMediaSession" that can be used to create a (unicast) RTSP \ 
servers
  that acts as a 'proxy' for another (unicast or multicast) RTSP/RTP stream.
- Added a new application "live555ProxyServer", and included it in a \ 
new subdirectory "proxyServer/" in the
  "LIVE555 Streaming Media" distribution.  This application - which \ 
uses the new "ProxyServerMediaSession" class - acts as
  a unicast RTSP server 'proxy' for one or more 'back end' (unicast or \ 
multicast) RTSP streams, specified on the command line.
- Fixed an obscure bug in RTP/RTCP-over-TCP reading.  (Thanks to Shiyong Zhang \ 
for reporting this.)
- Changed the definition of "Boolean" in \ 
"UsageEnvironment/include/Boolean.hh" from "unsigned" to \ 
"unsigned char",
  to avoid an apparent conflict when compiling for Mac OS X (and also to save \ 
some space).
  (Thanks to Barry Stump for the suggestion.)
- Madea a minor change to "RTPInterface" to accommodate RTSP clients \ 
that call 'startPlaying()' on a "RTPSource" object prior
  to the handling of a RTSP "SETUP" response.  (This change affected \ 
only RTP-over-TCP streams.)
- Changed the "RTSPClient" "fVerbosityLevel" field from \ 
"private:" to "protected:", to allow subclasses to use it in \ 
their own
  debugging output.
- Made some changes to "GroupsockHelper.cpp" that were allegedly \ 
needed for compilation for 'Android'.
- Made a minor change to "NetCommon.h" that allegedly improves/fixes \ 
compilation for some version of Windoze.
- Removed the "MP3HTTPSource" class; it was old code that shouldn't be \ 
used.

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

2012.03.22:
- Fixed a bug in the way that "MPEG1or2DemuxedServerMediaSubsession" \ 
creates "AC3AudioStreamFramer" objects.
  This was causing errors in the way that AC3 audio tracks in VOB files were \ 
being streamed by "testOnDemandRTSPServer".
  (Thanks to "Rustam" for reporting this issue.)
- Corrected a potentially misleading error message in "RTSPClient".  \ 
(Thanks to Sebastien Escudier for reporting this.)

2012.03.20:
- Fixed a bug in the "RTSPServer" implementation that could prevent it \ 
from properly handling 'pipelined' requests
  (such as "SETUP" requests) from a single client.
- Updated the "RTSPClient" code to (when "verbosityLevel" \ 
> 0) output a warning message when the server 'skips over' one of our
  earlier requests.  If this happens, it indicates a bug in the server (perhaps \ 
a bug in the way that the server handles
  pipelined requests - such as the bug that we just fixed in our own server here).
- Fixed a bug in the "RTSPClient" code that prevented it from properly \ 
handling 'pipelined' responses from a single server.
- Fixed a bug in the Matroska file parsing code that could cause an infinite \ 
loop when streaming from a multi-track file.
- Updated the "RTSPServer" code to no longer attempt to seek, or set \ 
the scale of, a subsession within a multi-subsession
  stream.  (Instead, these operations can be done only on the 'aggregate' session.)
- Added a new member function "addFilter()" to \ 
"MediaSubsession".  This allows RTP receivers to add a filter (such as \ 
a 'framer')
  in front of the subsession's "readSource()", changing \ 
"readSource()" to be this new filter.
- Fixed a minor bug in "ServerMediaSession" that was causing it to \ 
generate incomplete default 'info' and 'description' strings
  in SDP descriptions.
- Fixed a minor bug in "T140TextRTPSink": Make sure that the 'idle \ 
timer' (for delivering empty frames downstream) gets turned
  off when the input source closes.
- Fixed the testing of the "mpeg4Mode" parameter to the \ 
"MPEG4GenericRTPSink" constructor, to make it case-insensitive.
- Added new versions of "H264VideoRTPSink::createNew()" that \ 
(optionally) take SPS and PPS NAL units
  (either in raw binary form, or as a 'sprop-parameter-string') as parameters.  \ 
This is useful if you know this information in
  advance, rather than having to get it from the input 'framer' object.
- Added a new version of "H264VideoStreamFramer::setSPSandPPS()" that \ 
takes a 'sprop-parameter-string'
  (instead of the raw binary NAL units) as parameter.
- Added a new version of "MPEG4ESVideoRTPSink::createNew()" that takes \ 
stream configuration information as a parameter.  This is
  useful if you know this information in advance, and don't want to rely upon \ 
the sink getting this from the input 'framer' object.
- Added a member function "MPEG4VideoStreamFramer::setConfigInfo()" \ 
that can be used to (optionally) set stream configuration
  information, without requiring the framer to read it from the input source.
- Added a new version of "VorbisAudioRTPSink::createNew()" that takes \ 
a Base-64-encoded 'configuration' string - rather than
  raw configuration headers - as parameter.
- Added a minor hack to "MediaSubsession" to allow ADU-ized MP3 frames \ 
to optionally be received 'as is',
  instead of always converting them back to MP3 frames for delivery.
- Added a new member function "ServerMediaSession::numSubsessions()" \ 
to return the number of "ServerMediaSubsessions" that have
  been added to the "ServerMediaSession".
- Changed the signature of "base64Decode()" to make its string \ 
argument "char const*" instead of "char*" (for extra type \ 
safety).

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