Condividi tramite


Metodo IMFTransform::P rocessOutput (mftransform.h)

Genera l'output dai dati di input correnti.

Sintassi

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

Parametri

[in] dwFlags

OR bit per bit pari a zero o più flag dall'enumerazione _MFT_PROCESS_OUTPUT_FLAGS.

[in] cOutputBufferCount

Numero di elementi nella matrice pOutputSamples . Il valore deve essere almeno 1.

[in, out] pOutputSamples

Puntatore a una matrice di strutture MFT_OUTPUT_DATA_BUFFER , allocate dal chiamante. MFT usa questa matrice per restituire i dati di output al chiamante.

[out] pdwStatus

Riceve un VALORE OR bit per bit pari a zero o più flag dall'enumerazione _MFT_PROCESS_OUTPUT_STATUS .

Valore restituito

Il metodo restituisce un valore HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.

Codice restituito Descrizione
S_OK
Il metodo è riuscito.
E_UNEXPECTED
Il metodo ProcessOutput è stato chiamato su un MFT asincrono che non prevedeva questa chiamata al metodo.
MF_E_INVALIDSTREAMNUMBER
Identificatore di flusso non valido nel membro dwStreamID di una o più strutture MFT_OUTPUT_DATA_BUFFER .
MF_E_TRANSFORM_NEED_MORE_INPUT
La trasformazione non può produrre dati di output finché non riceve altri dati di input.
MF_E_TRANSFORM_STREAM_CHANGE
Il formato è stato modificato in un flusso di output o è presente un nuovo formato preferito oppure è presente un nuovo flusso di output.
MF_E_TRANSFORM_TYPE_NOT_SET
È necessario impostare il tipo di supporto su uno o più flussi di MFT.
 
Nota Se si converte un oggetto DirectX Media (DMO) in un MFT, tenere presente che S_FALSE non è un codice restituito valido per IMFTransform::P rocessOutput, a differenza del metodo IMediaObject::P rocessOutput .
 

Commenti

Le dimensioni della matrice pOutputSamples devono essere uguali o maggiori del numero di flussi di output selezionati . Il numero di flussi di output selezionati è uguale al numero totale di flussi di output meno il numero di flussi deselezionati . Un flusso viene deselezionato se ha il flag MFT_OUTPUT_STREAM_OPTIONAL e il chiamante non imposta un tipo di supporto (o imposta il tipo di supporto su NULL). Per altre informazioni, vedere _MFT_OUTPUT_STREAM_INFO_FLAGS'enumerazione .

Questo metodo genera esempi di output e può anche generare eventi. Se il metodo ha esito positivo, almeno una delle condizioni seguenti è vera:

  • Uno o più esempi nella matrice pOutputSamples contengono dati di output.
  • Uno o più membri della matrice pOutputSamples contengono una raccolta di eventi non vuota.
Se MFT_UNIQUE_METHOD_NAMES viene definito prima di includere Mftransform.h, questo metodo viene rinominato MFTProcessOutput. Vedere Creazione di oggetti DMO/MFT ibridi.

Buffer di output

MFT restituisce i dati di output per un flusso tramite il membro pSample della struttura MFT_OUTPUT_DATA_BUFFER . Questo membro della struttura è un puntatore all'interfaccia IMFSample di un campione multimediale. Vedere Esempi multimediali. Il campione multimediale viene allocato dal chiamante o dal MFT, a seconda del modello di allocazione MFT. Per trovare il modello di allocazione, chiamare IMFTransform::GetOutputStreamInfo ed esaminare il membro dwFlags della struttura MFT_OUTPUT_STREAM_INFO :
  • Se il flag MFT_OUTPUT_STREAM_PROVIDES_SAMPLES è presente, MFT alloca l'esempio multimediale.
  • Se il flag MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES è presente, il chiamante può facoltativamente fornire un esempio multimediale. Se pSample è NULL, il MFT allocherà l'esempio multimediale.
  • Se nessuno di questi due flag è presente, il chiamante deve allocare l'esempio multimediale.
Questi flag rimangono costanti a meno che il tipo di supporto per il flusso di output non cambi.

Se il chiamante alloca l'esempio multimediale, l'esempio multimediale deve contenere un buffer sufficientemente grande da contenere i dati di output. Per trovare i requisiti del buffer, chiamare GetOutputStreamInfo. MFT scrive i dati di output all'inizio del buffer, sovrascrivendo tutti i dati già presenti nel buffer.

Se il MFT alloca l'esempio, il MFT alloca anche i buffer per l'esempio.

Se MFT ha più flussi di output, i flussi potrebbero produrre output a velocità diverse, quindi alcuni flussi potrebbero avere output mentre altri non lo fanno. Se un flusso non produce alcun output, MFT imposta il flag MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE nel membro dwStatus della struttura MFT_OUTPUT_DATA_BUFFER per tale flusso. In tal caso, se il chiamante allocato pSample, i buffer nell'esempio non contengono dati validi. Se il chiamante non ha allocato pSample, il flag MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE indica che pSample è ancora uguale a NULL dopo la restituzione del metodo.

Se nessun flusso di output contiene dati e MFT non ha eventi da restituire, ProcessOutput restituisce MF_E_TRANSFORM_NEED_MORE_INPUT.

MFT non può restituire più campioni per flusso in una singola chiamata a ProcessOutput. Se sono disponibili più dati di output per un flusso dopo la restituzione di ProcessOutput , MFT imposta il flag MFT_OUTPUT_DATA_BUFFER_INCOMPLETE nel membro dwStatus della struttura MFT_OUTPUT_DATA_BUFFER per tale flusso.

Se MFT dispone di dati sufficienti per produrre l'output, deve rifiutare di accettare altri input fino a quando ProcessOutput non è stato chiamato abbastanza volte per eseguire il pull di tutti gli output disponibili. Un'eccezione è quando il metodo IMFTransform::GetOutputStreamInfo restituisce il flag MFT_OUTPUT_STREAM_LAZY_READ . In genere, un MFT con più flussi di output deve produrre l'output per un flusso il prima possibile e non attendere che tutti i flussi abbiano output.

Eventi in banda

MFT può restituire una raccolta di oggetti evento nel membro pEvents di ogni struttura MFT_OUTPUT_DATA_BUFFER . MFT alloca sia l'oggetto raccolta che gli eventi.

Per inviare un evento al chiamante, MFT esegue i passaggi seguenti all'interno di ProcessOutput:

  1. Creare un nuovo oggetto raccolta chiamando MFCreateCollection.
  2. Aggiungere uno o più eventi alla raccolta chiamando IMFCollection::AddElement.
  3. Impostare il membro pEvents della struttura MFT_OUTPUT_DATA_BUFFER uguale al puntatore IMFCollection . L'MFT lascia un conteggio dei riferimenti su questa interfaccia; il chiamante deve rilasciare il puntatore.
Gli eventi non dispongono di timestamp. Il chiamante deve elaborare gli eventi prima di elaborare gli esempi di output. In altre parole, gli eventi si verificano nel punto del flusso immediatamente dopo la chiamata precedente a ProcessOutput e prima di tutti gli esempi di output restituiti dalla chiamata ProcessOutput corrente.

È valido per il metodo ProcessOutput restituire uno o più eventi e zero esempi di output.

Il chiamante è responsabile del rilascio di tutti gli eventi allocati dal MFT. Al termine del metodo, controllare il membro pEvents di ogni struttura MFT_OUTPUT_DATA_BUFFER . Se il valore non è NULL, il chiamante deve rilasciare il puntatore all'interfaccia IMFCollection :

// 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;
        }
    }
}

Un MFT non deve usare l'interfaccia IMFMediaEventGenerator per inviare eventi in banda.

modifiche Stream

Il metodo ProcessOutput può causare una delle modifiche seguenti in un flusso di output:
  • Eliminazione di un flusso di output. Per segnalare un'eliminazione del flusso, MFT imposta il flag MFT_OUTPUT_DATA_BUFFER_STREAM_END nel membro dwStatus della struttura MFT_OUTPUT_DATA_BUFFER per tale flusso.
  • Creazione di un nuovo flusso di output. Per segnalare un nuovo flusso di output, MFT imposta il flag MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS nel parametro pdwStatus . Un nuovo flusso può avere lo stesso identificatore di flusso di un flusso eliminato.
  • Modifica del formato in un flusso di output. Per segnalare una modifica del formato, MFT imposta il flag MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE nel membro dwStatus della struttura MFT_OUTPUT_DATA_BUFFER per tale flusso.
È possibile che tutte e tre queste azioni vengano restituite da una singola chiamata a ProcessOutput. Il chiamante deve rispondere all'ordine elencato qui, prima eliminazioni, quindi aggiunte, quindi modifica del formato.

Il flag MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE segnala una modifica del formato in un flusso di output. Ciò potrebbe significare che il tipo di supporto corrente è diventato non valido oppure l'ordine delle preferenze è stato modificato e un formato più efficiente è disponibile. In quest'ultimo caso, è possibile che il client imposterà nuovamente il tipo di supporto originale. Per evitare cicli infiniti, MFT non deve impostare di nuovo il flag di MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE fino a quando non viene apportata un'altra modifica. Evitare inoltre di impostare questo flag se l'ordine delle preferenze cambia, ma il tipo di supporto corrente è ancora il tipo più preferito.

Attributi di esempio

Un esempio di input può avere attributi a cui si accede tramite l'interfaccia IMFAttributes . A meno che non si applichi più un attributo specifico, tutti gli attributi devono essere copiati nell'esempio di output corrispondente. La responsabilità della copia degli attributi è determinata come segue:
  • Se il valore della proprietà MFPKEY_EXATTRIBUTE_SUPPORTED nel MFT è VARIANT_TRUE, MFT copia gli attributi.
  • Se il valore di MFPKEY_EXATTRIBUTE_SUPPORTED è VARIANT_FALSE o la proprietà non è impostata, il client deve copiare gli attributi di esempio. Non sovrascrivere gli attributi impostati dall'MFT nell'esempio di output.
Per un elenco di attributi di esempio, vedere Attributi di esempio.

Elaborazione asincrona

Le osservazioni precedenti descrivono il modello di elaborazione sincrona . Per supportare l'elaborazione asincrona, vedere MFT asincroni.

Requisiti

Requisito Valore
Client minimo supportato Windows Vista [app desktop | App UWP]
Server minimo supportato Windows Server 2008 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione mftransform.h
Libreria Mfuuid.lib

Vedi anche

FMTransform

Trasformazioni di Media Foundation