Relojes de referencia

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Una función del Administrador de gráficos de filtros es sincronizar todos los filtros del gráfico con el mismo reloj, denominado reloj de referencia.

Cualquier objeto que exponga la interfaz IReferenceClock puede actuar como el reloj de referencia. Un filtro DirectShow puede proporcionar el reloj de referencia, normalmente el representador de audio, que tiene acceso a un temporizador de hardware. Como reserva, el Administrador de gráficos de filtros puede usar la hora del sistema.

Nominalmente, un reloj de referencia mide el tiempo en intervalos de 100 nanosegundos, aunque la precisión real del reloj podría ser menor. Para recuperar la hora actual del reloj, llame al método IReferenceClock::GetTime . La línea base del reloj (la hora desde la que comienza a contar) depende de la implementación, por lo que el valor devuelto por GetTime no es inherentemente significativo. Lo que importa es la diferencia desde el momento en que el gráfico comenzó a ejecutarse.

Aunque la precisión de un reloj de referencia puede variar, se garantiza que las horas devueltas por el método GetTime aumenten de forma monotónica. En otras palabras, los tiempos del reloj nunca volverán atrás. Si un reloj de referencia genera tiempos de reloj desde un origen de hardware y el reloj de hardware salta hacia atrás (por ejemplo, si hay un ajuste al reloj), el método GetTime debe continuar devolviendo la última hora notificada hasta que el reloj de hardware se ponga al día. Para obtener más información, vea CBaseReferenceClock (clase).

Reloj de referencia predeterminado

Filter Graph Manager selecciona automáticamente un reloj de referencia cuando se ejecuta el gráfico. Usa el siguiente algoritmo para seleccionar el reloj:

  • Si la aplicación ha seleccionado un reloj (consulte a continuación), úselo.
  • Si el grafo contiene un filtro de origen activo que admite IReferenceClock, use ese filtro. Para obtener la definición de un origen en directo, consulte Orígenes activos.
  • Si el grafo no contiene ningún filtro de origen activo, use cualquier filtro del gráfico que admita IReferenceClock, empezando por los representadores y trabajando en sentido ascendente. Se prefieren filtros conectados sobre filtros no conectados. (Si el gráfico representa una secuencia de audio, este paso del algoritmo normalmente seleccionará el filtro del representador de audio).
  • Si ningún filtro proporciona un reloj adecuado, use el Reloj de referencia del sistema, que se basa en la hora del sistema.

Establecer el reloj de referencia

Una aplicación puede seleccionar un reloj llamando al método IMediaFilter::SetSyncSource en el Administrador de gráficos de filtros. Debe hacerlo solo si tiene un motivo determinado para preferir otro reloj.

Puede indicar al Administrador de gráficos de filtros que no use un reloj de referencia llamando a SetSyncSource con el valor NULL. Por ejemplo, puede hacerlo para procesar muestras lo antes posible. Para restaurar el reloj de referencia predeterminado, llame al método IFilterGraph::SetDefaultSyncSource en el Administrador de gráficos de filtros.

Cada vez que cambia el reloj de referencia, el Administrador de gráficos de filtros notifica a cada filtro llamando a su método IMediaFilter::SetSyncSource . Las aplicaciones nunca deben llamar a este método en filtros.

Establecer el reloj del gráfico

Hora y relojes en DirectShow