IMFTransform::P rocessOutput-Methode (mftransform.h)

Generiert eine Ausgabe aus den aktuellen Eingabedaten.

Syntax

HRESULT ProcessOutput(
  [in]      DWORD                  dwFlags,
  [in]      DWORD                  cOutputBufferCount,
  [in, out] MFT_OUTPUT_DATA_BUFFER *pOutputSamples,
  [out]     DWORD                  *pdwStatus
);

Parameter

[in] dwFlags

Bitweise OR mit null oder mehr Flags aus der _MFT_PROCESS_OUTPUT_FLAGS-Enumeration .

[in] cOutputBufferCount

Anzahl der Elemente im pOutputSamples-Array . Der Wert muss mindestens 1 sein.

[in, out] pOutputSamples

Zeiger auf ein Array von MFT_OUTPUT_DATA_BUFFER Strukturen, die vom Aufrufer zugeordnet werden. Das MFT verwendet dieses Array, um Ausgabedaten an den Aufrufer zurückzugeben.

[out] pdwStatus

Empfängt ein bitweises OR mit null oder mehr Flags aus der _MFT_PROCESS_OUTPUT_STATUS-Enumeration .

Rückgabewert

Die Methode gibt ein HRESULT zurück. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.

Rückgabecode BESCHREIBUNG
S_OK
Die Methode wurde erfolgreich ausgeführt.
E_UNEXPECTED
Die ProcessOutput-Methode wurde für eine asynchrone MFT aufgerufen, die diesen Methodenaufruf nicht erwartet hatte.
MF_E_INVALIDSTREAMNUMBER
Ungültiger Streambezeichner im dwStreamID-Member einer oder mehrerer MFT_OUTPUT_DATA_BUFFER-Strukturen .
MF_E_TRANSFORM_NEED_MORE_INPUT
Die Transformation kann erst dann Ausgabedaten erzeugen, wenn sie mehr Eingabedaten empfängt.
MF_E_TRANSFORM_STREAM_CHANGE
Das Format hat sich in einem Ausgabestream geändert, oder es gibt ein neues bevorzugtes Format, oder es gibt einen neuen Ausgabedatenstrom.
MF_E_TRANSFORM_TYPE_NOT_SET
Sie müssen den Medientyp für einen oder mehrere Streams des MFT festlegen.
 
Hinweis Wenn Sie ein DirectX Media Object (DMO) in ein MFT konvertieren, beachten Sie, dass S_FALSE im Gegensatz zur IMediaObject::P rocessOutput-Methode kein gültiger Rückgabecode für IMFTransform::P rocessOutput ist.
 

Hinweise

Die Größe des pOutputSamples-Arrays muss gleich oder größer als die Anzahl der ausgewählten Ausgabestreams sein. Die Anzahl der ausgewählten Ausgabestreams entspricht der Gesamtzahl der Ausgabestreams minus der Anzahl der deaktivierten Datenströme. Ein Stream wird deaktiviert, wenn er über das flag MFT_OUTPUT_STREAM_OPTIONAL verfügt und der Aufrufer keinen Medientyp festlegt (oder den Medientyp auf NULL festlegt). Weitere Informationen finden Sie unter _MFT_OUTPUT_STREAM_INFO_FLAGS-Enumeration .

Diese Methode generiert Ausgabebeispiele und kann auch Ereignisse generieren. Wenn die Methode erfolgreich ist, gilt mindestens eine der folgenden Bedingungen:

  • Mindestens ein Beispiel im pOutputSamples-Array enthält Ausgabedaten.
  • Mindestens ein Element des pOutputSamples-Arrays enthält eine nicht leere Auflistung von Ereignissen.
Wenn MFT_UNIQUE_METHOD_NAMES vor dem Einschließen von Mftransform.h definiert ist, wird diese Methode in MFTProcessOutput umbenannt. Weitere Informationen finden Sie unter Erstellen von DMO/MFT-Hybridobjekten.

Ausgabepuffer

Der MFT gibt Ausgabedaten für einen Stream über den pSample-Member der MFT_OUTPUT_DATA_BUFFER-Struktur zurück. Dieses Strukturelement ist ein Zeiger auf die IMFSample-Schnittstelle eines Medienbeispiels. (Siehe Medienbeispiele.) Das Medienbeispiel wird je nach MFT-Zuordnungsmodell entweder vom Aufrufer oder vom MFT zugeordnet. Um das Zuordnungsmodell zu finden, rufen Sie IMFTransform::GetOutputStreamInfo auf, und untersuchen Sie den dwFlags-Member der MFT_OUTPUT_STREAM_INFO-Struktur :
  • Wenn das flag MFT_OUTPUT_STREAM_PROVIDES_SAMPLES vorhanden ist, ordnet das MFT das Medienbeispiel zu.
  • Wenn das MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES-Flag vorhanden ist, kann der Aufrufer optional ein Medienbeispiel bereitstellen. Wenn pSampleNULL ist, ordnet das MFT das Medienbeispiel zu.
  • Wenn keines dieser beiden Flags vorhanden ist, muss der Aufrufer das Medienbeispiel zuordnen.
Diese Flags bleiben konstant, es sei denn, der Medientyp für den Ausgabestream ändert sich.

Wenn der Aufrufer das Medienbeispiel zuordnet, muss das Medienbeispiel einen Puffer enthalten, der groß genug ist, um die Ausgabedaten aufzunehmen. Rufen Sie GetOutputStreamInfo auf, um die Pufferanforderungen zu ermitteln. Der MFT schreibt die Ausgabedaten an den Anfang des Puffers und überschreibt alle Daten, die bereits im Puffer vorhanden sind.

Wenn der MFT die Stichprobe zuordnet, ordnet der MFT auch die Puffer für die Stichprobe zu.

Wenn der MFT über mehrere Ausgabedatenströme verfügt, erzeugen die Streams möglicherweise eine Ausgabe mit unterschiedlichen Raten, sodass einige Datenströme möglicherweise eine Ausgabe aufweisen, während andere Datenströme dies nicht tun. Wenn ein Stream keine Ausgabe erzeugt hat, legt MFT das flag MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE im dwStatus-Element der MFT_OUTPUT_DATA_BUFFER-Struktur für diesen Datenstrom fest. Wenn der Aufrufer in diesem Fall pSample zugewiesen hat, enthalten die Puffer im Beispiel keine gültigen Daten. Wenn der Aufrufer pSample nicht zugeordnet hat, gibt das MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE-Flag an, dass pSample nach der Rückgabe der Methode weiterhin NULL ist.

Wenn keine Ausgabestreams Daten enthalten und der MFT keine Ereignisse zurückgibt, gibt ProcessOutputMF_E_TRANSFORM_NEED_MORE_INPUT zurück.

Der MFT kann nicht mehr als ein Beispiel pro Stream in einem einzelnen Aufruf von ProcessOutput zurückgeben. Wenn nach der Rückgabe von ProcessOutput weitere Ausgabedaten für einen Stream verfügbar sind, legt MFT das flag MFT_OUTPUT_DATA_BUFFER_INCOMPLETE im dwStatus-Element der MFT_OUTPUT_DATA_BUFFER-Struktur für diesen Stream fest.

Wenn der MFT über genügend Daten verfügt, um eine Ausgabe zu erzeugen, sollte er die Annahme weiterer Eingaben ablehnen, bis ProcessOutput genügend Mal aufgerufen wurde, um die gesamte verfügbare Ausgabe zu pullen. (Eine Ausnahme ist, wenn die IMFTransform::GetOutputStreamInfo-Methode das flag MFT_OUTPUT_STREAM_LAZY_READ zurückgibt.) Im Allgemeinen sollte ein MFT mit mehreren Ausgabestreams so schnell wie möglich eine Ausgabe für einen Datenstrom erzeugen und nicht warten, bis alle Datenströme ausgegeben werden.

In-Band-Ereignisse

Der MFT kann eine Auflistung von Ereignisobjekten im pEvents-Member jeder MFT_OUTPUT_DATA_BUFFER-Struktur zurückgeben. Der MFT ordnet sowohl das Auflistungsobjekt als auch die Ereignisse zu.

Um ein Ereignis an den Aufrufer zu senden, führt der MFT die folgenden Schritte in ProcessOutput aus:

  1. Erstellen Sie ein neues Auflistungsobjekt, indem Sie MFCreateCollection aufrufen.
  2. Fügen Sie der Auflistung ein oder mehrere Ereignisse hinzu, indem Sie IMFCollection::AddElement aufrufen.
  3. Legen Sie den pEvents-Member der MFT_OUTPUT_DATA_BUFFER-Struktur auf den IMFCollection-Zeiger fest. Der MFT hinterlässt eine Verweisanzahl auf dieser Schnittstelle. Der Aufrufer muss den Zeiger freigeben.
Ereignisse verfügen nicht über Zeitstempel. Der Aufrufer sollte die Ereignisse verarbeiten, bevor die Ausgabebeispiele verarbeitet werden. Anders ausgedrückt: Ereignisse treten an der Stelle im Stream unmittelbar nach dem vorherigen Aufruf von ProcessOutput und vor allen Ausgabebeispielen auf, die vom aktuellen ProcessOutput-Aufruf zurückgegeben wurden.

Es ist gültig, dass die ProcessOutput-Methode ein oder mehrere Ereignisse und 0 Ausgabebeispiele zurückgibt.

Der Aufrufer ist für die Freigabe aller Ereignisse verantwortlich, die vom MFT zugeordnet werden. Wenn die Methode zurückgibt, überprüfen Sie den pEvents-Member jeder MFT_OUTPUT_DATA_BUFFER-Struktur . Wenn der Wert nicht NULL ist, muss der Aufrufer den IMFCollection-Schnittstellenzeiger freigeben:

// Release the events that an MFT might allocate in IMFTransform::ProcessOutput().
void ReleaseEventCollection(DWORD cOutputBuffers, MFT_OUTPUT_DATA_BUFFER* pBuffers)
{
    for (DWORD i = 0; i < cOutputBuffers; i++)
    {
        if (pBuffers[i].pEvents)
        {
            pBuffers[i].pEvents->Release();
            pBuffers[i].pEvents = NULL;
        }
    }
}

Ein MFT sollte nicht die IMFMediaEventGenerator-Schnittstelle verwenden, um In-Band-Ereignisse zu senden.

Stream Änderungen

Die ProcessOutput-Methode kann eine der folgenden Änderungen in einem Ausgabedatenstrom verursachen:
  • Das Löschen eines Ausgabedatenstroms. Um einen Streamlöschung zu signalisieren, legt der MFT das flag MFT_OUTPUT_DATA_BUFFER_STREAM_END im dwStatus-Element der MFT_OUTPUT_DATA_BUFFER-Struktur für diesen Stream fest.
  • Die Erstellung eines neuen Ausgabedatenstroms. Um einen neuen Ausgabedatenstrom zu signalisieren, legt der MFT das flag MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS im pdwStatus-Parameter fest. Ein neuer Stream kann denselben Streambezeichner wie ein gelöschter Datenstrom aufweisen.
  • Eine Formatänderung für einen Ausgabestream. Um eine Formatänderung zu signalisieren, legt der MFT das flag MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE im dwStatus-Member der MFT_OUTPUT_DATA_BUFFER-Struktur für diesen Stream fest.
Es ist möglich, dass alle drei dieser Aktionen aus einem einzelnen Aufruf von ProcessOutput resultieren. Der Aufrufer muss in der hier aufgeführten Reihenfolge darauf reagieren – zuerst Löschvorgänge, dann Ergänzungen und dann Formatänderungen.

Das flag MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE signalisiert eine Formatänderung in einem Ausgabedatenstrom. Dies kann bedeuten, dass der aktuelle Medientyp ungültig ist oder die Einstellungsreihenfolge geändert wurde und ein effizienteres Format verfügbar ist. Im letzteren Fall ist es möglich, dass der Client den ursprünglichen Medientyp neu legt. Um endlose Schleifen zu schützen, sollte das MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE Flag nicht erneut festgelegt werden, bis eine weitere Änderung erfolgt. Vermeiden Sie außerdem das Festlegen dieses Flags, wenn sich die Einstellungsreihenfolge ändert, der aktuelle Medientyp jedoch immer noch der am meisten bevorzugte Typ ist.

Beispielattribute

Ein Eingabebeispiel kann Attribute aufweisen, auf die über die IMFAttributes-Schnittstelle zugegriffen wird. Sofern kein bestimmtes Attribut nicht mehr gilt, sollten alle Attribute in das entsprechende Ausgabebeispiel kopiert werden. Die Verantwortung für das Kopieren von Attributen wird wie folgt bestimmt:
  • Wenn der Wert der MFPKEY_EXATTRIBUTE_SUPPORTED-Eigenschaft für MFT VARIANT_TRUE ist, kopiert der MFT die Attribute.
  • Wenn der Wert von MFPKEY_EXATTRIBUTE_SUPPORTEDVARIANT_FALSE ist oder die -Eigenschaft nicht festgelegt ist, muss der Client die Beispielattribute kopieren. Überschreiben Sie keine Attribute, die der MFT für das Ausgabebeispiel festlegt.
Eine Liste der Beispielattribute finden Sie unter Beispielattribute.

Asynchrone Verarbeitung

In den vorherigen Anmerkungen wird das synchrone Verarbeitungsmodell beschrieben. Informationen zur Unterstützung der asynchronen Verarbeitung finden Sie unter Asynchrone MFTs.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile mftransform.h
Bibliothek Mfuuid.lib

Weitere Informationen

IMFTransform

Media Foundation-Transformationen