Ignore:
Timestamp:
Jul 15, 2009 5:55:16 PM (15 years ago)
Author:
nanang
Message:

Ticket #919:

  • Added default ilbc mode into codec passthrough setting.
  • Added iLBC mode 'negotiation' in iLBC codec_open().
  • Updated stream_create() to prioritize codec_open(), that may update the codec params, over stream initializations involving codec params.
File:
1 edited

Legend:

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

    r2825 r2834  
    115115    void                *codec_setting;     /**< Specific codec setting.    */ 
    116116    pj_uint16_t          avg_frame_size;    /**< Average of frame size.     */ 
     117    unsigned             samples_per_frame; /**< Samples per frame, for iLBC 
     118                                                 this can be 240 or 160, can 
     119                                                 only be known after codec is 
     120                                                 opened.                    */ 
    117121} codec_private_t; 
    118122 
     
    381385            codec_desc[i].enabled = enabled; 
    382386        } 
     387 
     388#if PJMEDIA_HAS_PASSTHROUGH_CODEC_ILBC 
     389        /* Update iLBC codec description based on default mode setting. */ 
     390        for (i = 0; i < PJ_ARRAY_SIZE(codec_desc); ++i) { 
     391            if (codec_desc[i].enabled &&  
     392                codec_desc[i].fmt_id == PJMEDIA_FORMAT_ILBC) 
     393            { 
     394                codec_desc[i].samples_per_frame =  
     395                                (setting->ilbc_mode == 20? 160 : 240); 
     396                codec_desc[i].def_bitrate =  
     397                                (setting->ilbc_mode == 20? 15200 : 13333); 
     398                pj_strset2(&codec_desc[i].dec_fmtp.param[0].val,  
     399                                (setting->ilbc_mode == 20? "20" : "30")); 
     400                break; 
     401            } 
     402        } 
     403#endif 
    383404    } 
    384405 
     
    646667    pool = codec_data->pool; 
    647668 
    648     /* Get bitstream size */ 
    649     i = attr->info.avg_bps * desc->samples_per_frame; 
     669    /* Cache samples per frame value */ 
     670    codec_data->samples_per_frame = desc->samples_per_frame; 
     671 
     672    /* Calculate bitstream size */ 
     673    i = attr->info.avg_bps * codec_data->samples_per_frame; 
    650674    j = desc->clock_rate << 3; 
    651675    codec_data->avg_frame_size = (pj_uint16_t)(i / j); 
     
    695719#endif 
    696720 
     721#if PJMEDIA_HAS_PASSTHROUGH_CODEC_ILBC 
     722    { 
     723        enum { DEFAULT_MODE = 30 }; 
     724        static pj_str_t STR_MODE = {"mode", 4}; 
     725        pj_uint16_t dec_fmtp_mode = DEFAULT_MODE,  
     726                    enc_fmtp_mode = DEFAULT_MODE; 
     727 
     728        /* Get decoder mode */ 
     729        for (i = 0; i < attr->setting.dec_fmtp.cnt; ++i) { 
     730            if (pj_stricmp(&attr->setting.dec_fmtp.param[i].name, &STR_MODE) == 0) 
     731            { 
     732                dec_fmtp_mode = (pj_uint16_t) 
     733                                pj_strtoul(&attr->setting.dec_fmtp.param[i].val); 
     734                break; 
     735            } 
     736        } 
     737 
     738        /* Decoder mode must be set */ 
     739        PJ_ASSERT_RETURN(dec_fmtp_mode == 20 || dec_fmtp_mode == 30,  
     740                         PJMEDIA_CODEC_EINMODE); 
     741 
     742        /* Get encoder mode */ 
     743        for (i = 0; i < attr->setting.enc_fmtp.cnt; ++i) { 
     744            if (pj_stricmp(&attr->setting.enc_fmtp.param[i].name, &STR_MODE) == 0) 
     745            { 
     746                enc_fmtp_mode = (pj_uint16_t) 
     747                                pj_strtoul(&attr->setting.enc_fmtp.param[i].val); 
     748                break; 
     749            } 
     750        } 
     751 
     752        PJ_ASSERT_RETURN(enc_fmtp_mode==20 || enc_fmtp_mode==30,  
     753                         PJMEDIA_CODEC_EINMODE); 
     754 
     755        /* Both sides of a bi-directional session MUST use the same "mode" value. 
     756         * In this point, possible values are only 20 or 30, so when encoder and 
     757         * decoder modes are not same, just use the default mode, it is 30. 
     758         */ 
     759        if (enc_fmtp_mode != dec_fmtp_mode) { 
     760            enc_fmtp_mode = dec_fmtp_mode = DEFAULT_MODE; 
     761            PJ_LOG(4,(pool->obj_name,  
     762                      "Normalized iLBC encoder and decoder modes to %d",  
     763                      DEFAULT_MODE)); 
     764        } 
     765 
     766        /* Update some attributes based on negotiated mode. */ 
     767        attr->info.avg_bps = (dec_fmtp_mode == 30? 13333 : 15200); 
     768        attr->info.frm_ptime = dec_fmtp_mode; 
     769 
     770        /* Override average frame size */ 
     771        codec_data->avg_frame_size = (dec_fmtp_mode == 30? 50 : 38); 
     772 
     773        /* Override samples per frame */ 
     774        codec_data->samples_per_frame = (dec_fmtp_mode == 30? 240 : 160); 
     775    } 
     776#endif 
     777 
    697778    return PJ_SUCCESS; 
    698779} 
     
    746827        frames[count].buf = pkt; 
    747828        frames[count].size = codec_data->avg_frame_size; 
    748         frames[count].timestamp.u64 = ts->u64 + count*desc->samples_per_frame; 
     829        frames[count].timestamp.u64 = ts->u64 +  
     830                                      count * codec_data->samples_per_frame; 
    749831 
    750832        pkt = (pj_uint8_t*)pkt + codec_data->avg_frame_size; 
     
    758840        frames[count].buf = pkt; 
    759841        frames[count].size = pkt_size; 
    760         frames[count].timestamp.u64 = ts->u64 + count*desc->samples_per_frame; 
     842        frames[count].timestamp.u64 = ts->u64 +  
     843                                       count * codec_data->samples_per_frame; 
    761844        ++count; 
    762845    } 
     
    855938        pjmedia_frame_ext_append_subframe(output_, input_.buf,  
    856939                                          (pj_uint16_t)(input_.size << 3), 
    857                                           (pj_uint16_t)desc->samples_per_frame); 
     940                                          (pj_uint16_t)codec_data->samples_per_frame); 
    858941        output->timestamp = input->timestamp; 
    859942         
     
    864947    pjmedia_frame_ext_append_subframe(output_, input->buf,  
    865948                                      (pj_uint16_t)(input->size << 3), 
    866                                       (pj_uint16_t)desc->samples_per_frame); 
     949                                      (pj_uint16_t)codec_data->samples_per_frame); 
    867950    output->timestamp = input->timestamp; 
    868951 
     
    884967 
    885968    pjmedia_frame_ext_append_subframe(output_, NULL, 0, 
    886                                       (pj_uint16_t)desc->samples_per_frame); 
     969                                      (pj_uint16_t)codec_data->samples_per_frame); 
    887970 
    888971    return PJ_SUCCESS; 
Note: See TracChangeset for help on using the changeset viewer.