Ignore:
Timestamp:
Aug 10, 2010 3:06:40 PM (12 years ago)
Author:
nanang
Message:

Fix #1106:

  • Added PCM signal adjustment in IPP G722.1 implementation. The default setting is configurable via (the existing compile-time config) PJMEDIA_G7221_DEFAULT_PCM_SHIFT.
  • Added new APIs to get and set IPP codecs settings: pjmedia_codec_ipp_set/get_config(). At run-time, the G722.1 PCM signal adjustment setting can be set using these functions.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia-codec/ipp_codecs.c

    r3199 r3261  
    113113    pj_pool_t               *pool; 
    114114    pj_mutex_t              *mutex; 
     115    unsigned                 g7221_pcm_shift; 
    115116} ipp_factory; 
    116117 
     
    134135                                                 codec has internal VAD.    */ 
    135136    pj_timestamp         last_tx;           /**< Timestamp of last transmit.*/ 
     137 
     138    unsigned             g7221_pcm_shift;   /**< G722.1 PCM level adjustment*/ 
    136139} ipp_private_t; 
    137140 
     
    661664    ipp_factory.base.factory_data = NULL; 
    662665    ipp_factory.endpt = endpt; 
     666    ipp_factory.g7221_pcm_shift = PJMEDIA_G7221_DEFAULT_PCM_SHIFT; 
    663667 
    664668    ipp_factory.pool = pjmedia_endpt_create_pool(endpt, "IPP codecs", 4000, 4000); 
     
    730734    return status; 
    731735} 
     736 
     737/* 
     738 * Get current IPP codecs configuration settings. 
     739 */ 
     740PJ_DEF(pj_status_t) pjmedia_codec_ipp_get_config( 
     741                                pjmedia_codec_ipp_config *cfg) 
     742{ 
     743    PJ_ASSERT_RETURN(cfg, PJ_EINVAL); 
     744 
     745    pj_bzero(cfg, sizeof(*cfg)); 
     746    cfg->g7221_pcm_shift = ipp_factory.g7221_pcm_shift; 
     747 
     748    return PJ_SUCCESS; 
     749} 
     750 
     751 
     752/* 
     753 * Set IPP codecs configuration settings. 
     754 */ 
     755PJ_DECL(pj_status_t) pjmedia_codec_ipp_set_config( 
     756                                const pjmedia_codec_ipp_config *cfg) 
     757{ 
     758    PJ_ASSERT_RETURN(cfg, PJ_EINVAL); 
     759 
     760    ipp_factory.g7221_pcm_shift = cfg->g7221_pcm_shift; 
     761     
     762    return PJ_SUCCESS; 
     763} 
     764 
    732765 
    733766/*  
     
    12091242#endif 
    12101243 
     1244#if PJMEDIA_HAS_INTEL_IPP_CODEC_G722_1 
     1245    if (ippc->pt >= PJMEDIA_RTP_PT_G722_1_16 &&  
     1246        ippc->pt <= PJMEDIA_RTP_PT_G7221_RSV2) 
     1247    { 
     1248        codec_data->g7221_pcm_shift = ipp_factory.g7221_pcm_shift; 
     1249    } 
     1250#endif 
     1251 
    12111252    return PJ_SUCCESS; 
    12121253 
     
    13621403        if (pt == PJMEDIA_RTP_PT_AMR || pt == PJMEDIA_RTP_PT_AMRWB) { 
    13631404            out.pBuffer += 2; 
     1405        } 
     1406#endif 
     1407 
     1408#if PJMEDIA_HAS_INTEL_IPP_CODEC_G722_1 
     1409        /* For G722.1: adjust the encoder input signal level */ 
     1410        if (pt >= PJMEDIA_RTP_PT_G722_1_16 &&  
     1411            pt <= PJMEDIA_RTP_PT_G7221_RSV2 && 
     1412            codec_data->g7221_pcm_shift) 
     1413        { 
     1414            unsigned i; 
     1415            for (i = 0; i < samples_per_frame; ++i) 
     1416                pcm_in[i] >>= codec_data->g7221_pcm_shift; 
    13641417        } 
    13651418#endif 
     
    15151568#endif 
    15161569 
     1570#if PJMEDIA_HAS_INTEL_IPP_CODEC_G722_1 
     1571    /* For G722.1: adjust the decoder output signal level */ 
     1572    if (pt >= PJMEDIA_RTP_PT_G722_1_16 &&  
     1573        pt <= PJMEDIA_RTP_PT_G7221_RSV2 && 
     1574        codec_data->g7221_pcm_shift) 
     1575    { 
     1576        unsigned i; 
     1577        pj_int16_t *s = (pj_int16_t*)output->buf; 
     1578 
     1579        for (i = 0; i < samples_per_frame; ++i) 
     1580            s[i] <<= codec_data->g7221_pcm_shift; 
     1581    } 
     1582#endif 
     1583 
    15171584    output->type = PJMEDIA_FRAME_TYPE_AUDIO; 
    15181585    output->size = samples_per_frame << 1; 
Note: See TracChangeset for help on using the changeset viewer.