Changeset 637 for pjproject/trunk


Ignore:
Timestamp:
Jul 31, 2006 3:19:36 PM (18 years ago)
Author:
bennylp
Message:
  • Added iLBC codec (experimental) with the following features:
    • configurable default decoder mode (20 or 30),
    • encoder mode follows the mode specified in SDP fmtp from the remote's SDP,
    • silence detector uses pjmedia's,
    • PLC uses iLBC's PLC,
    • perceptual enhancement (penh) is configurable via codec param, as usual.
  • iLBC mode is configurable in pjsua with --ilbc-mode option.
  • Added packet lost simulation in pjmedia's UDP transport and in pjsua (with --rx-drop-pct and --tx-drop-pct options).
  • Increase default buffer count in DirectSound? to 32 frames to make it more resilient to CPU disruption.
  • Specify and parse fmtp mode in SDP for codecs that need it.
Location:
pjproject/trunk
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/build/Makefile

    r631 r637  
    1212#       "#define PJMEDIA_HAS_SPEEX_CODEC 0" in pj/config_site.h. 
    1313# 
    14 export CODEC_OBJS = $(GSM_OBJS) $(SPEEX_OBJS) 
     14export CODEC_OBJS = $(GSM_OBJS) $(SPEEX_OBJS) $(ILBC_OBJS) 
    1515 
    1616 
     
    107107SPEEX_CFLAGS := -DHAVE_CONFIG_H=1 -I../src/pjmedia-codec 
    108108 
     109ILBC_OBJS :=    ilbc.o \ 
     110                ilbc/FrameClassify.o ilbc/LPCdecode.o ilbc/LPCencode.o \ 
     111                ilbc/StateConstructW.o ilbc/StateSearchW.o ilbc/anaFilter.o \ 
     112                ilbc/constants.o ilbc/createCB.o ilbc/doCPLC.o \ 
     113                ilbc/enhancer.o ilbc/filter.o ilbc/gainquant.o \ 
     114                ilbc/getCBvec.o ilbc/helpfun.o ilbc/hpInput.o \ 
     115                ilbc/hpOutput.o ilbc/iCBConstruct.o ilbc/iCBSearch.o \ 
     116                ilbc/iLBC_decode.o ilbc/iLBC_encode.o ilbc/lsf.o \ 
     117                ilbc/packing.o ilbc/syntFilter.o 
     118ILBC_CFLAGS := 
     119 
    109120export PJMEDIA_CODEC_SRCDIR = ../src/pjmedia-codec 
    110121export PJMEDIA_CODEC_OBJS += l16.o \ 
    111122                        $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \ 
    112123                        $(CODEC_OBJS) 
    113 export PJMEDIA_CODEC_CFLAGS += $(_CFLAGS) $(GSM_CFLAGS) $(SPEEX_CFLAGS) 
     124export PJMEDIA_CODEC_CFLAGS += $(_CFLAGS) $(GSM_CFLAGS) $(SPEEX_CFLAGS) \ 
     125                        $(ILBC_CFLAGS) 
    114126 
    115127 
  • pjproject/trunk/pjmedia/build/pjmedia_codec.dsp

    r630 r637  
    101101# Begin Source File 
    102102 
     103SOURCE="..\src\pjmedia-codec\ilbc.c" 
     104# End Source File 
     105# Begin Source File 
     106 
    103107SOURCE="..\src\pjmedia-codec\l16.c" 
    104108 
     
    139143# Begin Source File 
    140144 
     145SOURCE="..\include\pjmedia-codec\ilbc.h" 
     146# End Source File 
     147# Begin Source File 
     148 
    141149SOURCE="..\include\pjmedia-codec\l16.h" 
    142150# End Source File 
     
    663671# End Source File 
    664672# End Group 
     673# End Group 
     674# Begin Group "iLBC Codec" 
     675 
     676# PROP Default_Filter "" 
     677# Begin Source File 
     678 
     679SOURCE="..\src\pjmedia-codec\ilbc\anaFilter.c" 
     680# End Source File 
     681# Begin Source File 
     682 
     683SOURCE="..\src\pjmedia-codec\ilbc\anaFilter.h" 
     684# End Source File 
     685# Begin Source File 
     686 
     687SOURCE="..\src\pjmedia-codec\ilbc\constants.c" 
     688# End Source File 
     689# Begin Source File 
     690 
     691SOURCE="..\src\pjmedia-codec\ilbc\constants.h" 
     692# End Source File 
     693# Begin Source File 
     694 
     695SOURCE="..\src\pjmedia-codec\ilbc\createCB.c" 
     696# End Source File 
     697# Begin Source File 
     698 
     699SOURCE="..\src\pjmedia-codec\ilbc\createCB.h" 
     700# End Source File 
     701# Begin Source File 
     702 
     703SOURCE="..\src\pjmedia-codec\ilbc\doCPLC.c" 
     704# End Source File 
     705# Begin Source File 
     706 
     707SOURCE="..\src\pjmedia-codec\ilbc\doCPLC.h" 
     708# End Source File 
     709# Begin Source File 
     710 
     711SOURCE="..\src\pjmedia-codec\ilbc\enhancer.c" 
     712# End Source File 
     713# Begin Source File 
     714 
     715SOURCE="..\src\pjmedia-codec\ilbc\enhancer.h" 
     716# End Source File 
     717# Begin Source File 
     718 
     719SOURCE="..\src\pjmedia-codec\ilbc\filter.c" 
     720# End Source File 
     721# Begin Source File 
     722 
     723SOURCE="..\src\pjmedia-codec\ilbc\filter.h" 
     724# End Source File 
     725# Begin Source File 
     726 
     727SOURCE="..\src\pjmedia-codec\ilbc\FrameClassify.c" 
     728# End Source File 
     729# Begin Source File 
     730 
     731SOURCE="..\src\pjmedia-codec\ilbc\FrameClassify.h" 
     732# End Source File 
     733# Begin Source File 
     734 
     735SOURCE="..\src\pjmedia-codec\ilbc\gainquant.c" 
     736# End Source File 
     737# Begin Source File 
     738 
     739SOURCE="..\src\pjmedia-codec\ilbc\gainquant.h" 
     740# End Source File 
     741# Begin Source File 
     742 
     743SOURCE="..\src\pjmedia-codec\ilbc\getCBvec.c" 
     744# End Source File 
     745# Begin Source File 
     746 
     747SOURCE="..\src\pjmedia-codec\ilbc\getCBvec.h" 
     748# End Source File 
     749# Begin Source File 
     750 
     751SOURCE="..\src\pjmedia-codec\ilbc\helpfun.c" 
     752# End Source File 
     753# Begin Source File 
     754 
     755SOURCE="..\src\pjmedia-codec\ilbc\helpfun.h" 
     756# End Source File 
     757# Begin Source File 
     758 
     759SOURCE="..\src\pjmedia-codec\ilbc\hpInput.c" 
     760# End Source File 
     761# Begin Source File 
     762 
     763SOURCE="..\src\pjmedia-codec\ilbc\hpInput.h" 
     764# End Source File 
     765# Begin Source File 
     766 
     767SOURCE="..\src\pjmedia-codec\ilbc\hpOutput.c" 
     768# End Source File 
     769# Begin Source File 
     770 
     771SOURCE="..\src\pjmedia-codec\ilbc\hpOutput.h" 
     772# End Source File 
     773# Begin Source File 
     774 
     775SOURCE="..\src\pjmedia-codec\ilbc\iCBConstruct.c" 
     776# End Source File 
     777# Begin Source File 
     778 
     779SOURCE="..\src\pjmedia-codec\ilbc\iCBConstruct.h" 
     780# End Source File 
     781# Begin Source File 
     782 
     783SOURCE="..\src\pjmedia-codec\ilbc\iCBSearch.c" 
     784# End Source File 
     785# Begin Source File 
     786 
     787SOURCE="..\src\pjmedia-codec\ilbc\iCBSearch.h" 
     788# End Source File 
     789# Begin Source File 
     790 
     791SOURCE="..\src\pjmedia-codec\ilbc\iLBC_decode.c" 
     792# End Source File 
     793# Begin Source File 
     794 
     795SOURCE="..\src\pjmedia-codec\ilbc\iLBC_decode.h" 
     796# End Source File 
     797# Begin Source File 
     798 
     799SOURCE="..\src\pjmedia-codec\ilbc\iLBC_define.h" 
     800# End Source File 
     801# Begin Source File 
     802 
     803SOURCE="..\src\pjmedia-codec\ilbc\iLBC_encode.c" 
     804# End Source File 
     805# Begin Source File 
     806 
     807SOURCE="..\src\pjmedia-codec\ilbc\iLBC_encode.h" 
     808# End Source File 
     809# Begin Source File 
     810 
     811SOURCE="..\src\pjmedia-codec\ilbc\iLBC_test.c" 
     812# PROP Exclude_From_Build 1 
     813# End Source File 
     814# Begin Source File 
     815 
     816SOURCE="..\src\pjmedia-codec\ilbc\LPCdecode.c" 
     817# End Source File 
     818# Begin Source File 
     819 
     820SOURCE="..\src\pjmedia-codec\ilbc\LPCdecode.h" 
     821# End Source File 
     822# Begin Source File 
     823 
     824SOURCE="..\src\pjmedia-codec\ilbc\LPCencode.c" 
     825# End Source File 
     826# Begin Source File 
     827 
     828SOURCE="..\src\pjmedia-codec\ilbc\LPCencode.h" 
     829# End Source File 
     830# Begin Source File 
     831 
     832SOURCE="..\src\pjmedia-codec\ilbc\lsf.c" 
     833# End Source File 
     834# Begin Source File 
     835 
     836SOURCE="..\src\pjmedia-codec\ilbc\lsf.h" 
     837# End Source File 
     838# Begin Source File 
     839 
     840SOURCE="..\src\pjmedia-codec\ilbc\packing.c" 
     841# End Source File 
     842# Begin Source File 
     843 
     844SOURCE="..\src\pjmedia-codec\ilbc\packing.h" 
     845# End Source File 
     846# Begin Source File 
     847 
     848SOURCE="..\src\pjmedia-codec\ilbc\StateConstructW.c" 
     849# End Source File 
     850# Begin Source File 
     851 
     852SOURCE="..\src\pjmedia-codec\ilbc\StateConstructW.h" 
     853# End Source File 
     854# Begin Source File 
     855 
     856SOURCE="..\src\pjmedia-codec\ilbc\StateSearchW.c" 
     857# End Source File 
     858# Begin Source File 
     859 
     860SOURCE="..\src\pjmedia-codec\ilbc\StateSearchW.h" 
     861# End Source File 
     862# Begin Source File 
     863 
     864SOURCE="..\src\pjmedia-codec\ilbc\syntFilter.c" 
     865# End Source File 
     866# Begin Source File 
     867 
     868SOURCE="..\src\pjmedia-codec\ilbc\syntFilter.h" 
     869# End Source File 
    665870# End Group 
    666871# End Target 
  • pjproject/trunk/pjmedia/include/pjmedia-codec.h

    r531 r637  
    2828#include <pjmedia-codec/gsm.h> 
    2929#include <pjmedia-codec/speex.h> 
     30#include <pjmedia-codec/ilbc.h> 
    3031 
    3132 
  • pjproject/trunk/pjmedia/include/pjmedia-codec/config.h

    r411 r637  
    4747 
    4848 
     49/** 
     50 * Unless specified otherwise, iLBC codec is included by default. 
     51 */ 
     52#ifndef PJMEDIA_HAS_ILBC_CODEC 
     53#   define PJMEDIA_HAS_ILBC_CODEC    1 
     54#endif 
     55 
     56 
    4957 
    5058#endif  /* __PJMEDIA_CODEC_CONFIG_H__ */ 
  • pjproject/trunk/pjmedia/include/pjmedia-codec/types.h

    r622 r637  
    4949    PJMEDIA_RTP_PT_L16_32KHZ_STEREO,            /**< L16 @ 32KHz, stereo    */ 
    5050    PJMEDIA_RTP_PT_L16_48KHZ_MONO,              /**< L16 @ 48KHz, mono      */ 
    51     PJMEDIA_RTP_PT_L16_48KHZ_STEREO             /**< L16 @ 48KHz, stereo    */ 
     51    PJMEDIA_RTP_PT_L16_48KHZ_STEREO,            /**< L16 @ 48KHz, stereo    */ 
     52    PJMEDIA_RTP_PT_ILBC                         /**< iLBC (13.3/15.2Kbps)   */ 
    5253}; 
    5354 
  • pjproject/trunk/pjmedia/include/pjmedia/codec.h

    r622 r637  
    272272        unsigned    vad:1;          /**< Voice Activity Detector.       */ 
    273273        unsigned    cng:1;          /**< Comfort Noise Generator.       */ 
    274         unsigned    lpf:1;          /**< Low pass filter                */ 
    275         unsigned    hpf:1;          /**< High pass filter               */ 
    276274        unsigned    penh:1;         /**< Perceptual Enhancement         */ 
    277275        unsigned    plc:1;          /**< Packet loss concealment        */ 
    278276        unsigned    reserved:1;     /**< Reserved, must be zero.        */ 
     277        pj_uint8_t  enc_fmtp_mode;  /**< Mode param in fmtp (def:0)     */ 
     278        pj_uint8_t  dec_fmtp_mode;  /**< Mode param in fmtp (def:0)     */ 
    279279    } setting; 
    280280} pjmedia_codec_param; 
  • pjproject/trunk/pjmedia/include/pjmedia/errno.h

    r568 r637  
    299299 */ 
    300300#define PJMEDIA_CODEC_EFRMINLEN     (PJMEDIA_ERRNO_START+84)    /* 220084 */ 
     301/** 
     302 * @hideinitializer 
     303 * Invalid PCM frame length. 
     304 */ 
     305#define PJMEDIA_CODEC_EPCMFRMINLEN  (PJMEDIA_ERRNO_START+85)    /* 220085 */ 
     306/** 
     307 * @hideinitializer 
     308 * Invalid mode. 
     309 */ 
     310#define PJMEDIA_CODEC_EINMODE       (PJMEDIA_ERRNO_START+86)    /* 220086 */ 
    301311 
    302312 
  • pjproject/trunk/pjmedia/include/pjmedia/transport_udp.h

    r622 r637  
    145145 
    146146/** 
     147 * Simulate packet lost in the specified direction (for testing purposes). 
     148 * When enabled, the transport will randomly drop packets to the specified 
     149 * direction. 
     150 * 
     151 * @param tp        The UDP media transport. 
     152 * @param dir       Media direction to which packets will be randomly dropped. 
     153 * @param pct_lost  Percent lost (0-100). Set to zero to disable packet 
     154 *                  lost simulation. 
     155 * 
     156 * @return          PJ_SUCCESS on success. 
     157 */ 
     158PJ_DECL(pj_status_t) pjmedia_transport_udp_simulate_lost(pjmedia_transport *tp, 
     159                                                         pjmedia_dir dir, 
     160                                                         unsigned pct_lost); 
     161 
     162 
     163 
     164/** 
    147165 * Close UDP transport. Application can also use the "destroy" member of 
    148166 * media transport interface to close the UDP transport. 
     167 * 
     168 * @param tp        The UDP media transport. 
     169 * 
     170 * @return          PJ_SUCCESS on success. 
    149171 */ 
    150172PJ_DECL(pj_status_t) pjmedia_transport_udp_close(pjmedia_transport *tp); 
  • pjproject/trunk/pjmedia/src/pjmedia-codec/speex_codec.c

    r628 r637  
    409409    attr->setting.cng = 1; 
    410410    attr->setting.plc = 1; 
    411     attr->setting.hpf = 1; 
    412     attr->setting.lpf =1 ; 
    413411    attr->setting.penh =1 ; 
    414412    attr->setting.vad = 1; 
  • pjproject/trunk/pjmedia/src/pjmedia/dsound.c

    r582 r637  
    4545 
    4646#define MAX_PACKET_BUFFER_COUNT     32 
    47 #define DEFAULT_BUFFER_COUNT        16 
     47#define DEFAULT_BUFFER_COUNT        32 
    4848 
    4949#define MAX_HARDWARE                16 
  • pjproject/trunk/pjmedia/src/pjmedia/endpoint.c

    r635 r637  
    347347#endif 
    348348 
    349     /* Add format and rtpmap for each codec */ 
     349    /* Add format, rtpmap, and fmtp (when applicable) for each codec */ 
    350350    for (i=0; i<endpt->codec_mgr.codec_cnt; ++i) { 
    351351 
     
    354354        char tmp_param[3]; 
    355355        pjmedia_sdp_attr *attr; 
     356        pjmedia_codec_param codec_param; 
    356357        pj_str_t *fmt; 
    357358 
     
    360361 
    361362        codec_info = &endpt->codec_mgr.codec_desc[i].info; 
     363        pjmedia_codec_mgr_get_default_param(&endpt->codec_mgr, codec_info, 
     364                                            &codec_param); 
    362365        fmt = &m->desc.fmt[m->desc.fmt_count++]; 
    363366 
     
    391394        m->attr[m->attr_count++] = attr; 
    392395 
     396        /* Add fmtp mode where applicable */ 
     397        if (codec_param.setting.dec_fmtp_mode != 0) { 
     398            const pj_str_t fmtp = { "fmtp", 4 }; 
     399            attr = pj_pool_zalloc(pool, sizeof(pjmedia_sdp_attr)); 
     400 
     401            attr->name = fmtp; 
     402            attr->value.ptr = pj_pool_alloc(pool, 32); 
     403            attr->value.slen =  
     404                pj_ansi_snprintf( attr->value.ptr, 32, 
     405                                  ":%d mode=%d", 
     406                                  codec_info->pt, 
     407                                  codec_param.setting.dec_fmtp_mode); 
     408            m->attr[m->attr_count++] = attr; 
     409        } 
    393410    } 
    394411 
  • pjproject/trunk/pjmedia/src/pjmedia/errno.c

    r568 r637  
    9090    PJ_BUILD_ERR( PJMEDIA_CODEC_EPCMTOOSHORT,   "PCM frame is too short" ), 
    9191    PJ_BUILD_ERR( PJMEDIA_CODEC_EFRMINLEN,      "Invalid codec frame length" ), 
     92    PJ_BUILD_ERR( PJMEDIA_CODEC_EPCMFRMINLEN,   "Invalid PCM frame length" ), 
     93    PJ_BUILD_ERR( PJMEDIA_CODEC_EINMODE,        "Invalid codec mode (no fmtp?)" ), 
    9294 
    9395    /* Media errors. */ 
  • pjproject/trunk/pjmedia/src/pjmedia/session.c

    r582 r637  
    5959 
    6060/* 
     61 * Get fmtp mode parameter associated with the codec. 
     62 */ 
     63static pj_status_t get_fmtp_mode(const pjmedia_sdp_media *m, 
     64                                 const pj_str_t *fmt, 
     65                                 int *p_mode) 
     66{ 
     67    const pjmedia_sdp_attr *attr; 
     68    pjmedia_sdp_fmtp fmtp; 
     69    const pj_str_t str_mode = { "mode=", 5 }; 
     70    char *pos; 
     71 
     72    /* Get "fmtp" attribute for the format */ 
     73    attr = pjmedia_sdp_media_find_attr2(m, "fmtp", fmt); 
     74    if (attr == NULL) 
     75        return -1; 
     76 
     77    /* Parse "fmtp" attribute */ 
     78    if (pjmedia_sdp_attr_get_fmtp(attr, &fmtp) != PJ_SUCCESS) 
     79        return -1; 
     80 
     81    /* Look for "mode=" string in the fmtp */ 
     82    while (fmtp.fmt_param.slen >= str_mode.slen + 1) { 
     83        if (pj_strnicmp(&fmtp.fmt_param, &str_mode, str_mode.slen)==0) { 
     84            /* Found "mode=" string */ 
     85            break; 
     86        } 
     87 
     88        fmtp.fmt_param.ptr++; 
     89        fmtp.fmt_param.slen--; 
     90    } 
     91 
     92    if (fmtp.fmt_param.slen < str_mode.slen + 1) { 
     93        /* "mode=" param not found */ 
     94        return -1; 
     95    } 
     96 
     97    /* Get the mode */ 
     98    pos = fmtp.fmt_param.ptr + str_mode.slen; 
     99    *p_mode = 0; 
     100    while (pj_isdigit(*pos)) { 
     101        *p_mode = *p_mode * 10 + (*pos - '0'); 
     102        ++pos; 
     103    } 
     104 
     105    return PJ_SUCCESS; 
     106} 
     107 
     108 
     109/* 
    61110 * Create stream info from SDP media line. 
    62111 */ 
     
    76125    const pjmedia_sdp_conn *rem_conn; 
    77126    pjmedia_sdp_rtpmap *rtpmap; 
     127    int local_fmtp_mode = 0, rem_fmtp_mode = 0; 
    78128    unsigned i, pt; 
    79129    pj_status_t status; 
     
    271321 
    272322    } else { 
     323 
    273324        attr = pjmedia_sdp_media_find_attr(local_m, &ID_RTPMAP,  
    274325                                           &local_m->desc.fmt[0]); 
     
    305356        } 
    306357 
     358        /* Get fmtp mode= param in local SDP, if any */ 
     359        get_fmtp_mode(local_m, &local_m->desc.fmt[0], &local_fmtp_mode); 
     360 
    307361        /* Determine payload type for outgoing channel, by finding 
    308362         * dynamic payload type in remote SDP that matches the answer. 
     
    331385                /* Found matched codec. */ 
    332386                si->tx_pt = rpt; 
     387 
     388                /* Get fmtp mode param in remote SDP, if any */ 
     389                get_fmtp_mode(rem_m, &rtpmap->pt, &rem_fmtp_mode); 
     390 
    333391                break; 
    334392            } 
     
    345403    if (status != PJ_SUCCESS) 
    346404        return status; 
     405 
     406    /* Set fmtp mode for both local and remote */ 
     407    if (local_fmtp_mode != 0) 
     408        si->param->setting.dec_fmtp_mode = (pj_int8_t)local_fmtp_mode; 
     409    if (rem_fmtp_mode != 0) 
     410        si->param->setting.enc_fmtp_mode = (pj_int8_t)rem_fmtp_mode; 
     411 
    347412 
    348413    /* Get incomming payload type for telephone-events */ 
  • pjproject/trunk/pjmedia/src/pjmedia/transport_udp.c

    r582 r637  
    2222#include <pj/ioqueue.h> 
    2323#include <pj/log.h> 
     24#include <pj/rand.h> 
    2425#include <pj/string.h> 
    2526 
     
    5859                        const void*, 
    5960                        pj_ssize_t); 
     61 
     62    unsigned            tx_drop_pct;    /**< Percent of tx pkts to drop.    */ 
     63    unsigned            rx_drop_pct;    /**< Percent of rx pkts to drop.    */ 
    6064 
    6165    pj_sock_t           rtp_sock;       /**< RTP socket                     */ 
     
    372376        user_data = udp->user_data; 
    373377 
     378        /* Simulate packet lost on RX direction */ 
     379        if (udp->rx_drop_pct) { 
     380            if ((pj_rand() % 100) <= (int)udp->rx_drop_pct) { 
     381                PJ_LOG(5,(udp->base.name,  
     382                          "RX RTP packet dropped because of pkt lost " 
     383                          "simulation")); 
     384                goto read_next_packet; 
     385            } 
     386        } 
     387 
     388 
    374389        if (udp->attached && cb) 
    375390            (*cb)(user_data, udp->rtp_pkt, bytes_read); 
     
    426441        } 
    427442 
     443read_next_packet: 
    428444        bytes_read = sizeof(udp->rtp_pkt); 
    429445        udp->rtp_addrlen = sizeof(pj_sockaddr_in); 
     
    582598    PJ_ASSERT_RETURN(size <= RTP_LEN, PJ_ETOOBIG); 
    583599 
     600    /* Simulate packet lost on TX direction */ 
     601    if (udp->tx_drop_pct) { 
     602        if ((pj_rand() % 100) <= (int)udp->tx_drop_pct) { 
     603            PJ_LOG(5,(udp->base.name,  
     604                      "TX RTP packet dropped because of pkt lost " 
     605                      "simulation")); 
     606            return PJ_SUCCESS; 
     607        } 
     608    } 
     609 
     610 
    584611    id = udp->rtp_write_op_id; 
    585612    pw = &udp->rtp_pending_write[id]; 
     
    629656} 
    630657 
     658 
     659PJ_DEF(pj_status_t) pjmedia_transport_udp_simulate_lost(pjmedia_transport *tp, 
     660                                                        pjmedia_dir dir, 
     661                                                        unsigned pct_lost) 
     662{ 
     663    struct transport_udp *udp = (struct transport_udp*)tp; 
     664 
     665    PJ_ASSERT_RETURN(tp &&  
     666                     (dir==PJMEDIA_DIR_ENCODING||dir==PJMEDIA_DIR_DECODING) && 
     667                     pct_lost <= 100, PJ_EINVAL); 
     668 
     669    if (dir == PJMEDIA_DIR_ENCODING) 
     670        udp->tx_drop_pct = pct_lost; 
     671    else if (dir == PJMEDIA_DIR_DECODING) 
     672        udp->rx_drop_pct = pct_lost; 
     673    else 
     674        return PJ_EINVAL; 
     675 
     676    return PJ_SUCCESS; 
     677} 
     678 
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c

    r632 r637  
    124124    puts  ("  --auto-loop         Automatically loop incoming RTP to outgoing RTP"); 
    125125    puts  ("  --rtp-port=N        Base port to try for RTP (default=4000)"); 
    126     puts  ("  --quality=N         Specify media quality (0-10, default=10)"); 
     126    puts  ("  --quality=N         Specify media quality (0-10, default=6)"); 
    127127    puts  ("  --ptime=MSEC        Override codec ptime to MSEC (default=specific)"); 
    128128    puts  ("  --no-vad            Disable VAD/silence detector (default=vad enabled)"); 
     129    puts  ("  --ilbc-mode=MODE    Set iLBC codec mode (20 or 30, default is 20)"); 
     130    puts  ("  --rx-drop-pct=PCT   Drop PCT percent of RX RTP (for pkt lost sim, default: 0)"); 
     131    puts  ("  --tx-drop-pct=PCT   Drop PCT percent of TX RTP (for pkt lost sim, default: 0)"); 
     132 
    129133 
    130134    puts  (""); 
     
    256260           OPT_AUTO_ANSWER, OPT_AUTO_HANGUP, OPT_AUTO_PLAY, OPT_AUTO_LOOP, 
    257261           OPT_AUTO_CONF, OPT_CLOCK_RATE, 
    258            OPT_PLAY_FILE, OPT_RTP_PORT, OPT_ADD_CODEC, 
     262           OPT_PLAY_FILE, OPT_RTP_PORT, OPT_ADD_CODEC, OPT_ILBC_MODE, 
    259263           OPT_COMPLEXITY, OPT_QUALITY, OPT_PTIME, OPT_NO_VAD, 
     264           OPT_RX_DROP_PCT, OPT_TX_DROP_PCT, 
    260265           OPT_NEXT_ACCOUNT, OPT_NEXT_CRED, OPT_MAX_CALLS,  
    261266           OPT_DURATION, OPT_NO_TCP, OPT_NO_UDP, 
     
    299304        { "ptime",      1, 0, OPT_PTIME}, 
    300305        { "no-vad",     0, 0, OPT_NO_VAD}, 
     306        { "ilbc-mode",  1, 0, OPT_ILBC_MODE}, 
     307        { "rx-drop-pct",1, 0, OPT_RX_DROP_PCT}, 
     308        { "tx-drop-pct",1, 0, OPT_TX_DROP_PCT}, 
    301309        { "next-account",0,0, OPT_NEXT_ACCOUNT}, 
    302310        { "next-cred",  0, 0, OPT_NEXT_CRED}, 
     
    621629                PJ_LOG(1,(THIS_FILE, 
    622630                          "Error: invalid --quality (expecting 0-10")); 
     631                return -1; 
     632            } 
     633            break; 
     634 
     635        case OPT_ILBC_MODE: 
     636            cfg->media_cfg.ilbc_mode = my_atoi(pj_optarg); 
     637            if (cfg->media_cfg.ilbc_mode!=20 && cfg->media_cfg.ilbc_mode!=30) { 
     638                PJ_LOG(1,(THIS_FILE, 
     639                          "Error: invalid --ilbc-mode (expecting 20 or 30")); 
     640                return -1; 
     641            } 
     642            break; 
     643 
     644        case OPT_RX_DROP_PCT: 
     645            cfg->media_cfg.rx_drop_pct = my_atoi(pj_optarg); 
     646            if (cfg->media_cfg.rx_drop_pct > 100) { 
     647                PJ_LOG(1,(THIS_FILE, 
     648                          "Error: invalid --rx-drop-pct (expecting <= 100")); 
     649                return -1; 
     650            } 
     651            break; 
     652             
     653        case OPT_TX_DROP_PCT: 
     654            cfg->media_cfg.tx_drop_pct = my_atoi(pj_optarg); 
     655            if (cfg->media_cfg.tx_drop_pct > 100) { 
     656                PJ_LOG(1,(THIS_FILE, 
     657                          "Error: invalid --tx-drop-pct (expecting <= 100")); 
    623658                return -1; 
    624659            } 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h

    r632 r637  
    20882088     * number. 
    20892089     * 
    2090      * Default: 5. 
     2090     * Default: 6. 
    20912091     */ 
    20922092    unsigned            quality; 
     
    21052105     */ 
    21062106    pj_bool_t           no_vad; 
     2107 
     2108    /** 
     2109     * iLBC mode (20 or 30). 
     2110     * 
     2111     * Default: 20 
     2112     */ 
     2113    unsigned            ilbc_mode; 
     2114 
     2115    /** 
     2116     * Percentage of RTP packet to drop in TX direction 
     2117     * (to simulate packet lost). 
     2118     * 
     2119     * Default: 0 
     2120     */ 
     2121    unsigned            tx_drop_pct; 
     2122 
     2123    /** 
     2124     * Percentage of RTP packet to drop in RX direction 
     2125     * (to simulate packet lost). 
     2126     * 
     2127     * Default: 0 
     2128     */ 
     2129    unsigned            rx_drop_pct; 
     2130 
    21072131}; 
    21082132 
     
    21212145    cfg->has_ioqueue = PJ_TRUE; 
    21222146    cfg->thread_cnt = 1; 
    2123     cfg->quality = 5; 
     2147    cfg->quality = 6; 
     2148    cfg->ilbc_mode = 20; 
    21242149} 
    21252150 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c

    r635 r637  
    942942 
    943943    /* Create SDP */ 
     944    PJ_UNUSED_ARG(unhold); 
    944945    PJ_TODO(create_active_inactive_sdp_based_on_unhold_arg); 
    945946    status = pjmedia_endpt_create_sdp( pjsua_var.med_endpt, call->inv->pool,  
     
    18541855        /* Override ptime, if this option is specified. */ 
    18551856        if (pjsua_var.media_cfg.ptime != 0) { 
    1856             sess_info.stream_info[0].param->setting.frm_per_pkt =  
    1857                 pjsua_var.media_cfg.ptime / sess_info.stream_info[0].param->info.frm_ptime; 
     1857            sess_info.stream_info[0].param->setting.frm_per_pkt = (pj_uint8_t) 
     1858                (pjsua_var.media_cfg.ptime / sess_info.stream_info[0].param->info.frm_ptime); 
    18581859            if (sess_info.stream_info[0].param->setting.frm_per_pkt == 0) 
    18591860                sess_info.stream_info[0].param->setting.frm_per_pkt = 1; 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r612 r637  
    11151115 
    11161116    /* To be done!! */ 
    1117  
     1117    PJ_UNUSED_ARG(force); 
    11181118 
    11191119    PJ_TODO(pjsua_transport_close); 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c

    r632 r637  
    8686#endif /* PJMEDIA_HAS_SPEEX_CODEC */ 
    8787 
     88#if PJMEDIA_HAS_ILBC_CODEC 
     89    /* Register iLBC. */ 
     90    status = pjmedia_codec_ilbc_init( pjsua_var.med_endpt,  
     91                                      pjsua_var.media_cfg.ilbc_mode); 
     92    if (status != PJ_SUCCESS) { 
     93        pjsua_perror(THIS_FILE, "Error initializing iLBC codec", 
     94                     status); 
     95        return status; 
     96    } 
     97#endif /* PJMEDIA_HAS_ILBC_CODEC */ 
     98 
    8899#if PJMEDIA_HAS_GSM_CODEC 
    89100    /* Register GSM */ 
     
    485496            goto on_error; 
    486497        } 
     498 
     499        pjmedia_transport_udp_simulate_lost(pjsua_var.calls[i].med_tp, 
     500                                            PJMEDIA_DIR_ENCODING, 
     501                                            pjsua_var.media_cfg.tx_drop_pct); 
     502 
     503        pjmedia_transport_udp_simulate_lost(pjsua_var.calls[i].med_tp, 
     504                                            PJMEDIA_DIR_DECODING, 
     505                                            pjsua_var.media_cfg.rx_drop_pct); 
     506 
    487507    } 
    488508 
     
    661681                                            pjsua_var.mconf_cfg.samples_per_frame * 
    662682                                              1000 / pjsua_var.media_cfg.clock_rate,  
    663                                             0, 0, &port); 
     683                                            options, 0, &port); 
    664684    if (status != PJ_SUCCESS) { 
    665685        PJSUA_UNLOCK(); 
     
    759779    pj_status_t status; 
    760780 
     781    /* Don't support max_size at present */ 
     782    PJ_ASSERT_RETURN(max_size == 0, PJ_EINVAL); 
     783 
     784    /* Don't support file format at present */ 
     785    PJ_ASSERT_RETURN(file_format == 0, PJ_EINVAL); 
     786 
     787    /* Don't support encoding at present */ 
     788    PJ_ASSERT_RETURN(encoding == NULL, PJ_EINVAL); 
     789 
    761790    if (pjsua_var.rec_cnt >= PJ_ARRAY_SIZE(pjsua_var.recorder)) 
    762791        return PJ_ETOOMANY; 
     
    783812                                            pjsua_var.mconf_cfg.samples_per_frame, 
    784813                                            pjsua_var.mconf_cfg.bits_per_sample,  
    785                                             0, 0, &port); 
     814                                            options, 0, &port); 
    786815    if (status != PJ_SUCCESS) { 
    787816        PJSUA_UNLOCK(); 
     
    10931122                                           const pjmedia_codec_param *param) 
    10941123{ 
     1124    PJ_UNUSED_ARG(id); 
     1125    PJ_UNUSED_ARG(param); 
    10951126    PJ_TODO(set_codec_param); 
    10961127    return PJ_SUCCESS; 
    10971128} 
    1098  
    1099  
Note: See TracChangeset for help on using the changeset viewer.