Génération de données dans un filtre de capture

cette rubrique décrit comment un filtre de capture d’DirectShow personnalisé doit générer des données de sortie.

Modifications de l’état du filtre

Un filtre de capture doit produire des données uniquement lorsque le filtre est en cours d’exécution. N’envoyez pas de données à partir de vos codes confidentiels lorsque le filtre est suspendu. Retournez également VFW S ne peut pas être _ _ _ renvoyé à partir de la méthode CBaseFilter :: GetState lorsque le filtre est suspendu. cette valeur de retour indique au gestionnaire de Graph de filtre qu’il ne doit pas attendre les données de votre filtre pendant que le filtre est suspendu. Pour plus d’informations, consultez États de filtre.

Le code suivant montre comment implémenter la méthode IMediaFilter :: GetState :

CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *pState)
{
    CheckPointer(pState, E_POINTER);
    *pState = m_State;
    if (m_State == State_Paused)
    {
        return VFW_S_CANT_CUE;
    }
    else
    {
        return S_OK;
    }
}

Contrôle des Flux individuels

Les broches de sortie d’un filtre de capture doivent prendre en charge l’interface IAMStreamControl , afin qu’une application puisse activer ou désactiver chaque pin individuellement. Par exemple, une application peut afficher un aperçu sans capture, puis passer en mode capture sans reconstruire le graphique de filtre. Vous pouvez utiliser la classe CBaseStreamControl pour implémenter cette interface.

Horodatages

Quand le filtre capture un exemple, horodatage l’exemple avec l’heure actuelle du flux. L’heure de fin est l’heure de début plus la durée. Par exemple, si le filtre capture 10 échantillons par seconde et que la durée du flux est de 200 millions unités lorsque le filtre capture l’échantillon, les horodatages doivent être 200 millions et 201 millions. (Il y a 10 millions unités par seconde.)

Pour calculer le temps de flux, appelez la méthode IReferenceClock :: getTime pour obtenir le temps de référence actuel, puis soustraction l’heure de début d’origine. Vous pouvez également appeler la méthode CBaseFilter :: StreamTime , qui effectue le même calcul. Pour définir l’horodatage sur un exemple, appelez la méthode IMediaSample :: setTime .

Toutefois, si le filtre a un code pin d’aperçu, les exemples du code PIN de préversion ne doivent pas avoir de datage. En effet, les exemples atteindront toujours le convertisseur légèrement après l’heure de la capture. Si les exemples sont horodatés, le convertisseur les traite comme tard et peut tenter de rattraper le problème en supprimant des exemples. (pour plus d’informations, consultez DirectShow des filtres de Capture vidéo.) Notez que l’interface IAMStreamControl requiert le code confidentiel pour effectuer le suivi des temps d’échantillonnage. Pour un code pin d’aperçu, vous devrez peut-être modifier l’implémentation afin qu’elle ne repose pas sur les horodatages.

Les horodatages doivent toujours augmenter d’un échantillon à l’autre. Cela est vrai même lorsque le filtre est suspendu. Si le filtre est exécuté, s’interrompt, puis s’exécute à nouveau, le premier échantillon après la pause doit avoir un horodatage plus grand que le dernier échantillon avant la pause.

En fonction des données que vous capturez, il peut être utile de définir l’heure du média sur les échantillons.

Pour plus d’informations, consultez temps et horloges dans DirectShow.

DirectShow Filtres de capture vidéo

Temps et horloges dans DirectShow

Écriture de filtres de capture