Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 all'interno della pipeline multimediale tra l'origine multimediale e la destinazione multimediale è un MFT.
Per la maggior parte delle applicazioni, i dettagli dell'elaborazione dei dati MFT sono nascosti da livelli più elevati dell'architettura di Media Foundation. Molte applicazioni di 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 obbligatori 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 metodi specifiche. Per una descrizione più dettagliata e passo-passo, vedere il modello di elaborazione di base MFT .
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.
Alcune MFP 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, multiplexer in genere consentono 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.
Tipi di media
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 media.
A seconda dello stato interno dello MFT, potrebbe fornire un elenco dei possibili formati multimediali per ogni flusso. È possibile usare questo elenco come suggerimento quando si impostano i tipi di supporti. L'impostazione del tipo di supporto in un flusso può modificare l'elenco dei tipi possibili per un altro flusso. Ad esempio, un decodificatore non può in genere 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 media per un flusso, chiamare IMFTransform::GetInputAvailableType o IMFTransform::GetOutputAvailableType.
Elaborazione dei dati
Dopo che il client imposta i tipi di media nei flussi, la MFT è pronta per elaborare i dati. A tale scopo, il client alterna la fornitura di dati di input a MFT e il recupero di dati di output da MFT:
- Per assegnare i dati di input all'MFT, chiamare IMFTransform::ProcessInput.
- Per estrarre i dati di output da MFT, chiamare IMFTransform::ProcessOutput.
Il metodo ProcessInput accetta un puntatore a un campione multimediale allocato dal client. L'esempio multimediale contiene uno o più buffer e ogni buffer contiene i dati di input per l'elaborazione di MFT.
Il metodoProcessOutputsupporta due modelli di allocazione diversi: MFT alloca i buffer di output o il client alloca i buffer di output. Alcune MFP 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, al fine di 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 che possa decodificare qualsiasi frame. Il client chiama ProcessInput per recapitare il primo fotogramma. Si supponga che il primo fotogramma sia un fotogramma delta (illustrato nel diagramma seguente come "P" per il fotogramma previsto). Il decodificatore mantiene questo fotogramma, ma non può produrre alcun output fino a quando non ottiene il fotogramma chiave successivo.
Il client continua a chiamare ProcessInput e raggiunge infine il fotogramma chiave successivo (illustrato nel diagramma successivo come "I" per il frame intercodato). Adesso il decodificatore ha abbastanza fotogrammi per iniziare la decodifica. A questo punto smette di accettare l'input e il client deve chiamare ProcessOutput per ottenere i fotogrammi decodificati.
L'approccio più semplice per il client consiste semplicemente nell'alternare chiamate a ProcessInput e ProcessOutput. Un algoritmo più sofisticato è descritto nell'argomento Modello di elaborazione MFT di base.
Argomenti correlati