Hi, Gabriel,
Thank you for your post.
I've got same issue on Android with pjsip 2.5,
then I confirmed your temporal workaround is also effective.
crash at:
F libc : ../src/pjsip-ua/sip_inv.c:2321: pjsip_inv_answer:
assertion "inv->last_answer" failed
my handler is ...
class MyAccount extends Account {
public void onIncomingCall(OnIncomingCallParam prm)
{
MyCall call = new MyCall(this, prm.getCallId());
CallOpParam new_prm = new CallOpParam();
new_prm.setStatusCode(pjsip_status_code.PJSIP_SC_OK);
call.answer(new_prm);
}
Thanks,
minoruta
Date: Mon, 16 May 2016 11:54:31 +0200
From: gabriel@margiani.ch
To: pjsip list pjsip@lists.pjsip.org
Subject: Re: [pjsip] bug in pjsua2 Endpoint pjsua2 crash on incoming
call
Message-ID: b1296f929196391e33ec1b165af1f304@margiani.ch
Content-Type: text/plain; charset="us-ascii"
17:28:38.112 pjsua_call.c .Incoming Request msg INVITE/cseq=19 (rdata0x7f5778009268)
17:28:38.112 pjsua_media.c ..Call 0: initializing media..
17:28:38.113 pjsua_media.c ...RTP socket reachable at 192.168.1.8:4000
17:28:38.113 pjsua_media.c ...RTCP socket reachable at 192.168.1.8:4001
17:28:38.113 pjsua_media.c ...Media index 0 selected for audio call 0
*** Incoming Call: "Telefon" sip:... [NULL]
17:28:38.113 pjsua_call.c ...Answering call 0: code=200 a.out:
../src/pjsip-ua/sip_inv.c:2321: pjsip_inv_answer: Assertion
`inv->last_answer' failed. [1] 19792 abort (core dumped) ./a.out
I managed to track it down a little more. It seems to be a bug in
pj::Endpoint. The first answer to a call has to be made by
'pjsip_inv_initial_answer()' function, which is done by pjsua
automatically before calling the 'on_incoming_call' callback of
pj::Endpoint. Before this happens, the media is being initialized (see
log above) by 'pj::Endpoint::on_create_media_transport()' (line 1233).
In version 2.5 this method calls on it's own 'on_incoming_call', but the
call isn't ready to be answered "normally" yet, so we get the crash.
Below the code of on_create_media_transport. Commenting out like shown
solves the problem for me, but I don't know why the code has been added,
so it might not the best solution:
-------------- pjsua2/Endpoint.cpp:1233+ -------------------------
pjmedia_transport*
Endpoint::on_create_media_transport(pjsua_call_id call_id,
unsigned media_idx,
pjmedia_transport *base_tp,
unsigned flags)
{
Call *call = Call::lookup(call_id);
if (!call) {
//pjsua_call in_call = &pjsua_var.calls[call_id];
//if (in_call->incoming_data) {
/ This can happen when there is an incoming call but the
* on_incoming_call() callback hasn't been called. So we need to
* call the callback here.
*/
//on_incoming_call(in_call->acc_id, call_id,
in_call->incoming_data);
//[> New call should already be created by app. <]
//call = Call::lookup(call_id);
//if (!call) {
//return base_tp;
//}
//} else {
return base_tp;
//}
}
----------- [...] -----------------------------------
regards
Gabriel