Ignore:
Timestamp:
Feb 9, 2009 10:39:58 AM (15 years ago)
Author:
nanang
Message:
  • Added support for codec ILBC, G729, and AMR.
  • Updated audio switch board to make user possible to update its port 0 (master port) attributes, this is needed since sound device need to be reopened (e.g: for changing ptime or codec) while conf is not recreated.
  • Added new API to AMR helper to resolve mode/frame-type based on frame len.
  • Updated pmedia_frame_ext helper functions for a bit optimization.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/aps-direct/pjmedia/src/pjmedia-codec/passthrough.c

    r2438 r2444  
    171171{ 
    172172#   if PJMEDIA_HAS_PASSTHROUGH_CODEC_AMR 
    173     {1, "AMR",      PJMEDIA_RTP_PT_AMR,       PJMEDIA_FOURCC_AMR, 
     173    {1, "AMR",      PJMEDIA_RTP_PT_AMR,       {PJMEDIA_FOURCC_AMR}, 
    174174                    8000, 1, 160,  
    175                     5900, 12200, 4, 
     175                    12200, 12200, 2, 
    176176                    &parse_amr, &pack_amr 
    177177                    /*, {1, {{{"octet-align", 11}, {"1", 1}}} } */ 
     
    180180 
    181181#   if PJMEDIA_HAS_PASSTHROUGH_CODEC_G729 
    182     {1, "G729",     PJMEDIA_RTP_PT_G729,      PJMEDIA_FOURCC_G729, 
     182    {1, "G729",     PJMEDIA_RTP_PT_G729,      {PJMEDIA_FOURCC_G729}, 
    183183                    8000, 1,  80, 
    184                     8000, 11800, 2 
     184                    8000, 8000, 2 
    185185    }, 
    186186#   endif 
    187187 
    188188#   if PJMEDIA_HAS_PASSTHROUGH_CODEC_ILBC 
    189     {1, "iLBC",     PJMEDIA_RTP_PT_ILBC,      PJMEDIA_FOURCC_ILBC, 
    190                     8000, 1,  80, 
    191                     8000, 11800, 2, 
     189    {1, "iLBC",     PJMEDIA_RTP_PT_ILBC,      {PJMEDIA_FOURCC_ILBC}, 
     190                    8000, 1,  240, 
     191                    13333, 15200, 2, 
    192192                    NULL, NULL, 
    193193                    {1, {{{"mode", 4}, {"30", 2}}} } 
     
    196196 
    197197#   if PJMEDIA_HAS_PASSTHROUGH_CODEC_PCMU 
    198     {1, "PCMU",     PJMEDIA_RTP_PT_PCMU,      PJMEDIA_FOURCC_G711U, 
     198    {1, "PCMU",     PJMEDIA_RTP_PT_PCMU,      {PJMEDIA_FOURCC_G711U}, 
    199199                    8000, 1,  80, 
    200200                    64000, 64000, 2 
     
    203203 
    204204#   if PJMEDIA_HAS_PASSTHROUGH_CODEC_PCMA 
    205     {1, "PCMA",     PJMEDIA_RTP_PT_PCMA,      PJMEDIA_FOURCC_G711A, 
     205    {1, "PCMA",     PJMEDIA_RTP_PT_PCMA,      {PJMEDIA_FOURCC_G711A}, 
    206206                    8000, 1,  80, 
    207207                    64000, 64000, 2 
     
    210210}; 
    211211 
     212 
    212213#if PJMEDIA_HAS_PASSTHROUGH_CODEC_AMR 
    213214 
     
    227228                              struct pjmedia_frame *output) 
    228229{ 
    229     enum {MAX_FRAMES_PER_PACKET = 16}; 
     230    enum {MAX_FRAMES_PER_PACKET = 8}; 
    230231 
    231232    pjmedia_frame frames[MAX_FRAMES_PER_PACKET]; 
    232     unsigned nframes = 0; 
    233     pjmedia_codec_amr_bit_info *info; 
    234  
    235     PJ_TODO(DEFINE_AMR_FRAME_INFO_FOR_PJMEDIA_FRAME_EXT); 
    236  
    237 #if 0 
    238  
    239     pj_uint8_t *r; /* Read cursor */ 
     233    amr_settings_t* setting = (amr_settings_t*)codec_data->codec_setting; 
     234    pjmedia_codec_amr_pack_setting *enc_setting = &setting->enc_setting; 
    240235    pj_uint8_t SID_FT; 
    241     pjmedia_codec_amr_pack_setting *setting; 
    242  
    243     setting = &((amr_settings_t*)codec_data->codec_setting)->enc_setting; 
    244  
    245     SID_FT = (pj_uint8_t)(setting->amr_nb? 8 : 9); 
    246  
    247     /* Align pkt buf right */ 
    248     r = (pj_uint8_t*)pkt + max_pkt_size - *pkt_size; 
    249     pj_memmove(r, pkt, *pkt_size); 
     236    unsigned i; 
     237 
     238    pj_assert(input->subframe_cnt <= MAX_FRAMES_PER_PACKET); 
     239 
     240    SID_FT = (pj_uint8_t)(enc_setting->amr_nb? 8 : 9); 
    250241 
    251242    /* Get frames */ 
    252     for (;;) { 
    253         pj_bool_t eof; 
    254         pj_uint16_t info_; 
    255  
    256         info_ = *((pj_uint16_t*)r); 
    257         eof = ((info_ & 0x40) != 0); 
    258  
    259         info = (pjmedia_codec_amr_bit_info*) &frames[nframes].bit_info; 
     243    for (i = 0; i < input->subframe_cnt; ++i) { 
     244        pjmedia_frame_ext_subframe *sf; 
     245        pjmedia_codec_amr_bit_info *info; 
     246        unsigned len; 
     247         
     248        sf = pjmedia_frame_ext_get_subframe(input, i); 
     249         
     250        len = sf->bitlen >> 3; 
     251        if (sf->bitlen & 0x07) 
     252            ++len; 
     253         
     254        info = (pjmedia_codec_amr_bit_info*) &frames[i].bit_info; 
    260255        pj_bzero(info, sizeof(*info)); 
    261         info->frame_type = (pj_uint8_t)(info_ & 0x0F); 
     256        info->frame_type = pjmedia_codec_amr_get_mode2(enc_setting->amr_nb,  
     257                                                       len); 
    262258        info->good_quality = 1; 
    263         info->mode = (pj_int8_t) ((info_ >> 8) & 0x0F); 
    264  
    265         frames[nframes].buf = r + 2; 
    266         frames[nframes].size = info->frame_type <= SID_FT ? 
    267                                pjmedia_codec_amrnb_framelen[info->frame_type] : 
    268                                0; 
    269  
    270         r += frames[nframes].size + 2; 
    271  
    272         /* Last frame */ 
    273         if (++nframes >= MAX_FRAMES_PER_PACKET || eof) 
    274             break; 
    275     } 
    276  
    277     /* Pack */ 
    278     *pkt_size = max_pkt_size; 
    279  
    280     return pjmedia_codec_amr_pack(frames, nframes, setting, pkt, pkt_size); 
    281 #endif 
    282  
    283     return PJ_ENOTSUP; 
     259        info->mode = setting->enc_mode; 
     260 
     261        frames[i].buf = sf->data; 
     262        frames[i].size = len; 
     263    } 
     264 
     265    output->size = output_buf_len; 
     266 
     267    return pjmedia_codec_amr_pack(frames, input->subframe_cnt, enc_setting,  
     268                                  output->buf, &output->size); 
    284269} 
    285270 
     
    302287        return status; 
    303288 
     289    // CMR is not supported for now.  
    304290    /* Check Change Mode Request. */ 
    305     if ((setting->amr_nb && cmr <= 7) || (!setting->amr_nb && cmr <= 8)) { 
    306         s->enc_mode = cmr; 
    307     } 
     291    //if ((setting->amr_nb && cmr <= 7) || (!setting->amr_nb && cmr <= 8)) { 
     292    //  s->enc_mode = cmr; 
     293    //} 
    308294 
    309295    return PJ_SUCCESS; 
     
    800786    pjmedia_frame_ext *output_ = (pjmedia_frame_ext*) output; 
    801787 
    802     pj_assert(input && input->size > 0); 
     788    pj_assert(input); 
    803789 
    804790#if PJMEDIA_HAS_PASSTHROUGH_CODEC_AMR 
     
    807793     * into encoder bits order. 
    808794     */ 
    809     if (desc->pt == PJMEDIA_RTP_PT_AMR) { 
    810         pjmedia_frame frame; 
     795    if (desc->pt == PJMEDIA_RTP_PT_AMR || desc->pt == PJMEDIA_RTP_PT_AMRWB) { 
     796        pjmedia_frame input_; 
    811797        pjmedia_codec_amr_pack_setting *setting; 
    812798 
    813799        setting = &((amr_settings_t*)codec_data->codec_setting)->dec_setting; 
    814800 
    815         frame = *input; 
    816         pjmedia_codec_amr_predecode(input, setting, &frame); 
     801        input_ = *input; 
     802        pjmedia_codec_amr_predecode(input, setting, &input_); 
     803         
     804        pjmedia_frame_ext_append_subframe(output_, input_.buf,  
     805                                          (pj_uint16_t)(input_.size << 3), 
     806                                          (pj_uint16_t)desc->samples_per_frame); 
     807         
     808        return PJ_SUCCESS; 
    817809    } 
    818810#endif 
    819     /* 
    820     PJ_ASSERT_RETURN(output_buf_len >= sizeof(pjmedia_frame_ext) + 
    821                                        sizeof(pjmedia_frame_ext_subframe) + 
    822                                        input->size, 
    823                      PJMEDIA_CODEC_EFRMTOOSHORT); 
    824      */ 
    825  
     811     
    826812    pjmedia_frame_ext_append_subframe(output_, input->buf,  
    827813                                      (pj_uint16_t)(input->size << 3), 
Note: See TracChangeset for help on using the changeset viewer.