Implementazione del controllo frequenza

Questo argomento descrive in che modo gli oggetti pipeline personalizzati possono supportare frequenze di riproduzione variabili, inclusa la riproduzione inversa. Per informazioni sull'uso del controllo frequenza da un'applicazione, vedere Controllo frequenza.

In questo argomento sono incluse 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:

  1. Implementare l'interfaccia IMFGetService .
  2. Supportare il servizio di MF_RATE_CONTROL_SERVICE . Vedere Interfacce del servizio.
  3. Implementare l'interfaccia IMFRateSupport , che ottiene le frequenze di riproduzione supportate dall'oggetto .
  4. 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 velocità 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. L'orologio della presentazione viene invece eseguito a una velocità più veloce o più lenta. Per la riproduzione inversa, l'origine fornisce campioni in ordine inverso, con timestamp decrescenti.

Il parametro fThin del metodo IMFRateControl::SetRate indica se l'origine multimediale deve essere sottile 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 eliminare campioni audio in modalità thinned. A velocità di riproduzione molto elevate, tuttavia, l'origine potrebbe non essere in grado di leggere rapidamente i dati 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 tra la modalità thinned e 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 recapita il primo esempio nel flusso (ovvero, il tempo di presentazione = 0), invia l'evento MEEndOfStream .

Trasformazioni di Media Foundation

In generale, una trasformazione di 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.
  • 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 l'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 meno 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 i campioni, in ordine inverso, senza eliminare campioni o scaricare il 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, il MFT deve essere preparato affinché i timestamp diminuiscano e affinché i fotogrammi differenziali arrivino in ordine inverso. Un decodificatore in genere dovrà 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 cambia la frequenza di riproduzione, l'orologio della presentazione chiama il metodo IMFClockStateSink::OnClockSetRate del sink multimediale.

Controllo frequenza

Ricerca, avanzamento veloce e gioco inverso