Share via


CSourceSeeking, classe

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Hiérarchie de classes csourceseeking

La classe CSourceSeeking est une classe abstraite permettant d’implémenter la recherche dans les filtres sources avec une broche de sortie.

Cette classe prend en charge l’interface IMediaSeeking . Il fournit des implémentations par défaut pour toutes les méthodes IMediaSeeking . Les variables membres protégées stockent l’heure de début, l’heure d’arrêt et le taux actuel. Par défaut, le seul format d’heure pris en charge par la classe est TIME_FORMAT_MEDIA_TIME (unités de 100 nanosecondes). Pour plus d'informations, consultez la section Notes.

Variables de membre protégé Description
m_rtDuration Durée du flux.
m_rtStart Heure de début
m_rtStop Arrêtez le temps.
m_dRateSeeking Taux de lecture.
m_dwSeekingCaps Recherche de fonctionnalités.
m_pLock Pointeur vers un objet de section critique pour le verrouillage.
Méthodes protégées Description
CSourceSeeking Méthode du constructeur.
Méthodes virtuelles pures Description
ChangeRate Appelé lorsque le taux de lecture change.
ChangeStart Appelé lorsque la position de début change.
ChangeStop Appelé lorsque la position d’arrêt change.
IMediaSeeking, méthodes Description
IsFormatSupported Détermine si un format d’heure spécifié est pris en charge.
QueryPreferredFormat Récupère le format d’heure par défaut de l’objet.
SetTimeFormat Définit le format d’heure.
IsUsingTimeFormat Détermine si un format d’heure spécifié est le format actuellement utilisé.
GetTimeFormat Récupère le format d’heure actuel.
GetDuration Récupère la durée du flux.
GetStopPosition Récupère l’heure à laquelle la lecture s’arrête, par rapport à la durée du flux.
GetCurrentPosition Récupère la position actuelle, par rapport à la durée totale du flux.
GetCapabilities Récupère toutes les fonctionnalités de recherche du flux.
CheckCapabilities Interroge si le flux a spécifié des fonctionnalités de recherche.
ConvertTimeFormat Convertit d’un format de temps en un autre.
SetPositions Définit la position actuelle et la position d’arrêt.
GetPositions Récupère la position actuelle et la position d’arrêt.
GetAvailable Récupère la plage d’heures pendant lesquelles la recherche est efficace.
SetRate Définit la vitesse de lecture.
GetRate Récupère le taux de lecture.
GetPreroll Récupère l’heure de pré-inscription.

Notes

Chaque fois que la position de début, la position d’arrêt ou la vitesse de lecture change, l’objet CSourceSeeking appelle une méthode virtuelle pure correspondante :

La classe dérivée doit implémenter ces méthodes. Après toute opération de recherche, un filtre doit effectuer les opérations suivantes :

  1. Appelez la méthode IPin::BeginFlush sur la broche d’entrée en aval.
  2. Arrêtez le thread de travail qui fournit des données.
  3. Appelez la méthode IPin::EndFlush sur la broche d’entrée.
  4. Redémarrez le thread de travail.
  5. Appelez la méthode IPin::NewSegment sur la broche d’entrée.
  6. Définissez la propriété de discontinuité sur le premier échantillon. Appelez la méthode IMediaSample::SetDiscontinuity .

L’appel à BeginFlush libère le thread de travail, si le thread est bloqué en attendant de remettre un exemple.

À l’étape 2, vérifiez que le thread a cessé d’envoyer des données. Selon l’implémentation, vous devrez peut-être attendre que le thread se termine ou que le thread signale une réponse d’un type quelconque. Si votre filtre utilise la classe CSourceStream , la méthode CSourceStream::Stop se bloque jusqu’à ce que le thread de travail réponde.

Dans l’idéal, le nouveau segment (étape 5) doit être remis à partir du thread de travail. Elle peut également être effectuée par l’objet CSourceSeeking , à condition que le filtre le sérialise avec les exemples.

L’exemple suivant montre une implémentation possible. Il suppose que la broche de sortie du filtre source est dérivée de CSourceSeeking et CSourceStream. Cet exemple définit une méthode d’assistance, UpdateFromSeek, qui effectue les étapes 1 4. La méthode CSourceStream::OnThreadStartPlay est remplacée pour envoyer le nouveau segment et définir un indicateur indiquant la discontinuité. Le thread de travail récupère cet indicateur et appelle la méthode IMediaSample::SetDiscontinuity :

void CMyStream::UpdateFromSeek()
{
    if (ThreadExists()) 
    {
        DeliverBeginFlush();
        Stop();
        DeliverEndFlush();
        Run();
    }
}

HRESULT CMyStream::OnThreadStartPlay()
{
    m_bDiscontinuity = TRUE;
    return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}

Prise en charge des formats de temps supplémentaires

Par défaut, cette classe prend en charge la recherche uniquement en unités de temps de référence (TIME_FORMAT_MEDIA_TIME). Pour prendre en charge les formats de temps supplémentaires, remplacez les méthodes IMediaSeeking qui traitent des formats d’heure :

En outre, remplacez les méthodes IMediaSeeking restantes pour effectuer les conversions nécessaires entre les formats d’heure. Une fois la méthode SetTimeFormat appelée, toutes les méthodes IMediaSeeking doivent traiter les paramètres d’heure entrants et sortants comme étant dans le nouveau format d’heure. Par exemple, si la variable m_rtDuration représente la durée en unités de temps de référence, mais que le format d’heure actuel est des images, la méthode GetDuration doit retourner la valeur m_rtDuration convertie en images. Par exemple :

STDMETHODIMP GetDuration(LONGLONG *pDuration)
{
    HRESULT hr = CSourceSeeking::GetDuration(pDuration);
    if (SUCCEEDED(hr))
    {
        if (m_TimeFormat == TIME_FORMAT_FRAME)
        {
            // Convert from reference time to frames.
            *pDuration = TimeToFrame(*pDuration);  // Private method.
        }
    }
    return hr
} 

Veillez également à case activée pour l’indicateur AM_SEEKING_ReturnTime dans la méthode IMediaSeeking::SetPositions. Si cet indicateur est présent, convertissez les valeurs de position en heures de référence lorsque vous les retournez à l’appelant.

Configuration requise

Condition requise Valeur
En-tête
Ctlutil.h (include Streams.h)
Bibliothèque
Strmbase.lib (builds de vente au détail) ;
Strmbasd.lib (builds de débogage)

Voir aussi

Prise en charge de la recherche dans un filtre source