Hello community, here is the log from the commit of package live555 for openSUSE:Factory checked in at 2017-11-04 19:27:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/live555 (Old) and /work/SRC/openSUSE:Factory/.live555.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "live555" Sat Nov 4 19:27:50 2017 rev:11 rq:538277 version:2017.10.28 Changes: -------- --- /work/SRC/openSUSE:Factory/live555/live555.changes 2017-08-24 17:39:17.399189902 +0200 +++ /work/SRC/openSUSE:Factory/.live555.new/live555.changes 2017-11-04 19:27:54.008166387 +0100 @@ -1,0 +2,31 @@ +Wed Nov 1 12:27:27 UTC 2017 - mathias.hom...@opensuse.org + +- Update to 2017.10.28 +2017.10.28: +- Fixed the handling of the LIVE555 Proxy Server's "-u <username> <password>" command-line option if + the "REGISTER" command is also implemented (i.e., with "-R"). Now, when we handle "REGISTER", + the <username> and <password> are used to access the REGISTER'ed back-end stream, if necessary. +- Changed the server handling of the RTSP "REGISTER" command to (if "reuseConnection" is True) delay + a short period of time (100ms) between replying to the "REGISTER" command, and actually + handling it. This is intended to reduce/avoid the possibility of a subsequent "DESCRIBE" command + ending up in the client ("REGISTER" sender)'s buffer, before the socket gets reused for handling + incoming RTSP commands. (Thanks to Durgesh Tanuku for noting this issue.) +- Made a change to "SIPClient" to better handle Asterisk SIP servers with authentication. + (Thanks to Rus.) + +2017.09.12: +- Made some improvements/bug fixes to AVI indexes in "AVIFileSink". + (Thanks to Victor V. Vinokurov.) +- Updated the handling of the "writeTimeoutInMilliseconds" parameter in the "makeSocketBlocking()" + function to work correctly on Windows. (Thanks to Jeff Shanab for noting this issue.) +- Added support for adding Opus audio to MPEG Transport Streams. This is done by setting the + "mpegVersion" parameter to 3 in "MPEG2TransportStreamFromESSource::addNewAudioSource()" or + "MPEG2TransportStreamMultiplexor::handleNewBuffer()". + (Thanks to Praveen Mathad for suggesting this.) + +2017.07.18: +- Updated "BitVector" to support a signed version of "get_expGolomb()", and fixed our H.264/265 + parsing code to use the signed version where appropriate. + (Thanks to Toson Huang and Long Zhang for reporting this.) + +------------------------------------------------------------------- Old: ---- live.2017.06.04.tar.gz New: ---- live.2017.10.28.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ live555.spec ++++++ --- /var/tmp/diff_new_pack.GTUYtk/_old 2017-11-04 19:27:54.760138909 +0100 +++ /var/tmp/diff_new_pack.GTUYtk/_new 2017-11-04 19:27:54.764138763 +0100 @@ -18,8 +18,8 @@ Name: live555 -Version: 2017.06.04 -Release: 1.2 +Version: 2017.10.28 +Release: 1 Summary: LIVE555 Streaming Media License: LGPL-2.1 Group: System/Libraries ++++++ live.2017.06.04.tar.gz -> live.2017.10.28.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh new/live/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh --- old/live/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh 2017-06-04 18:53:05.000000000 +0200 +++ new/live/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh 2017-10-28 02:26:18.000000000 +0200 @@ -4,7 +4,7 @@ #ifndef _BASICUSAGEENVIRONMENT_VERSION_HH #define _BASICUSAGEENVIRONMENT_VERSION_HH -#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_STRING "2017.06.04" -#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_INT 1496534400 +#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_STRING "2017.10.28" +#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_INT 1509148800 #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/UsageEnvironment/include/UsageEnvironment_version.hh new/live/UsageEnvironment/include/UsageEnvironment_version.hh --- old/live/UsageEnvironment/include/UsageEnvironment_version.hh 2017-06-04 18:53:05.000000000 +0200 +++ new/live/UsageEnvironment/include/UsageEnvironment_version.hh 2017-10-28 02:26:18.000000000 +0200 @@ -4,7 +4,7 @@ #ifndef _USAGEENVIRONMENT_VERSION_HH #define _USAGEENVIRONMENT_VERSION_HH -#define USAGEENVIRONMENT_LIBRARY_VERSION_STRING "2017.06.04" -#define USAGEENVIRONMENT_LIBRARY_VERSION_INT 1496534400 +#define USAGEENVIRONMENT_LIBRARY_VERSION_STRING "2017.10.28" +#define USAGEENVIRONMENT_LIBRARY_VERSION_INT 1509148800 #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.linux-with-shared-libraries new/live/config.linux-with-shared-libraries --- old/live/config.linux-with-shared-libraries 2017-06-04 18:53:19.000000000 +0200 +++ new/live/config.linux-with-shared-libraries 2017-10-28 02:29:48.000000000 +0200 @@ -3,9 +3,9 @@ # At least one interface changes, or is removed => CURRENT += 1; REVISION = 0; AGE = 0 # One or more interfaces were added, but no existing interfaces were changed or removed => CURRENT += 1; REVISION = 0; AGE += 1 -libliveMedia_VERSION_CURRENT=59 -libliveMedia_VERSION_REVISION=2 -libliveMedia_VERSION_AGE=1 +libliveMedia_VERSION_CURRENT=61 +libliveMedia_VERSION_REVISION=0 +libliveMedia_VERSION_AGE=0 libliveMedia_LIB_SUFFIX=so.$(shell expr $(libliveMedia_VERSION_CURRENT) - $(libliveMedia_VERSION_AGE)).$(libliveMedia_VERSION_AGE).$(libliveMedia_VERSION_REVISION) libBasicUsageEnvironment_VERSION_CURRENT=1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/groupsock/GroupsockHelper.cpp new/live/groupsock/GroupsockHelper.cpp --- old/live/groupsock/GroupsockHelper.cpp 2017-06-04 18:53:05.000000000 +0200 +++ new/live/groupsock/GroupsockHelper.cpp 2017-10-28 02:26:18.000000000 +0200 @@ -202,11 +202,16 @@ if (writeTimeoutInMilliseconds > 0) { #ifdef SO_SNDTIMEO +#if defined(__WIN32__) || defined(_WIN32) + DWORD msto = (DWORD)writeTimeoutInMilliseconds; + setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&msto, sizeof(msto) ); +#else struct timeval tv; tv.tv_sec = writeTimeoutInMilliseconds/1000; tv.tv_usec = (writeTimeoutInMilliseconds%1000)*1000; setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof tv); #endif +#endif } return result; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/groupsock/include/groupsock_version.hh new/live/groupsock/include/groupsock_version.hh --- old/live/groupsock/include/groupsock_version.hh 2017-06-04 18:53:05.000000000 +0200 +++ new/live/groupsock/include/groupsock_version.hh 2017-10-28 02:26:18.000000000 +0200 @@ -4,7 +4,7 @@ #ifndef _GROUPSOCK_VERSION_HH #define _GROUPSOCK_VERSION_HH -#define GROUPSOCK_LIBRARY_VERSION_STRING "2017.06.04" -#define GROUPSOCK_LIBRARY_VERSION_INT 1496534400 +#define GROUPSOCK_LIBRARY_VERSION_STRING "2017.10.28" +#define GROUPSOCK_LIBRARY_VERSION_INT 1509148800 #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/AVIFileSink.cpp new/live/liveMedia/AVIFileSink.cpp --- old/live/liveMedia/AVIFileSink.cpp 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/AVIFileSink.cpp 2017-10-28 02:26:18.000000000 +0200 @@ -25,6 +25,11 @@ #define fourChar(x,y,z,w) ( ((w)<<24)|((z)<<16)|((y)<<8)|(x) )/*little-endian*/ +#define AVIIF_LIST 0x00000001 +#define AVIIF_KEYFRAME 0x00000010 +#define AVIIF_NO_TIME 0x00000100 +#define AVIIF_COMPRESSOR 0x0FFF0000 + ////////// AVISubsessionIOState /////////// // A structure used to represent the I/O state of each input 'subsession': @@ -365,7 +370,7 @@ addWord(indexRecord->size()); } - fRIFFSizeValue += fNumBytesWritten; + fRIFFSizeValue += fNumBytesWritten + fNumIndexRecords*4*4 - 4; setWord(fRIFFSizePosition, fRIFFSizeValue); setWord(fAVIHMaxBytesPerSecondPosition, maxBytesPerSecond); @@ -531,9 +536,9 @@ // Add an index record for this frame: AVIIndexRecord* newIndexRecord = new AVIIndexRecord(fAVISubsessionTag, // chunk id - frameSource[0] == 0x67 ? 0x10 : 0, // flags - fOurSink.fMoviSizePosition + 8 + fOurSink.fNumBytesWritten, // offset (note: 8 == size + 'movi') - frameSize + 4); // size + AVIIF_KEYFRAME, // flags + 4 + fOurSink.fNumBytesWritten, // offset (note: 4 == 'movi') + frameSize); // size fOurSink.addIndexRecord(newIndexRecord); // Write the data into the file: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/BitVector.cpp new/live/liveMedia/BitVector.cpp --- old/live/liveMedia/BitVector.cpp 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/BitVector.cpp 2017-10-28 02:26:18.000000000 +0200 @@ -139,6 +139,15 @@ return codeStart - 1 + getBits(numLeadingZeroBits); } +int BitVector::get_expGolombSigned() { + unsigned codeNum = get_expGolomb(); + + if ((codeNum&1) == 0) { // even + return -(int)(codeNum/2); + } else { // odd + return (codeNum+1)/2; + } +} void shiftBits(unsigned char* toBasePtr, unsigned toBitOffset, unsigned char const* fromBasePtr, unsigned fromBitOffset, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/H264or5VideoStreamFramer.cpp new/live/liveMedia/H264or5VideoStreamFramer.cpp --- old/live/liveMedia/H264or5VideoStreamFramer.cpp 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/H264or5VideoStreamFramer.cpp 2017-10-28 02:26:18.000000000 +0200 @@ -551,7 +551,7 @@ DEBUG_PRINT(nextScale); if (nextScale != 0) { DEBUG_TAB; - unsigned delta_scale = bv.get_expGolomb(); + int delta_scale = bv.get_expGolombSigned(); DEBUG_PRINT(delta_scale); nextScale = (lastScale + delta_scale + 256) % 256; } @@ -573,12 +573,12 @@ } else if (pic_order_cnt_type == 1) { DEBUG_TAB; bv.skipBits(1); // delta_pic_order_always_zero_flag - (void)bv.get_expGolomb(); // offset_for_non_ref_pic - (void)bv.get_expGolomb(); // offset_for_top_to_bottom_field + (void)bv.get_expGolombSigned(); // offset_for_non_ref_pic + (void)bv.get_expGolombSigned(); // offset_for_top_to_bottom_field unsigned num_ref_frames_in_pic_order_cnt_cycle = bv.get_expGolomb(); DEBUG_PRINT(num_ref_frames_in_pic_order_cnt_cycle); for (unsigned i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; ++i) { - (void)bv.get_expGolomb(); // offset_for_ref_frame[i] + (void)bv.get_expGolombSigned(); // offset_for_ref_frame[i] } } unsigned max_num_ref_frames = bv.get_expGolomb(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/MPEG2TransportStreamMultiplexor.cpp new/live/liveMedia/MPEG2TransportStreamMultiplexor.cpp --- old/live/liveMedia/MPEG2TransportStreamMultiplexor.cpp 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/MPEG2TransportStreamMultiplexor.cpp 2017-10-28 02:26:18.000000000 +0200 @@ -121,16 +121,16 @@ streamType = mpegVersion == 1 ? 1 : mpegVersion == 2 ? 2 : mpegVersion == 4 ? 0x10 : mpegVersion == 5/*H.264*/ ? 0x1B : 0x24/*assume H.265*/; } else if ((stream_id&0xE0) == 0xC0) { // audio - streamType = mpegVersion == 1 ? 3 : mpegVersion == 2 ? 4 : 0xF; - } else if (stream_id == 0xBD) { // private_stream1 (usually AC-3) - streamType = 0x06; // for DVB; for ATSC, use 0x81 - } else { // something else, e.g., AC-3 uses private_stream1 (0xBD) + streamType = mpegVersion == 1 ? 3 : mpegVersion == 2 ? 4 : mpegVersion == 3 ? 6 : 0xF; + } else if (stream_id == 0xBD) { // private_stream1 (usually AC-3 or Opus) + streamType = 0x06; // for DVB or Opus; for ATSC, use 0x81 + } else { // something else streamType = 0x81; // private } } if (fPCR_PID == 0) { // set it to this stream, if it's appropriate: - if ((!fHaveVideoStreams && (streamType == 3 || streamType == 4 || streamType == 0xF))/* audio stream */ || + if ((!fHaveVideoStreams && (streamType == 3 || streamType == 4 || streamType == 6 || streamType == 0xF))/* audio stream */ || (streamType == 1 || streamType == 2 || streamType == 0x10 || streamType == 0x1B || streamType == 0x24)/* video stream */) { fPCR_PID = fCurrentPID; // use this stream's SCR for PCR } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/RTSPServerRegister.cpp new/live/liveMedia/RTSPServerRegister.cpp --- old/live/liveMedia/RTSPServerRegister.cpp 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/RTSPServerRegister.cpp 2017-10-28 02:26:18.000000000 +0200 @@ -216,6 +216,8 @@ delete[] (char*)fCmd; delete[] fURL; delete[] fURLSuffix; delete[] fProxyURLSuffix; } +#define DELAY_USECS_AFTER_REGISTER_RESPONSE 100000 /*100ms*/ + void RTSPServer ::RTSPClientConnection::handleCmd_REGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, char const* url, char const* urlSuffix, char const* fullRequestStr, @@ -225,13 +227,19 @@ // The "REGISTER"/"DEREGISTER" command - if we implement it - may require access control: if (!authenticationOK(cmd, urlSuffix, fullRequestStr)) return; - // We implement the "REGISTER"/"DEREGISTER" command by first replying to it, then actually handling it - // (in a separate event-loop task, that will get called after the reply has been done): + // We implement the "REGISTER"/"DEREGISTER" command by first replying to it, then actually + // handling it (in a separate event-loop task, that will get called after the reply has + // been done). + // Hack: If we're going to reuse the command's connection for subsequent RTSP commands, then we + // delay the actual handling of the command slightly, to make it less likely that the first + // subsequent RTSP command (e.g., "DESCRIBE") will end up in the client's reponse buffer before + // the socket (at the far end) gets reused for RTSP command handling. setRTSPResponse(responseStr == NULL ? "200 OK" : responseStr); delete[] responseStr; ParamsForREGISTER* registerParams = new ParamsForREGISTER(cmd, this, url, urlSuffix, reuseConnection, deliverViaTCP, proxyURLSuffix); - envir().taskScheduler().scheduleDelayedTask(0, (TaskFunc*)continueHandlingREGISTER, registerParams); + envir().taskScheduler().scheduleDelayedTask(reuseConnection ? DELAY_USECS_AFTER_REGISTER_RESPONSE : 0, + (TaskFunc*)continueHandlingREGISTER, registerParams); } else if (responseStr != NULL) { setRTSPResponse(responseStr); delete[] responseStr; @@ -312,26 +320,33 @@ ::createNew(UsageEnvironment& env, Port ourPort, UserAuthenticationDatabase* authDatabase, UserAuthenticationDatabase* authDatabaseForREGISTER, unsigned reclamationSeconds, - Boolean streamRTPOverTCP, int verbosityLevelForProxying) { + Boolean streamRTPOverTCP, int verbosityLevelForProxying, + char const* backEndUsername, char const* backEndPassword) { int ourSocket = setUpOurSocket(env, ourPort); if (ourSocket == -1) return NULL; - return new RTSPServerWithREGISTERProxying(env, ourSocket, ourPort, authDatabase, authDatabaseForREGISTER, reclamationSeconds, - streamRTPOverTCP, verbosityLevelForProxying); + return new RTSPServerWithREGISTERProxying(env, ourSocket, ourPort, + authDatabase, authDatabaseForREGISTER, + reclamationSeconds, + streamRTPOverTCP, verbosityLevelForProxying, + backEndUsername, backEndPassword); } RTSPServerWithREGISTERProxying ::RTSPServerWithREGISTERProxying(UsageEnvironment& env, int ourSocket, Port ourPort, UserAuthenticationDatabase* authDatabase, UserAuthenticationDatabase* authDatabaseForREGISTER, unsigned reclamationSeconds, - Boolean streamRTPOverTCP, int verbosityLevelForProxying) + Boolean streamRTPOverTCP, int verbosityLevelForProxying, + char const* backEndUsername, char const* backEndPassword) : RTSPServer(env, ourSocket, ourPort, authDatabase, reclamationSeconds), fStreamRTPOverTCP(streamRTPOverTCP), fVerbosityLevelForProxying(verbosityLevelForProxying), - fRegisteredProxyCounter(0), fAllowedCommandNames(NULL), fAuthDBForREGISTER(authDatabaseForREGISTER) { + fRegisteredProxyCounter(0), fAllowedCommandNames(NULL), fAuthDBForREGISTER(authDatabaseForREGISTER), + fBackEndUsername(strDup(backEndUsername)), fBackEndPassword(strDup(backEndPassword)) { } RTSPServerWithREGISTERProxying::~RTSPServerWithREGISTERProxying() { delete[] fAllowedCommandNames; + delete[] fBackEndUsername; delete[] fBackEndPassword; } char const* RTSPServerWithREGISTERProxying::allowedCommandNames() { @@ -390,7 +405,8 @@ // We don't support streaming from the back-end via RTSP/RTP/RTCP-over-HTTP; only via RTP/RTCP-over-TCP or RTP/RTCP-over-UDP ServerMediaSession* sms - = ProxyServerMediaSession::createNew(envir(), this, url, proxyStreamName, NULL, NULL, + = ProxyServerMediaSession::createNew(envir(), this, url, proxyStreamName, + fBackEndUsername, fBackEndPassword, tunnelOverHTTPPortNum, fVerbosityLevelForProxying, socketToRemoteServer); addServerMediaSession(sms); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/SIPClient.cpp new/live/liveMedia/SIPClient.cpp --- old/live/liveMedia/SIPClient.cpp 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/SIPClient.cpp 2017-10-28 02:26:18.000000000 +0200 @@ -482,7 +482,7 @@ && fWorkingAuthenticator != NULL) { // We have an authentication failure, so fill in // "*fWorkingAuthenticator" using the contents of a following - // "Proxy-Authenticate:" line. (Once we compute a 'response' for + // "Proxy-Authenticate:" or "WWW_Authenticate:" line. (Once we compute a 'response' for // "fWorkingAuthenticator", it can be used in a subsequent request // - that will hopefully succeed.) char* lineStart; @@ -503,6 +503,8 @@ // Asterisk ##### sscanf(lineStart, "Proxy-Authenticate: Digest realm=\"%[^\"]\", nonce=\"%[^\"]\"", realm, nonce) == 2 || + sscanf(lineStart, "WWW-Authenticate: Digest realm=\"%[^\"]\", nonce=\"%[^\"]\"", + realm, nonce) == 2 || // Cisco ATA ##### sscanf(lineStart, "Proxy-Authenticate: Digest algorithm=MD5,domain=\"%*[^\"]\",nonce=\"%[^\"]\", realm=\"%[^\"]\"", nonce, realm) == 2) { @@ -868,7 +870,7 @@ && authenticator->password() != NULL) { // We've been provided a filled-in authenticator, so use it: char const* const authFmt - = "Proxy-Authorization: Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", response=\"%s\", uri=\"%s\"\r\n"; + = "Authorization: Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", response=\"%s\", uri=\"%s\"\r\n"; char const* response = authenticator->computeDigestResponse(cmd, url); unsigned authBufSize = strlen(authFmt) + strlen(authenticator->username()) + strlen(authenticator->realm()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/include/BitVector.hh new/live/liveMedia/include/BitVector.hh --- old/live/liveMedia/include/BitVector.hh 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/include/BitVector.hh 2017-10-28 02:26:18.000000000 +0200 @@ -50,6 +50,7 @@ unsigned get_expGolomb(); // Returns the value of the next bits, assuming that they were encoded using an exponential-Golomb code of order 0 + int get_expGolombSigned(); // signed version of the above private: unsigned char* fBaseBytePtr; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/include/MPEG2TransportStreamFromESSource.hh new/live/liveMedia/include/MPEG2TransportStreamFromESSource.hh --- old/live/liveMedia/include/MPEG2TransportStreamFromESSource.hh 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/include/MPEG2TransportStreamFromESSource.hh 2017-10-28 02:26:18.000000000 +0200 @@ -31,8 +31,11 @@ static MPEG2TransportStreamFromESSource* createNew(UsageEnvironment& env); void addNewVideoSource(FramedSource* inputSource, int mpegVersion, int16_t PID = -1); - // Note: For MPEG-4 video, set "mpegVersion" to 4; for H.264 video, set "mpegVersion" to 5. + // Note: For MPEG-4 video, set "mpegVersion" to 4; for H.264 video, set "mpegVersion" to 5; + // for H.265 video, set "mpegVersion" to 6 void addNewAudioSource(FramedSource* inputSource, int mpegVersion, int16_t PID = -1); + // Note: For Opus audio, set "mpegVersion" to 3 + // Note: In these functions, if "PID" is not -1, then it (currently, just the low 8 bits) // is used as the stream's PID. Otherwise (if "PID" is -1) the 'stream_id' is used as // the PID. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/include/MPEG2TransportStreamMultiplexor.hh new/live/liveMedia/include/MPEG2TransportStreamMultiplexor.hh --- old/live/liveMedia/include/MPEG2TransportStreamMultiplexor.hh 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/include/MPEG2TransportStreamMultiplexor.hh 2017-10-28 02:26:18.000000000 +0200 @@ -47,7 +47,9 @@ void handleNewBuffer(unsigned char* buffer, unsigned bufferSize, int mpegVersion, MPEG1or2Demux::SCR scr, int16_t PID = -1); // called by "awaitNewBuffer()" - // Note: For MPEG-4 video, set "mpegVersion" to 4; for H.264 video, set "mpegVersion" to 5. + // Note: For MPEG-4 video, set "mpegVersion" to 4; for H.264 video, set "mpegVersion" to 5; + // for H.265 video, set "mpegVersion" to 6. + // For Opus audio, set "mpegVersion" to 3. // The buffer is assumed to be a PES packet, with a proper PES header. // If "PID" is not -1, then it (currently, only the low 8 bits) is used as the stream's PID, // otherwise the "stream_id" in the PES header is reused to be the stream's PID. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/include/RTSPServer.hh new/live/liveMedia/include/RTSPServer.hh --- old/live/liveMedia/include/RTSPServer.hh 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/include/RTSPServer.hh 2017-10-28 02:26:18.000000000 +0200 @@ -310,13 +310,16 @@ UserAuthenticationDatabase* authDatabaseForREGISTER = NULL, unsigned reclamationSeconds = 65, Boolean streamRTPOverTCP = False, - int verbosityLevelForProxying = 0); + int verbosityLevelForProxying = 0, + char const* backEndUsername = NULL, + char const* backEndPassword = NULL); protected: RTSPServerWithREGISTERProxying(UsageEnvironment& env, int ourSocket, Port ourPort, UserAuthenticationDatabase* authDatabase, UserAuthenticationDatabase* authDatabaseForREGISTER, unsigned reclamationSeconds, - Boolean streamRTPOverTCP, int verbosityLevelForProxying); + Boolean streamRTPOverTCP, int verbosityLevelForProxying, + char const* backEndUsername, char const* backEndPassword); // called only by createNew(); virtual ~RTSPServerWithREGISTERProxying(); @@ -335,6 +338,8 @@ unsigned fRegisteredProxyCounter; char* fAllowedCommandNames; UserAuthenticationDatabase* fAuthDBForREGISTER; + char* fBackEndUsername; + char* fBackEndPassword; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/include/liveMedia_version.hh new/live/liveMedia/include/liveMedia_version.hh --- old/live/liveMedia/include/liveMedia_version.hh 2017-06-04 18:53:05.000000000 +0200 +++ new/live/liveMedia/include/liveMedia_version.hh 2017-10-28 02:26:18.000000000 +0200 @@ -4,7 +4,7 @@ #ifndef _LIVEMEDIA_VERSION_HH #define _LIVEMEDIA_VERSION_HH -#define LIVEMEDIA_LIBRARY_VERSION_STRING "2017.06.04" -#define LIVEMEDIA_LIBRARY_VERSION_INT 1496534400 +#define LIVEMEDIA_LIBRARY_VERSION_STRING "2017.10.28" +#define LIVEMEDIA_LIBRARY_VERSION_INT 1509148800 #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/mediaServer/version.hh new/live/mediaServer/version.hh --- old/live/mediaServer/version.hh 2017-06-04 18:53:05.000000000 +0200 +++ new/live/mediaServer/version.hh 2017-10-28 02:26:19.000000000 +0200 @@ -5,6 +5,6 @@ #ifndef _MEDIA_SERVER_VERSION_HH #define _MEDIA_SERVER_VERSION_HH -#define MEDIA_SERVER_VERSION_STRING "0.90" +#define MEDIA_SERVER_VERSION_STRING "0.91" #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/proxyServer/live555ProxyServer.cpp new/live/proxyServer/live555ProxyServer.cpp --- old/live/proxyServer/live555ProxyServer.cpp 2017-06-04 18:53:05.000000000 +0200 +++ new/live/proxyServer/live555ProxyServer.cpp 2017-10-28 02:26:19.000000000 +0200 @@ -38,7 +38,7 @@ static RTSPServer* createRTSPServer(Port port) { if (proxyREGISTERRequests) { - return RTSPServerWithREGISTERProxying::createNew(*env, port, authDB, authDBForREGISTER, 65, streamRTPOverTCP, verbosityLevel); + return RTSPServerWithREGISTERProxying::createNew(*env, port, authDB, authDBForREGISTER, 65, streamRTPOverTCP, verbosityLevel, username, password); } else { return RTSPServer::createNew(*env, port, authDB); }