Changeset 3116


Ignore:
Timestamp:
Mar 4, 2010 3:47:25 PM (15 years ago)
Author:
nanang
Message:

Ticket #1008:

  • Applied VAS AMR playback solution from Forum Nokia.
  • Fixed AMR playback for VAS and APS in composing DTX/NO_DATA (frame type 15) frame header.
  • Modified symbsndtest test application to support non-PCM audio.
  • Minor check fix in pjmedia_codec_mgr_destroy(), caught assertion when VAS factory init failed and media endpoint tried to destroy codec manager (codec mgr hasn't been init-ed).
Location:
pjproject/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp

    r2958 r3116  
    10351035                    buf.iBuffer.Append((TUint8*)sf->data, len); 
    10361036                } else { 
    1037                     buf.iBuffer.Append(0); 
     1037                    enum {NO_DATA_FT = 15 }; 
     1038                    pj_uint8_t amr_header = 4 || (NO_DATA_FT << 3); 
     1039 
     1040                    buf.iBuffer.Append(amr_header); 
    10381041                } 
    10391042 
     
    10411044             
    10421045            } else { /* PJMEDIA_FRAME_TYPE_NONE */ 
    1043                 buf.iBuffer.Append(0); 
    1044                  
     1046                enum {NO_DATA_FT = 15 }; 
     1047                pj_uint8_t amr_header = 4 || (NO_DATA_FT << 3); 
     1048 
     1049                buf.iBuffer.Append(amr_header); 
     1050 
    10451051                frame->samples_cnt = 0; 
    10461052                frame->subframe_cnt = 0; 
  • pjproject/trunk/pjmedia/src/pjmedia-audiodev/symb_vas_dev.cpp

    r3078 r3116  
    416416TInt CPjAudioEngine::StartPlay() 
    417417{ 
    418     TInt err; 
     418    TInt err = KErrNone; 
    419419     
    420420    pj_assert(iVoIPDnlink); 
     
    429429            err = g711dec_if->SetMode((CVoIPFormatIntfc::TG711CodecMode) 
    430430                                      setting_.mode); 
    431             pj_assert(err == KErrNone); 
    432431        } 
    433432        break; 
     
    439438            err = ilbcdec_if->SetMode((CVoIPFormatIntfc::TILBCCodecMode) 
    440439                                      setting_.mode); 
    441             pj_assert(err == KErrNone); 
    442         } 
    443         break; 
    444  
     440        } 
     441        break; 
     442 
     443    case EAMR_NB: 
     444        /* Ticket #1008: AMR playback issue on few devices, e.g: E72, E52 */ 
     445        err = dec_fmt_if->SetFrameMode(ETrue); 
     446        break; 
     447         
    445448    default: 
    446449        break; 
    447450    } 
     451 
     452    if (err != KErrNone) 
     453        goto on_return; 
    448454     
    449455    /* Configure audio routing */ 
     
    452458    /* Start player */ 
    453459    err = iVoIPDnlink->Start(); 
    454      
     460 
     461on_return: 
    455462    if (err == KErrNone) { 
    456463        dn_state_ = STATE_STREAMING; 
     
    465472TInt CPjAudioEngine::StartRec() 
    466473{ 
    467     TInt err; 
     474    TInt err = KErrNone; 
    468475     
    469476    pj_assert(iVoIPUplink); 
     
    478485            err = g711enc_if->SetMode((CVoIPFormatIntfc::TG711CodecMode) 
    479486                                      setting_.mode); 
    480             pj_assert(err == KErrNone); 
    481487        } 
    482488        break; 
     
    488494            err = ilbcenc_if->SetMode((CVoIPFormatIntfc::TILBCCodecMode) 
    489495                                      setting_.mode); 
    490             pj_assert(err == KErrNone); 
    491496        } 
    492497        break; 
    493498         
    494499    case EAMR_NB: 
    495         enc_fmt_if->SetBitRate(setting_.mode); 
     500        err = enc_fmt_if->SetBitRate(setting_.mode); 
    496501        break; 
    497502         
     
    499504        break; 
    500505    } 
     506     
     507    if (err != KErrNone) 
     508        goto on_return; 
    501509     
    502510    /* Configure general codec setting */ 
     
    505513    /* Start recorder */ 
    506514    err = iVoIPUplink->Start(); 
    507      
     515 
     516on_return: 
    508517    if (err == KErrNone) { 
    509518        up_state_ = STATE_STREAMING; 
     
    11131122                    buffer.Append((TUint8*)sf->data, len); 
    11141123                } else { 
    1115                     buffer.Append(0); 
     1124                    enum {NO_DATA_FT = 15 }; 
     1125                    pj_uint8_t amr_header = 4 || (NO_DATA_FT << 3); 
     1126 
     1127                    buffer.Append(amr_header); 
    11161128                } 
    11171129 
     
    11191131             
    11201132            } else { /* PJMEDIA_FRAME_TYPE_NONE */ 
    1121                 buffer.Append(0); 
     1133                enum {NO_DATA_FT = 15 }; 
     1134                pj_uint8_t amr_header = 4 || (NO_DATA_FT << 3); 
     1135 
     1136                buffer.Append(amr_header); 
    11221137                 
    11231138                frame->samples_cnt = 0; 
  • pjproject/trunk/pjmedia/src/pjmedia/codec.c

    r3078 r3116  
    8686 
    8787    /* Destroy mutex */ 
    88     pj_mutex_destroy(mgr->mutex); 
     88    if (mgr->mutex) 
     89        pj_mutex_destroy(mgr->mutex); 
    8990 
    9091    /* Release pool */ 
    91     pj_pool_release(mgr->pool); 
     92    if (mgr->pool) 
     93        pj_pool_release(mgr->pool); 
    9294 
    9395    /* Just for safety, set codec manager states to zero */ 
  • pjproject/trunk/pjsip-apps/src/symsndtest/app_main.cpp

    r2821 r3116  
    4141static unsigned rec_cnt, play_cnt; 
    4242static pj_time_val t_start; 
    43  
    44 pj_pool_t *pool; 
    45 pjmedia_delay_buf *delaybuf; 
     43static pjmedia_aud_param param; 
     44static pj_pool_t *pool; 
     45static pjmedia_delay_buf *delaybuf; 
     46static char frame_buf[256]; 
     47 
     48static void copy_frame_ext(pjmedia_frame_ext *f_dst,  
     49                           const pjmedia_frame_ext *f_src)  
     50{ 
     51    pj_bzero(f_dst, sizeof(*f_dst)); 
     52    if (f_src->subframe_cnt) { 
     53        f_dst->base.type = PJMEDIA_FRAME_TYPE_EXTENDED; 
     54        for (unsigned i = 0; i < f_src->subframe_cnt; ++i) { 
     55            pjmedia_frame_ext_subframe *sf; 
     56            sf = pjmedia_frame_ext_get_subframe(f_src, i); 
     57            pjmedia_frame_ext_append_subframe(f_dst, sf->data, sf->bitlen,  
     58                                              param.samples_per_frame); 
     59        } 
     60    } else { 
     61        f_dst->base.type = PJMEDIA_FRAME_TYPE_NONE; 
     62    } 
     63} 
    4664 
    4765/* Logging callback */ 
     
    138156    PJ_UNUSED_ARG(user_data); 
    139157 
    140     pjmedia_delay_buf_put(delaybuf, (pj_int16_t*)frame->buf); 
    141  
    142     if (frame->size != SAMPLES_PER_FRAME*2) { 
    143                 PJ_LOG(3, (THIS_FILE, "Size captured = %u", 
    144                            frame->size)); 
     158    if (param.ext_fmt.id == PJMEDIA_FORMAT_PCM) { 
     159        pjmedia_delay_buf_put(delaybuf, (pj_int16_t*)frame->buf); 
     160     
     161        if (frame->size != SAMPLES_PER_FRAME*2) { 
     162                    PJ_LOG(3, (THIS_FILE, "Size captured = %u", 
     163                               frame->size)); 
     164        } 
     165    } else { 
     166        pjmedia_frame_ext *f_src = (pjmedia_frame_ext*)frame; 
     167        pjmedia_frame_ext *f_dst = (pjmedia_frame_ext*)frame_buf; 
     168         
     169        copy_frame_ext(f_dst, f_src); 
    145170    } 
    146171 
     
    155180    PJ_UNUSED_ARG(user_data); 
    156181 
    157     pjmedia_delay_buf_get(delaybuf, (pj_int16_t*)frame->buf); 
    158     frame->size = SAMPLES_PER_FRAME*2; 
    159     frame->type = PJMEDIA_FRAME_TYPE_AUDIO; 
     182    if (param.ext_fmt.id == PJMEDIA_FORMAT_PCM) { 
     183        pjmedia_delay_buf_get(delaybuf, (pj_int16_t*)frame->buf); 
     184        frame->size = SAMPLES_PER_FRAME*2; 
     185        frame->type = PJMEDIA_FRAME_TYPE_AUDIO; 
     186    } else { 
     187        pjmedia_frame_ext *f_src = (pjmedia_frame_ext*)frame_buf; 
     188        pjmedia_frame_ext *f_dst = (pjmedia_frame_ext*)frame; 
     189 
     190        copy_frame_ext(f_dst, f_src); 
     191    } 
    160192 
    161193    ++play_cnt; 
     
    166198static pj_status_t snd_start(unsigned flag) 
    167199{ 
    168     pjmedia_aud_param param; 
    169200    pj_status_t status; 
    170201 
     
    179210    param.samples_per_frame = SAMPLES_PER_FRAME; 
    180211    param.dir = (pjmedia_dir) flag; 
     212    param.ext_fmt.id = PJMEDIA_FORMAT_AMR; 
     213    param.ext_fmt.bitrate = 12200; 
     214    param.output_route = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER; 
    181215 
    182216    status = pjmedia_aud_stream_create(&param, &rec_cb, &play_cb, NULL, &strm); 
Note: See TracChangeset for help on using the changeset viewer.