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.]
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 :
- Position de début : CSourceSeeking::ChangeStart
- Position d’arrêt : CSourceSeeking::ChangeStop
- Taux de lecture : CSourceSeeking::ChangeRate
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 :
- 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é 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 :
- 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. 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 |
|
Bibliothèque |
|