Thanks. I started implementing it and came across an issue. I've assigned on_send_ack my callback function to modify the IP:port, but this callback isn't called. Pjsip sends invite, remote replies with 100/INVITE 3 times, then with 183/INVITE. On reception of this, it creates a new transaction (tsx0x4bd134) for replying. In log this line: 00:14:50.487 tsx0x4bd134 Transaction created for Request msg PRACK/cseq=14643 (tdta0x4bc0c8) Then remote replies with 200/PRACK, but I don't get this ACK in application, because pjsip thinks it is for transaction tsx0x4bd134 and not for the initial transaction of the dialog (tsx0x4b8fbc), so the check if (tsx == inv->invite_tsx) { in sip_inv.c, function inv_on_state_early is false and inv_send_ack is not called. Pjsip replies with standard 200/PRACK. Full log: 00:14:47.951 os_core_unix.c pjlib 1.14.0 for POSIX initialized 00:14:47.986 sip_endpoint.c Creating endpoint instance... 00:14:48.042 pjlib select() I/O Queue created (0x4ae2b0) 00:14:48.050 sip_endpoint.c Module "mod-msg-print" registered 00:14:48.051 sip_transport. Transport manager created. 00:14:48.066 udp0x4b1fb0 SIP UDP transport started, published address is 192.168.1.121:5070 00:14:48.130 sip_endpoint.c Module "mod-tsx-layer" registered 00:14:48.131 sip_endpoint.c Module "mod-stateful-util" registered 00:14:48.131 sip_endpoint.c Module "mod-ua" registered 00:14:48.138 sip_endpoint.c Module "mod-invite" registered 00:14:48.140 sip_endpoint.c Module "mod-100rel" registered 00:14:48.141 sip_endpoint.c Module "mod-cc" registered 00:14:48.141 svipua.c module id 6 00:14:48.143 dlg0x4b7394 UAC dialog created 00:14:48.143 dlg0x4b7394 Module mod-invite added as dialog usage, data=0x4b7b4c 00:14:48.143 dlg0x4b7394 Session count inc to 2 by mod-invite 00:14:48.144 dlg0x4b7394 Module mod-100rel added as dialog usage, data=0x4b7c40 00:14:48.144 dlg0x4b7394 100rel module attached 00:14:48.145 inv0x4b7394 UAC invite session created for dialog dlg0x4b7394 00:14:48.145 endpoint Request msg INVITE/cseq=14643 (tdta0x4b7f50) created. 00:14:48.146 inv0x4b7394 Sending Request msg INVITE/cseq=14643 (tdta0x4b7f50) 00:14:48.146 dlg0x4b7394 Sending Request msg INVITE/cseq=14643 (tdta0x4b7f50) 00:14:48.147 tsx0x4b8fbc Transaction created for Request msg INVITE/cseq=14642 (tdta0x4b7f50) <-- INITIAL TRANSACTION 00:14:48.147 tsx0x4b8fbc Sending Request msg INVITE/cseq=14642 (tdta0x4b7f50) in state Null 00:14:48.147 sip_resolve.c Target '192.168.1.145:5060' type=Unspecified resolved to '192.168.1.145:5060' type=UDP (UDP transport) 00:14:48.149 tsx0x4b8fbc State changed from Null to Calling, event=TX_MSG 00:14:48.149 dlg0x4b7394 Transaction tsx0x4b8fbc state changed to Calling 00:14:48.149 svipua.c Call state changed to CALLING 00:14:48.650 tsx0x4b8fbc Retransmit timer event 00:14:48.650 tsx0x4b8fbc Retransmiting Request msg INVITE/cseq=14642 (tdta0x4b7f50), count=0, restart?=1 00:14:49.650 tsx0x4b8fbc Retransmit timer event 00:14:49.650 tsx0x4b8fbc Retransmiting Request msg INVITE/cseq=14642 (tdta0x4b7f50), count=1, restart?=1 00:14:50.389 sip_endpoint.c Processing incoming message: Response msg 100/INVITE/cseq=14642 (rdata0x4b33dc) 00:14:50.390 tsx0x4b8fbc Incoming Response msg 100/INVITE/cseq=14642 (rdata0x4b33dc) in state Calling 00:14:50.390 tsx0x4b8fbc State changed from Calling to Proceeding, event=RX_MSG 00:14:50.391 dlg0x4b7394 Received Response msg 100/INVITE/cseq=14642 (rdata0x4b33dc) 00:14:50.391 dlg0x4b7394 Transaction tsx0x4b8fbc state changed to Proceeding 00:14:50.392 sip_endpoint.c Processing incoming message: Response msg 100/INVITE/cseq=14642 (rdata0x4b33dc) 00:14:50.392 tsx0x4b8fbc Incoming Response msg 100/INVITE/cseq=14642 (rdata0x4b33dc) in state Proceeding 00:14:50.392 tsx0x4b8fbc State changed from Proceeding to Proceeding, event=RX_MSG 00:14:50.393 dlg0x4b7394 Received Response msg 100/INVITE/cseq=14642 (rdata0x4b33dc) 00:14:50.393 dlg0x4b7394 Transaction tsx0x4b8fbc state changed to Proceeding 00:14:50.394 sip_endpoint.c Processing incoming message: Response msg 100/INVITE/cseq=14642 (rdata0x4b33dc) 00:14:50.394 tsx0x4b8fbc Incoming Response msg 100/INVITE/cseq=14642 (rdata0x4b33dc) in state Proceeding 00:14:50.394 tsx0x4b8fbc State changed from Proceeding to Proceeding, event=RX_MSG 00:14:50.394 dlg0x4b7394 Received Response msg 100/INVITE/cseq=14642 (rdata0x4b33dc) 00:14:50.395 dlg0x4b7394 Transaction tsx0x4b8fbc state changed to Proceeding 00:14:50.483 sip_endpoint.c Processing incoming message: Response msg 183/INVITE/cseq=14642 (rdata0x4b33dc) 00:14:50.483 tsx0x4b8fbc Incoming Response msg 183/INVITE/cseq=14642 (rdata0x4b33dc) in state Proceeding 00:14:50.484 tsx0x4b8fbc State changed from Proceeding to Proceeding, event=RX_MSG 00:14:50.484 dlg0x4b7394 Received Response msg 183/INVITE/cseq=14642 (rdata0x4b33dc) 00:14:50.484 dlg0x4b7394 Route-set updated 00:14:50.485 dlg0x4b7394 Transaction tsx0x4b8fbc state changed to Proceeding 00:14:50.485 svipua.c Call state changed to EARLY 00:14:50.485 inv0x4b7394 Got SDP offer in Response msg 183/INVITE/cseq=14642 (rdata0x4b33dc) 00:14:50.486 endpoint Request msg PRACK/cseq=14644 (tdta0x4bc0c8) created. 00:14:50.487 dlg0x4b7394 Sending Request msg PRACK/cseq=14644 (tdta0x4bc0c8) 00:14:50.487 tsx0x4bd134 Transaction created for Request msg PRACK/cseq=14643 (tdta0x4bc0c8) <-- HERE IT CREATES A NEW TRANSACTION 00:14:50.488 tsx0x4bd134 Sending Request msg PRACK/cseq=14643 (tdta0x4bc0c8) in state Null 00:14:50.488 sip_resolve.c Target '192.168.1.145:5060' type=Unspecified resolved to '192.168.1.145:5060' type=UDP (UDP transport) 00:14:50.489 tsx0x4bd134 State changed from Null to Calling, event=TX_MSG 00:14:50.489 dlg0x4b7394 Transaction tsx0x4bd134 state changed to Calling 00:14:50.545 sip_endpoint.c Processing incoming message: Response msg 200/PRACK/cseq=14643 (rdata0x4b33dc) 00:14:50.545 tsx0x4bd134 Incoming Response msg 200/PRACK/cseq=14643 (rdata0x4b33dc) in state Calling <-- THE NEW TRANSACTION GETS 200/PRACK 00:14:50.546 tsx0x4bd134 State changed from Calling to Completed, event=RX_MSG 00:14:50.546 dlg0x4b7394 Received Response msg 200/PRACK/cseq=14643 (rdata0x4b33dc) 00:14:50.546 dlg0x4b7394 Transaction tsx0x4bd134 state changed to Completed 00:14:55.550 tsx0x4bd134 Timeout timer event 00:14:55.550 tsx0x4bd134 State changed from Completed to Terminated, event=TIMER 00:14:55.550 dlg0x4b7394 Transaction tsx0x4bd134 state changed to Terminated 00:14:55.560 tsx0x4bd134 Timeout timer event 00:14:55.560 tsx0x4bd134 State changed from Terminated to Destroyed, event=TIMER 00:14:55.560 tdta0x4bc0c8 Destroying txdata Request msg PRACK/cseq=14643 (tdta0x4bc0c8) 00:14:55.561 tsx0x4bd134 Transaction destroyed! 00:16:50.578 sip_endpoint.c Processing incoming message: Response msg 408/INVITE/cseq=14642 (rdata0x4b33dc) 00:16:50.580 tsx0x4b8fbc Incoming Response msg 408/INVITE/cseq=14642 (rdata0x4b33dc) in state Proceeding 00:16:50.581 endpoint Request msg ACK/cseq=14642 (tdta0x4bc0c8) created. 00:16:50.581 tsx0x4b8fbc State changed from Proceeding to Completed, event=RX_MSG 00:16:50.582 dlg0x4b7394 Received Response msg 408/INVITE/cseq=14642 (rdata0x4b33dc) 00:16:50.582 dlg0x4b7394 Transaction tsx0x4b8fbc state changed to Completed 00:16:50.582 svipua.c Call DISCONNECTED [reason=408 (Request Timeout)] 00:16:50.583 svipua.c One call completed 00:16:50.583 dlg0x4b7394 Session count dec to 1 by mod-invite 00:16:50.583 tdta0x4b7f50 Destroying txdata Request msg INVITE/cseq=14642 (tdta0x4b7f50) 00:16:50.584 svipua.c Total pool memory allocated=88 KB, used=70 KB -----Original Message----- From: pjsip-bounces@xxxxxxxxxxxxxxx [mailto:pjsip-bounces at lists.pjsip.org] On Behalf Of Joel Dodson Sent: Friday, May 11, 2012 12:53 AM To: pjsip list Subject: Re: direct RTP you're proposing a third party call control scenario (3PCC). See RFC 3725 (http://tools.ietf.org/html/rfc3725) if you haven't already. You can do that with PJSIP/PJMEDIA. You just need to put the IP:port for the RTP stream for device X into the SDPs sent by your main SIP device to the client. Check out the invite session abstraction (pjsip_inv_session). It's used in the siprtp.c sample and in the simpleua.c sample. You'll be using PJSIP at a much lower level than the API to write a simple client, but you'll have much more control over the messages and full access to get and set SDPs. It's also much more efficient than the higher level API. good luck. It's quite simple really once you get into it...