Subject: CVS commit: pkgsrc/net/liblive
From: Thomas Klausner
Date: 2014-12-13 10:20:02
Message id: 20141213092002.A5E2498@cvs.netbsd.org

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

Files:
RevisionActionfile
1.4modifypkgsrc/net/liblive/patches/patch-ba
1.22modifypkgsrc/net/liblive/Makefile
1.8modifypkgsrc/net/liblive/PLIST
1.15modifypkgsrc/net/liblive/distinfo
1.6modifypkgsrc/net/liblive/patches/patch-aa
1.2modifypkgsrc/net/liblive/patches/patch-config.solaris-64bit
1.1removepkgsrc/net/liblive/patches/patch-ca
1.1removepkgsrc/net/liblive/patches/patch-cb