Ignore:
Timestamp:
Oct 29, 2008 10:17:02 AM (15 years ago)
Author:
nanang
Message:

Ticket #670:

  • Configurable setting to enable/disable AMR bitstream reordering (sensitivity order to/from encoder bits order).
  • Updated AMR codec to regard in-band Change Mode Request from remote encoder.
  • Updated AMR settings (octet-align, etc) to be configured upon codec opening, instead of hardcoded in the encode, decode, parse.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/include/pjmedia-codec/amr_helper.h

    r2358 r2359  
    605605    pj_int8_t  mode;            /**< AMR mode.                          */ 
    606606    pj_uint8_t start_bit;       /**< Frame start bit.                   */ 
    607     pj_uint8_t good_quality:1;  /**< Flag if frame contains good data.  */ 
     607    pj_uint8_t good_quality:1;  /**< Flag if frame is good/degraded.    */ 
    608608} pjmedia_codec_amr_bit_info; 
    609609#pragma pack() 
     
    614614 */ 
    615615typedef struct pjmedia_codec_amr_settings { 
    616     pj_bool_t  amr_nb;          /**< TRUE for AMR-NB, FALSE for AMR-WB  */ 
    617     pj_uint8_t CMR;             /**< Change Mode Request,  
    618                                      in band message from encoder.      */ 
     616    pj_bool_t  amr_nb;          /**< TRUE for AMR-NB, FALSE for AMR-WB. */ 
     617    pj_bool_t  reorder;         /**< Reorder bitstream into descending  
     618                                     sensitivity order or vice versa.   */ 
    619619    pj_uint8_t octet_aligned;   /**< TRUE if payload is in octet-aligned mode, 
    620620                                     FALSE if payload is in bandwidth  
    621621                                     efficient mode.                    */ 
     622    pj_uint8_t CMR;             /**< Change Mode Request for remote 
     623                                     encoder.                           */ 
    622624} pjmedia_codec_amr_settings; 
    623625 
     
    631633 */ 
    632634 
    633 PJ_INLINE(int) pjmedia_codec_amr_get_mode(unsigned bitrate) 
    634 { 
    635     int mode = -1; 
     635PJ_INLINE(pj_int8_t) pjmedia_codec_amr_get_mode(unsigned bitrate) 
     636{ 
     637    pj_int8_t mode = -1; 
    636638 
    637639    if(bitrate==4750){ 
     
    676678 
    677679/** 
    678  * Rearrange AMR bitstream from sensitivity bits order into encoder bits order. 
    679  * This will also make the start_bit to be 0. Basically this function should be 
    680  * called before invoking decoder. 
     680 * Prepare a frame before pass it to decoder. This function will do: 
     681 * - reorder AMR bitstream from descending sensitivity order into  
     682 *   encoder bits order. This can be enabled/disabled via param  
     683 *   'setting' by setting/resetting field 'reorder'. 
     684 * - align left the start bit (make the start_bit to be 0). 
    681685 * 
    682686 * @param amr_nb    Set PJ_TRUE for AMR-NB and PJ_FALSE for AMR-WB. 
    683687 * @param in        Input frame. 
     688 * @param setting   Settings, see @pjmedia_codec_amr_settings. 
    684689 * @param out       Output frame. 
    685690 * 
    686691 * @return          PJ_SUCCESS on success. 
    687692 */ 
    688 PJ_INLINE(pj_status_t) pjmedia_codec_amr_reorder_sens_to_enc( 
    689                                                 pj_bool_t amr_nb, 
    690                                                 const pjmedia_frame *in, 
    691                                                 pjmedia_frame *out) 
     693PJ_INLINE(pj_status_t) pjmedia_codec_amr_predecode( 
     694                                    const pjmedia_frame *in, 
     695                                    const pjmedia_codec_amr_settings *setting, 
     696                                    pjmedia_frame *out) 
    692697{ 
    693698    pj_int8_t    amr_bits[477 + 7] = {0}; 
     
    713718    *out_info = *in_info; 
    714719 
    715     if (amr_nb) { 
     720    if (setting->amr_nb) { 
    716721        SID_FT          = 8; 
    717722        framelen_tbl    = pjmedia_codec_amrnb_framelen; 
     
    751756 
    752757        /* Speech */ 
    753         const pj_int16_t *order_map; 
    754  
    755758        out_info->mode = in_info->frame_type; 
    756759        out->size = framelen_tbl[out_info->mode]; 
    757760        PJ_ASSERT_RETURN(out->size <= in->size, PJMEDIA_CODEC_EFRMINLEN); 
    758761 
    759         order_map = order_maps[out_info->mode]; 
    760762        pj_bzero(out->buf, out->size); 
    761         for(i = 0; i < framelenbit_tbl[out_info->mode]; ++i) { 
    762             if (amr_bits[i]) { 
    763                 pj_uint16_t bitpos; 
    764                 bitpos = order_map[i]; 
    765                 w[bitpos>>3] |= 1 << (7 - (bitpos % 8)); 
     763 
     764        if (setting->reorder) { 
     765            const pj_int16_t *order_map; 
     766 
     767            order_map = order_maps[out_info->mode]; 
     768            for(i = 0; i < framelenbit_tbl[out_info->mode]; ++i) { 
     769                if (amr_bits[i]) { 
     770                    pj_uint16_t bitpos; 
     771                    bitpos = order_map[i]; 
     772                    w[bitpos>>3] |= 1 << (7 - (bitpos % 8)); 
     773                } 
     774            } 
     775        } else { 
     776            for(i = 0; i < framelenbit_tbl[out_info->mode]; ++i) { 
     777                if (amr_bits[i]) 
     778                    w[i >> 3] |= 1 << (7 - (i % 8)); 
    766779            } 
    767780        } 
     
    773786        pj_uint8_t FT_; 
    774787 
    775         if (amr_nb) 
     788        if (setting->amr_nb) 
    776789            FT_ = (pj_uint8_t)((amr_bits[36] << 2) | (amr_bits[37] << 1) |  
    777790                               amr_bits[38]); 
     
    949962 
    950963            /* Speech */ 
    951             const pj_int16_t *order_map; 
    952  
    953             /* Put bits in the packet, sensitivity descending ordered */ 
    954             order_map = order_maps[info->frame_type]; 
    955964            if (w_bitptr == 0) *w = 0; 
    956             for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) { 
    957                 if (amr_bits[order_map[j]]) 
    958                     *w |= (1 << (7-w_bitptr)); 
    959  
    960                 if (++w_bitptr == 8) { 
    961                     w_bitptr = 0; 
    962                     ++w; 
    963                     *w = 0; 
     965 
     966            if (setting->reorder) { 
     967                const pj_int16_t *order_map; 
     968 
     969                /* Put bits in the packet, sensitivity descending ordered */ 
     970                order_map = order_maps[info->frame_type]; 
     971                for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) { 
     972                    if (amr_bits[order_map[j]]) 
     973                        *w |= (1 << (7-w_bitptr)); 
     974 
     975                    if (++w_bitptr == 8) { 
     976                        w_bitptr = 0; 
     977                        ++w; 
     978                        *w = 0; 
     979                    } 
     980                } 
     981            } else { 
     982                for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) { 
     983                    if (amr_bits[j]) 
     984                        *w |= (1 << (7-w_bitptr)); 
     985 
     986                    if (++w_bitptr == 8) { 
     987                        w_bitptr = 0; 
     988                        ++w; 
     989                        *w = 0; 
     990                    } 
    964991                } 
    965992            } 
     
    10191046 * @param frames    Frames parsed. 
    10201047 * @param nframes   Number of frames parsed. 
    1021  * @param CMR       Change Mode Request message from the encoder. 
     1048 * @param CMR       Change Mode Request message for local encoder. 
    10221049 * 
    10231050 * @return          PJ_SUCCESS on success. 
Note: See TracChangeset for help on using the changeset viewer.