Ignore:
Timestamp:
Jun 2, 2009 4:28:24 PM (15 years ago)
Author:
nanang
Message:

Ticket #793: Updated (IPP) AMR codec to choose mode in the mode-set based on default mode setting.

File:
1 edited

Legend:

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

    r2733 r2734  
    2727#include <pj/assert.h> 
    2828#include <pj/log.h> 
     29#include <pj/math.h> 
    2930#include <pj/pool.h> 
    3031#include <pj/string.h> 
     
    10991100        amr_settings_t *s; 
    11001101        pj_uint8_t octet_align = 0; 
    1101         pj_int8_t enc_mode = -1; 
     1102        pj_int8_t enc_mode; 
     1103 
     1104        enc_mode = pjmedia_codec_amr_get_mode( 
     1105                                codec_data->info->params.modes.bitrate); 
     1106        pj_assert(enc_mode >= 0 && enc_mode <= 8); 
    11021107 
    11031108        /* Check AMR specific attributes */ 
     
    11191124            } 
    11201125        } 
     1126 
    11211127        for (i = 0; i < attr->setting.enc_fmtp.cnt; ++i) { 
    1122             /* mode-set */ 
     1128            /* mode-set, encoding mode is chosen based on local default mode  
     1129             * setting: 
     1130             * - if local default mode is included in the mode-set, use it 
     1131             * - otherwise, find the closest mode to local default mode; 
     1132             *   if there are two closest modes, prefer to use the higher 
     1133             *   one, e.g: local default mode is 4, the mode-set param 
     1134             *   contains '2,3,5,6', then 5 will be chosen. 
     1135             */ 
    11231136            const pj_str_t STR_FMTP_MODE_SET = {"mode-set", 8}; 
    11241137             
     
    11281141                const char *p; 
    11291142                pj_size_t l; 
    1130  
    1131                 /* Get the highest value, for better quality. */ 
     1143                pj_int8_t diff = 99; 
     1144                 
    11321145                p = pj_strbuf(&attr->setting.enc_fmtp.param[i].val); 
    11331146                l = pj_strlen(&attr->setting.enc_fmtp.param[i].val); 
    11341147 
    11351148                while (l--) { 
    1136                     if ((ippc->pt == PJMEDIA_RTP_PT_AMR && *p>='0' && *p<='7') || 
    1137                         (ippc->pt == PJMEDIA_RTP_PT_AMRWB && *p>='0' && *p<='8')) 
     1149                    if ((ippc->pt==PJMEDIA_RTP_PT_AMR && *p>='0' && *p<='7') || 
     1150                        (ippc->pt==PJMEDIA_RTP_PT_AMRWB && *p>='0' && *p<='8')) 
    11381151                    { 
    1139                         pj_int8_t tmp = *p - '0'; 
    1140                         if (enc_mode < tmp) 
    1141                             enc_mode = tmp; 
     1152                        pj_int8_t tmp = *p - '0' - enc_mode; 
     1153 
     1154                        if (PJ_ABS(diff) > PJ_ABS(tmp) ||  
     1155                            (PJ_ABS(diff) == PJ_ABS(tmp) && tmp > diff)) 
     1156                        { 
     1157                            diff = tmp; 
     1158                            if (diff == 0) break; 
     1159                        } 
    11421160                    } 
    11431161                    ++p; 
    11441162                } 
     1163 
     1164                if (diff == 99) 
     1165                    goto on_error; 
     1166 
     1167                enc_mode = enc_mode + diff; 
     1168 
    11451169                break; 
    11461170            } 
     
    11601184        s->dec_setting.reorder = PJ_TRUE; 
    11611185 
    1162         if (enc_mode != -1) { 
    1163             s->enc_mode = enc_mode; 
    1164         } else { 
    1165             s->enc_mode = pjmedia_codec_amr_get_mode( 
    1166                                     codec_data->info->params.modes.bitrate); 
    1167         } 
    1168  
    1169         if (s->enc_mode < 0) 
    1170             goto on_error; 
    1171  
    1172         /* Apply requested encoder bitrate */ 
     1186        /* Apply encoder mode/bitrate */ 
     1187        s->enc_mode = enc_mode; 
    11731188        codec_data->info->params.modes.bitrate = s->enc_setting.amr_nb? 
    11741189                                pjmedia_codec_amrnb_bitrates[s->enc_mode]: 
Note: See TracChangeset for help on using the changeset viewer.