Informazioni sulle MFP

Le trasformazioni di Media Foundation forniscono un modello generico per l'elaborazione dei dati multimediali. Le MFP vengono usate per decodificatori, codificatori e processori di segnali digitali ( DSP). In breve, tutto ciò che si trova nella pipeline multimediale tra l'origine multimediale e il sink multimediale è un MFT.

Per la maggior parte delle applicazioni, i dettagli dell'elaborazione dei dati MFT sono nascosti da livelli superiori dell'architettura di Media Foundation. Molte applicazioni Media Foundation non effettueranno mai una chiamata diretta a un MFT. Tuttavia, è certamente possibile ospitare un MFT direttamente nell'applicazione.

Le MFP sono un'evoluzione del modello di trasformazione introdotta per la prima volta con oggetti multimediali DirectX ( DMO). In realtà, è relativamente facile creare una trasformazione che supporta entrambi i modelli. Rispetto alle DMO, i comportamenti necessari delle MFP sono più chiaramente specificati, semplificando la scrittura di un'implementazione corretta. Inoltre, le MFP possono supportare l'elaborazione video accelerata dall'hardware.

In questo argomento viene fornita una breve panoramica del modello di elaborazione MFT, concentrandosi sulla progettazione complessiva anziché sulle chiamate di metodo specifiche. Per una descrizione più dettagliata, vedere Modello di elaborazione MFT di base.

Flussi

Un MFT include flussi di input e flussi di output. I flussi di input ricevono dati e i flussi di output producono dati. Ad esempio, un decodificatore ha un flusso di input, che riceve i dati codificati e un flusso di output, che produce i dati decodificati.

I flussi in un MFT non sono rappresentati come oggetti COM distinti. Ogni flusso ha invece un identificatore di flusso designato e i metodi nell'interfaccia IMFTransform accettano gli identificatori di flusso come parametri di input.

Alcuni mft hanno un numero fisso di flussi. Ad esempio, i decodificatori e i codificatori in genere hanno esattamente un input e un output. Altri MFP hanno un numero dinamico di flussi. Se un MFT supporta flussi dinamici, il client può aggiungere nuovi flussi di input. Il client non può aggiungere flussi di output, ma MFT potrebbe aggiungere o rimuovere flussi di output durante l'elaborazione. Ad esempio, i multiplexer consentono in genere al client di aggiungere flussi di input e di avere un output per il flusso multiplexed. I demultiplexer sono il contrario, con un input ma un numero dinamico di flussi di output, a seconda del contenuto del flusso di input. La figura seguente mostra la differenza tra multiplexer e demultiplexer.

diagramma che mostra un codificatore/decodificatore (1 input, 1 output), un multiplexer (2 input, 1 output) e un demultiplexer (1 input, 2 output)

Tipi di supporti

Quando viene creato un MFT per la prima volta, nessuno dei flussi ha un formato stabilito. Prima che MFT possa elaborare i dati, il client deve impostare i formati per i flussi. Ad esempio, con un decodificatore, il formato di input è il formato di compressione usato nel file di origine originale e il formato di output è un formato non compresso, ad esempio audio PCM o video RGB. I formati di flusso vengono descritti usando tipi di supporti.

A seconda dello stato interno del MFT, potrebbe fornire un elenco dei possibili tipi di supporti per ogni flusso. È possibile usare questo elenco come suggerimento quando si impostano i tipi di supporto. L'impostazione del tipo di supporto in un flusso può modificare l'elenco dei tipi possibili per un altro flusso. Ad esempio, un decodificatore in genere non può fornire alcun tipo di output finché il client non imposta il tipo di input. Il tipo di input contiene le informazioni necessarie al decodificatore per restituire un elenco di possibili tipi di output.

Per impostare il tipo di supporto in un flusso, chiamare IMFTransform::SetInputType o IMFTransform::SetOutputType. Per ottenere l'elenco dei possibili tipi di supporti per un flusso, chiamare IMFTransform::GetInputAvailableType o IMFTransform::GetOutputAvailableType.

Elaborazione dei dati

Dopo che il client imposta i tipi di supporti nei flussi, MFT è pronto per elaborare i dati. A tale scopo, il client si alterna tra l'inserimento di dati di input al MFT e il recupero dei dati di output da MFT:

Il metodo ProcessInput accetta un puntatore a un campione multimediale allocato dal client. L'esempio di supporto contiene uno o più buffer e ogni buffer contiene i dati di input che MFT deve elaborare.

Il metodo ProcessOutput supporta due modelli di allocazione diversi: MFT alloca i buffer di output o il client alloca i buffer di output. Alcuni MMF supportano entrambi i modelli di allocazione, ma non è necessario che un MFT supporti entrambi. Ad esempio, un MFT potrebbe richiedere al client di allocare i buffer di output. Il metodo IMFTransform::GetOutputStreamInfo restituisce informazioni su un flusso di output, incluso il modello di allocazione supportato da MFT.

Le MFP sono progettate per memorizzare nel buffer il minor numero possibile di dati, in modo da ridurre al minimo la latenza nella pipeline. Pertanto, in qualsiasi momento, il MFT può segnalare una delle condizioni seguenti:

  • MFT richiede più dati di input. In questo stato, MFT non può produrre output finché il client non chiama ProcessInput almeno una volta.
  • MFT non accetterà più input finché il client non chiama ProcessOutput almeno una volta.

Si supponga, ad esempio, di usare un decodificatore video per decodificare un flusso video contenente una combinazione di fotogrammi chiave e fotogrammi differenziali. Inizialmente, MFT richiede un input prima di poter decodificare qualsiasi fotogramma. Il client chiama ProcessInput per recapitare il primo frame. Si supponga che il primo fotogramma sia un frame differenziale (illustrato nel diagramma seguente come "P" per il frame stimato). Il decodificatore mantiene questo frame, ma non può produrre alcun output fino a quando non ottiene il fotogramma chiave successivo.

diagramma che mostra il valore mft che richiede l'input, puntando a un frame stimato

Il client continua a chiamare ProcessInput e alla fine raggiunge il fotogramma chiave successivo (mostrato nel diagramma successivo come "I" per frame intercodato). Ora il decodificatore dispone di fotogrammi sufficienti per avviare la decodifica. A questo punto smette di accettare l'input e il client deve chiamare ProcessOutput per ottenere i frame decodificati.

diagramma che mostra un mft che non accetta l'input, puntando a un fotogramma all'interno del codice e a tre fotogrammi stimati

L'approccio più semplice per il client consiste semplicemente nell'alternare le chiamate a ProcessInput e ProcessOutput. Un algoritmo più sofisticato è descritto nell'argomento Modello di elaborazione MFT di base.

Trasformazioni di Media Foundation