CSourceSeeking, classe

hiérarchie de la classe csourceseeking

La classe CSourceSeeking est une classe abstraite pour l’implémentation de la recherche dans les filtres sources avec une seule 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 la vitesse actuelle. Par défaut, le seul format d’heure pris en charge par la classe est l’heure du format de l’heure (unités de 100 nanosecondes). _ _ _ Pour plus d'informations, consultez la section Notes.

Variables membres protégées Description
m _ rtDuration Durée du flux.
m _ rtStart Heure de début
m _ rtStop Heure d’arrêt.
m _ dRateSeeking Vitesse de lecture.
m _ dwSeekingCaps Fonctionnalités de recherche.
m _ pLock Pointeur vers un objet de section critique pour le verrouillage.
Méthodes protégées Description
CSourceSeeking Méthode de constructeur.
Méthodes virtuelles pures Description
ChangeRate Appelé lorsque la vitesse de lecture change.
Modifiez l' Appelé lorsque la position de début change.
ChangeStop Appelé lorsque la position d’arrêt change.
Méthodes IMediaSeeking Description
IsFormatSupported Détermine si un format d’heure spécifié est pris en charge.
QueryPreferredFormat Récupère le format d’heure préféré de l’objet.
SetTimeFormat Définit le format d’heure.
IsUsingTimeFormat Détermine si un format d’heure spécifié est le format en cours d’utilisation.
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êtera, 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 d’heure 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 de temps pendant laquelle la recherche est efficace.
Seles Définit la vitesse de lecture.
GetRate Récupère la vitesse de lecture.
GetPreroll Récupère le temps de préroll.

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 une 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é discontinu sur le premier exemple. Appelez la méthode IMediaSample :: SetDiscontinuity .

L’appel à BeginFlush libère le thread de travail, si le thread est bloqué en attente de remise d’un échantillon.

À l’étape 2, assurez-vous 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’une sorte. 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 illustre une implémentation possible. Elle 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 substituée pour envoyer le nouveau segment, et pour définir un indicateur qui spécifie la discontinuation. Le thread de travail sélectionne 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 de formats d’heure supplémentaires

Par défaut, cette classe prend en charge la recherche uniquement en unités de temps de référence (temps de format de l’heure _ _ _ ). Pour prendre en charge des formats d’heure supplémentaires, substituez 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. Après l’appel de la méthode SetTimeFormat , toutes les méthodes IMediaSeeking doivent traiter les paramètres d’heure entrante et sortante 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 frames, la méthode GetDuration doit retourner la valeur m _ rtDuration convertie en frames. 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
} 

En outre, assurez-vous de vérifier l' _ indicateur AM recherché _ 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.

Spécifications

Condition requise Valeur
En-tête
Ctlutil. h (inclure Flux. h)
Bibliothèque
Strmbase. lib (versions commerciales);
Strmbasd. lib (versions Debug)

Voir aussi

Prise en charge de la recherche dans un filtre source