Imposer codec XVID avec Directshow
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:
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.