Ignore:
Timestamp:
Mar 12, 2009 6:11:37 PM (15 years ago)
Author:
bennylp
Message:

(Major) Task #737 and #738: integration of APS-Direct and Audiodev from aps-direct branch to trunk.

Location:
pjproject/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk

  • pjproject/trunk/pjmedia/src/pjmedia/stream.c

    r2477 r2506  
    409409 
    410410 
     411/* The other version of get_frame callback used when stream port format 
     412 * is non linear PCM. 
     413 */ 
     414static pj_status_t get_frame_ext( pjmedia_port *port, pjmedia_frame *frame) 
     415{ 
     416    pjmedia_stream *stream = (pjmedia_stream*) port->port_data.pdata; 
     417    pjmedia_channel *channel = stream->dec; 
     418    pjmedia_frame_ext *f = (pjmedia_frame_ext*)frame; 
     419    unsigned samples_per_frame, samples_required; 
     420    pj_status_t status; 
     421 
     422    /* Return no frame if channel is paused */ 
     423    if (channel->paused) { 
     424        frame->type = PJMEDIA_FRAME_TYPE_NONE; 
     425        return PJ_SUCCESS; 
     426    } 
     427 
     428    /* Repeat get frame from the jitter buffer and decode the frame 
     429     * until we have enough frames according to codec's ptime. 
     430     */ 
     431 
     432    samples_required = stream->port.info.samples_per_frame; 
     433    samples_per_frame = stream->codec_param.info.frm_ptime * 
     434                        stream->codec_param.info.clock_rate * 
     435                        stream->codec_param.info.channel_cnt /  
     436                        1000; 
     437 
     438    pj_bzero(f, sizeof(pjmedia_frame_ext)); 
     439    f->base.type = PJMEDIA_FRAME_TYPE_EXTENDED; 
     440 
     441    while (f->samples_cnt < samples_required) { 
     442        char frame_type; 
     443        pj_size_t frame_size; 
     444        pj_uint32_t bit_info; 
     445 
     446        /* Lock jitter buffer mutex first */ 
     447        pj_mutex_lock( stream->jb_mutex ); 
     448 
     449        /* Get frame from jitter buffer. */ 
     450        pjmedia_jbuf_get_frame2(stream->jb, channel->out_pkt, &frame_size, 
     451                                &frame_type, &bit_info); 
     452         
     453        /* Unlock jitter buffer mutex. */ 
     454        pj_mutex_unlock( stream->jb_mutex ); 
     455 
     456        if (frame_type == PJMEDIA_JB_NORMAL_FRAME) { 
     457            /* Got "NORMAL" frame from jitter buffer */ 
     458            pjmedia_frame frame_in; 
     459 
     460            /* Decode */ 
     461            frame_in.buf = channel->out_pkt; 
     462            frame_in.size = frame_size; 
     463            frame_in.bit_info = bit_info; 
     464            frame_in.type = PJMEDIA_FRAME_TYPE_AUDIO; 
     465 
     466            status = stream->codec->op->decode( stream->codec, &frame_in, 
     467                                                0, frame); 
     468            if (status != PJ_SUCCESS) { 
     469                LOGERR_((port->info.name.ptr, "codec decode() error",  
     470                         status)); 
     471                pjmedia_frame_ext_append_subframe(f, NULL, 0, 
     472                                            (pj_uint16_t)samples_per_frame); 
     473            } 
     474        } else { 
     475            status = (*stream->codec->op->recover)(stream->codec, 
     476                                                   0, frame); 
     477            if (status != PJ_SUCCESS) { 
     478                pjmedia_frame_ext_append_subframe(f, NULL, 0, 
     479                                            (pj_uint16_t)samples_per_frame); 
     480            } 
     481 
     482            if (frame_type == PJMEDIA_JB_MISSING_FRAME) { 
     483                PJ_LOG(5,(stream->port.info.name.ptr,  "Frame lost!")); 
     484            } else if (frame_type == PJMEDIA_JB_ZERO_EMPTY_FRAME) { 
     485                /* Jitter buffer is empty. Check if this is the first "empty"  
     486                 * state. 
     487                 */ 
     488                if (frame_type != stream->jb_last_frm) { 
     489                    pjmedia_jb_state jb_state; 
     490 
     491                    /* Report the state of jitter buffer */ 
     492                    pjmedia_jbuf_get_state(stream->jb, &jb_state); 
     493                    PJ_LOG(5,(stream->port.info.name.ptr,  
     494                              "Jitter buffer empty (prefetch=%d)",  
     495                              jb_state.prefetch)); 
     496                } 
     497            } else { 
     498                pjmedia_jb_state jb_state; 
     499 
     500                /* It can only be PJMEDIA_JB_ZERO_PREFETCH frame */ 
     501                pj_assert(frame_type == PJMEDIA_JB_ZERO_PREFETCH_FRAME); 
     502 
     503                /* Get the state of jitter buffer */ 
     504                pjmedia_jbuf_get_state(stream->jb, &jb_state); 
     505 
     506                if (stream->jb_last_frm != frame_type) { 
     507                    PJ_LOG(5,(stream->port.info.name.ptr,  
     508                              "Jitter buffer is bufferring (prefetch=%d)", 
     509                              jb_state.prefetch)); 
     510                } 
     511            } 
     512        } 
     513 
     514        stream->jb_last_frm = frame_type; 
     515    } 
     516 
     517    return PJ_SUCCESS; 
     518} 
     519 
     520 
    411521/* 
    412522 * Transmit DTMF 
     
    687797    if (frame->type == PJMEDIA_FRAME_TYPE_AUDIO) 
    688798        ts_len = (frame->size >> 1) / stream->codec_param.info.channel_cnt; 
     799    else if (frame->type == PJMEDIA_FRAME_TYPE_EXTENDED) 
     800        ts_len = stream->port.info.samples_per_frame /  
     801                 stream->port.info.channel_count; 
    689802    else 
    690803        ts_len = 0; 
     
    753866    } else if (frame->type == PJMEDIA_FRAME_TYPE_AUDIO && 
    754867               frame->buf == NULL && 
     868               stream->port.info.format.id == PJMEDIA_FORMAT_L16 && 
    755869               (stream->dir & PJMEDIA_DIR_ENCODING) && 
    756870               stream->codec_param.info.frm_ptime * 
     
    14841598    stream->port.info.clock_rate = info->fmt.clock_rate; 
    14851599    stream->port.info.channel_count = info->fmt.channel_cnt; 
     1600    stream->port.info.format.id = info->param->info.fmt_id; 
    14861601    stream->port.port_data.pdata = stream; 
    1487     stream->port.put_frame = &put_frame; 
    1488     stream->port.get_frame = &get_frame; 
     1602    if (stream->port.info.format.id == PJMEDIA_FORMAT_L16) { 
     1603        stream->port.put_frame = &put_frame; 
     1604        stream->port.get_frame = &get_frame; 
     1605    } else { 
     1606        stream->port.info.format.bitrate = info->param->info.avg_bps; 
     1607        stream->port.info.format.vad = (info->param->setting.vad != 0); 
     1608 
     1609        stream->port.put_frame = &put_frame; 
     1610        stream->port.get_frame = &get_frame_ext; 
     1611    } 
    14891612 
    14901613 
Note: See TracChangeset for help on using the changeset viewer.