[asterisk-dev] Manipulate re-INVITE response in user written Asterisk module
Matt Fredrickson
creslin at digium.com
Fri Nov 2 15:29:19 CDT 2018
On Tue, Oct 30, 2018 at 4:50 PM Andreas Wehrmann <a.wehrmann at yandex.com> wrote:
>
> Hello folks,
>
> I'm currently writing a module for Asterisk
> to make it divert a video stream to an external videoserver.
> The scenario is this:
>
> - some external participant is calling into Asterisk (offering audio+video)
>
> - using SIP session supplements: in the incoming (INVITE) message callback,
> a video session is set up on the videoserver (actually: this happens always, regardless of what is offered)
>
> - using the dialplan, the call is routed to another PBX supporting audio only
> (but video codecs are enabled on our side, so video will be offered by Asterisk)
>
> - when the other PBX answers, I'm using SIP session supplements to determine whether the call answered by the other PBX supports video
> -- if video is supported, my module does nothing
> -- if video is rejected, I manipulate the SDP inside to make it seem to Asterisk
> as if video actually was supported by inserting connection info pointing to the video server
>
> What I've just described does work.
> The SIP supplement is registered with a response priority of AST_SIP_SESSION_BEFORE_MEDIA
> and handles the INVITE method only.
>
> However, what doesn't work is if the external participant initially calls in
> with audio only and enables video later by sending a reINVITE.
>
> I do not get a callback from my already registered SIP supplement when the other PBX
> responds to the reINVITE in order to give me a chance to manipulate the SDP.
> I guess this is because the session was already active and thus "AFTER_MEDIA".
>
> When I register a SIP supplement with "AST_SIP_SESSION_AFTER_MEDIA",
> I do indeed get a callback for the reINVITE response,
> but that happens too late, since SDP negotiation inside Asterisk has already happened.
>
> I then tried to register an SDP handler (just to see what callbacks I get and whether they might be useful).
> The only callback I receive is defer_incoming_sdp_stream() for the reINVITE that my Asterisk receives
> which doesn't seem too useful for what I'm trying to do.
>
> Since I had no more ideas left, I then tried to hook into PJSIP directly
> by providing a pjsip_module that implements the on_rx_response() callback.
>
> That doesn't really work either, because the callback never fired.
> After I played around with module priority the callback eventually fired but I was unable to get the TSX and dialog references from PJ
> (probably because the module got called too early?).
> However I need those to get the corresponding ast_sip_session.
>
> At this point, I don't know how to proceed.
> Is there a way to hook into reINVITE responses to achieve what I'm trying to do?
Good question! Sounds like an interesting project. For the purpose
of pure curiosity, do you mind if I ask why you're trying to send the
video to a separate server?
With regards to your specific questions, I'm guessing this is
something that George Joseph or Josh Colp might have a few more
opinions about.
--
Matthew Fredrickson
Digium - A Sangoma Company | Asterisk Project Lead
445 Jan Davis Drive NW - Huntsville, AL 35806 - USA
More information about the asterisk-dev
mailing list