CSourceSeeking, classe

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 :
- Position de départ : CSourceSeeking :: modifiez l'
- Position d’arrêt : CSourceSeeking :: ChangeStop
- Vitesse de lecture : CSourceSeeking :: ChangeRate
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 :
- Appelez la méthode IPIN :: BeginFlush sur la broche d’entrée en aval.
- Arrêtez le thread de travail qui fournit des données.
- Appelez la méthode IPIN :: EndFlush sur la broche d’entrée.
- Redémarrez le thread de travail.
- Appelez la méthode IPIN :: NewSegment sur la broche d’entrée.
- 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 :
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::SetTimeFormat
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 |
|
| Bibliothèque |
|