Changes between Version 2 and Version 3 of 3rd_Party_Media

Mar 15, 2008 1:04:53 PM (16 years ago)



  • 3rd_Party_Media

    v2 v3  
    1011== SIP and Media Interaction == 
    8081The ''on_media_update()'' callback contains ''status'' parameter which tells application whether SDP negotiation has been successful (or not). We are normally only interested with the successful status to start our media. 
    82 Below is the pseudo-code to implement ''on_media_update()'' callback. You can see a working implementation of this function in ''pjsua_call_on_media_update()'' function of {{{pjsua_call.c}}}. 
    84 {{{ 
    85 !#c 
     83Below is the pseudo-code to implement ''on_media_update()'' callback. You can see a working implementation of this function in ''pjsua_call_on_media_update()'' function of {{{pjsua_call.c}}} in PJSUA-LIB. 
    8687void on_media_update(inv, status) 
    105 And below is the pseudo-code of ''update_media_channel()'' function. You can see a working implementation of this function in ''pjsua_media_channel_update()'' of pjsua_media.c. 
     106And below is the pseudo-code of ''update_media_channel()'' function. You can see a working implementation of this function in ''pjsua_media_channel_update()'' of pjsua_media.c in PJSUA-LIB. 
    107108The ''update_media_channel'' needs to handle two cases: 
    112 !#c 
    113114update_media_channel(local_sdp, remote_sdp) 
     148=== Subsequent Offer/Answer === 
     150The invite session provides additional callbacks relating to SDP offer/answer: 
     151 * '''on_rx_offer()''': this callback is called when the session has received a new offer from remote, and it needs a local SDP. 
     152 * '''on_create_offer()''': this callback is called when the session needs to generate a local offer (for example when it receives incoming re-INVITE without an offer). 
     154For both of these two callbacks, application MUST provide a local SDP to the invite session. The process of getting local SDP is similar to the one when creating a call/invite session above. 
     156For a working sample, please see ''pjsua_call_on_rx_offer()'' and ''pjsua_call_on_create_offer()'' functions in {{{pjsua_call.c}}} file of PJSUA-LIB. 
     160== Third Party Integration Strategy == 
     162We have two approaches on how to integrate your third party media stack with PJSIP: 
     163 1. to completely remove PJMEDIA from application dependency 
     164 1. reuse PJMEDIA's session info 
     165 1. integrating third party stack into PJMEDIA 
     167Please note than on all approaches, the SDP parts (messaging, parsing, and offer answer negotiation) cannot be excluded from application dependency since SDP is tightly coupled with the invite session (for the reasons explained above). Fortunately the SDP parts are independent from PJMEDIA thus can be taken out from PJMEDIA cleanly. 
     169Both integration approaches above have their pros and cons which will be discussed below. 
     172=== Completely Replace PJMEDIA with Third Party Media Stack === 
     174With this approach, basically we don't link/use PJMEDIA at all. Pros and cons of this approach are: 
     177 * the separation is cleaner thus may be easier to understand. Basically application MUST NOT use anything from PJMEDIA except {{{<sdp.h>}}} and {{{<sdp_neg.h>}}} 
     178 * using this approach is supported, since it does not require modifications to our codes/libraries. 
     181 * This approach can only be used when application uses PJSIP directly (i.e. not PJSUA-LIB), thus it requires significant more efforts to accomplish tasks which otherwise can be done more easily with PJSUA-LIB. But on the positive note, PJSUA-LIB contains ready to use examples on how to do things so one may just need to copy/paste the code into application's code. 
     182 * Since we are not allowed to use PJMEDIA's media session info, we need to get the media info directly from the SDP's, and this is tedious! 
     184To use this approach, you need to do the following (more or less): 
     185 * Create a new library which consists of the following files from PJMEDIA directory (note that on GNU and Symbian build systems, a library containing these files has been provided and it's called {{{pjsdp}}} library): 
     186    - errno.c 
     187    - sdp.c 
     188    - sdp_cmp.c 
     189    - sdp_neg.c 
     190 * To create a local SDP for the invite session (either when creating the call or when the invite session needs updated offer or answer), you need to build the SDP manually. You cannot use {{{pjmedia_endpt_create_sdp()}}} function since this function is part of PJMEDIA. 
     191 * To create a media session, you need to manually inspect both local and remote SDP (see ''on_media_update()'' pseudo-code above) and create your media session based on the information in both SDP's. 
     194=== Reusing PJMEDIA's Session Info === 
     196The idea of this approach is to allow PJMEDIA to deal with SDP for us, since dealing with SDP's manually is quite a tedious operation. With this approach, we can ask PJMEDIA to generate SDP for us (the ''pjmedia_endpt_create_sdp()'' function) based on the capability/codecs that are registered to it, and we can use the ''pjmedia_session_info_from_sdp()'' function to convert local and remote SDP's into the more manageable media session info structure. 
     199 * much easier to work with than manipulating SDP's manually 
     200 * this approach is supported since it doesn't modify our codes/libraries 
     203 * there is a bit of glue code needed to make PJMEDIA works for us. 
     204 * it still can only work with PJSIP (and not PJSUA-LIB) 
     207Steps to use this approach: 
     208 * application needs to link with PJMEDIA library to get the SDP parts and the SDP generation/conversion to media session info functionality. 
     209 * implement a codec factory for each codec that the third party media stack supports. The codec factory is needed to register the codec into codec manager's codec list. Note that only the codec factory needs to be implemented (the ''pjmedia_codec_factory_op'' API); no need to implement the codec operation itself (the ''pjmedia_codec_op'' API). Since we will never create PJMEDIA's stream, the codec will never gets instantiated, so there is no need to implement the codec. Only the codec factory is needed. The operations that need to be implemented in ''pjmedia_codec_factory_op'' are: 
     210  - test_alloc() 
     211  - default_attr() 
     212  - enum_info() 
     213 * create a ''pjmedia_endpt'' instance, and registers each of the codec factories into the codec manager (application can query the codec manager instance from the ''pjmedia_endpt''). 
     214 * the code to create a call or to handle media update event is similar to the generic pseudo-code explained earlier, except that application will replace call to ''pjmedia_session_create()'' with the corresponding function provided by the third party media stack. 
     217=== Integrating Third Party Stack into PJMEDIA === 
     220 *