Freigeben über


CSourceSeeking-Klasse

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Klassenhierarchie csourceseeking

Die CSourceSeeking-Klasse ist eine abstrakte Klasse zum Implementieren der Suche in Quellfiltern mit einem Ausgabepin.

Diese Klasse unterstützt die IMediaSeeking-Schnittstelle . Es stellt Standardimplementierungen für alle IMediaSeeking-Methoden bereit. Geschützte Membervariablen speichern die Startzeit, die Stoppzeit und die aktuelle Rate. Standardmäßig wird das einzige Von der -Klasse unterstützte Zeitformat TIME_FORMAT_MEDIA_TIME (100 Nanosekundeneinheiten). Weitere Informationen finden Sie unter Hinweise.

Geschützte Membervariablen BESCHREIBUNG
m_rtDuration Dauer des Datenstroms.
m_rtStart Startzeit
m_rtStop Stoppzeit.
m_dRateSeeking Wiedergaberate.
m_dwSeekingCaps Suchen nach Funktionen.
m_pLock Zeiger auf ein kritisches Abschnittsobjekt zum Sperren.
Geschützte Methoden BESCHREIBUNG
CSourceSeeking Konstruktormethode.
Reine virtuelle Methoden BESCHREIBUNG
ChangeRate Wird aufgerufen, wenn sich die Wiedergaberate ändert.
ChangeStart Wird aufgerufen, wenn sich die Startposition ändert.
ChangeStop Wird aufgerufen, wenn sich die Stoppposition ändert.
IMediaSeeking-Methoden BESCHREIBUNG
IsFormatSupported Bestimmt, ob ein angegebenes Zeitformat unterstützt wird.
QueryPreferredFormat Ruft das bevorzugte Zeitformat des Objekts ab.
SetTimeFormat Legt das Zeitformat fest.
IsUsingTimeFormat Bestimmt, ob ein angegebenes Zeitformat das aktuell verwendete Format ist.
GetTimeFormat Ruft das aktuelle Zeitformat ab.
GetDuration Ruft die Dauer des Datenstroms ab.
GetStopPosition Ruft den Zeitpunkt ab, zu dem die Wiedergabe beendet wird, relativ zur Dauer des Datenstroms.
GetCurrentPosition Ruft die aktuelle Position relativ zur Gesamtdauer des Datenstroms ab.
GetCapabilities Ruft alle Suchfunktionen des Datenstroms ab.
CheckCapabilities Fragt ab, ob der Stream über angegebene Suchfunktionen verfügt.
ConvertTimeFormat Konvertiert von einem Zeitformat in ein anderes.
SetPositions Legt die aktuelle Position und die Stoppposition fest.
GetPositions Ruft die aktuelle Position und die Stoppposition ab.
GetAvailable Ruft den Zeitraum ab, in dem die Suche effizient ist.
SetRate Legt die Wiedergaberate fest.
GetRate Ruft die Wiedergaberate ab.
GetPreroll Ruft die Vorrollzeit ab.

Bemerkungen

Wenn sich die Startposition, die Stoppposition oder die Wiedergaberate ändert, ruft das CSourceSeeking-Objekt eine entsprechende reine virtuelle Methode auf:

Die abgeleitete Klasse muss diese Methoden implementieren. Nach jedem Suchvorgang muss ein Filter Folgendes ausführen:

  1. Rufen Sie die IPin::BeginFlush-Methode für den Downstreameingabenadel auf.
  2. Halten Sie den Workerthread an, der Daten bereitstellt.
  3. Rufen Sie die IPin::EndFlush-Methode auf dem Eingabenadel auf.
  4. Starten Sie den Workerthread neu.
  5. Rufen Sie die IPin::NewSegment-Methode für den Eingabenadel auf.
  6. Legen Sie die Diskontinuitätseigenschaft für das erste Beispiel fest. Rufen Sie die IMediaSample::SetDiscontinuity-Methode auf.

Der Aufruf von BeginFlush gibt den Workerthread frei, wenn der Thread blockiert wird, um ein Beispiel zu übermitteln.

Stellen Sie in Schritt 2 sicher, dass der Thread das Senden von Daten beendet hat. Abhängig von der Implementierung müssen Sie möglicherweise warten, bis der Thread beendet wird, oder darauf, dass der Thread eine Antwort einer Art signalisiert. Wenn Der Filter die CSourceStream-Klasse verwendet, blockiert die CSourceStream::Stop-Methode , bis der Workerthread antwortet.

Idealerweise sollte das neue Segment (Schritt 5) aus dem Workerthread bereitgestellt werden. Dies kann auch durch das CSourceSeeking-Objekt erfolgen, solange der Filter es mit den Beispielen serialisiert.

Das folgende Beispiel zeigt eine mögliche Implementierung. Es wird davon ausgegangen, dass der Ausgabepin des Quellfilters von CSourceSeeking und CSourceStream abgeleitet ist. In diesem Beispiel wird die Hilfsmethode UpdateFromSeek definiert, die Schritte 1 4 ausführt. Die CSourceStream::OnThreadStartPlay-Methode wird überschrieben, um das neue Segment zu senden und ein Flag festzulegen, das die Diskontinuität angibt. Der Workerthread übernimmt dieses Flag und ruft die IMediaSample::SetDiscontinuity-Methode auf :

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

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

Unterstützung zusätzlicher Zeitformate

Standardmäßig unterstützt diese Klasse die Suche nur in Einheiten der Referenzzeit (TIME_FORMAT_MEDIA_TIME). Um zusätzliche Zeitformate zu unterstützen, überschreiben Sie die IMediaSeeking-Methoden , die sich mit Zeitformaten befassen:

Überschreiben Sie außerdem die verbleibenden IMediaSeeking-Methoden , um die erforderlichen Konvertierungen zwischen Zeitformaten durchzuführen. Nachdem die SetTimeFormat-Methode aufgerufen wurde, müssen alle IMediaSeeking-Methoden eingehende und ausgehende Zeitparameter als im neuen Zeitformat behandeln. Wenn die variable m_rtDuration beispielsweise die Dauer in Einheiten der Referenzzeit darstellt, das aktuelle Zeitformat jedoch Frames ist, muss die GetDuration-Methode den Wert zurückgeben , m_rtDuration in Frames konvertiert wurden. Beispiel:

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
} 

Achten Sie außerdem darauf, in der IMediaSeeking::SetPositions-Methode nach dem flag AM_SEEKING_ReturnTime zu suchen. Wenn dieses Flag vorhanden ist, konvertieren Sie die Positionswerte in Referenzzeiten, wenn Sie sie an den Aufrufer zurückgeben.

Anforderungen

Anforderung Wert
Header
Ctlutil.h (include Streams.h)
Bibliothek
Strmbase.lib (Einzelhandelsbuilds);
Strmbasd.lib (Debugbuilds)

Siehe auch

Unterstützung der Suche in einem Quellfilter