Mft hardware

Nota

Questo argomento si applica a Windows 7 o versione successiva.

 

In questo argomento viene descritto come scrivere una trasformazione di Media Foundation (MFT) che funge da proxy per un codificatore hardware, un decodificatore o un processore di segnali digitali.This topic describe how to write a Media Foundation transform (MFT) that funge da proxy to a hardware encoder, decoder, or digital signal processor (DSP).

Importante

Se un codec hardware usa il driver di classe multimediale AVStream, non richiede un MFT personalizzato. Media Foundation fornisce un proxy AVStream a questo scopo. Le informazioni contenute in questo argomento si applicano solo nel caso speciale in cui il codec hardware non usa AVStream. Per altre informazioni, vedere Supporto codec hardware in AVStream.

 

In questo argomento sono incluse le sezioni seguenti:

Introduzione

Qualsiasi codec hardware non basato su AVStream deve fornire il proprio MFT per fungere da proxy al driver. Un codec hardware può incorporare diversi blocchi funzionali distinti:

  • Codificatore
  • Decodificatore
  • Ridimensionamento/conversione del formato dei fotogrammi

Ognuna di queste funzioni deve essere gestita da un MFT separato. Un hardware MFT non deve mai fungere da "transcoder" multiuso. In alternativa, inserire le funzioni di codifica in un codificatore MFT e decodificare le funzioni in un decodificatore MFT. Se l'hardware offre la scalabilità dei fotogrammi e le conversioni di formato, inserire tali funzioni in un processore video separato, registrato nella categoria MFT_CATEGORY_VIDEO_PROCESSOR . Se l'hardware non supporta il ridimensionamento dei fotogrammi o la conversione del formato, Media Foundation fornisce un processore video software.

Le MGT hardware hanno i requisiti generali seguenti:

  • Le MFP hardware devono usare il nuovo modello di elaborazione asincrona, come descritto in MGT asincroni.
  • Le funzioni multifunzione hardware devono supportare le modifiche al formato dinamico, come descritto in Modifiche al formato dinamico.

Attributi MFT hardware

Un hardware MFT deve implementare i metodi seguenti correlati agli attributi:

Quando mft viene creato per la prima volta, deve impostare gli attributi seguenti nel proprio archivio attributi globale, ovvero l'archivio attributi restituito da GetAttributes:

Attributo Descrizione
MF_TRANSFORM_ASYNC Deve essere impostato su TRUE. Indica che MFT esegue l'elaborazione asincrona.
MFT_ENUM_HARDWARE_URL_Attribute Contiene il collegamento simbolico per il dispositivo hardware.
Il caricatore della topologia usa la presenza di questo attributo per verificare se un MFT rappresenta un dispositivo hardware.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE Deve essere impostato su TRUE. Indica che MFT supporta le modifiche al formato dinamico.

 

Sequenza handshake hardware

Se due MFC rappresentano lo stesso dispositivo fisico, possono scambiare dati all'interno dell'hardware, ad esempio tramite un bus hardware. Non è necessario copiare i dati nella memoria di sistema e quindi tornare al dispositivo.

Nel diagramma seguente, le MFP con etichetta "A" e "B" rappresentano blocchi funzionali all'interno dello stesso hardware. Ad esempio, in uno scenario di transcodifica, "A" potrebbe rappresentare un decodificatore hardware e "B" potrebbe rappresentare un codificatore hardware. Il flusso di dati tra "A" e "B" si verifica all'interno dell'hardware. MFT etichettato "C" è un software MFT. Il flusso di dati da "B" a "C" usa la memoria di sistema.

diagramma che mostra le caselle con etichetta da a c e un codec hardware: un punto a b e il codec, il codec punta a b e b punta a c

Per stabilire una connessione hardware, i due MGT hardware devono usare un canale di comunicazione privato. Questa connessione viene stabilita durante la negoziazione del formato, prima che i tipi di supporti vengano impostati e prima della prima chiamata a ProcessInput. Il processo di connessione funziona come segue:

  1. Il caricatore della topologia controlla la presenza dell'attributo MFT_ENUM_HARDWARE_URL_Attribute entrambe le MFC. Si noti che non esamina il valore di questo attributo.

  2. Se MFT_ENUM_HARDWARE_URL_Attribute è presente in entrambe le reti multifunzione, il caricatore della topologia esegue le operazioni seguenti:

    1. Il caricatore della topologia chiama IMFTransform::GetOutputStreamAttributes nel MFT (A) upstream. Questo metodo restituisce un puntatore IMFAttributes . Lasciare che questo puntatore sia indicato da pUpstream.
    2. Il caricatore della topologia chiama IMFTransform::GetInputStreamAttributes nel MFT (B) downstream. Questa chiamata restituisce anche un puntatore IMFAttributes . Lasciare che questo puntatore sia indicato pDownstream.
    3. Il caricatore della topologia imposta l'attributo MFT_CONNECTED_STREAM_ATTRIBUTE su pDownstream chiamando IMFAttributes::SetUnknown. Il valore dell'attributo è il puntatore pUpstream .
    4. Il caricatore della topologia imposta l'attributo MFT_CONNECTED_TO_HW_STREAM su TRUE sia su pDownstream che su pUpstream.
  3. A questo punto, il MFT a valle ha un puntatore all'archivio attributi MFT upstream, come illustrato nel diagramma seguente.

    diagramma con ogni mfts che punta al flusso, ogni flusso che punta al relativo archivio e l'archivio di input con una linea tratteggiata all'archivio di output

    Nota

    Per maggiore chiarezza, questo diagramma mostra i flussi e l'attributo archivia come oggetti distinti, ma non è necessario per l'implementazione.

     

  4. Il MFT downstream usa il puntatore IMFAttributes per stabilire un canale di comunicazione privato con MFT upstream. Poiché il canale è privato, il meccanismo esatto è definito dall'implementazione. Ad esempio, MFT potrebbe eseguire una query per un'interfaccia COM privata.

Durante il passaggio 4, il MFT downstream deve verificare se i due MFT condividono lo stesso dispositivo fisico. In caso contrario, è necessario eseguire il fallback all'uso della memoria di sistema per il trasporto dati. In questo modo, MFT può funzionare correttamente con le MFT software e altri dispositivi hardware.

Se l'handshake ha esito positivo e i due MFP condividono un canale dati privato, non usano il modello di elaborazione dati standard (descritto nella sezione successiva) nel punto di connessione. In particolare, MFT downstream non invia eventi METransformNeedInput ; per altri dettagli, vedere la sezione successiva di questo argomento.

Elaborazione dei dati

Quando un hardware MFT usa la memoria di sistema per il trasporto dati, il processo funziona come segue:

  1. Per richiedere più input, MFT invia un evento METransformNeedInput .
  2. L'evento METransformNeedInput fa sì che la pipeline chiami IMFTransform::P rocessInput.
  3. Quando MFT contiene dati di output, MFT invia un evento METransformHaveOutput .
  4. L'evento METransformHaveOutput fa sì che la pipeline chiami IMFTransform::P rocessOutput.

Per informazioni dettagliate, vedere Mft asincroni.

Se MFT usa un canale hardware, tuttavia, non invia questi eventi al punto di connessione hardware, perché tutto il trasferimento dei dati avviene internamente all'interno dell'hardware. Pertanto, la pipeline non chiama ProcessInput o ProcessOutput nel punto di connessione.

Si consideri ad esempio il primo diagramma di questo argomento. Data questa configurazione, l'elaborazione dei dati viene eseguita nel modo seguente:

  1. "A" invia METransformNeedInput per richiedere i dati.
  2. La pipeline chiama ProcessInput in "A".
  3. "A" e "B" elaborano i dati nell'hardware.
  4. Al termine dell'elaborazione, "B" invia un evento METransformHaveOutput .
  5. La pipeline chiama ProcessOutput su "B".

Decodificatore/codificatore associato

Se un decodificatore e un codificatore si trovano nello stesso chip hardware, può essere preferibile usarli insieme durante la transcodifica. Ovvero, se ne seleziona una, l'altra deve essere selezionata nella pipeline di transcodifica. Per garantire che vengano scelti codec hardware corrispondenti, entrambi i codec MFT devono offrire un tipo di supporto personalizzato. Per creare un tipo di supporto personalizzato:

  • Impostare l'attributo MF_MT_MAJOR_TYPE su MFMediaType_Audio o MFMediaType_Video, in base alle esigenze.
  • Impostare l'attributo MF_MT_SUBTYPE su un valore GUID personalizzato.

Altri attributi di tipo sono facoltativi. Il decodificatore restituisce il tipo personalizzato dal relativo IMFTransform::GetOutputAvailableType e il codificatore restituisce il tipo personalizzato dal metodo IMFTransform::GetInputAvailableType . In entrambi i casi, il tipo personalizzato deve essere la prima voce nell'elenco (dwTypeIndex = 0).

Per usare i codec software, il codec deve restituire almeno un formato standard, ad esempio NV12 per il video. I formati standard devono essere visualizzati dopo il tipo personalizzato (dwTypeIndex> 0). Se i due codec devono essere sempre associati e non possono interagire con i codec software, le MFC devono restituire solo il formato personalizzato e non restituire formati standard.

Nota

Se un decodificatore non restituisce formati standard, non può essere usato per la riproduzione con il renderer video avanzato. In tal caso, deve essere registrato come decodificatore transcodificabile. Vedere Decodificatori solo transcodificati.

 

Scrittura di un MFT personalizzato

Implementazione di un codec MFT

Trasformazioni di Media Foundation