Re: Bug report: pjsua has no video on call unhold on cisco pbx

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hakan,

I'm not sure if it's a bug. As far as I remember (perhaps you need to
search the RFC for this), sending INVITE without SDP doesn't
constitute an unhold request, and the recipient is then free to
provide an offer, which in this case, means that PJSIP will offer the
state of the currently active session.

If you want to change this behavior, your workaround is actually
already the solution, which is correctly implemented in the
application (pjsua_app is actually a sample app) and doesn't require
any modification within the library.

Regards,
Ming

On Wed, Sep 26, 2018 at 12:27 AM Håkan Berg <hakan.berg@xxxxxxxx> wrote:
>
> Hi Ming,
>
> Yes, you're correct. The remote is sending a re-INVITE without SDP when doing unhold.
>
> Attaching log file.
>
> Br,
> /Håkan
>
> -----Original Message-----
> From: pjsip [mailto:pjsip-bounces@xxxxxxxxxxxxxxx] On Behalf Of Ming
> Sent: den 25 september 2018 03:04
> To: pjsip list <pjsip@xxxxxxxxxxxxxxx>
> Subject: Re:  Bug report: pjsua has no video on call unhold on cisco pbx
>
> Hi Hakan,
>
> Since I can't access the Cisco server from here, can you forward us the log (level 5, as text attachment)?
>
> Based on your description, since app needs to overwrite callback on_call_tx_offer(), does it mean that the remote is sending re-INVITE without SDP when trying to unhold?
>
> Regards,
> Ming
> On Mon, Sep 24, 2018 at 9:03 PM Håkan Berg <hakan.berg@xxxxxxxx> wrote:
> >
> > Hi,
> > I believe I've found a problem in pjsua: When registered to a cisco unified call manager pbx (10.5 in my case) and calling to a video phone endpoint on that pbx, the video negotiation in pjsip fails if the endpoint phone puts pjsip on hold and then unhold again.
> > The SDP sent from pjsip seems to be missing vital video lines:
> > m=video 0 RTP/AVP 31
> > c=IN IP4 127.0.0.1
> > a=sendrecv
> >
> > Whereas a working video SDP might include something like this:
> > m=video 4006 RTP/AVP 97
> > c=IN IP4 10.0.0.5
> > b=TIAS:768000
> > a=rtcp:4007 IN IP4 10.0.0.5
> > a=sendrecv
> > a=rtpmap:97 H264/90000
> > a=fmtp:97 profile-level-id=42000d
> >
> > I can reproduce it with pjsua-bin like so:
> >
> > git clone https://github.com/cisco/openh264.git
> > cd openh264
> > make
> > sudo make install
> > cd ..
> > wget http://pjsip.org/release/2.8/pjproject-2.8.tar.bz2
> > tar xvfj pjproject-2.8.tar.bz2
> > cd pjproject-2.8
> > ./configure
> > echo "#define PJMEDIA_HAS_VIDEO 1" >> pjlib/include/pj/config_site.h
> > make dep && make cd pjsip-apps/bin ./pjsua-x86_64-unknown-linux-gnu
> > --playback-dev=1 --capture-dev=1 --id sip:1@10.0.0.1 --registrar
> > sip:10.0.0.1 --realm "*" --username 1 --password hunter2
> > --app-log-level=3 --video
> >
> > press m, enter sip:2@10.0.0.1
> > Cisco phone on extension 2 rings, answer and press hold. Video goes to inactive, press hold button again to unhold call, video ends up still being inactive because of SDP negotiation problem.
> > I can work around the problem by registering a callback function, but that should not be needed in my opinion:
> >
> > diff --git a/pjsip-apps/src/pjsua/pjsua_app.c.bak
> > b/pjsip-apps/src/pjsua/pjsua_app.c
> > index 51c4537..db6066a 100644
> > --- a/pjsip-apps/src/pjsua/pjsua_app.c.bak
> > +++ b/pjsip-apps/src/pjsua/pjsua_app.c
> > @@ -1226,6 +1226,12 @@ int stdout_refresh_proc(void *arg)
> >      return 0;
> >  }
> >
> > +static void
> > +ON_CALL_TX_OFFER_WORKAROUND(pjsua_call_id call_id, void *reserved,
> > +                            pjsua_call_setting *opt) { }
> > +
> >  static pj_status_t app_init()
> >  {
> >      pjsua_transport_id transport_id = -1; @@ -1275,6 +1281,9 @@
> > static pj_status_t app_init()
> >      app_config.cfg.cb.on_nat_detect = &on_nat_detect;
> >      app_config.cfg.cb.on_mwi_info = &on_mwi_info;
> >      app_config.cfg.cb.on_transport_state = &on_transport_state;
> > +
> > +    app_config.cfg.cb.on_call_tx_offer =
> > + &ON_CALL_TX_OFFER_WORKAROUND;
> > +
> >      app_config.cfg.cb.on_ice_transport_error = &on_ice_transport_error;
> >      app_config.cfg.cb.on_snd_dev_operation = &on_snd_dev_operation;
> >      app_config.cfg.cb.on_call_media_event = &on_call_media_event;
> >
> >
> >
> > This seems to be a problem because of the late offer mechanism that cisco uses, and pjsua-lib only "re-initialize media before creating SDP" if there's a on_call_tx_offer callback set (or call->med_prov_cnt is 0), see pjsua_call_on_create_offer().
> > This limitation does not seem to exist for things like pjsua_call_set_hold2(). But that's why the workaround gives a successful SDP negotiation: apply_call_setting() gets called.
> > Let me know if you need any pcap dumps demonstrating the problem.
> >
> > Please advise.
> > Br,
> > /Håkan
> >
> > _______________________________________________
> > Visit our blog: http://blog.pjsip.org
> >
> > pjsip mailing list
> > pjsip@xxxxxxxxxxxxxxx
> > http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
>
> pjsip mailing list
> pjsip@xxxxxxxxxxxxxxx
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
>
> pjsip mailing list
> pjsip@xxxxxxxxxxxxxxx
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org

_______________________________________________
Visit our blog: http://blog.pjsip.org

pjsip mailing list
pjsip@xxxxxxxxxxxxxxx
http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org




[Index of Archives]     [Asterisk Users]     [Asterisk App Development]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [Linux API]
  Powered by Linux