2006.09.18: - Fixed a bug in the way that "RTPSource" records the maximum sequence number seen so far. (The bug could be triggered by packets arriving out of order.) Thanks to Mallikharjuna Reddy for pointing this out. - When creating new datagram sockets, we now attempt to setsockopt() SO_REUSEPORT and IP_MULTICAST_LOOP, even on Windows. (A version of Windows prior to XP had problems with this, but it's apparently no longer a problem.) 2006.09.12: - Fixed a minor bug in "H264VideoRTPSink". (Thanks to Emiliano Parasassi for noting this.) - If the "totSessionBW" parameter to "RTCPInstance::RTCPInstance()" is zero, print out an error message, and use a value of 1 (kbps) instead. 2006.09.09: - Reenabled asynchronous file reading in "ByteStreamFileSource", after fixing a bug that could lead to a 'race condition' in some circumstances. (The fix was to call "FramedSource::afterGetting()" directly - rather than via the event loop - after delivering data to the downstream object.) - Updated "MPEG2TransportStreamFromESSource" again. Now, we set the "PES_packet_length" field to zero if the input data was larger than 2^16 bytes long. (This is in accordance with the MPEG specifications; thanks to "jeremy at electrosilk.net" for noticing this..) 2006.09.08: - Temporarily disabled asynchronous file reading in "ByteStreamFileSource" until we fix an apparent bug that is causing MPEG streaming to fail. - Updated "MPEG2TransportStreamFromESSource" to print a warning message if the input source delivers data in chunks that are too big to make up a PES packet. 2006.09.07: - Fixed a bug that was preventing the RTCP "RR" packet handler from being called when we were streaming RTP/RTCP-over-TCP. (Thanks to "zhangzx at rcs-9000.com" for noticing this.) 2006.08.26: - Changed the implementation of "ByteStreamFileSource" so that reads from the open file are now done asynchronously, when data becomes available. This matches the code's event-driven execution model better than the previous implementation, which read from files synchronously. It should also perform better in systems that read from more than one file concurrently. - Added Victor Kozhuhov's modifications to the WAV file support code, to allow for WAV files that contain u-law or a-law content (instead of the usual raw PCM). 2006.08.24: - Fixed the way in which "RTSPServer" handles requests that span more than one TCP socket read. These reads are now all handled asynchronously, in accordance with the library's event-driven execution model. (Thanks to Marc Neuberger for noting this.) - Fixed a memory leak in "MultiFramedRTPSource" that would occur if we received packets with duplicate sequence numbers, or if we received excessively delayed packets. (Thanks to David Bertrand for noticing this.) - Changed the order of statements in "~RTSPClient()" to fix a bug (noted by Brain Lai). - Changed "base64Encode()" to take a 'length' parameter, so that it will work with input data that contains '\0' characters. (Thanks to Derk-Jan Hartman for this suggestion.) - Added support - in "RTSPServer" - for the (non-standard) "x-playNow:" header in RTSP requests. (Thanks to Rob Casey for this patch.) - Updated "MediaSession" to parse the (standard) SDP "framerate" attribute (in addition to "x-framerate", which is non-standard). - Changed the parent class of "H264VideoStreamFramer" to be "FramedFilter" (to be consistent with other 'Framer' classes) instead of "FramedSource". (Thanks to Jinfeng Zhang for noticing this.) - Made the "FramedFilter" implementation more robust, in case the supplied input source parameter is NULL. 2006.08.07: - Changed the way that "OnDemandServerMediaSubsession" creates server ports. It now chooses server port numbers starting with a specific port number (which is now an optional parameter to the "OnDemandServerMediaSubsession" constructor). The default value of this initial port number parameter is 6970. This matches the port number range used by other common RTSP server implementations, including Darwin Streaming Server and Helix. - Changed the criterion for whether to send out a RTCP "SR". (Thanks to David Bertrand.) - Fixed an obscure bug in "OnDemandServerMediaSubsession::deleteStream()" (reported by Scott Hayes) - Removed some archaic code that was developed for a customer several years ago, but which is no longer used. 2006.07.04: - Another update to "H264VideoRTPSink" (requested by David Bertrand) 2006.06.28: - Another update to "H264VideoRTPSink". (Thanks to David Bertrand.) 2006.06.27: - Updated "H364VideoRTPSink" - Corrected the definition of MAX_PES_PACKET_SIZE in MPEG2TransportStreamFromPESSource.cpp. (Thanks to Jiri Pinkava for this fix.) 2006.06.23: - Fixed some minor issues with the previous addition of "H264VideoRTPSink" 2006.06.22: - Added "H264VideoRTPSink", for transmitting H.264/RTP streams. (Thanks to Benoit Quirynen and David Bertrand for funding this work.) - Changed the default definitions of IP_ADD_SOURCE_MEMBERSHIP and IP_DROP_SOURCE_MEMBERSHIP (for use if they're not already defined in header files), to make it more likely that SSM joins will properly fail if SSM is not actually implemented on the host OS. - Changed some "delete"s into "delete[]". (Thanks to Wojciech Matyjewicz and Mathur for reporting these bugs.) - Made "sapWatch a bit more robust. (Thanks to Jiri Pinkava for this fix.) 2006.05.17: - Fixed "OnDemandRTSPServer" so that it sets a RTCP "RR" handler, even if "reuseFirstStream" is True. - Changed "RTSPServer" (and the "testOnDemandRTSPServer" demo application) to use a 45-second client liveness timeout, by default. (Previously, no client liveness checking was being done by default.) (Note that client liveness timeouts are done only for unicast streams, not multicast.) - Fixed a bug in the implementation of "BasicHashTable" that arose when we were using hash tables with multi-word-sized keys. 2006.05.15: - No change from the previous release, but the installed ".tar.gz" file had accidentally been deleted. 2006.05.11: - Cleaned up some code in "BasicTaskScheduler" that was allegedly causing problems on a Zaurus. - Changed "TaskScheduler::rescheduleDelayedTask()" so that its "microseconds" parameter is a "int64_t" (to match "scheduleDelayedTask"). (Thanks to David Bertrand for suggesting this.) - Updated "ServerMediaSession:::generateSDPDescription()" to change "a=rtcp: unicast-reflection" to "a=rtcp-unicast: reflection", to reflect the latest version of the IETF's "draft-ietf-avt-rtcpssm" Internet-Draft. (This is for Source-Specific Multicast sessions only.) - Cleaned up "H263plusVideoRTPSink" slightly, to remove an unnecessary member variable. - Removed support for the (experimental and non-standard) "X-MCT-TEXT" payload type. 2006.03.17: - Fixed a bug in "RTSPClient" (that had been introduced in the 2006.02.15 release) that was stopping RTP-over-TCP reception from working. 2006.03.15: - Updated "MediaSession" to parse the "s=" and "i=" lines of input SDP descriptions, and added member functions for returning these string values. (Thanks to Scott Hays or this.) - Updated "MPEG2TransportStreamMultiplexor" to use the audio track for PCR iff there is no video track present. - Made a change to "liveMedia/include/H263plusVideoStreamFramer.hh" to overcome an error reported by some nit-picking compilers. - Fixed a minor bug in "MPEG2TransportStreamFromESSource" (in the way that it handles EOF on input). 2006.03.03: - Updated "MPEG4LATMAudioRTPSource" to allow the LATM data length field to be omitted from the start of each returned audio frame. (The "faad" decoder (used by VLC, for example) needed this.) - Renamed "SECOND" in the "BasicUsageEnvironment" library to "DELAY_SECOND" (and similarly for "ZERO", "MINUTE", "HOUR", "DAY"), to avoid an alleged name conflict with some other code used by VLC. (Thanks to Derk-Jan Hartman for this suggestion.) - Removed some unnecessary code from "testProgs/playCommon.cpp". 2006.02.25: - Updated the previous change to "MultiFramedRTPSource::doStopGettingFrames()", to also reset the object's fields. (Thanks to David Bertrand.) 2006.02.15: - Changed "GetFileSize()" (defined in "liveMedia/include/InputFile.hh") and "ByteStreamFileSource::fileSize()" to return a "u_int64_t", to allow for (potentially) large files. - Changed the "microseconds" parameter to "TaskScheduler::scheduleDelayedTask()" from "int" to "int64_t". This allows for durations greater than the previous ~2000 second limit. - Updated "RTSPClient" to support handling RTSP requests sent by the server. (Some servers send periodic requests back to the client as a keep-alive test.) At present, we just respond to such requests with a "not allowed" error. (Thanks to Khanh Mai for this change.) - Updated "MultiFramedRTPSource::doStopGettingFrames()" to reset the "ReorderingPacketBuffer". (Thanks to David Bertrand for this fix.) - Corrected a small bug in the previous "RTSPClient" modification (noticed by Glen Gray). - Fixed a bug in "ADTSAudioFileSource" when parsing the optional "crc_check" field. (Thanks to Paul Li for noticing this.) 2006.01.27: - Updated "RTSPClient" to: - allow the "parameterName" parameter to "getMediaSessionParameter()" to be NULL - add a "setUserAgentString()" member function, to allow clients to specify an alternative string for "User-Agent:" headers - parse the optional "timeout" parameter in response "Session:" headers, and added a "sessionTimeoutParameter()" member function to retrieve it. (Thanks to Glen Gray for proposing these changes.) - Fixed "H263plusVideoRTPSource" to properly initialize two member variables in its constructor. (Thanks to David Bertrand for this fix.) - Added Bernhard Feiten's support for H.263plus parsing/framing 2006.01.24: - Corrected the maximum PES packet size (in "MPEG1or2DemuxedElementaryStream.cpp") to allow for a 6-byte header. (Thanks to Jiri Pinkava for this fix.) - Fixed "MPEG1or2AudioStreamFramer" to avoid a potential divide-by-zero when it's fed certain malformed MPEG audio data. (Thanks to Eric Peters for this.) - Updated the top-level "Makefile.tail" to make it clear that "testProgs" can't be built until after the 'library' directories are built. This ensures that parallelizing "make"s don't do the wrong thing. 2006.01.05: - Updated "MPEG4VideoStreamFramer" to make the parsing of MPEG-4 video a bit more robust. (Thanks to Khanh Mai for this suggestion.) 2006.01.04: - Updated "OnDemandServerMediaSubsession" to tear down the stream (thus sending a RTCP "BYE") when the input source ends, iff the stream does not have a known duration. (If the stream has a known duration, then we keep the stream alive, in case a client wants to seek backwards in it.) 2005.12.30: - Extended the previous release's fix to also work with the RTSP "OPTIONS" command. 2005.12.29: - Include (if necessary) authentication headers in the initial HTTP "GET" and "POST" commands, if we're setting up RTSP-over-HTTP tunneling. This allows "RTSPClient" to work properly with some Axis cameras, which require authentication on these HTTP commands. 2005.12.23: - Fixed the RTCP port number in the RTSP "Transport:" header "port=" part (for multicast streams). - Updated the change that we made in version 2005.11.02 so that it also sets the port number correctly. 2005.12.15: - Made calls to "select()" more robust, by checking for (and ignoring) EAGAIN or EINTR errors. - Fixed a bug in "MPEG4VideoFileServerMediaSubsession" that could occur if a bad MPEG-4 video file (not containing any initial 'config' data) is read. (Thanks to Trevor Pering for noticing this.) - Removed an undocumented, experimental and rarely-used option from "openRTSP". 2005.12.09: - Updated the RTCP implementation so that reception stats for a SSRC are now kept around even after a RTCP BYE is received, in case we want to use these stats for QOS reports. (However, if a SSRC is reaped due to inactivity, then the reception stats are deleted.) 2005.12.05: - On some systems (notably FreeBSD), "struct sockaddr_in" includes a "sin_len" field, which should be set before the struct is used. We now replace declarations of "struct sockaddr_in" with a macro MAKE_SOCKADDR_IN() (defined in "groupsock/include/GroupsockHelper.hh"). This macro sets the "sin_len" field iff "HAVE_SOCKADDR_LEN" is defined on the command line. (Thanks to Boris Nikolaus for noting this issue.) - Fixed a bug in the timestamp generation for certain rare MPEG-4 video streams. (Thanks to Bernhard Feiten for reporting this.) 2005.11.30a: - Improved the calculation of the per-Transport Packet duration in "MPEG2TransportStreamFramer", so that the overall transmit duration tries to match the client playout duration (as determined by PCRs). - Minor patch to avoid errors when compiling with GCC 4.1. (Patch contributed by Hanno Boeck.) - Patch to the special 'Kasenna'-specific support in "RTSPClient". (Patch contributed by Glen Gray.) 2005.11.11: - Modified "MPEG2TransportStreamFramer" to take the PCR "discontinuity_indicator" flag into account when updating the estimated duration of each TS packet. 2005.11.03: - Minor bug fix to the previous version's update to "RTSPClient". 2005.11.02a: - Updated the previous release to add a new (optional) "forceMulticastOnUnspecified" parameter to "RTSPClient::setupMediaSubsession()". This forces the client to request a multicast stream if the original SDP response address was unspecified (0.0.0.0). (Note that not all servers will be able to handle this.) We also handle the "port=" field in RTSP "SETUP" response "Transport:" headers. - Fixed "RTSPServer" to include a proper "port=" field in the "SETUP" "Transport:" response when streaming multicast. 2005.11.02: - Updated "RTSPClient" to use the "destination=" address in the "SETUP" response's "Transport:" header - for multicast streams. We do this because some weird servers (e.g., Axis cameras, reportedly) do not specify the multicast address earlier, in the "DESCRIBE" response's SDP. 2005.10.28b: - Added a "rtpTimestampFrequency" parameter (with default value 90000) to "H263plusVideoRTPSink", "MPEG4ESVideoRTPSink". 2005.10.28a: - Removed some unnecessary "delete"s, and changed some "delete"s to "Medium::close()"s. (Minor bug noted by Zhixue Zhang.) 2005.10.28: - Fixed a potential 'divide by zero' problem in "MP3Internals.cpp". (Thanks to Eric Peters for noting this.) 2005.10.27: - Added a "numEntries()" pure virtual function to "HashTable". (Thanks to David Bertrand for this suggestion.) 2005.10.23: - When creating a Transport Stream from AC-3 audio input, we now use a stream_id of 0x06 rather than 0x81. - Add support for receiving the various G.726 RTP payload formats, described in RFC 3551. - Added an implementation of the "doStopGettingFrames()" virtual function to "BasicUDPSource". (Thanks to Adrian Hornsby for this suggestion.) - Changed the reimplemented virtual functions in "BasicUsageEnvironment0" and "BasicTaskScheduler0" from "protected" to "public". (Thanks to David Bertrand for this suggestion.) - Added support to "RTSPClient" for the "GET_PARAMETER" RTSP command. (Thanks to Glen Gray for this.) - Added a Windows version of the "genWindowsMakefiles" script. This should make it easier for Windows users to unpack and build the code. (Thanks to Erwin Herzog for this script.) 2005.10.05: - Fixed a couple of bugs noticed by David Bertrand. 2005.09.23: - This software is now called "LIVE555 Streaming Media", and our preferred domain name is now "live555.com". 2005.09.20: - Updated "MPEG2TransportStreamMultiplexor" to increase the frequency of PMTs and PATs in the output Transport Stream. - More improvements to "MPEG2TransportStreamFromESSource". - Updated "RTSPServer" to allow for empty stream names from certain non-standard RTSP clients (such as Amino STBs). - Fixed "RTSPClient::tearDownMediaSession()" to delete each subsession's "sessionId" field. - Fixed a minor memory leak in "RTSPClient" (when implementing HTTP tunneling) 2005.09.09: - Made the destructors for "BasicUsageEnvironment" and "BasicUsageEnvironment0" protected rather than public, to match the base class "UsageEnvironment". - More improvements to "MPEG2TransportStreamFromPESSource" and "MPEG2TransportStreamFromESSource". 2005.09.06: - Modified "MPEG2TransportStreamMultiplexor", and added "MPEG2TransportStreamFromESSource". 2005.08.26: - Updated "MediaSession" to parse the SDP "a=type:" attribute. (Patch by Derk-Jan Hartman.) - Added support to "RTSPClient" for handling Microsoft servers' non-standard use of the RTSP/RTP protocol. Also, fixed the parsing and generation of floating point numbers in the RTSP "Range:" and "Scale:" headers to work correctly in non-POSIX locales. (Thanks to Derk-Jan Hartman for this suggestion.) - Fixed a memory leak in "MPEG2TransportStreamFromPESSource". - Changed "MP3StreamState::readFromStream()" from "private" to "protected", to satisfy a request by Pierre l'Hussiez. 2005.08.09: - Improved the Transport Stream generation software to (in the future) allow for generating Transport Streams from Elementary Stream data as well as from PES packet data. 2005.07.23: - Improved "H264VideoRTPSource" to properly handle 'aggregate' packets that contain more than one NAL unit. 2005.07.21: - We no longer set a RTCP "RR" handler when we're streaming, unicast on-demand, from a shared input source. (The reason for this is that, in this case, we also share a RTCP instance for all client sessions (streams). A better fix will eventually be needed.) 2005.07.19: - Updated H.264/RTP support. 2005.07.15: - Oops, DEBUG was not supposed to be defined in "RTSPServer.cpp". - Added "-D_LARGEFILE_SOURCE=1" to the "COMPILE_OPTS =" line of the various "config.*linux*" files, to ensure that code that uses "fseeko()" will compile properly for all Linux systems. 2005.07.13: - When handling a 'passive' session, we no longer set a RTCP "RR" handler, because (unlike unicast, on-demand sessions) the RTCP instance usually outlives RTSP client sessions. (Thanks to Jon Sheller for reporting this bug.) 2005.07.12: - Minor updates to the Base64 code for H.264/RTP receiving. 2005.07.10: - Removed a debugging version of "testOnDemandRTSPServer" that had mistakenly been left in the proevious revision. If you downloaded the previous revision, then please download this version instead! - Fixed "MPEG1or2VideoStreamFramer" to better handle MPEG video streams where the first GOP time code has a non-zero 'pictures' count. (Thanks to Eric Peters for reporting this problem.) - Some enhancements to the Base64 code, for eventual use by "H264VideoRTPSource". 2005.07.08: - Added - to "RTCPInstance" - the ability to assign 'handler' functions to be called on the arrival of RTCP "SR" or "RR" packets (as well as "BYE"). We now use this mechanism (specifically, a RTCP "RR" handler) to improve the optional 'liveness' test for "RTSPServer". (Liveness is now indicated by either a RTSP command over the TCP connection, or the arrival of a RTCP "RR" packet.) - Moved routines for Base64 encoding and decoding into the "liveMedia" library. (Base64 encoding was already being used by "RTSPClient"; Base64 decoding will soon be used by "H264VideoRTPSource".) 2005.07.01: - Updated "testOnDemandRTSPServer" to demonstrate AAC audio streaming (from an ADTS-format file) - Made some modifications to (supposedly) make the code compile better for WinCE. 2005.06.30: - Added support for reading and streaming from AAC audio files in ADTS format. (Thanks to Manthan Systems for funding this work.) - Removed duplicate code in "testOnDemandRTSPServer.cpp". - Removed duplication of a common error message from "RTSPClient.cpp". 2005.06.29: - Added support for Basic authentication (in addition to Digest authentication) to "RTSPClient". - Removed a minor memory leak in "PassiveServerMediaSubsession". - Improved "MPEG4ESVideoRTPSource" to better note when received RTP packets begin or end a MPEG-4 'frame'. (Thanks to Saumya Chandra for noting the limitations of the previous code.) - Changed some member functions in "PassiveServerMediaSubsession" from "private" to "protected", to allow subclassing. (Thanks to Fabrice Aeschbacher for this suggestion.) 2005.06.16: - Fixed a bug in the generic MPEG (1, 2 or 4) video parsing code that was causing some MPEG-4 streams not to be parsed correctly. - Updated "MPEG4VideoStreamFramer" to better handle MPEG-4 video streams that contain 'B' frames. (Now, more accurate presentation times and frame durations are computed for such streams.) 2005.06.07: - Modified the Windows-specific code in "ByteStreamFileSource.cpp" to compile properly under MINGW. 2005.06.04: - Updated "MPEG2TransportStreamFramer::doStopGettingFrames()" to clear the PID status table. This makes it possible to handle PCR discontinuities when seeking (e.g.) within a stream. - Updated the "ByteStreamFileSource::seekToByte*()" operations to take 64-bit parameters, to allow for seeking within files that are >4 GB in size. 2005.05.26a: - Updated the 'seeking' operations in "ByteStreamFileSource" to handle files that are > 2^31 bytes in size. 2005.05.26: - Updated "RTCPInstance::setByeHandler()" to (by default) handle only "BYE"s that come from active participants. This means, for example, that a receiver of a multicast stream can now quit without its RTCP "BYE" being handled by other multicast receivers. (By default, multicast receivers will now handle only "BYE"s that come from the sender.) - "RTSPServer" now includes "rtptime" in the returned "RTPInfo:" header, because the bugfix in the previous release also happened to fix the problem that this was having with QuickTime Player. 2005.05.24: - Fixed "RTPSink" so that it now resets "fTimestampBase" only on the first time that a timestamp is ever computed; not on the first time after "startPlaying()" is called. (Thanks to David Bertrand for noting this.) 2005.05.23: - Added support to "RTSPServer" for (optionally) reclaiming client connection state (and stopping the stream) if no command has been received on the RTSP TCP connection within a specified period of time. This is useful for use in closed systems where it is known that the RTSP client always uses the "GET_PARAMETER" command as a periodic 'keep-alive'. It stops the stream from continuing indefinitely if the client suddenly dies. 2005.05.12: - Removed some unnecessary floating point code from "MP3Internals.cpp". (This was causing unnecessary slowness on some hardware without floating point.) 2005.05.09: - Modified "MPEG2TransportStreamFramer" to give greater weight (0.5) to more recent data when computing the estimate of per-transport-packet duration. (This causes it to respond more accurately to sudden changes in bitrate (i.e., in VBR streams).) - Added some (otherwise unnecessary) null destructors to stop gcc 4.0 from printing warning messages. (Thanks to Emiliano Parasassi for pointing this out.) 2005.05.05: - "RTSPServer" now uses separate buffers for requests and responses. (This fixes an issue that arose in the handling of requests from a set-top box.) 2005.05.04: - Updated "RTSPServer" to make the parsing of "CSeq:" headers in RTSP requests more robust. 2005.04.26: - Made sure that "MultiFramedRTPSource"s properly stop receiving incoming RTP packets, when they're asked to stop. (This fixes a bug that was being triggered by some streams that continued sending RTP packets after a RTCP "BYE". Thanks to Eberhardt Garner for helping track this down.) - Fixed a minor memory leak in "openRTSP". - Updated "FramedSource.hh" to no longer (by default) support the old form of the 'after getting' function. 2005.04.23: - Added "H264VideoRTPSource", for receiving H.264/RTP streams. (Thanks to Erik Hellerud for this.) - Made some minor modifications to "ServerMediaS(ubs)ession", to support a customer's project. 2005.04.22: - Improved "MPEG1or2VideoRTPSink" to allow more than one complete video 'slice' from the same picture to be packed into an outgoing RTP packet. - Eliminated a bogus "IP_ADD_MEMBERSHIP" error message that Windows (for some reason) sometimes triggers for no reason. 2005.04.20: - Changed the name of the (platform-independent) "_close()" function to "closeSocket()", to prevent an apparent function name conflict in Windows. 2005.04.13: - Modified "ourSourceAddressForMulticast()" to try the "gethostname()"/"gethostbyName()" method if the 'multicast loopback' method fails. - Made some modifications to "ServerMediaSubsession" to support "SIPServer" (whose implementation is currently in progress). 2005.04.07: - Fixed a bug in the "base64Encode()" routine in "RTSPClient.cpp". (Thanks to Raphael Rigo for noticing this.) - Updated "MPEG1or2VideoStreamDiscreteFramer" to handle the "iFramesOnly" and "vshPeriod" parameters (just as the original "MPEG1or2VideoStreamFramer" already does). 2005.03.31: - Removed some testing code that had accidentally been left in the previous release. If you use "openRTSP", then please use this release instead of the previous one. - Fixed a bug in "RTPServer" when handling streams without stream names. (The bug had been introduced in version 2005.03.28.) 2005.03.30: - Improved the support for seeking within RTSP/RTP-streamed MPEG-1 or 2 Program Stream files. (A/V sync after a seek still isn't perfect, though.) 2005.03.28: - The "RTSPServer" implementation now supports raw-UDP streaming, for those clients that request it. (This is usually requested only by some specialized clients - such as set-top boxes - and only for data such as MPEG Transport Streams where audio/video is muxed together (and no RTP timestamps are needed).) - Updated the calculation of MP3 sampling frequencies to allow for 'MPEG2.5' (Thanks to Massimo Buffo for this fix.) 2005.03.23: - Changed "BasicTaskScheduler::SingleStep()" to call only one read handler during each iteration of the event loop. This prevents potential problems if the event loop is called reentrantly from within a read handler. - Added a new, alternative version of "ByteStreamFileSource::createNew()" that takes an open file (FILE*) as parameter, instead of a file name. (Thanks to Mike Yan for this suggestion.) - Updated the top-level Makefile to build the lower-level directories using "$(MAKE)" rather than "make". This allows a command other than "make" (e.g., "gmake") to be used. (Thanks to Sergio.Gelato for this fix.) - Minor changes to (apparently) make Sun's C++ compiler happy. (Thanks to Sergio.Gelato for these.) - Some changes to "RTSPServer" to make it more tolerant of some strange, non-standard clients. - Support seeking within RTSP/RTP-streamed MPEG-1 or 2 Program Stream files. 2005.03.11: Updated "MPEG2TransportStreamFromPESSource" once again to better handle Program Streams that include a "program_stream_map". 2005.03.10: - Modified "BasicUDPSource" to make its OS socket receive buffer at least 50 kBytes (the same as we do for "MultiFramedRTPSource"). 2005.03.07: - Updated "MPEG2TransportStreamFromPESSource" (and thus also the "testMPEG1or2ProgramToTransportStream" demo application) to handle MPEG Program Streams that include MPEG-4 Elementary Stream data. (For this to work, the Program Stream must include a "program_stream_map".) 2005.03.05: - Modifying "ReceivingInterfaceAddr" now works before receiving unicast streams. (Previously, it worked only when receiving multicast streams.) Also, added a new option "-I " to "openRTSP", to allow the user to specify which interface is used. (Thanks to Luca Abeni for this patch.) - Fixed a "delete[]" vs "delete" bug in "MPEG4VideoStreamFramer", 2005.02.28: - Fixed a bug (that had been introduced in the 2005.01.07 version) in the MP3 frame<->ADU conversion code. 2005.02.25: - Fixed some minor memory leaks. - Made some more changes to prepare for RTSP server seeking within MPEG-1 or 2 Program Stream files. (This is still not done yet.) 2005.02.14: - Changed the generation of "rtptime" in "RTPInfo:" RTSP headers to use %u instead of %d. (Thanks to Regis Feneon for noting this.) - Made some changes to prepare for RTSP server seeking within MPEG-1 or 2 Program Stream files. (This is still not done yet.) 2005.02.09: - Updated "MultiFramedRTPSink" to allow for frame-specific special headers to appear before each frame in RTP packets. (This in addition to the (possible) special header that may appear at the start of the packet.) This functionality is added using a new virtual function "frameSpecificHeaderSize()" (that, by default, returns 0.) Thanks to Matt Romaine for this. - Added a new "BufferedPacket" virtual member function "getNextEnclosedFrameParameters()", which will (eventually) replace the existing "nextEnclosedFrameSize()" virtual member function. This (plus a corresponding change to "MultiFramedRTPSource") now makes it possible to give correct presentation times to multiple frames within incoming RTP packets. 2005.02.07: - The "MultiFramedRTPSink::setPacketSize()" function now applies just to one specific "MultiFramedRTPSink" object; not to all such objects. - Added a new version of "RTSPServer::removeServerMediaSession()" that takes the (string) stream name - rather than the "serverMediaSession" object - as argument. 2005.01.29: - We now remove reception and transmission statistics records (from each "RTPSource" and "RTPSink", respectively), whenever each RTCP SSRC membership gets 'reaped'. We also added more information to "RTPTransmissionStats". (Thanks to WIS Technologies for funding this work.) - Some minor fixes to "JPEGVideoRTPSource". (Thanks to Sergey Khlutchin for reporting this.) - Made the "ServerMediaSession" constructor "protected", to allow for subclassing. (This was requested by Eric Peters.) - Updated "win32config.Borland" and modified some header files, so that the code can be built using Borland's "C++ Builder 5.0". (Thanks to David Wu for this suggestion.) - Added a "setPacketSize()" function to "MultiFramedRTPSink" to make it possible to change the 'maximum' and 'preferred' size of outgoing RTP packets. (Thanks to Christian Gerstner for this suggestion.) 2005.01.24: - Some MIME-type parameters in SDP "a=fmtp:" lines are Boolean, taking only values 0 or 1. Sometimes these parameters are set (to 1), without an explicit "=1" being in the SDP "a=fmtp:" line. (This is not legal, but it sometimes occurs.) Our SDP parsing code (in "MediaSession.cpp") now checks for this. 2005.01.23: - More improvements to "AVIFileSink". MPEG-1, 2 or 4, JPEG and H.263 video is now supported, along with raw PCM or u-law audio. (However, audio is not yet working perfectly, and MPEG audio is currently not supported at all.) (Thanks to WIS Technologies for funding this work.) - Changed the (many) calls to "gettimeofday()" to pass NULL as the 'timezone' parameter, because this isn't used. 2005.01.13: - Fixed a bug in "liveMedia/OnDemandServerMediaSubsession.cpp" that was reportedly causing crashes on some systems. (Thanks to Brian Wang for finding this.) - Updated "MPEG1or2VideoStreamDiscreteFramer" and "MPEG4VideoStreamDiscreteFramer" to set appropriate presentation timestamps for B-frames. (Unlike I and P-frames, B-frames' timestamps are not monotonically increasing.) (Thanks to WIS Technologies for funding this work.) 2005.01.07: - Fixed a bug in "JPEGVideoRTPSink" that was causing incorrect packets to be generated when streaming using non-standard JPEG quantization tables (which must be included in the RTP packets). - Updated the handling of incoming MP3 ADUs to allow for the possibility of receiving ADUs that contain 'ancillary data' at the end. (For example, ADUs for "mp3Pro" frames are like this.) Note, however, that our MP3 frame-to-ADU generating code currently doesn't include 'ancillary data' at the end of the generated MP3 ADUs. This will need to be fixed in order to be able to correctly *transmit* ADUs for "mp3Pro" frames. - More work on "AVIFileSink". Recording of MPEG-4 video-only files now works. 2004.12.29: - Added a new liveMedia 'sink' class - "AVIFileSink" - for writing an AVI-format file. Note: This is not fully working yet, so don't try using it yet! (Thanks to WIS Technologies for funding this work.) 2004.12.23: - Fixed a bug in the previous release (when receiving MPEG-2 Transport RTP streams). 2004.12.22: - Updated "MPEG4GenericBufferedPacket::nextEnclosedFrameSize() to (i) allow for "generic" mode, and (ii) properly check for the absence of an "AU Header section". (Thanks to Erick van Rijk for this suggestion.) - When receiving a MPEG-2 Transport Stream (either RTP *or* raw-UDP), pass it through a "MPEG2TransportStreamFramer", so that "durationInMicroseconds" is set appropriately, based on the stream's embedded PCR values. (Thanks to Dermot McGahon for this suggestion.) - Changed the "num_packets_lost" statistics line (printed by "openRTSP -Q") to format as an int rather than as an unsigned. This is in case this value is negative (which can happen if duplicate packets are received). (Thanks to Norbert Donath for noting this.) 2004.12.15: - Changed the RTSP servers in the various test programs to use port 8554 instead of port 7070 for RTSP (as an alternative to the standard port 554). It turns out that port 8554 is the official IANA-reserved port number for RTSP (alternative). - Changed "RTSPClient" to include the "Scale:" header if the scale is being changed to 1.0 from something else. (Thanks to Matt Romaine for this suggestion.) 2004.12.09: - Fixed a bug in the handling of "audio/X-MP3-DRAFT-00" RTP streams. (Thanks to Dhananjay Deshpande for noticing this.) 2004.12.07: - Updated "RTSPClient" to parse the "Scale:" header (if any) in a response to a "PLAY" command, and set a corresponding field in the "MediaSession" or "MediaSubsession" structure. 2004.12.06: - Fixed a minor bug in "BasicTaskScheduler::SingleStep()" that would be triggered if the (optional) "maxDelayTime" parameter were unusually large. - The "RTSPServer" implementation of RTP/RTC-over-TCP streaming will now work even if the client's RTSP "SETUP" command doesn't include an "interleaved=" field. 2004.11.30: - Added "RTSPServer" support for the RTSP "Scale:" header, which is used to implement 'trick play': fast forward and reverse play. The actual implementation of these depends on the media type; it is currently implemented for MPEG-1 or 2 (including MP3) audio (forward play only), and for WAV (PCM) audio (forward or reverse play). (Thanks to Sony Corporation for funding this work.) 2004.11.26: - Improved "H263plusVideoRTPSource" to better recognize which packets begin a frame. (This should improve its performance on lossy networks.) - Improved the parsing of MPEG-1 or 2 audio streams to ignore more bogus 'syncwords'. - We now look for the 'Xing' VBR Table of Contents, and use this (if present) to implement seeking within VBR files. - Updated "ADUFromMP3Source" to allow the internal data buffers to be flushed (e.g., if there is a discontinuity in the MP3 input data). - When streaming a seekable MPEG audio stream on demand, insert filters that convert the input stream to ADU format, and then back to MP3. This allows us to seek within the stream without being tripped up by the MP3 'bit reservoir' (back-pointer). 2004.11.20: - Fixed a bug in "MediaSession::initiateByMediaType()". (It was not allowing for the possibility that a subsession had already been initiated.) 2004.11.19: - For consistency (and ease of comparison), the "MIMEtype()" codec name substring for each "MediaSource" subsession is in upper case. 2004.11.18: - Added an optional "scale" parameter to the "RTSPClient" "play...()" methods, to allow a client to specify fast forward or rewind 'trick play'. (Thanks to Dermot McGahon for this suggestion.) 2004.11.16: - Fixed a bug in the way that "QuickTimeFileSink" records the duration of multi-channel audio tracks in ".mov" or ".mp4"-format files. (Thanks to Orban/CRL Inc. for funding this work.) 2004.11.11a: - Another minor update to "RTSPClient". 2004.11.11: - Updated the "RTSPServer" implementation to handle the case where a "PLAY" request does not contain a "Range:" header. (Suggestion by Brian Wang.) - Reinstated the "MPEG4LATMAudioRTPSource" fix from version "2004.08.24". (It had accidentally gotten deleted.) - Included Dermot McGahon's patch to "RTSPClient" to support the bogus non-standard 'Kasenna' variant of RTSP. 2004.11.09a: - Fixed the previous revision (RTSP seeking support) to work properly with VLC. - Fixed a bug that was causing receivers of SSM streams to not receive RTCP packets. (Thanks to Alessandro Gaiarin for reporting this.) 2004.11.09: - Added support for seeking within streams. This currently works only for WAV audio file streams, and MPEG audio (include MP3) file sources. (However, it doesn't yet work properly for VBR MP3 files; this will get fixed. Also, it doesn't yet work properly with VLC.) (Thanks to Sony Corporation for funding this work.) 2004.11.06: - Improved the way that we specify output buffers for "RTPSink" objects. We now do this using a "maxSize" static member variable (instead of using a 'number of packets' variable as we did before). We also limit the size of the output buffer used for RTCP packets, to save space. - When streaming a MPEG Transport Stream, don't set the RTP 'M' bit. - When recording a ".mov" or ".mp4" file using "QuickTimeFileSink.cpp", we no longer fill in the "width" and "height" fields for audio tracks. 2004.11.04: - When streaming MPEG audio or WAV audio files on demand, we now return the correct file duration (in the RTSP "Range:" header and the SDP "a=range:" attribute), so that media players will report the correct stream duration. (Thanks to Sony Corporation for funding this work.) - In "MultiFramedRTPSink", we now wait until we receive the first data before initializing "fNextSendTime" with the current wall-clock time. (Thanks to Eric Peters for suggesting this.) 2004.11.02: - Updated the RTSP "Range:" header (in a "PLAY" response) and the SDP "a=range:" attribute to support streaming from sources with finite durations. (Such sources can support seeking via RTSP.) The "ServerMediaSubsession" class now has a "duration()" virtual function. (In the future, "FileServerMediaSubsession" subclasses will redefine this, so that seeking within the file will work.) (Thanks to Sony Corporation for funding this work.) 2004.11.01: - Added support to "RTSPClient" for streaming RTSP/RTP over HTTP, using the technique described in Apple's document: . This can be used for streaming from a Darwin Streaming Server from behind a HTTP-only firewall. (Note that our own RTSP server implementation doesn't yet implement RTSP-over-HTTP, but this is on the 'to do' list.) (Thanks to Orban/CRL Inc. and WIS Technologies for funding this work.) 2004.10.28a: - Fixed "OnDemandServerMediaSubsession" so that "PAUSE"/"PLAY" works properly on unicast streaming from files. 2004.10.28: - Removed (perhaps temporarily) the "rtptime=" parameter from the "RTP-Info:" header that's returned in response to the RTSP "PLAY" command. It appears that this may be messing up A/V sync in QuickTime Player. 2004.10.26: - Updated "JPEGVideoRTPSink" (and "JPEGVideoSource") to allow for the possibility of sending custom quantiziation tables in JPEG/RTP packets. - Fixed some compile warnings about unused named parameters. (Thanks to Thiago Correa for these suggestions.) 2004.10.22: - Added a new "MPEG1or2VideoStreamDiscreteFramer" class, similar to the existing "MPEG4VideoStreamDiscreteFramer". 2004.10.21: - Modified the order of SDP lines generated by a RTSP server (in "ServerMediaSession.cpp") to correspond to the exact order specified by the SDP RFC. JMIF clients are supposedly anal retentive about this. (Thanks to Fabrice Aeschbacher for noticing this.) 2004.10.19: - Updated "MPEG2TransportStreamFramer" to properly handle input data that doesn't begin with a 'sync' byte (0x47). 2004.10.18: - Added a new "removeServerMediaSession()" member function to "RTSPServer". - Updated the implementation of the RTSPServer "RTPInfo:" header to include a "rtptime=" field. - Improved the "WindowsAudioInputDevice" trick for making the microphone the first-listed device. (Thanks to Syncanph Xie for this suggestion.) 2004.10.14: - Added a new argument "-4" to "openRTSP" (with corresponding updates to "QuickTimeFileSink"), to generate a "MP4"-format file. (Currently, this works for MPEG-4 audio only.) (Thanks to Orban/CRL Inc. for funding this work.) 2004.10.13: - Fixed a typo that was causing the Windows version not to build. (Thanks to Thiago Correa for noticing this.) 2004.10.11: - Updates to "RTSPServer": - Include a "Date:" header in each response - Include a "Range:" header in each "PLAY" response. - Include "RTP-Info:" header in each "PLAY" response. - Made "SimpleRTPSink" more idiot-proof. 2004.10.07: - Improved the parser in "MPEG4VideoStreamFramer" to be more tolerant of bad/unexpected data. - Moved the code for opening input files by name (which includes a special-case hack for "stdin") to a single common file - "InputFile.cpp" - to get rid of duplicated code. 2004.10.04: - Fixed "UserAuthenticationDatabase::addUserRecord()" (in "RTSPServer.cpp") to make a copy of the "password" string, before adding it to the hash table. (The hash table already makes a copy of the "username" (key) string.) 2004.10.03: - Added support for receiving raw UDP streams (in addition to normal RTP/UDP streams) (Thanks to Derk-Jan Hartman) 2004.09.30: - Updated the RTSP server "UserAuthenticationDatabase" to (i) allow for it to be subclassed, and (ii) allow it to store passwords that are really md5(::) 2004.09.24: - Added support for access control (using digest authentication) to "RTSPServer". Also, added example code to the "testOnDemandRTSPServer" test program to illustrate how to use this. (Thanks to Orban/CRL Inc. and WIS Technologies for funding this work.) 2004.09.22: - Moved the digest authentication support out of "RTSPClient.cpp" (and "SIPClient.cpp") into a new file: "DigestAuthentication.cpp". There's also a corresponding new header file: "DigestAuthentication.hh". This is in preparation for adding digest authentication support to our RTSP server implementation also. 2004.09.20: - More improvements to the multi-unicast streaming support (from a single input source). RTP-over-TCP streaming is now supported in this case. Updated "testOnDemandRTSPServer" to add a variable "reuseFirstSource" (default: False) that can be used to implement this. 2004.09.09: - Made a minor improvement to the multi-unicast streaming support. 2004.09.08: - Added optional "author" and "copyright" parameters to "DarwinInjector::setDestination()". - Added an optional "miscSDPLines" parameter to "ServerMediaSession::createNew()", to allow the caller to add extra SDP lines to the session description. - Fixed a minor bug in the media tables reclamation code. - Added still more support for multi-unicast RTSP/RTP streaming from a single input source. (Thanks to Orban/CRL, Inc. and WIS Technologies for funding this work.) 2004.09.05: - We now more gracefully handle malformed "m=" SDP lines. (Thanks to Derk-Jan Hartman for noticing this problem.) - In "RTSPClient", we now make the "CSeq" number a static variable, to avoid potential problems if we connect to the same server with the same URL more than once. (Thanks to Keith Gurganus for the suggestion.) - Modified "RTSPServer" to use the destination interface IP address in its "rtsp://" URL. 2004.09.02: - Modified "GroupsockHelper.cpp" to allegedly support building for WinCE. 2004.08.26: - Fixed a bug that could cause "AMRAudioRTPSource"s to not get reclaimed. (Thanks to Chenglim Ear for reporting this.) - More support for multi-unicast RTSP/RTP streaming from a single input source. 2004.08.24: - Modified "LATMAudioRTPSource" to include the initial data length field in the data that's delivered to a client. (A decoder was needing to see this.) - Added a new "MPEG4VideoStreamDiscreteFramer" class, as a (more efficient) alternative to "MPEG4VideoStreamFramer" when the input source is a sequence of discrete MPEG-4 frames, rather than a byte stream. - Fixed a minor bug in "Media.cpp". (Thanks to Thiago Correa.) - Added more support for multi-unicast RTSP/RTP streaming from a single input source. (This now working, except for TCP connections - to be completed.) 2004.08.17: - Made the parsing of MPEG-1 or 2 video more robust, in case a Video Sequence Header doesn't appear exactly where it should. - Added initial support for multi-unicast RTSP/RTP streaming from a single input source. (This isn't fully working yet - more support needs to be added.) 2004.08.13: - Added a "numChannels" parameter to "MPEG4GenericRTPSink" (optional) and "MPEG4LATMAudioRTPSink". 2004.08.12: - Fixed a couple of small memory leaks (noticed by Gabriel Bouvigne). 2004.07.31: - Added support for MPEG-4 LATM audio RTP streaming. (MPEG-4 LATM audio RTP *receiving* had already been implemented.) (Thanks to Orban/CRL, Inc. for funding this work.) 2004.07.27: - Updated the MPEG Program-to-Transport Stream conversion mechanism to set the correct stream tags depending on whether the input data is MPEG-1 or 2. 2004.07.23: - Added a "-O" (upper-case letter 'oh') option to "openRTSP". This tells the program to not send an initial "OPTIONS" request prior to "DESCRIBE". - Modified "BasicTaskScheduler" to better allow subclassing. - Added an optional "maximum delay time" option to "BasicTaskScheduler0::SingleStep()". This allows subclasses to impose a limit on how long "select()" can delay, in case it wants to also do polling. 2004.07.22: - Fixed a serious bug that was causing some MPEG Program Stream files to be parsed incorrectly - especially if they have non-MPEG header data at the front. - Modified the way in which "Medium" objects are reclaimed, to overcome an obscure bug. 2004.07.20: - Added a comment to "DeviceSource.cpp" to clarify the purpose of "fTo", because several people have gotten this wrong. - Made ~BasicUsageEnvironment protected (just like ~UsageEnvironment) - Fixed "samplingFrequencyFromAudioSpecificConfig()" to remove a memory leak. 2004.07.16: - Fixed a bug in "AMRAudioRTPSource", in the way that it handled input RTP packets that contained more than one AMR frame. (Thanks to Gabriel Bouvigne for reporting this problem.) - We no automatically reclaim the memory that was allocated for the "UsageEnvironment" "liveMediaPriv" and "groupsockPriv" structures, once their tables become empty. 2004.07.14: - Updated "QuickTimeFileSink's" MPEG-4 audio recording mechanism again, this time to support aacPlus as well as regular AAC. 2004.07.13: - Updated "QuickTimeFileSink" to support recording MPEG-4 audio (including hint tracks). - Modified "MPEG4VideoStreamFramer" to allow simplified subclasses that take discrete frames as input (and therefore don't need a full parser). 2004.07.07: - Added the (rather bogus) "a=x-qt-text-nam:" and "a=x-qt-text-inf:" attributes to the SDP descriptions delivered by "RTSPServer" (in response to a "DESCRIBE" operation). These attributes get the same strings as the "s=" and "i=" lines (respectively). However, QuickTime Player doesn't do anything with those lines, but does recognize the "a=x-qt-*" lines. 2004.07.06: - Modified the code so that it will build for WinCE. (Thanks to Gabriel Bouvigne for these changes.) 2004.07.02: - Fixed a bug in HashTable::RemoveNext() (noted by Greg Bothe) - Added partial support for recording MPEG-4 audio in "QuickTimeFileSink". (Hinting is not yet working properly for this media type.) - Added an option to "MPEG1or2AudioStreamFramer" to allow its presentation times to be resynchronized by its input source. 2004.06.18: - Fixed a bug in "MPEG1or2AudioStreamFramer" (in the way it was checking for syncwords at the start of each frame). - Updated the "MPEGVideoStreamFramer" (base) class to report "fNumTruncatedBytes". - Increased "OutPacketBuffer::numPacketsLimit" from 20 to 30. 2004.06.17: - Another improvement to the "MPEG1or2Demux" parsing code. - Updated "QuickTimeFileSink" to support recording MPEG-4 video tracks into ".mov" files. (There's also basic support for recording MPEG-4 audio, but this isn't quite working yet.) 2004.06.14: - Updated "MPEG1or2Demux" to make the checking for a PACK_START_CODE more robust if it's not immediately present where we expect to see it. - Fixed a bug in "JPEGVideoRTPSource" that could cause a problem on 64-bit architectures. (Thanks to Andrey Filippov for noticing this.) 2004.06.11: - Removed an error from a error message in StreamParser. 2004.06.09: - Updated the implementation of the aggregate and non-aggregate RTSP "PLAY" operations to not include a "Range:" header if the 'start' parameter is < 0. (This is used when resuming from a "PAUSE", for example.) Also, removed an unnecessary "Range:" header from the "PAUSE" command. (Thanks to Gabriel Bouvigne for this suggestion.) - Reimplemented "MultiFramedRTPSource::doGetNextFrame1()" to use iteration rather than recursion, in the case where a large frame is fragmented over multiple incoming RTP packets. This avoids the possibility of stack overflow occurring if there are very large fragmented frames in the input data. 2004.06.07: - Added optional "start" and "end" parameters to the aggregate "PLAY" operation in "RTSPClient". (We had already done this for the non-aggregate "PLAY" operation.) - Made the input banks buffers in "StreamParser" heap-allocated, rather than making them member variables. This avoids any potential compiler problems with having such large structures as member variables. 2004.06.03: - Added the new 'liveMedia' class "MPEG2TransportFileServerMediaSubsession", for unicast on-demand streaming of MPEG-2 Transport Stream files. - Added the new test programs "testMPEG2TransportStreamer" and "testMPEG1or2ProgramToTransportStream", and added support for Transport File streaming to "testOnDemandRTSPServer". (Thanks to DVAgroup Inc. for funding this work.) 2004.06.02: - Fixed "MediaSession" to no longer apply the normal RTP 'M' bit rule when processing incoming "video/MP2T" (or "video/MP1S" or "video/MP2P") streams. (For such streams, the 'M' bit does not mean 'end of frame'.) 2004.06.01: - Updated "RTSPClient" to handle "Session:" headers that have a trailing ";timeout=" part. (Thanks to Gabriel Bouvigne for suggesting this.) 2004.05.31: - We now handle SDP "m=" lines with an optional field (although we don't actually do anything with this value). Thanks to Derk-Jan Hartman for this suggestion. 2004.05.29a: - Made a correction to the previous change. 2004.05.29: - Added a call to "DarwinInjector" to set the TCP socket's send buffer to 100 kBytes. 2004.05.28: - Renamed some variables in "MP3Internals.cpp" (and made them static) to overcome a name conflict seen by the VLC developers. (Thanks to Derk-Jan Hartman for pointing this out.) 2004.05.26: - Fixed a bug (apparently introduced with recent header file changes) that could cause MP3 files to not be read correctly on Windows. (In particular, this could cause "testMP3Streamer" to not work correctly on Windows.) Thanks to David Skiba for the bug report. 2004.05.24: - Added a new member function "lastReceivedSSRC()" to "RTPSource". This makes it possible for a receiver to demultiplex incoming RTP data based on SSRC. (Later this functionality should perhaps be added to "(MultiFramed)RTPSource" instead.) - More updates to "DarwinInjector". 2004.05.19: - Another update to "openRTSP" for a customer job. 2004.05.17: - Added a new test program "testMPEG4VideoToDarwin.cpp" that is similar to "testMPEG4VideoStreamer", except that instead of transmitting the video RTP/RTCP packets via multicast, it transmits them - via a RTSP TCP connection - to a remote Darwin Streaming Server. 2004.05.12: - Added a new "liveMedia" class - "DarwinInjector" - that can be used to send an audio and/or video RTP/RTCP stream to a remote Apple 'Darwin' (aka. QuickTime) Streaming Server, for playing by (potentially multiple) RTSP clients. - Added a new test program "testMPEG1or2AudioVideoToDarwin.cpp" that is similar to "testMPEG1or2AudioVideoStreamer", except that instead of transmitting the audio/video RTP/RTCP packets via multicast, it transmits them - via a RTSP TCP connection - to a remote Darwin Streaming Server. 2004.05.09: - Removed a line of junk that had erroneously been left at the start of Makefile.tail. - The "testRelay" test program has been reprogrammed in the usual liveMedia 'source->sink' style. 2004.05.07: - Another update to RTSPClient for a customer job. 2004.05.04: - Added an #include to "BasicUDPSink.cpp" to prevent a compilation problem on some platforms. 2004.05.02: - Some updates to RTSPClient and openRTSP for a customer job. 2004.04.27: - Fixed the round-trip time estimation routine in "RTPSink" to allow for the possibility of the computed round-trip time being negative. This can happen if there is clock drift between the sender and receiver, and if the actual round-trip time was quite small. If this happens, the returned round-trip time value is zero. (Thanks to Dixon Siu for alerting us to this issue.) 2004.04.23: - Updated some #ifdef's so that the code will compile with "mingw" on Windows. (Thanks to Joey Parrish for this.) - Added a "BasicUDPSink" class to "liveMedia", for UDP streaming without RTP. - Added new 'filter' classes to "liveMedia" for - converting MPEG Program Streams to Transport Streams. - 'framing' MPEG Transport Streams to return the 'duration' of each Transport packet (i.e., the inter-packet time gap). 2004.04.09: - Fixed a byte-ordering bug in the code for streaming from WAV audio files (used in "testWAVAudioStreamer" and "testOnDemandRTSPServer"). We were converting 16-bit samples from host to network order before streaming them. That was wrong, because audio samples are always stored in WAV files in little-endian order. The correct thing to do was to convert from little-endian to big-endian order. 2004.03.27: - Fixed a minor bug in the top-level Makefile. (Thanks to Matteo Nastasi for noting this.) 2004.03.27: - Modified "H261VideoRTPSource" so that it returns individual packet payloads to the caller, rather than waiting to form complete frames. Also, added a member function "lastSpecialHeader()" that returns the 4-byte special header for the most recently-read payload. 2004.03.23: - Added support for unicast RTSP/RTP streaming from VOB files, and added an example of this to "testOnDemandRTSPServer". 2004.03.17: - Made a series of minor bug fixes and improvements suggested by Sony. 2004.03.15: - Fixed a bug in "OnDemandServerMediaSubsession" (the RTCP instance was being deleted at the wrong time). (Thanks to Clark Taylor for noticing this.) - Minor modifications to the 2004.02.26 "RTPSink" changes. - Updated the "AMRAudioRTPSource" implementation to support 'bandwidth-efficient' mode. (Warning: This has not yet been tested.) 2004.03.12: - Updated the "RTSPClient" class to support an aggregate "PAUSE" operation. 2004.03.11: - Added an implementation of AMR audio RTP receiving ("AMRAudioRTPSource"), to match the existing"AMRAudioRTPSink". Also, added a new class "AMRAudioFileSink" (a subclass of "FileSink") that outputs an AMR audio input stream to a file, including the file 'magic number' and frame headers. "openRTSP" was also updated to output received AMR audio streams using "AMRAudioFileSink"s. (Thanks to SIGOS Systemintegration GmbH for funding this work.) - Cleaned up the "RTPSource" changes that were made in version 2004.02.26. 2004.03.05: - Updated the "RTSPServer" implementation to properly handle aggregate operations for which the URL ends with a "/". Some clients, such as "gmp4player" do this. 2004.03.03a: - Fixed a bug in "MultiFramedRTPSource.cpp" where we were not properly skipping over "contributing source" fields, if they were present in the RTP header. (Thanks to Phillip Bruce for noticing this.) 2004.03.03: - Fixed the "testMP3Streamer" test program to keep the RTP sink, RTCP instance, Groupsocks, and RTSP server (if used) open across all iterations of the loop. (Thanks to Frank Xia for noticing this problem.) 2004.03.02a: - The previous version accidentally had the built-in RTSP server enabled in "testMP3Streamer". It should be disabled by default. 2004.03.02: - Fixed a few potential errors that were found by running "valgrind" on some of the test programs (on Linux). 2004.03.01: - Added two new options to "openRTSP" (and "playSIP"): "-E " Tells the program to close the stream if no new packets have been received in at least seconds. "-B " Tells the program to set the network socket input buffer (for each input stream) to bytes. (This can be useful when testing QOS for different input buffer sizes.) (Thanks to SIGOS Systemintegration GmbH for funding this work.) 2004.02.26: - Added - to "RTPSink" - a database of statistics from incoming RTCP "Reception Report" (RR) packets. (This mirrors the similar database for RTCP SR packets that was already part of "RTPSource".) (Thanks to Clark Taylor for contributing this code.) 2004.02.23: - Fixed a bug in "MP3ADUinterleaving.cpp" that was causing frame durations to not be set properly when handling interleaved MP3 ADUs. 2004.02.20a: - Corrected a typo in the previous "#ifdef"s 2004.02.20: - Added "#ifdef"s to the two files that #include , so that they will compile OK with GCC v3.*. (Thanks to Goetz Waschk for this.) - Changed the stream parser debugging statements to make it clear that the use of C++ language exceptions by the stream parsing code is normal, and is not an error. 2004.02.19: - Updated the "RTSPServer" implementation to support RTP-over-TCP streaming (if requested by the client). 2004.02.13: - Changed the implementation of the "BasicUsageEnvironment" "operator<<" member functions so that they use "fprintf(stderr, ..." rather than "cerr << ...". People compiling in some environments were getting complaints about "cerr" being undefined (presumably because the right #include files weren't being found). However, everyone should have "stdio.h". (Thanks to Clark Taylor for this suggestion.) - Changed the "genMakefiles" script to complain if the user tries to run it without an " parameter. 2004.02.09: - Updated "RTSPServer" once again - this time to ensure that each incoming request is read completely (i.e., up until the trailing ). (Thanks to Regis Feneon for helping to fix this.) - Added a new "WAVAudioFileServerMediaSubsession" class to support on-demand streaming from WAV audio files. Also, updated the "testOnDemandRTSPServer" test program to illustrate this. 2004.02.05: - Updated the "WindowsAudioInputDevice" project to build two different versions of the library: One that uses Windows' built-in mixer; another that doesn't. 2004.02.04: - Fixed an obscure bug in "MPEG4ESVideoRTPSink" that could (very rarely) cause incorrect RTP timestamps to be set for the last fragmented packet of large MPEG-4 frames. This could cause QuickTime Player's video playback to freeze. 2004.02.03: - Added new "liveMedia" classes "MPEG1or2FileServerDemux" and "MPEG1or2DemuxedServerMediaSubsession" for supporting on-demand RTSP/RTP streaming of MPEG-1 or 2 Program Stream files. Also, updated the "testOnDemandRTSPServer" test program to support streaming of such a file. - We no longer set SO_REUSEPORT for stream (TCP) sockets, because it usually doesn't make sense to share TCP ports. (As a side effect, this means that it will no longer be possible to run more than one RTSP server (using the same TCP port) simultaneously on the same computer - something that should never have been possible in the first place.) - Fixed a minor RTSP server bug that was causing incorrect "destination"s to be set (for multicast streams) in the "SETUP" response "Transport:" header. 2004.01.28: - Yet another bug fix to "MPEG4VideoStreamFramer", to properly handle the case where MPEG-4 "GOV" headers don't occur on exact 'second' boundaries. (Thanks to Michael Niedermayer (via Michael Hess) for clarifying this.) 2004.01.27: - Fixed a bug in the previously added (but normally "#ifdef"d out) debugging code in "MultiFramedRTPSource.cpp". - Made a fix to the (normally "#ifdef"d out) debugging code in "AC3AudioStreamFramer.cpp". (Thanks to Yigal for noticing this.) 2004.01.24: - Changed "openRTSP" to use 20 kByte "FileSink" receive buffers by default, instead of 10 kBytes. (Some frames in MPEG-4 streams were exceeding the previous limit.) - Added code to "MultiFramedRTPSource.cpp" to easily let the developer simulate packet loss. 2004.01.23: - Changed "RTSPServer" to include a "Content-Base:" header in "DESCRIBE" responses. This overcomes a bug in QuickTime Player, which sends incorrect "SETUP" URLs otherwise. - Fixed a bug in "MPEG4VideoStreamFramer" that was causing some frames to erroneously be given a duration of 0. 2004.01.22: - Made another improvement to the "RTSPServer" implementation. It once again properly handles streams without a stream name (i.e., where the "streamName" parameter to "ServerMediaSession::createNew()" was NULL. - Updated the (little-used) "ByteStreamMultiFileSource" class to take "preferredFrameSize" and "playTimePerFrame" parameters, just like "ByteStreamFileSource". Also added a member function to ask whether a new file has just been read from. 2004.01.21: - Made several improvements/bugfixes to the "RTSPServer" implementation: - Worked around an apparent bug in QuickTime Player: It sometimes doesn't include a proper URL in RTSP "SETUP" requests. - Corrected the 'frame' (really tick) rate and frame duration that are computed for 'fixed_vop_rate' MPEG-4 video streams. - Compensated for some buggy MPEG-4 video streams that don't set timestamp information properly. - MPEG-4 video end codes will now be included in the outgoing RTP stream, and received properly by RTSP clients. - Fixed "RTSPClient" to be more tolerant of RTSP "Transport:" headers that contain more than one successive ';' character. (Darwin Streaming Server sometimes does this.) 2004.01.19: - Changed "RTSPServer" to not create per-session state when handling "DESCRIBE", but instead to wait until "SETUP". This fixes a problem that was causing the "VLC" media player to fail to work with our "RTSPServer" implementation, because VLC uses one RTSP TCP connection to do the "DESCRIBE", and then another to do "SETUP" and "PLAY". (Thanks to Emmanuel Dufour for pointing this out.) - Updated "MPEG4VideoStreamFramer" to include the VIDEO_SEQUENCE_END_CODE in the output stream if it sees it in the input. 2004.01.10: - Fixed the "RTSPServer" implementation to properly return a "server_port" field in the RTSP "SETUP" response for unicast streams. Also, the server ports (RTP and RTCP) are now chosen separately, and will no longer be the same as the client ports if the client and server are running on the same machine. (That did not work on some Linux systems.) - Fixed a bug in "MP3ADU" that was causing frame durations to not be set properly when translating between MP3 frames and ADU frames. 2004.01.09: - Modified "RTSPClient" to handle embedded NULL characters in a SDP description. (These are not legal, but they have been seen in some cases.) 2004.01.06: - Modified the FramedSource 'after getting' function signature to take two new parameters: (1) The number of bytes (if any) that were truncated from the delivered data, and (2) The duration (in microseconds) of the delivered frame. For backwards compatibility with old code, the old 'after getting' function signature is still supported, but will be removed in some future version of the code. (The "getPlayTime()" function was also removed.) 2003.12.26: - Made "FramedFilter" objects implement the "stopPlaying()" function by also calling "stopPlaying()" on their source object. - Fixed an obscure bug in "RTSPClient". 2003.12.20: - Made the "video/H263-2000" MIME type use the same RTP payload format as "video/H263-1998". (Thanks to Norbert Doneth for suggesting this.) 2003.12.19: - Fixed a minor bug in "RTSPServer" (some allocated memory wasn't being freed properly). (Thanks to Konstantin Lunin for finding this.) 2003.12.16: - Added "-DSOCKLEN_T=socklen_t" to the "COMPILE_OPTS =" line in the file "config.solaris", so that the code will compile correctly for 64-bit Solaris systems. 2003.11.25: - Put some error checks back into "WindowsAudioInputDevice". 2003.11.21: - Some case-insensitive string comparisons weren't working properly in Windows; fixed. 2003.11.19: - Added a global Boolean variable to flag when RTP I/O over a TCP connection fails. This hack allows higher-level code to check for this. 2003.11.16: - Fixed "RTPInterface" to not infinite loop when trying to read from a TCP connection that has closed. - Modified "BasicTaskScheduler" to overcome a bug in Windows that sometimes causes "select()" to fail. 2003.11.13: - Made "WindowsAudioInputDevice" a bit more robust against broken audio drivers. 2003.11.06: - Modified "groupsock/inet.c" to allow the system-supplied "random()" and "srandom()" functions to be used instead of our own "our_..." implementation. This is done if USE_SYSTEM_RANDOM is defined (e.g., in the "config.*" file). 2003.11.06: - Modified the "MPEGVideoStreamParser" constructor, in response to a complaint that some compilers would choke on the old code. 2003.10.30: - Added a warning output message to "MultiFramedRTPSink::afterGettingFrame1()" whenever the input frame appears to exceed the maximum buffer size. This maximum buffer size can be increased by changing "OutPacketBuffer::numPacketsLimit". 2003.10.27: - Changed the "MultiFramedRTPSource" error message (added in 2003.10.04) to apply only to frame sizes > 1000, so that (e.g.) QCELP RTP sources don't trigger it. 2003.10.24: - Fixed the RTSP server implementation to put SDP lines in the correct order (as defined by the SDP speecification). Also, added "Cseq:" lines that were missing from "404" error responses. (Thanks to Bill May for noting these bugs.) - Improved the implementation of MPEG-4 video framing and streaming. 2003.10.08: - Fixed a bug in the previous "FileSink" update that was causing "openRTSP" to crash when recording a MPEG-4 video stream (using the "-m" option). (Thanks to Jiangzhou Scu for noticing this bug.) 2003.10.07: - Updated the "FileSink" class to take an optional Boolean parameter "oneFilePerFrame". If set, a separate file will be output for each incoming frame. The frame's presentation time is used as a file name suffix, to distinguish the files. - Added a new option "-m" to "openRTSP" (and "playSIP"). This option causes a separate file to be written for each frame (using the above-mentioned new feature of "FileSink"). 2003.10.05: - Renamed the new openRTSP/playSIP "-S" option to "-b". 2003.10.04: - Added an error message to "MultiFramedRTPSource" to report when the client's receive buffer is too small for an incoming frame. (This could happen with large JPEG frames, for example.) - Updated the signature to "FileSink" to take an optional 'buffer size' parameter as argument. (The default value is 10000.) - Added a "-S " option to "openRTSP" and "playSIP". 2003.09.30: Improved the default implementation of "RTPSink::hasBeenSynchronizedUsingRTCP()" to more accurately report whether or not the most recently-delivered packet's presentation time was synchronized using RTCP SRs. (Thanks to Luca Abeni for pointing out the possibility of a problem with the old implementation.) 2003.09.25: Improved the support for unicast RTSP/RTP streaming. Also, added a new test program "testOnDemandRTSPServer" that demonstrates how to use this. 2003.09.19: - Added support for unicast streaming from a "RTSPServer". (A test program that demonstrates this will be available shortly.) (Thanks to TNO Fysisch en Elektronisch Laboratorium (Netherlands) for funding this work.) - Modified the "strDup()" function to return NULL (instead of crashing) if passed a NULL parameter. 2003.09.11: - Another improvement/bugfix to the "MultiFramedRTPSink" implementation. - Changed the implementation of "RTSPServer" and "ServerMediaSession" in preparation for implementing unicast streaming from RTSP servers. (This is something that's not ready yet, but close...) 2003.09.05: Fixed the implementation of "JPEGVideoRTPSource" so that it prepends a proper JFIF JPEG header to the start of each incoming JPEG frame. This means that programs such as "openRTSP" and "MPlayer" will now receive/play JPEG/RTP streams correctly. 2003.09.03: Improved the implementation of "MultiFramedRTPSink" to more efficiently handle the case where input frames get broken up into multiple outgoing RTP packets. We now eliminate an uncessary "memmove()" for each fragment. In particular, this should make MPEG-1 or 2 and motion-JPEG video streaming more efficient. 2003.09.01: - Added support for reading and streaming AMR audio files (as defined in RFC 3267). Also added a new test program "testAMRAudioStreamer". (Thanks to TNO Fysisch en Elektronisch Laboratorium (Netherlands) for funding this work.) 2003.08.28a: - When "openRTSP" writes out a recorded MPEG-4 Elementary Stream video file, it now writes SDP 'config' information to the front of the file beforehand. This 'config' information contains VOL etc. headers that can be useful for playback. 2003.08.28: - Added 'framer' and RTP sink classes for MPEG-4 Elementary Stream video. (Thanks to TNO Fysisch en Elektronisch Laboratorium (Netherlands) for funding this work.) - Added a new test program "testMPEG4VideoStreamer". - Fixed a bug with RTP-over-TCP reading that could cause a crash if the same TCP socket number gets reused for a later stream. Also, made this code more thread-safe. 2003.08.21: Renamed all of the MPEG-1 or 2 class and program names from "MPEG*" to "MPEG1or2*". This is to distinguish these from the classes and programs that use MPEG-4. 2003.08.19: Made the maximum buffer size in "MediaSink.cpp" a parameter that can be set (changed) at runtime. (Reset the default back to 20* packet size) 2003.08.18: - Fixed "JPEGVideoRTPSink" to use the standard RTP payload format code (26) for JPEG RTP streams. - Updated "MediaSink.cpp" to increase the maximum buffer size for incoming data. This makes it possible to stream large JPEG frames (which are fragmented over multiple outgoing RTP packets). 2003.08.16: - Added new classes "AudioRTPSink" and "VideoRTPSink" as parent classes of the various audio and video RTP sink classes, respectively. - Added a new "JPEGVideoRTPSink" class, and a "JPEGVideoSource" class that can be used as an abstract base class for particular JPEG sources. 2003.08.07: Minor change to "MediaSink". 2003.07.29: Updated "RTSPClient" to include a "tearDownMediaSession()" operation, in addition to "tearDownMediaSubsession(). "openRTSP" now uses just the "tearDownMediaSession()" operation. (Darwin Streaming Server was barfing with "tearDownMediaSubsession()"). Thanks to Edward Estabrook for suggesting this. 2003.07.27: Added a new "-F " option to "openRTSP" (and "playSIP"). This can be useful if you are running "openRTSP" several times, in the same directory, to play several different RTSP streams (e.g., from a script). (Thanks to Norbert Donath for this suggestion.) 2003.07.14: Updated the "WAVAudioFileSource" implementation (and the "testWAVAudioStreamer" test program) to better report any reason for a WAV file to be invalid. 2003.07.13: - Added new filter classes for converting between 16-bit PCM and 8-bit u-law audio, and between host and network order for 16-bit values. (See "liveMedia/include/uLawAudioFilter.hh" for details.) - Added a new class "WAVAudioFileSource" for reading/processing WAV audio files. - Added a new test program "testWAVAudioStreamer" that reads a WAV audio file - "test.wav" - and streams it via multicast (using a built-in RTSP server). - Updated "MediaSession" to recognize "L8" and "L16" RTP audio streams (to be handled by "SimpleRTPSource"). 2003.07.07: - Fixed a bug that would cause "vobStreamer" to crash if (incorrectly) run with no arguments. - Updated the "test*Streamer" test programs to print out the "rtsp://" URL of the built-in RTSP server (if it's enabled). 2003.07.01a: Updated the "WindowsAudioInputDevice" subdirectory to: - Change the name of the library from "WindowsAudioInputDevice.lib" to "libWindowsAudioInputDevice.lib". - Added a console test program - "showAudioInputPorts" - that lists the audio input ports that are currently available. 2003.07.01: Added a new subdirectory "WindowsAudioInputDevice", which is a Windows-specific implementation of the "AudioInputDevice" class. This can be used by Windows applications to read PCM audio from a sound card. 2003.06.28: Added an optional parameter (default, True) to "SimpleRTPSource" that says whether to use the RTP "M" (marker) bit to indicate the last (or only) fragment of a video frame. (Suggested by Cezar Plesca.) 2003.06.27: Added a "AudioDeviceSource" class to the "liveMedia" library. This class is a generic audio input device (such as a microphone or a sound card) - to be subclassed for specific OS platforms. 2003.06.26: - Updated the "RTSPServer" implementation to respond to "PAUSE" requests. (It doesnt actually pause the stream; just returns "OK". This makes QuickTime Player happier.) - Added a "-o" option to "openRTSP" (and modified "RTSPClient" accordingly). This option causes openRTSP to send an "OPTIONS" command to the server, and prints out the response. 2003.06.17: Added support for MPEG-4 generic RTP sinks. (Currently, only the "AAC-hbr" audio mode is supported, and only one AAC frame is packed into each outgoing RTP packet.) 2003.06.13: - Fixed a bug in "ServerMediaSubsession" that could cause a memory leak. (Thanks to Frederik Bonte for finding this.) 2003.06.07: - Fixed a minor bug in "MPEGVideoRTPSink": The RTP "M" bit is now set only on the last fragment, if a frame is fragmented. (Thanks to Tym Altman for pointing this out.) - Improved support for AudioRTPSinks that have more than one audio channel. 2003.05.31: Fixed a bug in "SimpleRTPSink" that would cause it to not generate correct RTP timestamps on outgoing packets. 2003.05.29: Fixed a bug in "RTSPServer" that would cause it to get into an infinite loop if a client's connection was terminated unexpectedly. 2003.05.28: Fixed some typos in comments. 2003.05.23: Some minor changes to reduce the number of bogus warning messages displayed when compiling using Visual C++. 2003.05.22b: Fixed a bug in "SIPClient" (thanks to Reini Urban for helping track this down). 2003.05.22a: Fixed a couple more minor bugs that were causing "valgrind" to complain. 2003.05.22: Fixed a bug in "SIPClient" (a field was not getting initialized properly) 2003.05.21: - Because not all platforms define 'errno' the same way, 'errno' is now implemented as a pure virtual function "getErrno()" in "UsageEnvironment". "BasicUsageEnvironment" defines this function to just return "errno", but other subclasses could implement it in other ways. - Added support for setting and reading information in "RTP-Info:" headers in RTSP "PLAY" response. (Thanks to Romulus Grigoras for contributing this.) 2003.05.19: Fixed a bug in "SIPClient" that could cause a crash. (Thanks to Reini Urban for finding this.) 2003.05.16: - Removed all calls to "fprintf(stderr, ...)" and "cerr << ..." from the library code. Instead, we now use "operator<<" virtual functions that are defined on the "UsageEnvironment". "BasicUsageEnvironment" defines these by outputting to "cerr", but other subclasses of "UsageEnvironment" can define them to do console output whichever way they wish. 2003.05.15: - Moved the "select()" call in "readSocket()" (GroupsockHelper.cpp) into a separate function, to allow it to be easily reimplemented if desired. - More minor changes to "RTPSource" stats handling, and the "-Q" option to "openRTSP"/"playSIP". 2003.05.12: - Restructured "BasicTaskScheduler" as two hierarchical classes: "BasicTaskScheduler0" (an abstract base class), and "BasicTaskScheduler". This makes it easier to subclass (e.g., to reimplement "SingleStep"). A subclass reimplementation would use "BasicTaskScheduler0". - Removed "our_bcopy()", and use "memmove()" instead, because everyone seems to implement that. - Fixed a bug in "RTPSource" that could cause packet loss stats to be reported incorrectly if the first RTP sequence number received was 0. 2003.05.06: Minor changes to the "openRTSP" QOS stats reports. 2003.05.05: Changed the "start" and "end" parameters to "RTSPClient::playMediaSubsession()" from int to float, for increased granularity. (Suggestion by Cezar Plesca.) 2003.05.03: - Added support for pausing/resuming to "RTSPClient". (Thanks to Romulus Grigoras for contributing this.) - Fixed a couple of bugs in "SIPClient". 2003.04.28: - Cleaned up and improved the "DelayQueue" implementation. (This time it works properly, I hope.) 2003.04.27: - Temporarily backed out the previous change to "DelayQueue", because it broke MPEG video streaming (causing it to play too slowly). 2003.04.26: - Made "DelayQueue" a little more accurate, by adjusting for the time that has elapsed since the last alarm, when adding a new entry to the queue. - Fixed a bug in "RTPSource" that could cause packet loss statistics to not be reported accurately (in RTCP) if incoming packets were misordered. - Updated "openRTSP" and "playSIP" to take a new "-Q" option, which prints out QOS data at the end of the session. 2003.04.24: - Added a mechanism for registering an optional, auxilliary read handler with a "RTPSource" or "RTCPInstance". Such a handler would get called after each new packet is read. - Changed "SimpleRTPSink" to (by default) set the RTP "M" bit on video streams iff the packet contains the last (or only) fragment of a frame. 2003.04.23: - More improvements/fixes to the handling of SSM sessions. - Fixed a bug in RTSPServer that could cause a crash if the client quit suddenly. 2003.04.20: - Updated "MediaSession" to recognize a=source-filter: incl ... lines in SDP descriptions (for SSM sessions), and to do the appropriate SSM-style multicast joins in this case (and also to send back RTCP via unicast). - Updated the RTCP implementation to reflect incoming unicast RTCP packets back to the multicast group in the case where we're a SSM source. - Update "vobStreamer" and the various "test*Streamer" test programs to properly behave as SSM sources, when we have specified this. 2003.04.18: - Updated the "*ServerMediaSession" classes to (optionally) output SSM-specific information in SDP descriptions. - Updated "vobStreamer" to choose a random multicast address in the SSM range. 2003.04.12: - Fixed "MPEGVideoStreamFramer" to allow for the possibility of the GOP "time_code" field remaining unchanged in the source stream. - Elimination of more unnecessary global variables. 2003.04.11: - Added support for an optional user name and password inside a RTSP or SIP URL. - The media lookup table (used in "Media.cpp") is now allocated dynamically, and stored in the "UsageEnvironment", rather than being a global variable. This makes it possible to have different threads, within the same address spaces, accessing the library code. (Each thread would need to have its own "UsageEnvironment" and "TaskScheduler", though.) 2003.04.09: Changed "BasicTaskScheduler::SingleStep()" to execute only one delay queue task (along with any data input events) during each iteration. This prevents a possible livelock if the delay queue always has events outstanding. (Thanks to Ruth Sadler for pointing this out.) 2003.04.04: - More improvements to "vobStreamer" (which has also been renamed from "VOBStreamer". 2003.04.02: - Made another change to the order that things are closed when exiting "openRTSP", to help avoid a potential race condition that can occur when using the "-t" option. (Thanks to Romulus Grigoras for reporting this.) - Updated "MPEGDemux" to properly handle the case where someone tries to read from it after its input source has already closed. - Several improvements to "VOBStreamer". - Added "ByteStreamMultiFileSource" to the "liveMedia" library. This generalizes "ByteStreamFileSource" to allow more than one input file to be read, in sequence. 2003.04.01: Fixed a bug in "openRTSP" that could cause it to crash when exiting (if the "-t" option was used). 2003.03.31: Added a new test program "VOBStreamer" to "testProgs". This program reads a "VOB" file (e.g., from a non-encrypted DVD), and streams the component video (MPEG) and audio (AC3) component streams using RTP multicast. (Online documentation to follow...) 2003.03.30: Added "AC3AudioRTPSource" and "AC3AudioRTPSink". 2003.03.28: - Fixed a bug in "MPEGVideoStreamFramer" that would cause it to generate incorrect presentation times if the MPEG video stream started out with a non-zero 'time_code'. - Updated "AC3AudioStreamFramer" to allow clients to get the stream's sampling rate before it reads the first frame. 2003.03.25: Began adding support for AC3 audio/RTP streaming. 2003.03.22: Added support for receiving H.261/RTP streams 2003.03.14: - Removed calls to "strdup()", because that's a C-library function whose result should not be deleted using "delete" (or "delete[]"). Instead, we now provide our own C++ equvalent, called "strDup()". - Also, changed several "delete"s to "delete[]". (Thanks to Bill Kain for noting the need for this fix.) 2003:03;11: Updated SIPClient to allow it to use an arbitrary source port number. This makes it possible to use it on the same host on which a SIP server is already running. 2003.03.09: - Made "MediaSession"s parsing of SDP descriptions more robust, to allow for blank lines in the SDP description. ("Be liberal in what you accept...") 2003.03.07: - Added an optional "MIME subtype" parameter to "SIPClient", to allow SIP "INVITE"s to use a dynamic RTP payload format. Updated "playSIP" accordingly, to add an optional "-D " argument. - Modified "FileSink" to close the source (and stop playing) if it gets an EOF when writing to the output file. (Thanks to Ruud Schramp.) 2003.03.03: Improved the implementation of "MPEG4GenericRTPSource". 2003.02.28: - Fixed a bug that would cause RTSP clients to not set the server port number (for RTCP) correctly in some situations. (Thanks to Alex Pollard.) - Fixed a bug in "RTSPServer" that would cause "Transport:" headers to not get generated correctly. 2003.02.27: - Improved the "MultiFramedRTPSource" implementation to more cleanly handle packet loss in the case where frames are split into multiple RTP packets. - Parsed the optional "/" parameter that can appear at the end of "a=rtpmap:" lines for audio sessions. 2003.02.17: More work on the experimental '-R ' option to "playSIP" (and "openRTSP") that allows it to inject the incoming stream into a separate RTSP server. This code is now working, although currently only for a single PCMU or GSM audio stream. Also, RTCP packets are not yet relayed between the source and destination. 2003.02.16: Improved RTSPClient and SIPClient to check for (and discard) any '\r' or '\n' that appears at the start of a response message. (Some weirdo servers can do this.) 2003.02.10: Began adding a new option to "playSIP" (and "openRTSP") to allow the incoming media stream to be injected into a separate, destination RTSP server. This still needs lots of work... 2003.02.08: Fixed the "JPEGVideoRTPSource" implementation to properly prepend a synthesized JPEG header to each received frame of RTP data. This now makes it possible to receive and play motion-JPEG RTP streams. 2003.02.06a: - Fixed a bug in the SDP "config" attribute parsing. (This affected the use of "MPEG4LATMAudioRTPSource". - Cleaned up the "createNew()" routines in each of the *RTPSource classes. - Added two new RTPSource classes - "MPEG4ESVideoRTPSource" and "MPEG4GenericRTPSource", for MPEG-4. However, these have not been fully implemented yet. 2003.02.06: Fixed some code that was 64-bit-unsafe. (Thanks to Philipp Thomas for noticing this.) 2003.02.05: - Cleaned up "RTSPClient", and added a method for doing an aggregate "PLAY" operation (in addition to the existing method that does a "PLAY" on an individual subsession). - Modified the "openRTSP" test program so that it does a single aggregate "PLAY", rather than a series of non-aggregate "PLAY"s, one for each subsession. (RealNetworks' server doesn't support the latter.) - Added a new routine for parsing "AudioSpecificConfig" strings that can appear in SDP descriptions. - Added Morgan Multimedia's implementation of "JPEGVideoRTPSource" to the "liveMedia" library. (I haven't yet tested this.) 2003.02.04: Removed "-DUSE_OUR_BZERO=1" from "config.linux", because it no longer seems to be necessary, and it was breaking compilation for some people. 2003.02.03b: Added an #include to "BasicUsageEnvironment/Lock.cpp" to fix a problem that someone encountered with NULL not being defined. 2003.02.03a: Created a new header file "groupsock/include/NetCommon.h" that contains all networking-related #includes. This also does the correct #includes for Windows, allowing Windows code to use Winsock-2 rather than Winsock-1. Also, modified "win32config" to use a "TARGETOS" of WINNT rather than WIN95, to make this all work. Thanks to Doug Kosovic for figuring out the magic incantations needed to get this all working. 2003.02.03: - Improved "SIPClient" (in the "liveMedia") library, so that "INVITE" requests are retransmitted, as necessary, for reliability. - Added a "-A " option to "playSIP". This allows the user to specify which audio RTP payload format should be received. (At present only static payload formats can be specified, and only audio codecs - not video.) 2003.01.28: - Added support (in the "liveMedia" library) for a basic SIP client - Added a new test program "playSIP", similar to "openRTSP". These two applications are now built from the same code base. 2003.01.17: Further improvements to the MPEG-4 audio support. We can now read (from the "MediaSubsession") the StreamMuxConfig "config" stream that was present in the SDP description. Also added a routine that parses such a string, producing binary "AudioSpecificConfig" data. (See "MPEG4LATMAudioRTPSource.cpp" for details.) 2003.01.16: Improved support for receiving MPEG-4 LATM audio. Note that currently, this works only for streams that do not have a StreamMuxConfig present in the stream. 2003.01.10: Added basic support for MPEG-4 LATM audio. 2002.12.21: Fixed a bug in the previous update to "QuickTimeFileSink" 2002.12.20: - Another change to "QuickTimeFileSink", again to change the way that track durations are computed for ".mov" files. Now, each track's duration is set to be the maximum of (i) the sum of the sample durations listed in the 'stts' atom, and (ii) the the sum of the durations listed in the track's 'edit list' (if any). - Updated the MP3 file parsing code to check for a 'Xing' VBR header in the first frame. ("liveCaster" can use this information to print more sensible information about each file that it streams.) 2002.12.10: Yet another change to "QuickTimeFileSink", this time to make sure that the duration of video tracks corresponds exactly to the sum of video sample durations listed in the 'stts' atom. 2002.11.30: Renamed "TaskScheduler::blockMyself()" to "doEventLoop()", to better describe what this member function actually does. 2002.11.25: Another change to "QuickTimeFileSink". Now, when synchronzed tracks are requested, the durations of video frame samples are adjusted so that they correspond to actual RTP presentation times. (This is not done for audio samples, however, because having audio samples vary in duration might break audio codecs.) 2002.11.22: Updated "QuickTimeFileSink" once again - this time to add more statistics to the 'udta'/'hinf' atom for each generated hint track. 2002.11.18: Modified the support for creating hint tracks in "QuickTimeFileSink" so that it it now works properly for H.263+ video sessions. 2002.11.15: - Made a small modification to "groupsock/GroupsockHelper.hh" to ensure that it compiles on all platforms. - Modified "MP3FileSource" so that it can handle layer I or layer II files, as well as layer III (MP3). 2002.11.14: Updated "QuickTimeFileSink" to support (optional) hint tracks in output QuickTime files. Also added a "-H" option to "openRTSP" that (when used with "-q") will add hint tracks to the output ".mov" file. (Note that the hint tracks currently don't work well for H.263+ video tracks, and currently don't work at all for QCELP.) 2002.11.04: Updated the expiration date in "openRTSP.cpp" 2002.10.22: - Undid the previous change. The top-level Unix Makefile now does cd ; make once again. Unfortunately "--directory" doesn't seem to work properly with the version of "make" that's installed with FreeBSD. - Changed the implementation of the "-n" option in "openRTSP". If "-y" is also specified, then the user will be notified only if (i) data has arrived for all subsessions, and (ii) all subsessions have been synchronized. 2002.10.21: Changed the top-level Unix Makefile to do make --directory= rather than cd ; make as the latter apparently didn't work with cygwin. (Thanks to "Sycotic" Smith for the tip.) 2002.10.20: - Updated "QuickTimeFileSink" once again to improve the implementation of synchronized audio/video tracks in output QuickTime files. - Added a configuration file for "cygwin". (Thanks to "Sycotic" Smith for working on this.) 2002.10.19: Updated "QuickTimeFileSink" to use QuickTime Edit Lists to synchronize the media tracks. (It appears that this does not always produce playable QuickTime files, so this implementation may have to be changed later.) 2002.10.11: Fixed a bug in "MultiFramedRTPSource" that could cause a RTP receiver to hang if it received a malformed RTP packet with no data after a special, media-specific header. 2002.10.10: Fixed the "RTSPClient" implementation so that it now understands "Content-Length" as well as "Content-length". (This now allows it to work with our own RTSP server implementation once again!) 2002.10.07: Improved the implementation of RTP (and RTCP) reception to eliminate an unnecessary "memmove()" each time a packet is received. 2002.10.04: Updated the "liveMedia" library to support optionally sending and receiving RTP and RTCP packets over a TCP connection (e.g., the TCP connection used for a RTSP session). Also, updated the "openRTSP" test program to take an optional "-t" argument, meaning: stream over TCP. 2002.10.01: Fixed the modification to "MultiFramedRTPSource" that was made in the 2002.08.29 release, and also made a corresponding change to "QuickTimeFileSink", so that it now correctly records H.263+/RTP streams once again. 2002.09.30: - Removed the "Media::addNew()" member function, because it was always called each time a new Media object was created. Instead, its function was just moved into the Media::Media() constructor. - Made another fix to "testMPEGAudioVideoStreamer". 2002.09.28: Fixed a bug in "testMPEGAudioVideoStreamer" that could cause a crash when its input file was being read for the 2nd or more time. (Also updated "liveMedia/FramedSource.cpp".) 2002.09.27: Updated "QCELPAudioRTPSource" so that "hasBeenSynchronizedUsingRTCP()" returns True only after a full interleave cycle of RTP packets has been received. This ensures that when it returns true, the receiver will be reading a frame that came from a synchronized RTP packet. 2002.09.26: - Fixed QCELPAudioRTPSource so that it now returns correct presentation timestamps on each frame that is read from it (even if the input data was interleaved). - Updated QuickTimeFileSink to correctly write ".mov" files for half-rate QCELP audio tracks. 2002.09.25: Added a new test program - "sapWatch" - that reads and prints SDP/SAP announcements (sent to the default SDP/SAP directory) 2002.09.24: - Fixed a bug in "QCELPAudioRTPSource" - The RTCP implementation now properly recognizes incoming RTCP reports from other processes on the same computer. (Previously, these would be rejected as being loop-back packets.) 2002.09.19: - Updated "RTPSource"s so that an accurate "presentationTime" variable is now returned whenever a client reads from such a source. These times are kept accurate by RTCP "Sender Report" packets sent by the sender. 2002.09.13: - Improved the "BasicHashTable" implementation so that it's no longer a quick-and-dirty hack. - Changed the parameter signature to "ByteStreamFileSource" so that the "playTimePerFrame" parameter is now an unsigned (microseconds) instead of a float. This eliminates a round-off problem. 2002.09.11: Modified "ByteStreamFileSource::doGetNextFrame()" so that - if the "playTimePerFrame" parameter was set - the presentation time gets set based on this, rather than the current 'wall clock' time. 2002.09.06: Updated "win32config.Borland" based on feedback by Vesselin Kostadinov. (Also updated an #ifdef in "liveMedia/include/Media.hh") 2002.09.05: Added code to ignore an "EAGAIN" error on a 'groupsock' read. (This can happen in Linux.) 2002.09.03: Fixed a bug in the RTSP server implementation that could have caused a memory smash. 2002.08.30: Added header files containing version strings (and corresponding integers) for each library. Client code can use these to print out version information, or check for version compatibility. 2002.08.29: Modified "MultiFramedRTPSource" and its subclasses to properly handle the case where a frame is fragmented over several successive incoming RTP packets. Each subclass's implementation of "processSpecialHeader()" can choose between having incomplete fragments returned immediately to the client (the default behavior), or waiting until all of the fragments have arrived. The implementation of "H263plusVideoRTPSource" was changed to do the latter (because the current "ffmpeg" H.263+ decoder relies upon getting complete frames for input). Added an optional "applicationName" parameter to "RTSPClient::createNew()", and updated the RTSP client implementation to add a "User-Agent:" field, which will contain this "applicationName" string (if present). 2002.08.27: Added an optional Boolean parameter "iFramesOnly" to "MPEGVideoStreamFramer::createNew()". If this parameter is True, then the framer object will return only data from "I" frames. (By default, this parameter is False, meaning that all frames will be returned.) This parameter can be used to reduce the bandwidth of streamed MPEG (1 or 2) video. 2002.08.06: Changed "groupsock/GroupsockHelper.cpp" to do a "#include " rather than "extern int errno". The latter was apparently breaking in some versions of Linux. 2002.08.05: Added support for the video/MP2P MIME type (RFC 2250 MPEG Program Streams) 2002.06.25: Source file distribution copied from live.sourceforge.net