locked
Mauvai affichage de la camera RRS feed

  • Question

  •  

    Actuellement je suis en train de développer une application sous VC++ 2005 pour piloter l'affichage de la camera et la prise de photos sous un PDA WM5/6 en se basant sur l'exemple CameraCapture fourni dans le SDK Windows Mobile 5 de Microsoft.

     

    L'application se lance bien, et j'arrive à récupérer le flux image qui s'affiche sur l'écran. Le problème s'est que la taille de la zone d'affichage ne change pas en fonction des paramètres que je passe. L’image s'affiche tout le temps sur une taille approximative de 100x100.

    Voici le code qui me permet d’initialiser la camera et d’obtenir l’affichage sur l’écran :

     

     

    HRESULT

    CGraphManager::CreateCaptureGraphInternal()

    {

    HRESULT hr = S_OK;

    CComVariant varCamName;

    CPropertyBag PropBag;

    OAEVENT oaEvent;

    WCHAR wzDeviceName[ MAX_PATH + 1 ];

    CComPtr<IMediaEvent> pMediaEvent;

    CComPtr<IMediaControl> pMediaControl;

    CComPtr<IBaseFilter> pSmartTee;

    CComPtr<IBaseFilter> pImageSinkFilter;

    CComPtr<IGraphBuilder> pFilterGraph;

    CComPtr<IPersistPropertyBag> pPropertyBag;

     

    //

    // Create the capture graph builder and register the filtergraph manager.

    //

    CHK( m_pCaptureGraphBuilder.CoCreateInstance( CLSID_CaptureGraphBuilder ));

    CHK( pFilterGraph.CoCreateInstance( CLSID_FilterGraph ));

    CHK( m_pCaptureGraphBuilder->SetFiltergraph( pFilterGraph ));

     

    //************************************************************************

    //*********** Create and initialize the video capture filter *************

    //************************************************************************

    CHK( m_pVideoCaptureFilter.CoCreateInstance( CLSID_VideoCapture ));

    CHK( m_pVideoCaptureFilter.QueryInterface( &pPropertyBag ));

    // We are loading the driver CAM1 in the video capture filter.

    CHK( GetFirstCameraDriver( wzDeviceName ));

    varCamName = wzDeviceName;

    if( varCamName.vt != VT_BSTR )

    {

    ERR( E_OUTOFMEMORY );

    }

    CHK( PropBag.Write( L"VCapName", &varCamName ));

    CHK( pPropertyBag->Load( &PropBag, NULL ));

    // Everything succeeded, the video capture filter is added to the filtergraph

    CHK( pFilterGraph->AddFilter( m_pVideoCaptureFilter, L"Video Capture Filter Source" ));

    //************************************************************************

    //*************** KR - Create & initialize the SmartTee ******************

    //************************************************************************

    CHK( pSmartTee.CoCreateInstance( CLSID_SmartTee ));

    // Everything succeeded, let's add the SmartTee to the graph

    CHK( pFilterGraph->AddFilter( pSmartTee, L"SmartTee Encoder" ));

     

    //

    CHK( m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_CAPTURE,

    &MEDIATYPE_Video,

    m_pVideoCaptureFilter,

    NULL,

    pSmartTee));

     

    //

    CHK( m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_PREVIEW,

    &MEDIATYPE_Video,

    pSmartTee,

    NULL,

    NULL));

     

    //

    // Create the still image filter, and connect it to the video capture filter

    //

    CHK( pImageSinkFilter.CoCreateInstance( CLSID_IMGSinkFilter ));

    CHK( pFilterGraph->AddFilter( pImageSinkFilter, L"Still image filter" ));

    CHK( m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_STILL,

    &MEDIATYPE_Video,

    m_pVideoCaptureFilter,

    NULL,

    pImageSinkFilter ));

    CHK( pImageSinkFilter.QueryInterface( &m_pImageSinkFilter ));

     

    //

    // Let's get the handle for DShow events. The main loop will listen to both notifications from

    // the UI thread and for DShow notifications

    //

    CHK( pFilterGraph->QueryInterface( IID_IMediaEvent, (void**) &pMediaEvent ));

    CHK( pMediaEvent->GetEventHandle( &oaEvent ));

    m_handle[1] = (HANDLE) oaEvent;

     

    m_fGraphBuilt = TRUE;

    NotifyMessage( MESSAGE_ERROR, L"Builing the graph failed" );

    Cleanup:

    if( FAILED( hr ))

    {

    NotifyMessage( MESSAGE_ERROR, L"Builing the graph failed" );

    }

    return hr;

    }

     

    HRESULT

    CGraphManager::RunCaptureGraphInternal(HWND hwnd , long X, long Y, long Width, long Height)

    {

    HRESULT hr = S_OK;

    CComPtr<IGraphBuilder> pGraphBuilder;

    CComPtr<IMediaControl> pMediaControl;

    CComPtr<IVideoWindow> pVideoWin;

    // Let's make sure that the graph has been initialized

    if(( m_pCaptureGraphBuilder == NULL ) || ( m_fGraphBuilt == FALSE ))

    {

    ERR( E_FAIL );

    }

     

    // Retrieve the filtergraph off the capture graph builder

    CHK( m_pCaptureGraphBuilder->GetFiltergraph( &pGraphBuilder ));

     

    //

    CHK(pGraphBuilder->QueryInterface(&pVideoWin));

     

    //CleanUp

    CHK(pVideoWin->put_Owner(NULL));

    OAHWND o_ahwnd;

    o_ahwnd = (OAHWND)hwnd;

    CHK(pVideoWin->put_Owner(o_ahwnd));

    CHK(pVideoWin->put_WindowStyle( WS_CHILD | WS_VISIBLE ));

     

    //long pWidth, pHeight;

    //CHK(pVideoWin->get_Width(&pWidth));

    //CHK(pVideoWin->get_Height(&pHeight));

    RECT rectangle;

    GetClientRect(hwnd,&rectangle);

     

    //CHK(pVideoWin->SetWindowPosition(x, y, Width, Heigth));

    CHK(pVideoWin->SetWindowPosition(10,10,320,320));

     

    CHK(pVideoWin->put_FullScreenMode(OAFALSE));

    CHK(pVideoWin->put_WindowState(SW_SHOW));

    CHK(pVideoWin->put_Visible(OATRUE));

     

    // Get the media control interface, and run the graph

    CHK( pGraphBuilder->QueryInterface( &pMediaControl ));

    CHK( pMediaControl->Run());

    CHK( NotifyMessage( MESSAGE_INFO, L"Preview is running" ));

    Cleanup:

    if( FAILED( hr ))

    {

    NotifyMessage( MESSAGE_ERROR, L"Runing the preview failed" );

    }

    return hr;

    }

     

    Dans mon programme je fais appel à CreateCaptureGraphInternal() dans un premier lieu puis à RunCaptureGraphInternal() pour obtenir une image sur mon écran.

     

    Merci pour toute proposition qui pourrais m'aider à mieu faire fonctionner mon code.

     

    Merci

    vendredi 12 septembre 2008 13:24

Toutes les réponses