[Users] Mediaproxy module and new equipment

Artur Yakupov artur at novatel.ru
Thu Oct 19 10:33:02 CEST 2006


Hi, all!

Preamble:
I got new equipment - videophone. I tried to make it work with OpenSER 
(version 1.1.0).
Schema:
VIDEOPHONE -> OpenSER -> VIDEOPHONE
I tried to make simple call.

It works but not behind NAT.

With rtpproxy OpenSER logs show such messages:
ERROR: force_rtp_proxy2: can't extract media port from the message
Calls last only few seconds than it get disconnected.

With mediaproxy OpenSER logs show following:
Oct 16 18:01:22 sip mediaproxy[20251]: error: uncaptured python 
exception, closing channel <rtphandler.CommandHandler connected '' at 0x68
2ecc> (exceptions.ValueError:invalid literal for int(): 5012/1 
[/usr/lib/python2.3/asyncore.pyc|readwrite|86] [/usr/lib/python2.3/asyncore
.pyc|handle_read_event|390] 
[/usr/local/mediaproxy/modules/rtphandler.py|handle_read|441] 
[/usr/local/mediaproxy/modules/rtphandler.py|pro
cess|531] [/usr/local/mediaproxy/modules/rtphandler.py|__init__|988] 
[/usr/local/mediaproxy/modules/rtphandler.py|setCaller|880])


I found that source of these troubles is that videophone generates 
INVITE`s in different format than for example Sipura does.
Media streams are described like these:
m=audio 5012/1 RTP/AVP 98 0 8.
m=video 5010/1 RTP/SAVPF 99.

As you can see, sub-field "port" is not in usual format, but it contains 
number of ports according to RFC2327:
m=<media> <port>/<number of ports> <transport> <fmt list>

So, I spended few hours examinating sources of rtpproxy and mediaproxy 
modules and made small trick (patch) to mediaproxy module.
I didn't understand logic of rtpproxy module because lack of time.
Here it is:
--- ./modules/mediaproxy/mediaproxy.c   2006-03-24 21:04:56 +0300
+++ ./modules/mediaproxy/mediaproxy_new.c       2006-10-17 17:53:54 +0400
@@ -825,7 +825,7 @@
 getMediaStreams(str *sdp, str *sessionIP, StreamInfo *streams, int limit)
 {
     str tokens[2], block, zone;
-    char *ptr, *sdpEnd;
+    char *ptr, *sdpEnd, *tmpptr;
     int i, count, streamCount, result;

     sdpEnd = sdp->s + sdp->len;
@@ -845,6 +845,9 @@
                 "line in SDP body\n");
             return -1;
         }
+
+       tmpptr=strchr(tokens[1].s,'/');
+       if ((tmpptr-tokens[1].s)<tokens[1].len ) 
tokens[1].len=tmpptr-tokens[1].s;

         streams[i].type = tokens[0];
         streams[i].port = tokens[1];

It works for me, but I know it is not correct solution.
I hope my small investigation would be useful.
Thanks for your attention.

With best regards,
Artur Yakupov




More information about the Users mailing list