Gestione delle modifiche del flusso
In questo argomento viene descritto come una trasformazione di Media Foundation (MFT) deve gestire le modifiche al formato durante lo streaming.
Importante
Questo argomento non si applica ai codificatori. I codificatori non devono propagare le modifiche al formato come descritto in questo argomento. I codificatori devono accettare solo un tipo di input corrispondente al tipo di output attualmente configurato.
Panoramica delle modifiche al formato
In genere, esistono due motivi per cui un formato può cambiare durante lo streaming.
- Il client potrebbe passare a un flusso con un formato nuovo. Ad esempio, in televisione digitale, questo può verificarsi a causa di una modifica del canale.
- In alcuni formati video, ad esempio H.264, il flusso di bit può segnalare una modifica del formato. Tali modifiche possono includere modifiche alla dominanza dei campi, alla risoluzione video o alle proporzioni dei pixel.
Se il tipo di codifica cambia, il client potrebbe dover rimuovere MFT dalla pipeline e sostituirlo con un altro MFT. Ad esempio, il client potrebbe dover eseguire lo scambio in un nuovo decodificatore. In questo argomento non viene illustrata tale situazione. In questo argomento viene illustrato solo il caso in cui l'MFT corrente può gestire il nuovo formato.
Se il formato cambia, MFT potrebbe richiedere un nuovo tipo di input, un nuovo tipo di output o entrambi.
- Le modifiche apportate al tipo di input vengono avviate dal client. Un MFT non modifica mai il proprio tipo di input.
- Le modifiche apportate al tipo di output vengono avviate da MFT. MFT segnala che richiede un nuovo tipo di output e il client negozia il nuovo tipo di output con MFT.
Di conseguenza, sono possibili tre casi distinti:
- Il client imposta un nuovo tipo di input. MFT utilizza il nuovo formato, senza alcuna modifica al tipo di output.
- Il client imposta un nuovo tipo di input e attiva una modifica nel tipo di output.
- Il tipo di input non cambia, ma MFT rileva una modifica del formato nel flusso di bit, che richiede un nuovo tipo di output.
Implementazione delle modifiche al formato
Nella parte restante di questo argomento viene descritto come il client deve elaborare una modifica del formato e come implementare le modifiche al formato in un MFT.
Tipo di output
Qualsiasi MFT può avviare una modifica al tipo di output, come indicato di seguito:
- Il client chiama IMFTransform::ProcessOutput. Il MFT risponde come segue:
- MFT non produce un esempio di output in ProcessOutput.
- MFT imposta il flag MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE nel membro dwStatus della struttura MFT_OUTPUT_DATA_BUFFER.
- Il metodoProcessOutputrestituisce il codice di errore MF_E_TRANSFORM_STREAM_CHANGE.
- Il client chiama IMFTransform::GetOutputAvailableType. Questo metodo restituisce un set aggiornato di tipi di output.
- Il client chiama SetOutputType per impostare un nuovo tipo di output.
- Il client riprende a chiamare ProcessInput/ProcessOutput.
Tipo di input
Le modifiche apportate al tipo di input vengono avviate dal client, mai dal MFT. Se il tipo di input cambia, potrebbe attivare una modifica al tipo di output.
La sequenza esatta degli eventi dipende dal valore dell'attributo MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE.
Valore | Descrizione |
---|---|
false | Prima che il client imposti un nuovo tipo di input, deve svuotare il MFT. |
VERO | Il client può impostare un nuovo tipo di input senza svuotare MFT. |
Un MFT espone questo attributo tramite il relativo metodo IMFTransform::GetAttributes. Il valore predefinito di questo attributo è FALSE; se MFT non imposta l'attributo, considerare il valore come FALSE.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE è FALSO
- Il client invia il message MFT_MESSAGE_COMMAND_DRAIN.
- Il client svuota L'MFT chiamando IMFTransform::P rocessOutput fino a quando ProcessOutput restituisce MF_E_TRANSFORM_NEED_MORE_INPUT.
- Il client chiama IMFTransform::SetInputType per impostare il nuovo tipo di input.
- MFT convalida il tipo di input. Se il tipo non è valido, SetInputType restituisce MF_E_INVALIDMEDIATYPE o un altro codice di errore. In caso contrario, SetInputType restituisce S_OK.
- Supponendo che il tipo di input sia valido, MFT valuta se anche il tipo di output cambia. In caso contrario, lo streaming continua e non sono necessarie altre azioni.
- Se il tipo di output cambia:
- MFT invalida il tipo di supporto di output corrente e aggiorna l'elenco dei tipi di supporti di output disponibili.
- La chiamata successiva a ProcessOutput restituisce MF_E_TRANSFORM_STREAM_CHANGE, come descritto nella sezione precedente.
- Il client chiama IMFTransform::GetOutputAvailableType per ottenere l'elenco aggiornato dei tipi di output.
- Il client chiama SetOutputType.
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE è TRUE
- Il client chiama IMFTransform::SetInputType per impostare il nuovo tipo di input.
- MFT convalida il tipo di input. Se il tipo non è valido, SetInputType restituisce MF_E_INVALIDMEDIATYPE o un altro codice di errore. In caso contrario, SetInputType restituisce S_OK.
- Supponendo che il tipo di input sia valido, MFT valuta se anche il tipo di output cambia. In caso contrario, lo streaming continua e non sono necessarie altre azioni.
- Prima che il tipo di output venga modificato, MFT deve elaborare tutti gli esempi di input memorizzati nella cache, come indicato di seguito:
- Il MFT non invalida il tipo di output attuale.
- MFT produce il maggior output possibile dagli esempi di input memorizzati nella cache.
- È facoltativo se MFT accetta nuovi esempi di input durante l'elaborazione degli esempi memorizzati nella cache. In tal caso, i nuovi campioni di input useranno il nuovo formato di input, pertanto MFT deve tenere traccia del punto quando il formato è stato modificato.
- Dopo che MFT elabora tutti i campioni ricevuti prima della modifica del tipo di input, il IMFTransform::P rocessOutput restituisce MF_E_TRANSFORM_STREAM_CHANGE.
- MFT invalida il tipo di output corrente e aggiorna l'elenco dei tipi di supporti di output disponibili.
- Il client negozia il nuovo tipo di output, come descritto in precedenza.
Gli MFT asincroni devono restituire il valore TRUE per l'attributo MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE. Quando si usa un MFT asincrono, il client può presupporre che l'attributo MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE sia impostato su TRUE.
Quando MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE è TRUE, la differenza principale è che non è necessario che il client svuoti l'MFT prima di impostare un nuovo tipo di input. Di conseguenza, il tipo di input potrebbe cambiare mentre l'MFT trattiene i campioni di input. È importante che il MFT non si limita a eliminare questi esempi. Inoltre, il tipo di output non può cambiare fino a quando MFT non elabora tutti i dati memorizzati nella cache.
Il paragrafo precedente si applica soprattutto ai decodificatori video, che possono ricevere fotogrammi intercoded fuori dall'ordine temporale e quindi devono memorizzarli nella cache. Se un MFT non memorizza nella cache i campioni di input, lo svuotamento è essenzialmente un no-op. In tal caso, MFT può impostare MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE su false (o lasciare l'attributo non impostato).
Si noti inoltre che ogni MFT deve gestire correttamente le modifiche del formato dopo lo svuotamento. L'attributo MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE indica se l'MFT supporta modifiche al formato senza necessità di svuotare.
Cambia in modalità interlaccia
Le modifiche apportate alla modalità di interlacciamento video sono un caso speciale, perché non invalidano il tipo di supporto corrente. Al contrario, la modalità interlaccia viene specificata per ogni fotogramma video impostando gli attributi nell'esempio multimediale. Un video MFT deve controllare ogni campione di input per la presenza di questi segnaposti.
La modalità di interlacciamento può cambiare quando la dominanza del campo cambia da campo superiore a campo inferiore, o quando il video passa tra immagini progressive e interlacciate.
Per altre informazioni, vedere Flag interlacciati in esempi.
Argomenti correlati