Changeset 144:b7778100a5a7 in mediastreamer2
- Timestamp:
- Nov 3, 2008 12:05:25 AM (5 years ago)
- Branch:
- default
- File:
-
- 1 edited
-
linphone/mediastreamer2/src/winvideods.c (modified) (21 diffs)
Legend:
- Unmodified
- Added
- Removed
-
linphone/mediastreamer2/src/winvideods.c
r55 r144 38 38 #include "dxfilter.h" 39 39 #include <qedit.h> 40 //#include <atlbase.h>41 //#include <atlcom.h>42 40 43 41 HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister); … … 49 47 int devidx; 50 48 51 //CComPtr<IGraphBuilder> m_pGraph;52 //CComPtr<ICaptureGraphBuilder2> m_pBuilder;53 //CComPtr<IMediaControl> m_pControl;54 49 IGraphBuilder *m_pGraph; 55 50 ICaptureGraphBuilder2 *m_pBuilder; 56 51 IMediaControl *m_pControl; 57 52 CDXFilter *m_pDXFilter; 58 //CComPtr<IBaseFilter> m_pIDXFilter;59 //CComPtr<IBaseFilter> m_pNullRenderer;60 //CComPtr<IBaseFilter> m_pDeviceFilter;61 53 IBaseFilter *m_pIDXFilter; 62 54 IBaseFilter *m_pNullRenderer; … … 75 67 float start_time; 76 68 int frame_count; 77 bool_t running;78 69 }V4wState; 79 70 … … 386 377 } 387 378 388 static int v4w_ open_videodevice(V4wState *s)379 static int v4w_configure_videodevice(V4wState *s) 389 380 { 390 381 // Initialize COM … … 392 383 393 384 // get a Graph 394 //HRESULT hr=s->m_pGraph.CoCreateInstance(CLSID_FilterGraph);395 385 HRESULT hr= CoCreateInstance (CLSID_FilterGraph, 396 386 NULL, … … 404 394 405 395 // get a CaptureGraphBuilder2 406 //hr=s->m_pBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2);407 396 hr= CoCreateInstance (CLSID_CaptureGraphBuilder2, 408 397 NULL, … … 419 408 420 409 // get mediacontrol so we can start and stop the filter graph 421 //hr=s->m_pGraph.QueryInterface(&(s->m_pControl));422 410 hr=s->m_pGraph->QueryInterface (IID_IMediaControl, (void **)&s->m_pControl); 423 411 if(FAILED(hr)) … … 461 449 462 450 int pos=0; 451 while(S_OK == pEnumMoniker->Next(1, &pMoniker, &nFetched) ) 452 { 453 IPropertyBag *pBag; 454 hr = pMoniker->BindToStorage( 0, 0, IID_IPropertyBag, (void**) &pBag ); 455 if( hr != S_OK ) 456 continue; 457 458 if (s->dev[0]=='\0') 459 break; 460 461 VARIANT var; 462 VariantInit(&var); 463 hr = pBag->Read( L"FriendlyName", &var, NULL ); 464 if( hr != S_OK ) 465 { 466 pMoniker->Release(); 467 continue; 468 } 469 //USES_CONVERSION; 470 char szName[256]; 471 472 WideCharToMultiByte(CP_ACP,0,var.bstrVal,-1,szName,256,0,0); 473 VariantClear(&var); 474 475 if (strcmp(szName, s->dev)==0) 476 break; 477 478 pMoniker->Release(); 479 pBag->Release(); 480 pMoniker=NULL; 481 pBag=NULL; 482 } 483 484 if(pMoniker==NULL) 485 { 486 int pos=0; 463 487 while(S_OK == pEnumMoniker->Next(1, &pMoniker, &nFetched) ) 464 488 { 465 if (pos>=s->devidx) 466 break; 467 pos++; 468 pMoniker->Release(); 469 pMoniker=NULL; 470 } 489 IPropertyBag *pBag; 490 hr = pMoniker->BindToStorage( 0, 0, IID_IPropertyBag, (void**) &pBag ); 491 if( hr != S_OK ) 492 continue; 493 } 494 495 } 496 497 if(pMoniker==NULL) 498 { 499 return -6; 500 } 501 502 hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&s->m_pDeviceFilter ); 503 if(FAILED(hr)) 504 { 505 return -7; 506 } 507 508 s->m_pGraph->AddFilter(s->m_pDeviceFilter, L"Device Filter"); 509 510 pMoniker->Release(); 511 pEnumMoniker->Release(); 512 pCreateDevEnum->Release(); 513 514 515 GUID pPinCategory; 516 517 if (try_format(s, s->pix_fmt, &pPinCategory)==0) 518 s->pix_fmt = s->pix_fmt; 519 else if (try_format(s,MS_YUV420P, &pPinCategory)==0) 520 s->pix_fmt = MS_YUV420P; 521 else if (try_format(s,MS_YUY2, &pPinCategory)==0) 522 s->pix_fmt = MS_YUY2; 523 else if (try_format(s,MS_YUYV, &pPinCategory)==0) 524 s->pix_fmt = MS_YUYV; 525 else if (try_format(s,MS_UYVY, &pPinCategory)==0) 526 s->pix_fmt = MS_UYVY; 527 else if (try_format(s,MS_RGB24, &pPinCategory)==0) 528 s->pix_fmt = MS_RGB24; 529 else 530 { 531 ms_error("Unsupported video pixel format."); 532 return -8; 533 } 534 535 if (s->pix_fmt == MS_YUV420P) 536 ms_message("Driver supports YUV420P, using that format."); 537 else if (s->pix_fmt == MS_YUY2) 538 ms_message("Driver supports YUY2 (UYVY), using that format."); 539 else if (s->pix_fmt == MS_YUYV) 540 ms_message("Driver supports YUV422, using that format."); 541 else if (s->pix_fmt == MS_UYVY) 542 ms_message("Driver supports UYVY, using that format."); 543 else if (s->pix_fmt == MS_RGB24) 544 ms_message("Driver supports RGB24, using that format."); 545 546 if (try_format_size(s, s->pix_fmt, s->vsize.width, s->vsize.height, &pPinCategory)==0) 547 ms_message("Selected Size: %ix%i.", s->vsize.width, s->vsize.height); 548 else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_QCIF_W, MS_VIDEO_SIZE_QCIF_H, &pPinCategory)==0) 549 ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_QCIF_W, MS_VIDEO_SIZE_QCIF_H); 550 else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_CIF_W, MS_VIDEO_SIZE_CIF_H, &pPinCategory)==0) 551 ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_CIF_W, MS_VIDEO_SIZE_CIF_H); 552 else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_4CIF_W, MS_VIDEO_SIZE_4CIF_H, &pPinCategory)==0) 553 ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_4CIF_W, MS_VIDEO_SIZE_4CIF_H); 554 else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_VGA_W, MS_VIDEO_SIZE_VGA_H, &pPinCategory)==0) 555 ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_VGA_W, MS_VIDEO_SIZE_VGA_H); 556 else if (try_format_size(s, s->pix_fmt, MS_VIDEO_SIZE_QVGA_W, MS_VIDEO_SIZE_QVGA_H, &pPinCategory)==0) 557 ms_message("Selected Size: %ix%i.", MS_VIDEO_SIZE_QVGA_W, MS_VIDEO_SIZE_QVGA_H); 558 else 559 { 560 ms_error("No supported size found for format."); 561 /* size not supported? */ 562 return -9; 563 } 564 565 return 0; 566 } 567 568 static int v4w_open_videodevice(V4wState *s) 569 { 570 // Initialize COM 571 CoInitialize(NULL); 572 573 // get a Graph 574 HRESULT hr= CoCreateInstance (CLSID_FilterGraph, 575 NULL, 576 CLSCTX_INPROC_SERVER, 577 IID_IGraphBuilder, //IID_IBaseFilter, 578 (void **)&s->m_pGraph); 579 if(FAILED(hr)) 580 { 581 return -1; 582 } 583 584 // get a CaptureGraphBuilder2 585 hr= CoCreateInstance (CLSID_CaptureGraphBuilder2, 586 NULL, 587 CLSCTX_INPROC_SERVER, 588 IID_ICaptureGraphBuilder2, //IID_IBaseFilter, 589 (void **)&s->m_pBuilder); 590 if(FAILED(hr)) 591 { 592 return -2; 593 } 594 595 // connect capture graph builder with the graph 596 s->m_pBuilder->SetFiltergraph(s->m_pGraph); 597 598 // get mediacontrol so we can start and stop the filter graph 599 hr=s->m_pGraph->QueryInterface (IID_IMediaControl, (void **)&s->m_pControl); 600 if(FAILED(hr)) 601 { 602 return -3; 603 } 604 605 606 #ifdef _DEBUG 607 HANDLE m_hLogFile=CreateFile(L"DShowGraphLog.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 608 if(m_hLogFile!=INVALID_HANDLE_VALUE) 609 { 610 hr=s->m_pGraph->SetLogFile((DWORD_PTR)m_hLogFile); 611 /* ASSERT(SUCCEEDED(hr)); */ 612 } 613 614 //AddGraphToRot(s->m_pGraph, &s->rotregvalue); 615 #endif 616 617 ICreateDevEnum *pCreateDevEnum = NULL; 618 IEnumMoniker *pEnumMoniker = NULL; 619 IMoniker *pMoniker = NULL; 620 621 ULONG nFetched = 0; 622 623 hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, 624 IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum); 625 if(FAILED(hr)) 626 { 627 return -4; 628 } 629 630 hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, 631 &pEnumMoniker, 0); 632 if (FAILED(hr) || pEnumMoniker == NULL) { 633 //printf("no device\n"); 634 return -5; 635 } 636 637 pEnumMoniker->Reset(); 638 639 int pos=0; 640 while(S_OK == pEnumMoniker->Next(1, &pMoniker, &nFetched) ) 641 { 642 IPropertyBag *pBag; 643 hr = pMoniker->BindToStorage( 0, 0, IID_IPropertyBag, (void**) &pBag ); 644 if( hr != S_OK ) 645 continue; 646 647 if (s->dev[0]=='\0') 648 break; 649 650 VARIANT var; 651 VariantInit(&var); 652 hr = pBag->Read( L"FriendlyName", &var, NULL ); 653 if( hr != S_OK ) 654 { 655 pMoniker->Release(); 656 continue; 657 } 658 //USES_CONVERSION; 659 char szName[256]; 660 661 WideCharToMultiByte(CP_ACP,0,var.bstrVal,-1,szName,256,0,0); 662 VariantClear(&var); 663 664 if (strcmp(szName, s->dev)==0) 665 break; 666 667 pMoniker->Release(); 668 pBag->Release(); 669 pMoniker=NULL; 670 pBag=NULL; 671 } 672 471 673 if(pMoniker==NULL) 472 674 { … … 628 830 629 831 // get null renderer 630 //hr=s->m_pNullRenderer.CoCreateInstance(CLSID_NullRenderer);631 832 hr=CoCreateInstance (CLSID_NullRenderer, 632 833 NULL, … … 647 848 if (FAILED(hr)) 648 849 { 649 //hr = s->m_pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, 650 // &MEDIATYPE_Video, s->m_pDeviceFilter, s->m_pIDXFilter, s->m_pNullRenderer); 651 if (FAILED(hr)) 652 { 653 return -17; 654 } 850 return -17; 655 851 } 656 852 … … 736 932 s->vsize.width=MS_VIDEO_SIZE_CIF_W; 737 933 s->vsize.height=MS_VIDEO_SIZE_CIF_H; 738 //s->pix_fmt=MS_RGB24;739 934 s->pix_fmt=MS_YUV420P; 740 935 … … 757 952 s->frame_count=-1; 758 953 s->fps=15; 954 memset(s->dev, 0, sizeof(s->dev)); 759 955 760 956 f->data=s; 761 957 } 762 958 959 static int _v4w_test(V4wState *s, void *arg) 960 { 961 int i; 962 i = v4w_configure_videodevice(s); 963 964 if (i!=0) 965 { 966 s->pix_fmt = MS_YUV420P; 967 s->vsize.width = MS_VIDEO_SIZE_CIF_W; 968 s->vsize.height = MS_VIDEO_SIZE_CIF_H; 969 } 970 971 //RemoveGraphFromRot(s->rotregvalue); 972 if (s->m_pGraph!=NULL) 973 { 974 if (s->m_pNullRenderer!=NULL) 975 s->m_pGraph->RemoveFilter(s->m_pNullRenderer); 976 if (s->m_pIDXFilter!=NULL) 977 s->m_pGraph->RemoveFilter(s->m_pIDXFilter); 978 if (s->m_pDeviceFilter!=NULL) 979 s->m_pGraph->RemoveFilter(s->m_pDeviceFilter); 980 } 981 982 if (s->m_pNullRenderer) 983 s->m_pNullRenderer->Release(); 984 if (s->m_pIDXFilter) 985 s->m_pIDXFilter->Release(); 986 if (s->m_pDeviceFilter) 987 s->m_pDeviceFilter->Release(); 988 989 if (s->m_pBuilder) 990 s->m_pBuilder->Release(); 991 if (s->m_pControl) 992 s->m_pControl->Release(); 993 if (s->m_pGraph) 994 s->m_pGraph->Release(); 995 996 if (s->m_pDXFilter!=NULL) 997 s->m_pDXFilter->Release(); 998 999 s->m_pNullRenderer=NULL; 1000 s->m_pIDXFilter=NULL; 1001 s->m_pDeviceFilter=NULL; 1002 s->m_pBuilder=NULL; 1003 s->m_pControl=NULL; 1004 s->m_pGraph=NULL; 1005 s->m_pDXFilter=NULL; 1006 1007 CoUninitialize(); 1008 s_callback = NULL; 1009 flushq(&s->rq,0); 1010 ms_message("v4w: checked device size=%ix%i format=%i (err=%i)", s->vsize.width, s->vsize.height, s->pix_fmt, i); 1011 1012 return i; 1013 } 763 1014 764 1015 static int _v4w_start(V4wState *s, void *arg) … … 868 1119 return 0; 869 1120 } 870 871 872 static int v4w_start(MSFilter *f, void *arg){873 V4wState *s=(V4wState*)f->data;874 _v4w_start(s, NULL);875 return 0;876 }877 878 static int v4w_stop(MSFilter *f, void *arg){879 V4wState *s=(V4wState*)f->data;880 _v4w_stop(s, NULL);881 return 0;882 }883 884 1121 885 1122 static void v4w_uninit(MSFilter *f){ … … 985 1222 static void v4w_preprocess(MSFilter * obj){ 986 1223 V4wState *s=(V4wState*)obj->data; 987 s->running=TRUE; 1224 if (s->rotregvalue==0) 1225 _v4w_start(s, NULL); 988 1226 if (s->rotregvalue==0) 989 1227 s->fps=1; … … 992 1230 static void v4w_postprocess(MSFilter * obj){ 993 1231 V4wState *s=(V4wState*)obj->data; 994 s->running=FALSE;995 1232 s->start_time=0; 996 1233 s->frame_count=-1; … … 1055 1292 static int v4w_get_pix_fmt(MSFilter *f,void *arg){ 1056 1293 V4wState *s=(V4wState*)f->data; 1294 if (s->rotregvalue==0){ 1295 _v4w_test(s, NULL); /* check supported format */ 1296 *((MSPixFmt*)arg) = (MSPixFmt)s->pix_fmt; 1297 return 0; 1298 } 1057 1299 *((MSPixFmt*)arg) = (MSPixFmt)s->pix_fmt; 1058 1300 return 0; … … 1100 1342 } 1101 1343 1344 static int v4w_set_name(MSFilter *f, void *arg){ 1345 V4wState *s=(V4wState*)f->data; 1346 snprintf(s->dev, sizeof(s->dev), (char*)arg); 1347 return 0; 1348 } 1349 1102 1350 static MSFilterMethod methods[]={ 1103 1351 { MS_FILTER_SET_FPS , v4w_set_fps }, … … 1106 1354 { MS_FILTER_SET_VIDEO_SIZE, v4w_set_vsize }, 1107 1355 { MS_FILTER_GET_VIDEO_SIZE, v4w_get_vsize }, 1108 { MS_V4L_START , v4w_start }, 1109 { MS_V4L_STOP , v4w_stop }, 1110 { MS_V4L_SET_DEVICE , v4w_set_device }, 1111 { MS_V4L_SET_IMAGE , v4w_set_image }, 1356 { MS_V4L_SET_DEVICE, v4w_set_device }, 1357 { MS_FILTER_SET_IMAGE, v4w_set_image }, 1112 1358 { 0 , NULL } 1113 1359 }; … … 1153 1399 1154 1400 static MSFilter *vfw_create_reader(MSWebCam *obj){ 1155 return ms_filter_new_from_desc(&ms_v4w_desc); 1401 MSFilter *f=ms_filter_new_from_desc(&ms_v4w_desc); 1402 v4w_set_name(f,obj->name); 1403 return f; 1156 1404 } 1157 1405 … … 1159 1407 1160 1408 static void vfw_cam_init(MSWebCam *cam){ 1161 cam->name=ms_strdup("dx0"); 1162 } 1163 1164 MSWebCamDesc ms_v4w_cam_desc={ 1409 } 1410 1411 MSWebCamDesc ms_directx_cam_desc={ 1165 1412 "DirectX Video Grabber", 1166 1413 &vfw_detect, … … 1171 1418 1172 1419 static void vfw_detect(MSWebCamManager *obj){ 1173 MSWebCam *cam=ms_web_cam_new(&ms_v4w_cam_desc); 1174 ms_web_cam_manager_add_cam(obj,cam); 1175 } 1420 ICreateDevEnum *pCreateDevEnum = NULL; 1421 IEnumMoniker *pEnumMoniker = NULL; 1422 IMoniker *pMoniker = NULL; 1423 HRESULT hr; 1424 1425 ULONG nFetched = 0; 1426 1427 hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, 1428 IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum); 1429 if(FAILED(hr)) 1430 { 1431 return ; 1432 } 1433 1434 hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, 1435 &pEnumMoniker, 0); 1436 if (FAILED(hr) || pEnumMoniker == NULL) { 1437 //printf("no device\n"); 1438 return ; 1439 } 1440 1441 pEnumMoniker->Reset(); 1442 1443 int pos=0; 1444 while(S_OK == pEnumMoniker->Next(1, &pMoniker, &nFetched) ) 1445 { 1446 IPropertyBag *pBag; 1447 hr = pMoniker->BindToStorage( 0, 0, IID_IPropertyBag, (void**) &pBag ); 1448 if( hr != S_OK ) 1449 continue; 1450 1451 VARIANT var; 1452 VariantInit(&var); 1453 hr = pBag->Read( L"FriendlyName", &var, NULL ); 1454 if( hr != S_OK ) 1455 { 1456 pMoniker->Release(); 1457 continue; 1458 } 1459 //USES_CONVERSION; 1460 char szName[256]; 1461 1462 WideCharToMultiByte(CP_ACP,0,var.bstrVal,-1,szName,256,0,0); 1463 VariantClear(&var); 1464 1465 MSWebCam *cam=ms_web_cam_new(&ms_directx_cam_desc); 1466 cam->name=ms_strdup(szName); 1467 ms_web_cam_manager_add_cam(obj,cam); 1468 1469 pMoniker->Release(); 1470 pBag->Release(); 1471 pMoniker=NULL; 1472 pBag=NULL; 1473 } 1474 1475 pEnumMoniker->Release(); 1476 pCreateDevEnum->Release(); 1477 }
Note: See TracChangeset
for help on using the changeset viewer.
