Orologio presentazione
L'orologio della presentazione è un oggetto che genera l'ora dell'orologio per una presentazione. L'ora segnalata dall'orologio della presentazione viene chiamata ora di presentazione. Tutti i flussi di una presentazione vengono sincronizzati con l'ora di presentazione. L'orologio della presentazione espone le interfacce seguenti.
Interfaccia | Descrizione |
---|---|
IMFPresentationClock | Interfaccia primaria per l'uso dell'orologio di presentazione. |
IMFRateControl | Controlla la frequenza di clock. |
IMFTimer | Fornisce un callback timer. |
IMFShutdown | Arresta l'orologio della presentazione. |
I sink multimediali usano l'ora di presentazione per pianificare quando eseguire il rendering degli esempi. Ogni volta che un sink multimediale riceve un nuovo campione, ottiene il timestamp dall'esempio ed esegue il rendering dell'esempio al momento indicato o il più vicino possibile. Poiché tutti i sink multimediali in una topologia condividono lo stesso orologio di presentazione, vengono sincronizzati più flussi ,ad esempio audio e video. Le origini multimediali e le trasformazioni non usano l'orologio della presentazione, perché non pianificano quando recapitare campioni. Vengono invece prodotti campioni ogni volta che la pipeline richiede un nuovo esempio.
Se si usa la sessione multimediale per la riproduzione, la sessione multimediale gestisce tutti i dettagli della creazione dell'orologio della presentazione, la selezione di un'origine ora e la notifica dei sink multimediali. L'applicazione potrebbe usare l'orologio della presentazione per ottenere l'ora di presentazione corrente durante la riproduzione, ma in caso contrario non chiamerà alcun metodo sull'orologio della presentazione.
Clock Time and Clock States
Per ottenere l'ora dell'orologio più recente dall'orologio della presentazione, chiamare IMFPresentationClock::GetTime. I tempi di clock sono sempre in unità di 100 nanosecondi, quindi un secondo è 10.000.000 (10^7). Corrisponde a una frequenza di 10 MHz.
L'orologio della presentazione ha tre stati: In esecuzione, sospeso e arrestato.
- Per eseguire l'orologio, chiamare IMFPresentationClock::Start. Il metodo Start specifica l'ora di inizio dell'orologio. Mentre l'orologio è in esecuzione, l'ora dell'orologio viene incrementata dall'ora di inizio, alla frequenza di clock corrente.
- Per sospendere l'orologio, chiamare IMFPresentationClock::P ause. Mentre l'orologio è sospeso, l'ora dell'orologio non avanza e GetTime restituisce l'ora in cui l'orologio è stato sospeso.
- Per arrestare l'orologio, chiamare IMFPresentationClock::Stop. Quando l'orologio viene arrestato, l'ora dell'orologio non avanza e GetTime restituisce zero.
Per impostazione predefinita, l'orologio avanza a una velocità di 1,0, ovvero 1 tick per 100 nanosecondi. Per modificare la frequenza di avanzamento dell'orologio, eseguire una query sull'orologio della presentazione per l'interfaccia IMFRateControl e chiamare IMFRateControl::SetRate.
Gli oggetti possono ricevere notifiche di modifiche dello stato (incluse le modifiche alla frequenza) dall'orologio della presentazione. Per ricevere notifiche, implementare l'interfaccia IMFClockStateSink e chiamare IMFPresentationClock::AddClockStateSink sull'orologio della presentazione. Prima di arrestare, chiamare IMFPresentationClock::RemoveClockStateSink per annullare la registrazione dell'oggetto. I sink multimediali usano questo meccanismo per ricevere notifiche dall'orologio.
Orari di presentazione
Un sink multimediale tenta di pianificare ogni esempio in modo che il rendering dell'esempio venga eseguito al momento corretto o il più vicino possibile all'ora corretta. Si applicano le definizioni seguenti:
- Ora di presentazione. Ora in cui deve essere eseguito il rendering di un esempio. Il tempo viene assegnato in unità di 100 nanosecondi.
- Tempo multimediale. Ora relativa all'inizio del contenuto. Ad esempio, se un file video è lungo 10 secondi, il punto a metà del file ha un tempo multimediale di 5 secondi.
- Timestamp. Ora contrassegnata su un campione multimediale. Per ottenere il timestamp, chiamare IMFSample::GetSampleTime. Quando un'origine multimediale produce un campione, imposta il timestamp uguale al tempo multimediale. La sessione multimediale converte il timestamp in ora di presentazione.
Per impostazione predefinita, il tempo multimediale e l'ora di presentazione sono uguali, ad esempio se un fotogramma video viene visualizzato 5 secondi nel file di origine, il tempo multimediale e l'ora di presentazione sono entrambi di 5 secondi. Se si usa l'origine sequencer, il modello di temporizzazione è leggermente più complicato, per consentire transizioni uniformi tra segmenti. Per altre informazioni sul modello di temporizzazione dell'origine sequencer, vedere Sequence Presentation Times.
L'origine multimediale imposta sempre il timestamp uguale al tempo multimediale. Se l'ora della presentazione non è allineata al tempo multimediale, la sessione multimediale converte i timestamp negli esempi multimediali. Quando il sink riceve un campione, il timestamp dell'esempio è stato convertito in ora di presentazione. Il sink pianifica l'esempio rispetto all'ora corrente dell'orologio della presentazione. I sink senza frequenza sono un'eccezione, perché ignorano l'orologio della presentazione.
Se l'applicazione cerca una nuova posizione, la sessione multimediale riavvia l'orologio della presentazione all'ora di ricerca specificata. Ad esempio, se l'applicazione cerca la posizione di 5 secondi nel file, la sessione multimediale avvia l'orologio a 5 secondi. L'origine multimediale potrebbe recapitare campioni con un timestamp leggermente precedente se il tempo di ricerca non rientra in un limite di fotogrammi chiave. Questa operazione è necessaria in modo che i decodificatori possano decodificare tutti i fotogrammi. La sessione multimediale elimina o taglia i campioni prima che raggiungano i sink multimediali, in modo da corrispondere al tempo di ricerca richiesto. Ad esempio, se il tempo di ricerca è di 5 secondi, il primo campione audio potrebbe iniziare a 4,5 secondi. La sessione multimediale taglia i primi 0,5 secondi dal primo campione audio decodificato.
Creazione dell'orologio della presentazione
Per creare l'orologio della presentazione, chiamare MFCreatePresentationClock. Per arrestare l'orologio, eseguire una query per l'interfaccia IMFShutdown e chiamare IMFShutdown::Shutdown. Il chiamante di MFCreatePresentationClock è responsabile della chiamata di Shutdown; nella maggior parte dei casi, si tratta della sessione multimediale anziché dell'applicazione.
Origini ora presentazione
Nonostante il nome, l'orologio della presentazione non implementa effettivamente un orologio. Ottiene invece l'ora dell'orologio da un altro oggetto, denominato origine ora di presentazione. L'origine dell'ora può essere qualsiasi oggetto che genera tick di orologio accurati ed espone l'interfaccia IMFPresentationTimeSource . Questo processo viene illustrato nella figura seguente.
Quando l'orologio della presentazione viene creato per la prima volta, non ha un'origine temporale. Per impostare l'origine ora, chiamare IMFPresentationClock::SetTimeSource con un puntatore all'interfaccia IMFPresentationTimeSource dell'origine temporale. Un'origine ora supporta gli stessi stati dell'orologio della presentazione (in esecuzione, sospeso e arrestato) e deve implementare l'interfaccia IMFClockStateSink . L'orologio della presentazione usa questa interfaccia per notificare all'origine ora quando modificare lo stato. In questo modo, l'origine dell'ora fornisce i tick dell'orologio, ma l'orologio della presentazione avvia le modifiche dello stato nell'orologio.
Alcuni sink multimediali hanno accesso a un orologio accurato e quindi espongono l'interfaccia IMFPresentationTimeSource . In particolare, il renderer audio può usare la frequenza della scheda audio come orologio. Nella riproduzione audio, è utile che il renderer audio funga da origine temporale, in modo che il video venga sincronizzato con la velocità di riproduzione audio. In genere si ottengono risultati migliori rispetto al tentativo di associare l'audio a un orologio esterno.
Media Foundation fornisce anche un'origine dell'ora di presentazione basata sull'orologio di sistema. Per creare questo oggetto, chiamare MFCreateSystemTimeSource. L'origine ora di sistema può essere usata quando nessun sink multimediale fornisce un'origine ora.
In generale, un sink multimediale deve utilizzare l'orologio della presentazione fornito, indipendentemente dall'origine dell'ora utilizzata dall'orologio della presentazione. Questa regola si applica anche quando un sink multimediale implementa IMFPresentationTimeSource. Se l'orologio della presentazione utilizza un'altra origine temporale, il sink multimediale deve seguire tale origine temporale, non il proprio orologio interno.
Esistono due situazioni in cui un sink multimediale non seguirà l'orologio della presentazione:
Alcuni sink multimediali sono senza frequenza. Se un sink multimediale è senza frequenza, utilizza campioni il più rapidamente possibile, senza pianificarli in base all'orologio della presentazione. In genere, i sink senza frequenza scrivono dati in un file, quindi è consigliabile completare l'operazione il più rapidamente possibile. Un sink senza frequenza restituisce il flag MEDIASINK_RATELESS nel metodo IMFMediaSink::GetCharacteristics . Quando tutti i sink in una topologia sono senza frequenza, la sessione multimediale esegue il push dei dati attraverso la pipeline il più rapidamente possibile.
Alcuni sink multimediali non possono corrispondere alle frequenze con un'origine temporale diversa da se stessa. In tal caso, il sink restituisce il flag MEDIASINK_CANNOT_MATCH_CLOCK nel metodo GetCharacteristics . La pipeline può comunque usare un'altra origine temporale, ma i risultati saranno inferiori a quelli ottimali. Il sink probabilmente sarà indietro e causerà glitch durante la riproduzione.
Argomenti correlati