Ignore:
Timestamp:
Apr 20, 2009 2:19:11 PM (15 years ago)
Author:
bennylp
Message:

More ticket #774: added option to shift PCM input to encoder right by some value (default is 1) to make it compatible with some other app

File:
1 edited

Legend:

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

    r2616 r2620  
    138138    pj_mutex_t              *mutex;         /**< Codec factory mutex.       */ 
    139139 
     140    int                      pcm_shift;     /**< Level adjustment           */ 
    140141    unsigned                 mode_count;    /**< Number of G722.1 modes.    */ 
    141142    codec_mode               modes[MAX_CODEC_MODES]; /**< The G722.1 modes. */ 
     
    165166    pj_uint16_t          frame_size_bits;   /**< Coded frame size in bits.  */ 
    166167    pj_uint16_t          number_of_regions; /**< Number of regions.         */ 
     168    int                  pcm_shift;         /**< Adjustment for PCM in/out  */ 
    167169     
    168170    /* Encoder specific state */ 
     171    Word16              *enc_frame;         /**< 16bit to 14bit buffer      */ 
    169172    Word16              *enc_old_frame; 
    170173     
     
    252255    /* Initialize codec modes, by default all standard bitrates are enabled */ 
    253256    codec_factory.mode_count = 0; 
     257    codec_factory.pcm_shift = PJMEDIA_G7221_DEFAULT_PCM_SHIFT; 
    254258 
    255259    mode = &codec_factory.modes[codec_factory.mode_count++]; 
     
    409413 
    410414/* 
     415 * Set level adjustment. 
     416 */ 
     417PJ_DEF(pj_status_t)  pjmedia_codec_g7221_set_pcm_shift(int val) 
     418{ 
     419    codec_factory.pcm_shift = val; 
     420    return PJ_SUCCESS; 
     421} 
     422 
     423/* 
    411424 * Unregister G722.1 codec factory from pjmedia endpoint. 
    412425 */ 
     
    645658                                    (attr->info.clock_rate <= WB_SAMPLE_RATE? 
    646659                                     NUMBER_OF_REGIONS:MAX_NUMBER_OF_REGIONS); 
     660    codec_data->pcm_shift = codec_factory.pcm_shift; 
    647661 
    648662    /* Initialize encoder state */ 
    649663    tmp = codec_data->samples_per_frame << 1; 
    650664    codec_data->enc_old_frame = (Word16*)pj_pool_zalloc(pool, tmp); 
     665    codec_data->enc_frame = (Word16*)pj_pool_alloc(pool, tmp); 
    651666 
    652667    /* Initialize decoder state */ 
     
    734749{ 
    735750    codec_private_t *codec_data = (codec_private_t*) codec->codec_data; 
     751    const Word16 *pcm_input; 
    736752    Word16 mlt_coefs[MAX_SAMPLES_PER_FRAME]; 
    737753    Word16 mag_shift; 
     
    773789    } 
    774790 
     791    /* Encoder adjust the input signal level */ 
     792    if (codec_data->pcm_shift) { 
     793        unsigned i; 
     794        pcm_input = (const Word16*)input->buf; 
     795        for (i=0; i<codec_data->samples_per_frame; ++i) { 
     796            codec_data->enc_frame[i] =  
     797                (pj_int16_t)(pcm_input[i] >> codec_data->pcm_shift); 
     798        } 
     799        pcm_input = codec_data->enc_frame; 
     800    } else { 
     801        pcm_input = (const Word16*)input->buf; 
     802    } 
     803 
    775804    /* Convert input samples to rmlt coefs */ 
    776     mag_shift = samples_to_rmlt_coefs((Word16*)input->buf, 
     805    mag_shift = samples_to_rmlt_coefs(pcm_input, 
    777806                                      codec_data->enc_old_frame,  
    778807                                      mlt_coefs,  
     
    856885                          mag_shift); 
    857886 
     887    /* Decoder adjust PCM signal */ 
     888    if (codec_data->pcm_shift) { 
     889        unsigned i; 
     890        pj_int16_t *buf = (Word16*)output->buf; 
     891 
     892        for (i=0; i<codec_data->samples_per_frame; ++i) { 
     893            buf[i] <<= codec_data->pcm_shift; 
     894        } 
     895    } 
     896 
    858897    output->type = PJMEDIA_FRAME_TYPE_AUDIO; 
    859898    output->size = codec_data->samples_per_frame << 1; 
Note: See TracChangeset for help on using the changeset viewer.