Changeset 144:b7778100a5a7 in mediastreamer2


Ignore:
Timestamp:
Nov 3, 2008 12:05:25 AM (5 years ago)
Author:
aymeric <aymeric@…>
Branch:
default
Message:

Update filter to latest architecture (without V4L_STOP/V4L_START)

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@147 3f6dc0c8-ddfe-455d-9043-3cd528dc4637

File:
1 edited

Legend:

Unmodified
Added
Removed
  • linphone/mediastreamer2/src/winvideods.c

    r55 r144  
    3838#include "dxfilter.h" 
    3939#include <qedit.h> 
    40 //#include <atlbase.h> 
    41 //#include <atlcom.h> 
    4240 
    4341HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister); 
     
    4947        int devidx; 
    5048 
    51         //CComPtr<IGraphBuilder> m_pGraph; 
    52         //CComPtr<ICaptureGraphBuilder2> m_pBuilder; 
    53         //CComPtr<IMediaControl> m_pControl; 
    5449        IGraphBuilder *m_pGraph; 
    5550        ICaptureGraphBuilder2 *m_pBuilder; 
    5651        IMediaControl *m_pControl; 
    5752        CDXFilter *m_pDXFilter; 
    58         //CComPtr<IBaseFilter> m_pIDXFilter;     
    59         //CComPtr<IBaseFilter> m_pNullRenderer; 
    60         //CComPtr<IBaseFilter> m_pDeviceFilter; 
    6153        IBaseFilter *m_pIDXFilter;       
    6254        IBaseFilter *m_pNullRenderer; 
     
    7567        float start_time; 
    7668        int frame_count; 
    77         bool_t running; 
    7869}V4wState; 
    7970 
     
    386377} 
    387378 
    388 static int v4w_open_videodevice(V4wState *s) 
     379static int v4w_configure_videodevice(V4wState *s) 
    389380{ 
    390381        // Initialize COM 
     
    392383 
    393384        // get a Graph 
    394         //HRESULT hr=s->m_pGraph.CoCreateInstance(CLSID_FilterGraph); 
    395385        HRESULT hr= CoCreateInstance (CLSID_FilterGraph, 
    396386                          NULL, 
     
    404394 
    405395        // get a CaptureGraphBuilder2 
    406         //hr=s->m_pBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2); 
    407396        hr= CoCreateInstance (CLSID_CaptureGraphBuilder2, 
    408397                          NULL, 
     
    419408 
    420409        // get mediacontrol so we can start and stop the filter graph 
    421         //hr=s->m_pGraph.QueryInterface(&(s->m_pControl)); 
    422410        hr=s->m_pGraph->QueryInterface (IID_IMediaControl, (void **)&s->m_pControl); 
    423411        if(FAILED(hr)) 
     
    461449 
    462450        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; 
    463487    while(S_OK == pEnumMoniker->Next(1, &pMoniker, &nFetched) ) 
    464488    { 
    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 
     568static 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 
    471673        if(pMoniker==NULL) 
    472674        { 
     
    628830 
    629831        // get null renderer 
    630         //hr=s->m_pNullRenderer.CoCreateInstance(CLSID_NullRenderer); 
    631832        hr=CoCreateInstance (CLSID_NullRenderer, 
    632833                          NULL, 
     
    647848        if (FAILED(hr)) 
    648849        { 
    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; 
    655851        } 
    656852         
     
    736932        s->vsize.width=MS_VIDEO_SIZE_CIF_W; 
    737933        s->vsize.height=MS_VIDEO_SIZE_CIF_H; 
    738         //s->pix_fmt=MS_RGB24; 
    739934        s->pix_fmt=MS_YUV420P; 
    740935 
     
    757952        s->frame_count=-1; 
    758953        s->fps=15; 
     954  memset(s->dev, 0, sizeof(s->dev)); 
    759955 
    760956        f->data=s; 
    761957} 
    762958 
     959static 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} 
    7631014 
    7641015static int _v4w_start(V4wState *s, void *arg) 
     
    8681119        return 0; 
    8691120} 
    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  
    8841121 
    8851122static void v4w_uninit(MSFilter *f){ 
     
    9851222static void v4w_preprocess(MSFilter * obj){ 
    9861223        V4wState *s=(V4wState*)obj->data; 
    987         s->running=TRUE; 
     1224        if (s->rotregvalue==0) 
     1225    _v4w_start(s, NULL); 
    9881226        if (s->rotregvalue==0) 
    9891227                s->fps=1; 
     
    9921230static void v4w_postprocess(MSFilter * obj){ 
    9931231        V4wState *s=(V4wState*)obj->data; 
    994         s->running=FALSE; 
    9951232        s->start_time=0; 
    9961233        s->frame_count=-1; 
     
    10551292static int v4w_get_pix_fmt(MSFilter *f,void *arg){ 
    10561293        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        } 
    10571299        *((MSPixFmt*)arg) = (MSPixFmt)s->pix_fmt; 
    10581300        return 0; 
     
    11001342} 
    11011343 
     1344static 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 
    11021350static MSFilterMethod methods[]={ 
    11031351        {       MS_FILTER_SET_FPS       ,       v4w_set_fps     }, 
     
    11061354        {       MS_FILTER_SET_VIDEO_SIZE, v4w_set_vsize }, 
    11071355        {       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 }, 
    11121358        {       0                                                               ,       NULL                    } 
    11131359}; 
     
    11531399 
    11541400static 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; 
    11561404} 
    11571405 
     
    11591407 
    11601408static void vfw_cam_init(MSWebCam *cam){ 
    1161         cam->name=ms_strdup("dx0"); 
    1162 } 
    1163  
    1164 MSWebCamDesc ms_v4w_cam_desc={ 
     1409} 
     1410 
     1411MSWebCamDesc ms_directx_cam_desc={ 
    11651412        "DirectX Video Grabber", 
    11661413        &vfw_detect, 
     
    11711418 
    11721419static 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.