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 |
---|---|
|
Il metodo è riuscito. |
|
Il metodo ProcessOutput è stato chiamato su un MFT asincrono che non prevedeva questa chiamata al metodo. |
|
Identificatore di flusso non valido nel membro dwStreamID di una o più strutture MFT_OUTPUT_DATA_BUFFER . |
|
La trasformazione non può produrre dati di output finché non riceve altri dati di input. |
|
Il formato è stato modificato in un flusso di output o è presente un nuovo formato preferito oppure è presente un nuovo flusso di output. |
|
È necessario impostare il tipo di supporto su uno o più flussi di MFT. |
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.
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.
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:
- Creare un nuovo oggetto raccolta chiamando MFCreateCollection.
- Aggiungere uno o più eventi alla raccolta chiamando IMFCollection::AddElement.
- 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.
È 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.
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.
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 |