diff options
author | Liong Sauw Ming <ming@teluu.com> | 2014-09-15 09:02:15 +0000 |
---|---|---|
committer | Liong Sauw Ming <ming@teluu.com> | 2014-09-15 09:02:15 +0000 |
commit | 72d1fade0a7080e39316d1a3a3526bc9a7fde2ba (patch) | |
tree | f60440bb797f6da2a1439645ae8f18ab0bc6675a /pjmedia/src/pjmedia-videodev | |
parent | 57b41530ce3c94c94c135b90199b9cc013c402e7 (diff) |
Fixed #1787: Failure of DShow device to open a certain resolution
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4922 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src/pjmedia-videodev')
-rw-r--r-- | pjmedia/src/pjmedia-videodev/dshow_dev.c | 66 |
1 files changed, 42 insertions, 24 deletions
diff --git a/pjmedia/src/pjmedia-videodev/dshow_dev.c b/pjmedia/src/pjmedia-videodev/dshow_dev.c index 7bf1a4c5..2c57722f 100644 --- a/pjmedia/src/pjmedia-videodev/dshow_dev.c +++ b/pjmedia/src/pjmedia-videodev/dshow_dev.c @@ -271,11 +271,14 @@ static void enum_dev_cap(IBaseFilter *filter, pjmedia_dir dir, const GUID *dshow_fmt, AM_MEDIA_TYPE **pMediatype, + int width, + int height, IPin **pSrcpin, - pj_bool_t *sup_fmt) + pjmedia_vid_dev_info *vdi) { IEnumPins *pEnum; AM_MEDIA_TYPE *mediatype = NULL; + pj_bool_t match_wh = PJ_FALSE; HRESULT hr; if (pSrcpin) @@ -333,17 +336,43 @@ static void enum_dev_cap(IBaseFilter *filter, &rpcstatus2) == 0 && rpcstatus2 == RPC_S_OK) { + VIDEOINFOHEADER *vi; + + vi = (VIDEOINFOHEADER *)mediatype->pbFormat; if (!dshow_fmt) dshow_fmts[j].enabled = PJ_TRUE; - if (sup_fmt) - sup_fmt[j] = PJ_TRUE; - if (pSrcpin) { + + if (vdi && vdi->fmt_cnt < + PJMEDIA_VID_DEV_INFO_FMT_CNT) + { + unsigned fps_num=DEFAULT_FPS, fps_denum=1; + + if (vi->AvgTimePerFrame != 0) { + fps_num = 10000000; + fps_denum=(unsigned)vi->AvgTimePerFrame; + } + + pjmedia_format_init_video( + &vdi->fmt[vdi->fmt_cnt++], + dshow_fmts[j].pjmedia_format, + vi->bmiHeader.biWidth, + vi->bmiHeader.biHeight, + fps_num, fps_denum); + } + + if (pSrcpin) { + if ((width == 0 && height == 0 ) || + (vi->bmiHeader.biWidth == width && + vi->bmiHeader.biHeight == height)) + { + match_wh = PJ_TRUE; + } *pSrcpin = pPin; *pMediatype = mediatype; } } } - if (pSrcpin && *pSrcpin) + if (pSrcpin && *pSrcpin && match_wh) break; } IAMStreamConfig_Release(streamcaps); @@ -377,6 +406,10 @@ static pj_status_t dshow_factory_refresh(pjmedia_vid_dev_factory *f) df->dev_pool = NULL; } + for (c = 0; c < sizeof(dshow_fmts) / sizeof(dshow_fmts[0]); c++) { + dshow_fmts[c].enabled = PJ_FALSE; + } + df->dev_count = 0; df->dev_pool = pj_pool_create(df->pf, "dshow video", 500, 500, NULL); @@ -446,25 +479,9 @@ static pj_status_t dshow_factory_refresh(pjmedia_vid_dev_factory *f) hr = get_cap_device(df, df->dev_count-1, &filter); if (SUCCEEDED(hr)) { - unsigned j; - pj_bool_t sup_fmt[sizeof(dshow_fmts)/sizeof(dshow_fmts[0])]; - - pj_bzero(sup_fmt, sizeof(sup_fmt)); - enum_dev_cap(filter, ddi->info.dir, NULL, NULL, NULL, sup_fmt); - ddi->info.fmt_cnt = 0; - for (j = 0; - j < sizeof(dshow_fmts)/sizeof(dshow_fmts[0]); - j++) - { - if (!sup_fmt[j]) - continue; - pjmedia_format_init_video( - &ddi->info.fmt[ddi->info.fmt_cnt++], - dshow_fmts[j].pjmedia_format, - DEFAULT_WIDTH, DEFAULT_HEIGHT, - DEFAULT_FPS, 1); - } + enum_dev_cap(filter, ddi->info.dir, NULL, NULL, + 0, 0, NULL, &ddi->info); } } VariantClear(&var_name); @@ -735,7 +752,8 @@ static pj_status_t create_filter_graph(pjmedia_dir dir, enum_dev_cap(graph->source_filter, dir, get_dshow_format_info(strm->param.fmt.id)->dshow_format, - &mediatype, &srcpin, NULL); + &mediatype, (use_def_size? 0: vfd->size.w), + (use_def_size? 0: vfd->size.h), &srcpin, NULL); graph->mediatype = mediatype; if (srcpin && dir == PJMEDIA_DIR_RENDER) { |