Hello,

J'ai écrit un player de video pour decoder des vidéos compessées en XVID, puis recopier les frames dans une texture DirectX9.

Donc mon code, j'appelle la fonction AddSourcefilter() qui choisi le codec adapté à ma vidéo.
Problème: suivant la machine il existe de nombreux codecs XVID/DIVX/MPEG-4 qui sont plus ou moins compatibles et qui créent des bugs sur certaines configs.
Donc, je voudrais simplement imposer le choix de mon codec XVID dans mon graphe Directshow.

Voici mon code pour mon graphes:

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
HRESULT initStreams(SMoviePlayer *mp,int volume) 
{
    HRESULT hr = S_OK;
    IBaseFilter		*pFTR;           // Texture Renderer Filter
    IBaseFilter		*pFSrc;          // Source Filter
    IPin			*pFSrcPinOut;    // Source Filter Output Pin   
    IPin	        *pFTRPinIn;      // Texture Renderer Input Pin
 
    // Create the filter graph
	hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (LPVOID*)&g_pGB);
    //if (FAILED(g_pGB.CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC)))
    //    return E_FAIL;
 
	// Create the Texture Renderer object
    mp->pCTR = new CTextureRenderer(NULL, &hr);
    if (FAILED(hr) || !mp->pCTR)
    {
        werrorv("Could not create texture renderer object!  hr=", hr);
        return E_FAIL;
    }
 
    // Get a pointer to the IBaseFilter on the TextureRenderer, add it to graph
    pFTR = mp->pCTR;
    if (FAILED(hr = g_pGB->AddFilter(pFTR, L"TEXTURERENDERER")))
    {
        werrorv("Could not add renderer filter to graph!  hr=", hr);
        return hr;
    }
 
    WCHAR wFileName[MAX_PATH];
	MultiByteToWideChar(CP_ACP, NULL,mp->cVideoFile, MAX_PATH, wFileName, MAX_PATH);
 
	// Add the source filter to the graph.
    hr = g_pGB->AddSourceFilter (wFileName, L"SOURCE", &pFSrc);
    if(FAILED(hr))
    {
        werrorv("Could not add source filter to graph!  hr=", hr);
        return hr;
    }
En fait ce qu'il faudrait c'est remplacer g_pGB->AddSourceFilter (wFileName, L"SOURCE", &pFSrc); avec une fonction du type AddFilter() à laquelle je fournis le CLSID précis de mon codec XVID, et ainsi eviter que d'autres codecs indérisables soient séléctionnés à sa place.

Quelqu'un aurait-il déjà codé cela, ou bien des conseils?
Merci.