Implementazione del controllo frequenza
Questo argomento descrive in che modo gli oggetti pipeline personalizzati possono supportare le frequenze di riproduzione variabili, inclusa la riproduzione inversa. Per informazioni sull'uso del controllo frequenza da un'applicazione, vedere Controllo frequenza.
Questo argomento include le sezioni seguenti:
Se si scrive un oggetto pipeline di Microsoft Media Foundation (un'origine multimediale, una trasformazione o un sink multimediale), potrebbe essere necessario supportare le frequenze di riproduzione variabili. A tale scopo, implementare le interfacce seguenti:
- Implementare l'interfaccia IMFGetService .
- Supportare il servizio MF_RATE_CONTROL_SERVICE . (Vedere Interfacce servizio.
- Implementare l'interfaccia IMFRateSupport , che ottiene le frequenze di riproduzione supportate dall'oggetto .
- Implementare l'interfaccia IMFRateControl , che ottiene o imposta la frequenza di riproduzione.
Origini multimediali
Se un'origine multimediale supporta il controllo della frequenza, deve implementare sia IMFRateSupport che IMFRateControl. In caso contrario, la sessione multimediale segnala che la frequenza di riproduzione minima e massima è 1,0, indipendentemente dagli altri componenti presenti nella pipeline.
La frequenza di riproduzione non influisce sui tempi di presentazione dei campioni, quindi l'origine multimediale non deve modificare i timestamp. Al contrario, l'orologio della presentazione viene eseguito a una velocità più veloce o più lenta. Per la riproduzione inversa, l'origine fornisce campioni in ordine inverso, con timestamp decrescente.
Il parametro fThin del metodo IMFRateControl::SetRate indica se l'origine multimediale deve sfoltire il contenuto. Il thinning si applica principalmente ai flussi video. In modalità thinned, l'origine elimina i fotogrammi differenziali e distribuisce solo fotogrammi chiave. A velocità di riproduzione molto elevate, l'origine potrebbe ignorare alcuni fotogrammi chiave (ad esempio, recapitare ogni altro fotogramma chiave).
L'origine non deve rilasciare campioni audio in modalità thinned. A velocità di riproduzione molto elevate, tuttavia, l'origine potrebbe non essere in grado di leggere i dati abbastanza velocemente per riempire le richieste di esempio della pipeline. In tal caso, l'origine potrebbe dover eliminare alcuni dati audio. In tal caso, dovrebbe tentare di distribuire campioni audio vicini nel tempo agli esempi video (presupponendo che l'origine abbia entrambi i tipi di flusso).
Quando un flusso passa dalla modalità thinned a quella non thinned, invia un evento MEStreamThinMode .
Quando l'origine multimediale completa una chiamata a SetRate, invia l'evento MESourceRateChanged .
Durante la riproduzione inversa:
- L'origine multimediale fornisce campioni in ordine inverso, senza regolare i timestamp.
- I timestamp all'interno di un flusso devono diminuire in modo monotonico.
- L'inizio del contenuto viene considerato la fine del flusso. Dopo che ogni flusso multimediale ha recapitato il primo esempio nel flusso , ovvero il tempo di presentazione = 0, invia l'evento MEEndOfStream .
Trasformazioni di Media Foundation
In generale, una trasformazione Media Foundation (MFT) non richiede il supporto esplicito per il controllo della frequenza, a meno che MFT non implementi la riproduzione inversa non sottile.
Se un MFT non implementa l'interfaccia IMFRateSupport , la sessione multimediale presuppone quanto segue:
- MFT supporta le frequenze di riproduzione arbitary per la riproduzione in avanti, sia thinned che non thinned.The MFT supports arbitary playback rate for forward playback, both thinned and non-thinned.
- MFT supporta la riproduzione inversa sottile, ma non supporta la riproduzione inversa non sottile.
Se una di queste condizioni non è vera, il MFT deve implementare IMFRateSupport e IMFRateControl.
Riproduzione inversa
La sessione multimediale può essere riprodotta inversa anche se una o più trasformazioni nella pipeline non supportano in modo esplicito la riproduzione inversa.
Se un MFT non espone l'interfaccia IMFRateSupport, la sessione multimediale usa il thinning per la riproduzione inversa, come indicato di seguito:
La sessione multimediale invia fotogrammi chiave al MFT nel modo consueto, chiamando IMFTransform::P rocessInput.
La sessione multimediale elimina i fotogrammi differenziali e li sostituisce con gli eventi MEStreamTick .
Tra ogni esempio, la sessione multimediale scarica il MFT, per evitare eventuali errori causati dal fatto che i timestamp diminuiscono.
Un esempio viene considerato un fotogramma chiave se ha l'attributo MFSampleExtension_CleanPoint impostato su TRUE e viene considerato un frame differenziale se questo attributo è FALSE o non è impostato.
Se MFT implementa IMFRateSupport, la sessione multimediale usa questa interfaccia per determinare se MFT supporta la riproduzione inversa non sottile. Se MFT supporta la riproduzione inversa non sottile, la sessione multimediale fornisce tutti gli esempi, in ordine inverso, senza eliminare campioni o scaricare MFT.
Se un MFT supporta la riproduzione inversa non sottile, deve implementare l'interfaccia IMFRateControl . La sessione multimediale userà questa interfaccia per notificare a MFT quando si verifica la riproduzione inversa. A questo punto, l'MFT deve essere preparato affinché i timestamp diminuiscano e affinché i fotogrammi differenziali arrivino in ordine inverso. Un decodificatore dovrà in genere memorizzare nel buffer i campioni fino a quando non ha ricevuto un intero gruppo di immagini (GOP), quindi decodificare l'intero GOP e restituire i fotogrammi decodificati nell'ordine corretto (inverso).
Sink multimediali
Se un sink multimediale è senza frequenza, la sessione multimediale presuppone che il sink multimediale possa gestire qualsiasi frequenza di riproduzione. Il sink multimediale non deve implementare IMFRateSupport. Un sink multimediale senza frequenza restituisce il flag MEDIASINK_RATELESS dal Metodo IMFMediaSink::GetCharacteristics .
In caso contrario, un sink multimediale deve implementare IMFRateSupport se può gestire le frequenze di riproduzione diverse da 1,0.
I sink multimediali non devono implementare IMFRateControl. Quando la frequenza di riproduzione cambia, l'orologio della presentazione chiama il metodo IMFClockStateSink::OnClockSetRate del sink multimediale.
Argomenti correlati