Index: liveMedia/MediaSession.cpp =================================================================== --- liveMedia/MediaSession.cpp (revision 5294) +++ liveMedia/MediaSession.cpp (working copy) @@ -28,9 +28,11 @@ ////////// MediaSession ////////// MediaSession* MediaSession::createNew(UsageEnvironment& env, - char const* sdpDescription) { + char const* sdpDescription, + Boolean ip6Workaround) { MediaSession* newSession = new MediaSession(env); if (newSession != NULL) { + newSession->fIp6Workaround = ip6Workaround; if (!newSession->initializeWithSDP(sdpDescription)) { delete newSession; return NULL; @@ -640,6 +642,7 @@ fRTPSocket(NULL), fRTCPSocket(NULL), fRTPSource(NULL), fRTCPInstance(NULL), fReadSource(NULL), fReceiveRawMP3ADUs(False), fReceiveRawJPEGFrames(False), + fIp6Workaround(parent.fIp6Workaround), fSessionId(NULL) { rtpInfo.seqNum = 0; rtpInfo.timestamp = 0; rtpInfo.infoIsNew = False; @@ -856,7 +859,7 @@ env().setResultMsg("Failed to create read source"); break; } - + SRTPCryptographicContext* ourCrypto = NULL; if (useSRTP) { // For SRTP, we need key management. If MIKEY (key management) state wasn't given @@ -1054,6 +1057,11 @@ fConnectionEndpointNameAddressFamily = AF_INET; return True; } else if (parseStringValue(sdpLine, "c=IN IP6 %[^/\r\n]", fConnectionEndpointName)) { + if (fIp6Workaround && strcmp(fConnectionEndpointName, "::") == 0) { + delete[] fConnectionEndpointName; + fConnectionEndpointName = NULL; + return False; + } fConnectionEndpointNameAddressFamily = AF_INET6; return True; } Index: liveMedia/include/MediaSession.hh =================================================================== --- liveMedia/include/MediaSession.hh (revision 5294) +++ liveMedia/include/MediaSession.hh (working copy) @@ -63,7 +63,8 @@ class MediaSession: public Medium { public: static MediaSession* createNew(UsageEnvironment& env, - char const* sdpDescription); + char const* sdpDescription, + Boolean ip6Workaround = False); static Boolean lookupByName(UsageEnvironment& env, char const* sourceName, MediaSession*& resultSession); @@ -147,7 +148,10 @@ char* fSessionName; // holds s= value char* fSessionDescription; // holds i= value char* fControlPath; // holds optional a=control: string +public: + Boolean fIp6Workaround; +protected: // Optional key management and crypto state: MIKEYState* fMIKEYState; SRTPCryptographicContext* fCrypto; @@ -362,6 +366,7 @@ RTPSource* fRTPSource; RTCPInstance* fRTCPInstance; FramedSource* fReadSource; Boolean fReceiveRawMP3ADUs, fReceiveRawJPEGFrames; + Boolean fIp6Workaround; // Other fields: char* fSessionId; // used by RTSP