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/dshow_dev.c

    r3582 r3592  
    8383    pjmedia_vid_dev_factory      base; 
    8484    pj_pool_t                   *pool; 
     85    pj_pool_t                   *dev_pool; 
    8586    pj_pool_factory             *pf; 
    8687 
     
    124125static pj_status_t dshow_factory_init(pjmedia_vid_dev_factory *f); 
    125126static pj_status_t dshow_factory_destroy(pjmedia_vid_dev_factory *f); 
     127static pj_status_t dshow_factory_refresh(pjmedia_vid_dev_factory *f); 
    126128static unsigned    dshow_factory_get_dev_count(pjmedia_vid_dev_factory *f); 
    127129static pj_status_t dshow_factory_get_dev_info(pjmedia_vid_dev_factory *f, 
     
    161163    &dshow_factory_get_dev_info, 
    162164    &dshow_factory_default_param, 
    163     &dshow_factory_create_stream 
     165    &dshow_factory_create_stream, 
     166    &dshow_factory_refresh 
    164167}; 
    165168 
     
    200203static pj_status_t dshow_factory_init(pjmedia_vid_dev_factory *f) 
    201204{ 
     205    CoInitializeEx(NULL, COINIT_MULTITHREADED); 
     206 
     207    return dshow_factory_refresh(f); 
     208} 
     209 
     210/* API: destroy factory */ 
     211static pj_status_t dshow_factory_destroy(pjmedia_vid_dev_factory *f) 
     212{ 
     213    struct dshow_factory *df = (struct dshow_factory*)f; 
     214    pj_pool_t *pool = df->pool; 
     215 
     216    df->pool = NULL; 
     217    if (df->dev_pool) 
     218        pj_pool_release(df->dev_pool); 
     219    if (pool) 
     220        pj_pool_release(pool); 
     221 
     222    CoUninitialize(); 
     223 
     224    return PJ_SUCCESS; 
     225} 
     226 
     227/* API: refresh the list of devices */ 
     228static pj_status_t dshow_factory_refresh(pjmedia_vid_dev_factory *f) 
     229{ 
    202230    struct dshow_factory *df = (struct dshow_factory*)f; 
    203231    struct dshow_dev_info *ddi; 
     
    210238    ULONG fetched; 
    211239 
     240    if (df->dev_pool) { 
     241        pj_pool_release(df->dev_pool); 
     242        df->dev_pool = NULL; 
     243    } 
     244 
    212245    df->dev_count = 0; 
    213  
    214     CoInitializeEx(NULL, COINIT_MULTITHREADED); 
     246    df->dev_pool = pj_pool_create(df->pf, "dshow video", 500, 500, NULL); 
    215247 
    216248    hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, 
     
    234266    dev_count += 1; 
    235267    df->dev_info = (struct dshow_dev_info*) 
    236                    pj_pool_calloc(df->pool, dev_count, 
     268                   pj_pool_calloc(df->dev_pool, dev_count, 
    237269                                  sizeof(struct dshow_dev_info)); 
    238270 
     
    305337        ddi->info.fmt_cnt = sizeof(dshow_fmts)/sizeof(dshow_fmts[0]); 
    306338        ddi->info.fmt = (pjmedia_format*) 
    307                         pj_pool_calloc(df->pool, ddi->info.fmt_cnt, 
     339                        pj_pool_calloc(df->dev_pool, ddi->info.fmt_cnt, 
    308340                                       sizeof(pjmedia_format)); 
    309341 
     
    322354//    ddi->info.caps = PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW; 
    323355 
    324     PJ_LOG(4, (THIS_FILE, "DShow initialized, found %d devices:",  
     356    PJ_LOG(4, (THIS_FILE, "DShow has %d devices:",  
    325357               df->dev_count)); 
    326358    for (c = 0; c < df->dev_count; ++c) { 
     
    331363               "capture" : "render")); 
    332364    } 
    333  
    334     return PJ_SUCCESS; 
    335 } 
    336  
    337 /* API: destroy factory */ 
    338 static pj_status_t dshow_factory_destroy(pjmedia_vid_dev_factory *f) 
    339 { 
    340     struct dshow_factory *df = (struct dshow_factory*)f; 
    341     pj_pool_t *pool = df->pool; 
    342  
    343     df->pool = NULL; 
    344     pj_pool_release(pool); 
    345  
    346     CoUninitialize(); 
    347365 
    348366    return PJ_SUCCESS; 
Note: See TracChangeset for help on using the changeset viewer.