Utilisation du mappeur de filtre
le mappeur de filtre est un objet COM qui énumère les filtres de DirectShow en fonction de différents critères de recherche. Le mappeur de filtre peut être moins efficace que l’énumérateur de périphérique système. par conséquent, si vous avez besoin de filtres d’une catégorie particulière, vous devez utiliser l’énumérateur de périphérique système. Toutefois, si vous devez localiser un filtre qui prend en charge une certaine combinaison de types de média, mais ne fait pas partie d’une catégorie claire, vous devrez peut-être utiliser le mappeur de filtre. (Par exemple, il peut s’agir d’un filtre de convertisseur ou d’un filtre de décodeur).
Le mappeur de filtre expose l’interface IFilterMapper2 . Pour rechercher un filtre, appelez la méthode IFilterMapper2 :: EnumMatchingFilters . Cette méthode prend plusieurs paramètres qui définissent les critères de recherche et retourne un énumérateur pour les filtres correspondants. L’énumérateur prend en charge l’interface IEnumMoniker et fournit un moniker unique pour chaque filtre correspondant.
L’exemple suivant énumère les filtres qui acceptent les entrées vidéo numériques (DV) et ont au moins une broche de sortie, de n’importe quel type de média. (Le filtre de décodage vidéo DV correspond à ces critères.)
IFilterMapper2 *pMapper = NULL;
IEnumMoniker *pEnum = NULL;
hr = CoCreateInstance(CLSID_FilterMapper2,
NULL, CLSCTX_INPROC, IID_IFilterMapper2,
(void **) &pMapper);
if (FAILED(hr))
{
// Error handling omitted for clarity.
}
GUID arrayInTypes[2];
arrayInTypes[0] = MEDIATYPE_Video;
arrayInTypes[1] = MEDIASUBTYPE_dvsd;
hr = pMapper->EnumMatchingFilters(
&pEnum,
0, // Reserved.
TRUE, // Use exact match?
MERIT_DO_NOT_USE+1, // Minimum merit.
TRUE, // At least one input pin?
1, // Number of major type/subtype pairs for input.
arrayInTypes, // Array of major type/subtype pairs for input.
NULL, // Input medium.
NULL, // Input pin category.
FALSE, // Must be a renderer?
TRUE, // At least one output pin?
0, // Number of major type/subtype pairs for output.
NULL, // Array of major type/subtype pairs for output.
NULL, // Output medium.
NULL); // Output pin category.
// Enumerate the monikers.
IMoniker *pMoniker;
ULONG cFetched;
while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
IPropertyBag *pPropBag = NULL;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void **)&pPropBag);
if (SUCCEEDED(hr))
{
// To retrieve the friendly name of the filter, do the following:
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr))
{
// Display the name in your UI somehow.
}
VariantClear(&varName);
// To create an instance of the filter, do the following:
IBaseFilter *pFilter;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
// Now add the filter to the graph. Remember to release pFilter later.
// Clean up.
pPropBag->Release();
}
pMoniker->Release();
}
// Clean up.
pMapper->Release();
pEnum->Release();
La méthode EnumMatchingFilters a un nombre relativement élevé de paramètres, qui sont commentés dans l’exemple. Les plus importants pour cet exemple sont les suivants :
- Valeur de mérite minimale : le filtre doit avoir une valeur mérite au-dessus de mérite _ ne _ pas _ utiliser.
- Types d’entrée : l’appelant passe un tableau contenant des paires de types et sous-types principaux. Seuls les filtres qui prennent en charge au moins l’une de ces paires correspondent.
- Correspondance exacte : un filtre peut enregistrer des valeurs null pour le type principal, le sous-type, la catégorie de code confidentiel ou le support. À moins que vous ne spécifiiez la correspondance exacte, une valeur null agit comme un caractère générique, correspondant à toute valeur que vous spécifiez. Avec la correspondance exacte, le filtre doit correspondre exactement à vos critères. Toutefois, si vous attribuez un paramètre null dans les critères de recherche, il agit toujours comme un caractère générique ou une valeur de type « ne pas se préoccuper », correspondant à n’importe quel filtre.