Hi, I came across an IP camera which, in my opinion, behaves wrong when set to DHCP on an Pv4 network. The camera replies on a RTSP-setup command from a IPv4 address with a SDP-lines like:
o=- 26064995877 26064995877 IN IP4 10.10.0.129 s=Media Presentation e=NONE b=AS:5050 t=0 0 a=control:rtsp://10.10.0.129/Streaming/channels/1/picture/ m=video 0 RTP/AVP 96 c=IN IP6 :: b=AS:5000 a=recvonly a=x-dimensions:1920,1080 a=control:rtsp://10.10.0.129/Streaming/channels/1/picture/trackID=1 a=rtpmap:96 H264/90000 a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z00AKp2oHgCJ+WbgICAoAAADAAgAAAMBlCA=,aO48gA== a=Media_header:MEDIAINFO=494D4B48010300000400000100000000000000000000000000000000000000000000000000000000; a=appversion:1.0 And I think the o= line conflicts with the c= line. I know that the camera has an IPv4 address (as can be seen in the o= line) and the connect comes from an IPv4 address. So, in my opinion, the camera should answer with "c=IN IP4 0.0.0.0", if nothing special is required. Would answering with "c=IN IP6 ::" be covered by the standard in this case? I think not. To make our client happy again, I came up with a quick hack, which I am attaching here. I don't believe this would be acceptable as patch into live555, but it solved my immediate problem. And this leads to another question: would manipulating the SDP lines before calling MediaSession::createNew be a possible solution, too? It would still be a hack, I know, but when that's a supported interface (and will be available in the forseeable future as well), I would feel much better ;-) CU, Uli Ulrich Teichert Sr. Software Engineer, Technology Development Center VSS Luminator Technology Group P: +49 (4321) 539895-13 ulrich.teich...@luminator.com https://www.luminator.com LTG Rastatt GmbH | Office Neumünster Oderstrasse 47 | DE - 24539 Neumünster Geschäftsführer: Roald Greboval, Hans-Joachim Reich | Sitz der Gesellschaft: D-76437 Rastatt, Amtsgericht: Mannheim, HRB 521501 USt.-IdNr: DE144752608, Steuer-Nr: 39487/30502
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=<session name> value char* fSessionDescription; // holds i=<session description> 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
_______________________________________________ live-devel mailing list live-devel@lists.live555.com http://lists.live555.com/mailman/listinfo/live-devel