Ignore:
Timestamp:
Apr 13, 2011 8:06:12 PM (11 years ago)
Author:
ming
Message:

Re #1213: Add on-the-fly format change capability for SDL OpenGL.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia/videoport.c

    r3509 r3535  
    3838struct pjmedia_vid_port 
    3939{ 
     40    pj_pool_t           *pool; 
    4041    pj_str_t             dev_name; 
    4142    pjmedia_dir          dir; 
     
    5051    pj_bool_t            destroy_client_port; 
    5152 
    52     pjmedia_converter   *cap_conv; 
    53     void                *cap_conv_buf; 
    54     pj_size_t            cap_conv_buf_size; 
     53    pjmedia_converter       *cap_conv; 
     54    void                    *cap_conv_buf; 
     55    pj_size_t                cap_conv_buf_size; 
     56    pjmedia_conversion_param cap_conv_param; 
    5557 
    5658    pjmedia_clock       *enc_clock, 
     
    136138    unsigned ptime_usec; 
    137139    pjmedia_vid_param vparam; 
    138     pjmedia_conversion_param conv_param; 
    139140 
    140141    PJ_ASSERT_RETURN(pool && prm && p_vid_port, PJ_EINVAL); 
     
    152153    /* Allocate videoport */ 
    153154    vp = PJ_POOL_ZALLOC_T(pool, pjmedia_vid_port); 
     155    vp->pool = pool; 
    154156    vp->role = prm->active ? ROLE_ACTIVE : ROLE_PASSIVE; 
    155157    vp->dir = prm->vidparam.dir; 
     
    257259              vparam.fmt.det.vid.fps.num, vparam.fmt.det.vid.fps.denum)); 
    258260 
     261    if (vp->dir & PJMEDIA_DIR_CAPTURE) { 
     262        pjmedia_format_copy(&vp->cap_conv_param.src, &vparam.fmt); 
     263        pjmedia_format_copy(&vp->cap_conv_param.dst, &prm->vidparam.fmt); 
     264    } else { 
     265        pjmedia_format_copy(&vp->cap_conv_param.src, &prm->vidparam.fmt); 
     266        pjmedia_format_copy(&vp->cap_conv_param.dst, &vparam.fmt); 
     267    } 
     268 
    259269    /* Instantiate converter if necessary */ 
    260270    if (vparam.fmt.id != prm->vidparam.fmt.id || 
     
    268278        pjmedia_video_apply_fmt_param vafp; 
    269279 
    270         if (vp->dir & PJMEDIA_DIR_CAPTURE) { 
    271             pjmedia_format_copy(&conv_param.src, &vparam.fmt); 
    272             pjmedia_format_copy(&conv_param.dst, &prm->vidparam.fmt); 
    273  
    274             status = pjmedia_converter_create(NULL, pool, &conv_param, 
    275                                               &vp->cap_conv); 
    276         } else { 
    277             pjmedia_format_copy(&conv_param.src, &prm->vidparam.fmt); 
    278             pjmedia_format_copy(&conv_param.dst, &vparam.fmt); 
    279  
    280             status = pjmedia_converter_create(NULL, pool, &conv_param, 
    281                                               &vp->cap_conv); 
    282         } 
    283  
     280        status = pjmedia_converter_create(NULL, pool, &vp->cap_conv_param, 
     281                                          &vp->cap_conv); 
    284282        if (status != PJ_SUCCESS) { 
    285283            PJ_PERROR(4,(THIS_FILE, status, "Error creating converter")); 
     
    288286 
    289287        /* Allocate buffer for conversion */ 
    290         vfi = pjmedia_get_video_format_info(NULL, conv_param.dst.id); 
     288        vfi = pjmedia_get_video_format_info(NULL, vp->cap_conv_param.dst.id); 
    291289        if (!vfi) 
    292290            return PJMEDIA_EBADFMT; 
    293291 
    294292        pj_bzero(&vafp, sizeof(vafp)); 
    295         vafp.size = conv_param.dst.det.vid.size; 
     293        vafp.size = vp->cap_conv_param.dst.det.vid.size; 
    296294        status = vfi->apply_fmt(vfi, &vafp); 
    297295        if (status != PJ_SUCCESS) 
     
    354352 
    355353        vfi = pjmedia_get_video_format_info(NULL, vp->cap_conv? 
    356                                             conv_param.src.id: 
     354                                            vp->cap_conv_param.src.id: 
    357355                                            vparam.fmt.id); 
    358356        if (!vfi) { 
     
    362360 
    363361        pj_bzero(&vafp, sizeof(vafp)); 
    364         vafp.size = (vp->cap_conv? conv_param.src.det.vid.size: 
     362        vafp.size = (vp->cap_conv? vp->cap_conv_param.src.det.vid.size: 
    365363                     vparam.fmt.det.vid.size); 
    366364        status = vfi->apply_fmt(vfi, &vafp); 
     
    611609        pj_status_t status; 
    612610 
     611        pjmedia_vid_port_stop(vp); 
     612 
    613613        /* Retrieve the video format detail */ 
    614614        vfd = pjmedia_format_get_video_format_detail( 
     
    617617            return PJMEDIA_EVID_BADFORMAT; 
    618618        pj_assert(vfd->fps.num); 
     619 
     620        if (vp->cap_conv) { 
     621            /* Change the destination format to the new format */ 
     622            pjmedia_format_copy(&vp->cap_conv_param.src, 
     623                                &vp->client_port->info.fmt); 
     624            /* Only copy the size here */ 
     625            vp->cap_conv_param.dst.det.vid.size = 
     626                vp->client_port->info.fmt.det.vid.size, 
     627 
     628            /* Recreate converter */ 
     629            pjmedia_converter_destroy(vp->cap_conv); 
     630            status = pjmedia_converter_create(NULL, vp->pool, 
     631                                              &vp->cap_conv_param, 
     632                                              &vp->cap_conv); 
     633            if (status != PJ_SUCCESS) { 
     634                PJ_PERROR(4,(THIS_FILE, status, "Error recreating converter")); 
     635                return status; 
     636            } 
     637        } 
    619638 
    620639        status = pjmedia_vid_dev_stream_set_cap( 
     
    628647                                  status != PJMEDIA_EVID_ERR ? "success" : 
    629648                                  "failure")); 
    630             pjmedia_vid_port_stop(vp); 
    631649            return status; 
    632650        } 
     
    650668        /* Notify application of the format change. */ 
    651669        pevent.event_type = PJMEDIA_EVENT_FMT_CHANGED; 
    652         pj_memcpy(&pevent.event_desc.fmt_change.new_format, 
    653                   &vp->client_port->info.fmt, sizeof(pjmedia_format)); 
     670        pjmedia_format_copy(&pevent.event_desc.fmt_change.new_format, 
     671                            &vp->client_port->info.fmt); 
    654672        if (vp->strm_cb.on_event_cb) 
    655673            (*vp->strm_cb.on_event_cb)(vp->strm, vp->strm_cb_data, &pevent); 
     674 
     675        pjmedia_vid_port_start(vp); 
    656676    } 
    657677 
Note: See TracChangeset for help on using the changeset viewer.