Changeset 4026 for pjproject/trunk


Ignore:
Timestamp:
Apr 5, 2012 8:38:27 AM (13 years ago)
Author:
ming
Message:

Re #1472: Adjust the clock's get_frame() rate if the video device is passive

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/vid_port.c

    r4013 r4026  
    5757    pj_bool_t                destroy_client_port; 
    5858 
    59     pjmedia_converter       *conv; 
    60     void                    *conv_buf; 
    61     pj_size_t                conv_buf_size; 
    62     pjmedia_conversion_param conv_param; 
     59    struct { 
     60        pjmedia_converter       *conv; 
     61        void                    *conv_buf; 
     62        pj_size_t                conv_buf_size; 
     63        pjmedia_conversion_param conv_param; 
     64        unsigned                 usec_ctr; 
     65        unsigned                 usec_src, usec_dst; 
     66    } conv; 
    6367 
    6468    pjmedia_clock           *clock; 
     
    126130static pj_status_t create_converter(pjmedia_vid_port *vp) 
    127131{ 
    128     if (vp->conv) { 
    129         pjmedia_converter_destroy(vp->conv); 
    130         vp->conv = NULL; 
     132    if (vp->conv.conv) { 
     133        pjmedia_converter_destroy(vp->conv.conv); 
     134        vp->conv.conv = NULL; 
    131135    } 
    132136 
    133137    /* Instantiate converter if necessary */ 
    134     if (vp->conv_param.src.id != vp->conv_param.dst.id || 
    135         vp->conv_param.src.det.vid.size.w != vp->conv_param.dst.det.vid.size.w || 
    136         vp->conv_param.src.det.vid.size.h != vp->conv_param.dst.det.vid.size.h) 
     138    if (vp->conv.conv_param.src.id != vp->conv.conv_param.dst.id || 
     139        (vp->conv.conv_param.src.det.vid.size.w != 
     140         vp->conv.conv_param.dst.det.vid.size.w) || 
     141        (vp->conv.conv_param.src.det.vid.size.h != 
     142         vp->conv.conv_param.dst.det.vid.size.h)) 
    137143    { 
    138144        pj_status_t status; 
    139145 
    140146        /* Yes, we need converter */ 
    141         const pjmedia_video_format_info *vfi; 
    142         pjmedia_video_apply_fmt_param vafp; 
    143  
    144         status = pjmedia_converter_create(NULL, vp->pool, &vp->conv_param, 
    145                                           &vp->conv); 
     147        status = pjmedia_converter_create(NULL, vp->pool, &vp->conv.conv_param, 
     148                                          &vp->conv.conv); 
    146149        if (status != PJ_SUCCESS) { 
    147150            PJ_PERROR(4,(THIS_FILE, status, "Error creating converter")); 
    148151            return status; 
    149152        } 
     153    } 
     154 
     155    if (vp->conv.conv || 
     156        (vp->role==ROLE_ACTIVE && (vp->dir & PJMEDIA_DIR_ENCODING))) 
     157    { 
     158        pj_status_t status; 
     159        const pjmedia_video_format_info *vfi; 
     160        pjmedia_video_apply_fmt_param vafp; 
    150161 
    151162        /* Allocate buffer for conversion */ 
    152         vfi = pjmedia_get_video_format_info(NULL, vp->conv_param.dst.id); 
     163        vfi = pjmedia_get_video_format_info(NULL, vp->conv.conv_param.dst.id); 
    153164        if (!vfi) 
    154165            return PJMEDIA_EBADFMT; 
    155166 
    156167        pj_bzero(&vafp, sizeof(vafp)); 
    157         vafp.size = vp->conv_param.dst.det.vid.size; 
     168        vafp.size = vp->conv.conv_param.dst.det.vid.size; 
    158169        status = vfi->apply_fmt(vfi, &vafp); 
    159170        if (status != PJ_SUCCESS) 
    160171            return PJMEDIA_EBADFMT; 
    161172 
    162         if (vafp.framebytes > vp->conv_buf_size) { 
    163             vp->conv_buf = pj_pool_alloc(vp->pool, vafp.framebytes); 
    164             vp->conv_buf_size = vafp.framebytes; 
     173        if (vafp.framebytes > vp->conv.conv_buf_size) { 
     174            vp->conv.conv_buf = pj_pool_alloc(vp->pool, vafp.framebytes); 
     175            vp->conv.conv_buf_size = vafp.framebytes; 
    165176        } 
    166177    } 
     178 
     179    vp->conv.usec_ctr = 0; 
     180    vp->conv.usec_src = PJMEDIA_PTIME(&vp->conv.conv_param.src.det.vid.fps); 
     181    vp->conv.usec_dst = PJMEDIA_PTIME(&vp->conv.conv_param.dst.det.vid.fps); 
    167182 
    168183    return PJ_SUCCESS; 
     
    273288 
    274289    if (vp->dir & PJMEDIA_DIR_CAPTURE) { 
    275         pjmedia_format_copy(&vp->conv_param.src, &vparam.fmt); 
    276         pjmedia_format_copy(&vp->conv_param.dst, &prm->vidparam.fmt); 
     290        pjmedia_format_copy(&vp->conv.conv_param.src, &vparam.fmt); 
     291        pjmedia_format_copy(&vp->conv.conv_param.dst, &prm->vidparam.fmt); 
    277292    } else { 
    278         pjmedia_format_copy(&vp->conv_param.src, &prm->vidparam.fmt); 
    279         pjmedia_format_copy(&vp->conv_param.dst, &vparam.fmt); 
     293        pjmedia_format_copy(&vp->conv.conv_param.src, &prm->vidparam.fmt); 
     294        pjmedia_format_copy(&vp->conv.conv_param.dst, &vparam.fmt); 
    280295    } 
    281296 
     
    511526        vp->frm_mutex = NULL; 
    512527    } 
    513     if (vp->conv) { 
    514         pjmedia_converter_destroy(vp->conv); 
    515         vp->conv = NULL; 
     528    if (vp->conv.conv) { 
     529        pjmedia_converter_destroy(vp->conv.conv); 
     530        vp->conv.conv = NULL; 
    516531    } 
    517532    pj_pool_release(vp->pool); 
     
    577592         
    578593        /* Change the destination format to the new format */ 
    579         pjmedia_format_copy(&vp->conv_param.src, 
     594        pjmedia_format_copy(&vp->conv.conv_param.src, 
    580595                            &event->data.fmt_changed.new_fmt); 
    581596        /* Only copy the size here */ 
    582         vp->conv_param.dst.det.vid.size = 
     597        vp->conv.conv_param.dst.det.vid.size = 
    583598            event->data.fmt_changed.new_fmt.det.vid.size; 
    584599 
     
    590605 
    591606        pjmedia_vid_dev_stream_get_param(vp->strm, &vid_param); 
    592         if (vid_param.fmt.id != vp->conv_param.dst.id || 
     607        if (vid_param.fmt.id != vp->conv.conv_param.dst.id || 
    593608            (vid_param.fmt.det.vid.size.h != 
    594              vp->conv_param.dst.det.vid.size.h) || 
     609             vp->conv.conv_param.dst.det.vid.size.h) || 
    595610            (vid_param.fmt.det.vid.size.w != 
    596              vp->conv_param.dst.det.vid.size.w)) 
     611             vp->conv.conv_param.dst.det.vid.size.w)) 
    597612        { 
    598613            status = pjmedia_vid_dev_stream_set_cap(vp->strm, 
    599614                                                    PJMEDIA_VID_DEV_CAP_FORMAT, 
    600                                                     &vp->conv_param.dst); 
     615                                                    &vp->conv.conv_param.dst); 
    601616            if (status != PJ_SUCCESS) { 
    602617                PJ_LOG(3, (THIS_FILE, "failure in changing the format of the " 
     
    639654    pj_status_t status = PJ_SUCCESS; 
    640655 
    641     if (vp->conv) { 
    642         dst_frame->buf  = vp->conv_buf; 
    643         dst_frame->size = vp->conv_buf_size; 
    644         status = pjmedia_converter_convert(vp->conv, 
     656    if (vp->conv.conv) { 
     657        dst_frame->buf  = vp->conv.conv_buf; 
     658        dst_frame->size = vp->conv.conv_buf_size; 
     659        status = pjmedia_converter_convert(vp->conv.conv, 
    645660                                           src_frame, dst_frame); 
    646661    } 
     
    651666/* Copy frame to buffer. */ 
    652667static void copy_frame_to_buffer(pjmedia_vid_port *vp, 
    653                                         pjmedia_frame *frame) 
     668                                 pjmedia_frame *frame) 
    654669{ 
    655670    pj_mutex_lock(vp->frm_mutex); 
     
    665680 
    666681    pj_mutex_lock(vp->frm_mutex); 
    667     if (vp->conv) 
     682    if (vp->conv.conv) 
    668683        status = convert_frame(vp, vp->frm_buf, frame); 
    669684    else 
     
    691706 
    692707    if (vp->stream_role == ROLE_PASSIVE) { 
    693         vp->frm_buf->size = vp->frm_buf_size; 
    694         status = pjmedia_vid_dev_stream_get_frame(vp->strm, vp->frm_buf); 
     708        while (vp->conv.usec_ctr < vp->conv.usec_src) { 
     709            vp->frm_buf->size = vp->frm_buf_size; 
     710            status = pjmedia_vid_dev_stream_get_frame(vp->strm, vp->frm_buf); 
     711            vp->conv.usec_ctr += vp->conv.usec_dst; 
     712        } 
     713        vp->conv.usec_ctr -= vp->conv.usec_src; 
    695714        if (status != PJ_SUCCESS) 
    696715            return; 
     
    699718    //save_rgb_frame(vp->cap_size.w, vp->cap_size.h, vp->frm_buf); 
    700719 
    701     status = convert_frame(vp, vp->frm_buf, &frame_); 
     720    frame_.buf = vp->conv.conv_buf; 
     721    frame_.size = vp->conv.conv_buf_size; 
     722    status = get_frame_from_buffer(vp, &frame_); 
    702723    if (status != PJ_SUCCESS) 
    703724        return; 
    704725 
    705     status = pjmedia_port_put_frame(vp->client_port,  
    706                                     (vp->conv? &frame_: vp->frm_buf)); 
     726    status = pjmedia_port_put_frame(vp->client_port, &frame_); 
    707727    if (status != PJ_SUCCESS) 
    708728        return; 
     
    876896            return status; 
    877897 
    878         if (!vp->conv) 
     898        if (!vp->conv.conv) 
    879899            pj_memcpy(frame, vp->frm_buf, sizeof(*frame)); 
    880900    } else { 
     
    907927            return status; 
    908928 
    909         return pjmedia_vid_dev_stream_put_frame(vp->strm, 
    910                                                 (vp->conv? &frame_: frame)); 
     929        return pjmedia_vid_dev_stream_put_frame(vp->strm, (vp->conv.conv? 
     930                                                          &frame_: frame)); 
    911931    } else { 
    912932        /* We are passive while the stream is active so we just store the 
     
    931951         * The decoding counterpart is in vid_pasv_port_put_frame(). 
    932952         */ 
    933         status = pjmedia_vid_dev_stream_get_frame(vp->strm, 
    934                                                   (vp->conv? vp->frm_buf: 
    935                                                    frame)); 
     953        status = pjmedia_vid_dev_stream_get_frame(vp->strm, (vp->conv.conv? 
     954                                                  vp->frm_buf: frame)); 
    936955        if (status != PJ_SUCCESS) 
    937956            return status; 
Note: See TracChangeset for help on using the changeset viewer.