Relógios de referência

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Uma função do Gerenciador de Grafo de Filtro é sincronizar todos os filtros no grafo com o mesmo relógio, chamado de relógio de referência.

Qualquer objeto que exponha a interface IReferenceClock pode atuar como o relógio de referência. O relógio de referência pode ser fornecido por um filtro DirectShow, normalmente o renderizador de áudio, que tem acesso a um temporizador de hardware. Como um fallback, o Gerenciador de Grafo de Filtro pode usar a hora do sistema.

Nominalmente, um relógio de referência mede o tempo em intervalos de 100 nanossegundos, embora a precisão real do relógio possa ser menor. Para recuperar a hora atual do relógio, chame o método IReferenceClock::GetTime . A linha de base do relógio, a hora da qual ele começa a contar, depende da implementação, portanto, o valor retornado por GetTime não é inerentemente significativo. O que importa é o delta de quando o grafo começou a ser executado.

Embora a precisão de um relógio de referência possa variar, os tempos retornados pelo método GetTime têm a garantia de aumentar monotonicamente. Em outras palavras, os horários do relógio nunca voltarão. Se um relógio de referência estiver gerando horários de relógio de uma fonte de hardware e o relógio de hardware saltar para trás (por exemplo, se houver um ajuste no relógio), o método GetTime deverá continuar a retornar a última hora relatada até que o relógio de hardware seja atualizado. Para obter mais informações, consulte Classe CBaseReferenceClock.

Relógio de referência padrão

O Gerenciador de Grafo de Filtro seleciona automaticamente um relógio de referência quando o grafo é executado. Ele usa o seguinte algoritmo para selecionar o relógio:

  • Se o aplicativo tiver selecionado um relógio (veja abaixo), use esse relógio.
  • Se o grafo contiver um filtro de fonte dinâmica que dê suporte a IReferenceClock, use esse filtro. Para obter a definição de uma fonte dinâmica, consulte Fontes dinâmicas.
  • Se o grafo NÃO contiver filtros de fonte dinâmica, use qualquer filtro no grafo que dê suporte a IReferenceClock, começando pelos renderizadores e trabalhando upstream. Prefira filtros conectados em vez de filtros não conectados. (Se o grafo estiver renderizando um fluxo de áudio, essa etapa no algoritmo normalmente selecionará o filtro do renderizador de áudio.)
  • Se nenhum filtro fornecer um relógio adequado, use o Relógio de Referência do Sistema, que se baseia na hora do sistema.

Definindo o relógio de referência

Um aplicativo pode selecionar um relógio chamando o método IMediaFilter::SetSyncSource no Gerenciador do Gráfico de Filtros. Você só deve fazer isso se tiver um motivo específico para preferir outro relógio.

Você pode instruir o Gerenciador de Grafo de Filtro a não usar um relógio de referência chamando SetSyncSource com o valor NULL. Por exemplo, você pode fazer isso para processar amostras o mais rápido possível. Para restaurar o relógio de referência padrão, chame o método IFilterGraph::SetDefaultSyncSource no Gerenciador de Grafo de Filtro.

Sempre que o relógio de referência é alterado, o Gerenciador do Gráfico de Filtro notifica cada filtro chamando seu método IMediaFilter::SetSyncSource . Os aplicativos nunca devem chamar esse método em filtros.

Definindo o relógio do grafo

Hora e relógios no DirectShow