Ignore:
Timestamp:
Jun 21, 2011 9:33:01 AM (13 years ago)
Author:
ming
Message:

Re #1312: Support for refreshing video device list
Add pjmedia-videodev API: pjmedia_vid_dev_refresh() and its implementation for Windows and Linux.

File:
1 edited

Legend:

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

    r3580 r3592  
    8282    pjmedia_vid_dev_factory      base; 
    8383    pj_pool_t                   *pool; 
     84    pj_pool_t                   *dev_pool; 
    8485    pj_pool_factory             *pf; 
    8586 
     
    120121static pj_status_t vid4lin_factory_init(pjmedia_vid_dev_factory *f); 
    121122static pj_status_t vid4lin_factory_destroy(pjmedia_vid_dev_factory *f); 
     123static pj_status_t vid4lin_factory_refresh(pjmedia_vid_dev_factory *f); 
    122124static unsigned    vid4lin_factory_get_dev_count(pjmedia_vid_dev_factory *f); 
    123125static pj_status_t vid4lin_factory_get_dev_info(pjmedia_vid_dev_factory *f, 
     
    156158    &vid4lin_factory_get_dev_info, 
    157159    &vid4lin_factory_default_param, 
    158     &vid4lin_factory_create_stream 
     160    &vid4lin_factory_create_stream, 
     161    &vid4lin_factory_refresh 
    159162}; 
    160163 
     
    213216    pj_status_t status; 
    214217 
     218    if (f->dev_pool) { 
     219        pj_pool_release(f->dev_pool); 
     220        f->dev_pool = NULL; 
     221    } 
     222 
    215223    pj_bzero(vdi, sizeof(vdi)); 
    216224    old_count = f->dev_count; 
    217225    f->dev_count = 0; 
     226    f->dev_pool = pj_pool_create(f->pf, DRIVER_NAME, 500, 500, NULL); 
    218227 
    219228    for (i=0; i<V4L2_MAX_DEVS && f->dev_count < V4L2_MAX_DEVS; ++i) { 
    220229        int fd; 
    221230        vid4lin_dev_info *pdi; 
    222         pj_pool_t *pool = f->pool; 
     231        pj_pool_t *pool = f->dev_pool; 
    223232        pj_uint32_t fmt_cap[8]; 
    224233        int j, fmt_cnt=0; 
     
    313322    if (f->dev_count > old_count || f->dev_info == NULL) { 
    314323        f->dev_info = (vid4lin_dev_info*) 
    315                       pj_pool_calloc(f->pool, 
     324                      pj_pool_calloc(f->dev_pool, 
    316325                                     f->dev_count, 
    317326                                     sizeof(vid4lin_dev_info)); 
     
    325334/* API: init factory */ 
    326335static pj_status_t vid4lin_factory_init(pjmedia_vid_dev_factory *f) 
     336{ 
     337    return vid4lin_factory_refresh(f); 
     338} 
     339 
     340/* API: destroy factory */ 
     341static pj_status_t vid4lin_factory_destroy(pjmedia_vid_dev_factory *f) 
     342{ 
     343    vid4lin_factory *cf = (vid4lin_factory*)f; 
     344    pj_pool_t *pool = cf->pool; 
     345 
     346    if (cf->dev_pool) 
     347        pj_pool_release(cf->dev_pool); 
     348    if (cf->pool) { 
     349        cf->pool = NULL; 
     350        pj_pool_release(pool); 
     351    } 
     352 
     353    return PJ_SUCCESS; 
     354} 
     355 
     356/* API: refresh the list of devices */ 
     357static pj_status_t vid4lin_factory_refresh(pjmedia_vid_dev_factory *f) 
    327358{ 
    328359    vid4lin_factory *cf = (vid4lin_factory*)f; 
     
    333364        return status; 
    334365 
    335     PJ_LOG(4, (THIS_FILE, "Video4Linux2 initialized with %d devices", 
     366    PJ_LOG(4, (THIS_FILE, "Video4Linux2 has %d devices", 
    336367               cf->dev_count)); 
    337  
    338     return PJ_SUCCESS; 
    339 } 
    340  
    341 /* API: destroy factory */ 
    342 static pj_status_t vid4lin_factory_destroy(pjmedia_vid_dev_factory *f) 
    343 { 
    344     vid4lin_factory *cf = (vid4lin_factory*)f; 
    345     pj_pool_t *pool = cf->pool; 
    346  
    347     if (cf->pool) { 
    348         cf->pool = NULL; 
    349         pj_pool_release(pool); 
    350     } 
    351368 
    352369    return PJ_SUCCESS; 
Note: See TracChangeset for help on using the changeset viewer.