[asterisk-dev] Manipulate re-INVITE response in user written Asterisk module

Andreas Wehrmann a.wehrmann at yandex.com
Mon Nov 5 01:53:53 CST 2018


On 02.11.18 21:29, Matt Fredrickson wrote:
> 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.
>
>
I work for a company that develops control centers for public safety 
organizations (police, fire brigade and the like)
and we've been experimenting with the integration of "new media" in our 
already existing systems.
The easiest way it seemed was to "cut off" the video stream before it 
reaches our internal PBX and make it available via WebRTC.
That way the only thing the workstation GUI needs to do is to display 
some website when it detects it has a video call.




More information about the asterisk-dev mailing list