Bonjour à tous,

bon je suis nouveau ici et aussi dans le monde de directshow.
je réalise un petit proto sur Windows Mobile 6 dans lequel je doit prendre des photos et il doit y avoir une prévisualisation.
j'ai donc décidé d'utiliser directshow, je me suis basé sur l'exemple du SDK que j'ai fais évoluer

C:\Program Files\Windows Mobile 6 SDK\Samples\PocketPC\CPP\win32\CameraCapture

en faite j'ai rajouter un SmartTee pour avoir la pin preview sur ma fenêtre principale j'ai rajouté un bouton dans lequel la preview est censé s'afficher via IID_IVideoWindow

seulement voilà tous fonctionne sauf la preview qui affiche l'image présente sur l'écran avant le lancement de mon programme. je ne trouve pas masse d'exemple fondamentalement différent de ce que j'ai fait, aussi je ne comprend pas pourquoi ça ne marche pas :/

la création de mon bouton destiné a l'affichage de la preview
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
	m_preview = CreateWindow( 
			L"Button", 
			L"preview", 
			WS_CHILD | WS_VISIBLE | BS_CENTER | BS_VCENTER, 
			10, 
			110, 
			440, 
			330, 
			m_hwnd, 
			NULL, 
			hInstance, 
			NULL );
 
    if( m_preview == NULL )
    {
        ERR( HRESULT_FROM_WIN32( GetLastError() ));
    }
 
    // Create the graph manager. This will control the dshow capture pipeline
    m_pGraphManager = new CGraphManager(m_preview);
    if( m_pGraphManager == NULL )
    {
        ERR( E_OUTOFMEMORY );
    }
L'initialisation du Grapph

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
HRESULT
CGraphManager::CreateCaptureGraphInternal()
{
    HRESULT       hr = S_OK;
    CComVariant   varCamName;
    CPropertyBag  PropBag;
    OAEVENT       oaEvent;
    WCHAR         wzDeviceName[ MAX_PATH + 1 ];
 
    CComPtr<IMediaEvent>            pMediaEvent;
    CComPtr<IGraphBuilder>          pFilterGraph;
    CComPtr<IBaseFilter>            pVideoEncoder;
    CComPtr<IBaseFilter>            pASFMultiplexer;
    CComPtr<IFileSinkFilter>        pFileSinkFilter;
    CComPtr<IPersistPropertyBag>    pPropertyBag;
    CComPtr<IDMOWrapperFilter>      pWrapperFilter;
    CComPtr<IBaseFilter>            pImageSinkFilter;
		CComPtr<IVideoWindow>           pVideoWin;
 
		CComPtr<IBaseFilter>            pSmartTee;
 
		CComPtr<IAMVideoRendererMode>   pVideoRenderer;
 
    //
    // 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" ));
 
 
 
 
		CHK( pSmartTee.CoCreateInstance( CLSID_SmartTee ));
		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 )); 
 
 
    // 
    // Third step: Create the video encoder DMO, load the WMV9 encoder, and 
    // add it to the graph
    //
 
 
 
    // Create the video encoder
    CHK( pVideoEncoder.CoCreateInstance( CLSID_DMOWrapperFilter ));
    CHK( pVideoEncoder.QueryInterface( &pWrapperFilter ));
 
    // Load the WMV9 DMO
    CHK( pWrapperFilter->Init( CLSID_CWMV9EncMediaObject, DMOCATEGORY_VIDEO_ENCODER ));
 
    // Everything succeeded, let's add the encoder to the graph
    CHK( pFilterGraph->AddFilter( pVideoEncoder, L"WMV9 DMO Encoder" ));
 
    //
    // Create the ASF multiplexer and add it to the graph
    //
    CHK( m_pCaptureGraphBuilder->SetOutputFileName( &MEDIASUBTYPE_Asf, L"\\video1.asf", &pASFMultiplexer, &pFileSinkFilter ));
 
    //
    // Connect the video capture filter, the encoder and the multiplexer together
    // 
   CHK( m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSmartTee, pVideoEncoder, pASFMultiplexer ));
 
 
 
//find the preview window and make it visible
 
	CHK(pFilterGraph->QueryInterface(IID_IVideoWindow, (void **)&pVideoWin));
 
 
 
	CHK(pVideoWin->put_Owner(NULL));
	CHK(pVideoWin->put_Owner((OAHWND)this->m_preview));
	CHK(pVideoWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS));
 
	RECT rc;
	GetClientRect(this->m_preview, &rc);
	CHK(pVideoWin->SetWindowPosition(0, 0, rc.right, rc.bottom));
	CHK(pVideoWin->put_FullScreenMode(OAFALSE));
	CHK(pVideoWin->put_WindowState(SW_SHOW)); 
	CHK(pVideoWin->put_Visible(OATRUE));
 
	//
	// 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 ));
    //
    // Prevent the data from flowing into the capture stream
    //
    CHK( m_pCaptureGraphBuilder->ControlStream( &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_pVideoCaptureFilter, 0, 0 ,0,0 ));
 
 
    //
    // 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 ))
	{
 
		DebugTool::WriteInFile("Builing the graph failed", 0);
		NotifyMessage( MESSAGE_ERROR, L"Builing the graph failed" );
	}
	else
		DebugTool::WriteInFile("Builing the graph OK", 0);
 
	return hr;
}

et le démarrage
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
HRESULT
CGraphManager::RunCaptureGraphInternal()
{
    HRESULT hr = S_OK;
 
    CComPtr<IGraphBuilder> pGraphBuilder;
    CComPtr<IMediaControl> pMediaControl;
 
 
    // 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 ));
 
    // Get the media control interface, and run the graph
    CHK( pGraphBuilder->QueryInterface( &pMediaControl ));
 
    CHK( pMediaControl->Run());
 
    CHK( NotifyMessage( MESSAGE_INFO, L"The Graph is running" ));
 
Cleanup:
	if( FAILED( hr ))
	{
		NotifyMessage( MESSAGE_ERROR, L"Runing the capture graph failed" );
	}
    return hr;
}
voilà donc si une personne a une idée par ce que la moi je sèche complètement :/

Merci

LeX.