Implementación del control de velocidad

En este tema se describe cómo los objetos de canalización personalizados pueden admitir velocidades de reproducción variables, incluida la reproducción inversa. Para obtener información sobre el uso del control de velocidad de una aplicación, consulte Control de velocidad.

Este tema contiene las siguientes secciones:

Si va a escribir un objeto de canalización de Microsoft Media Foundation (un origen multimedia, una transformación o un receptor multimedia), es posible que tenga que admitir velocidades de reproducción variables. Para ello, implemente las siguientes interfaces:

  1. Implemente la interfaz IMFGetService .
  2. Admita el servicio MF_RATE_CONTROL_SERVICE . (Consulte Interfaces de servicio).
  3. Implemente la interfaz IMFRateSupport , que obtiene las tasas de reproducción admitidas por el objeto .
  4. Implemente la interfaz IMFRateControl , que obtiene o establece la velocidad de reproducción.

Orígenes multimedia

Si un origen de medios admite el control de tasas, debe implementar IMFRateSupport y IMFRateControl. De lo contrario, la sesión multimedia informa de que la velocidad de reproducción mínima y máxima es de 1,0, independientemente de los demás componentes de la canalización.

La velocidad de reproducción no afecta a los tiempos de presentación de las muestras, por lo que el origen multimedia no debe ajustar sus marcas de tiempo. En su lugar, el reloj de presentación se ejecuta a una velocidad más rápida o más lenta. Para la reproducción inversa, el origen entrega muestras en orden inverso, con marcas de tiempo decrecientes.

El parámetro fThin del método IMFRateControl::SetRate indica si el origen multimedia debe fino el contenido. Thinning se aplica principalmente a las secuencias de vídeo. En modo fino, el origen quita fotogramas delta y solo entrega fotogramas clave. A velocidades de reproducción muy altas, el origen podría omitir algunos fotogramas clave (por ejemplo, entregar cada otro fotograma clave).

El origen no tiene que quitar muestras de audio en modo fino. Sin embargo, con velocidades de reproducción muy altas, es posible que el origen no pueda leer datos rápidamente para rellenar las solicitudes de ejemplo de la canalización. En ese caso, es posible que el origen tenga que quitar algunos datos de audio. Si es así, debe intentar entregar muestras de audio cercanas en tiempo a los ejemplos de vídeo (suponiendo que el origen tenga ambos tipos de secuencia).

Cuando una secuencia cambia entre el modo fino y no fino, envía un evento MEStreamThinMode .

Cuando el origen multimedia completa una llamada a SetRate, envía el evento MESourceRateChanged .

Durante la reproducción inversa:

  • El origen multimedia entrega muestras en orden inverso, sin ajustar las marcas de tiempo.
  • Las marcas de tiempo dentro de una secuencia deben disminuir de forma monotónica.
  • El principio del contenido se considera el final de la secuencia. Después de que cada secuencia multimedia entregue la primera muestra de la secuencia (es decir, tiempo de presentación = 0), envía el evento MEEndOfStream .

Transformaciones de Media Foundation

En general, una transformación de Media Foundation (MFT) no necesita compatibilidad explícita para el control de velocidad, a menos que MFT implemente la reproducción inversa no delgada.

Si un MFT no implementa la interfaz IMFRateSupport , la sesión de medios asume lo siguiente:

  • El MFT admite velocidades de reproducción arbitary para la reproducción hacia delante, tanto delgadas como no delgadas.
  • El MFT admite la reproducción inversa delgada, pero no admite la reproducción inversa no delgada.

Si alguna de estas condiciones no es cierta, el MFT debe implementar IMFRateSupport y IMFRateControl.

Reproducción inversa

La sesión multimedia puede reproducirse inverso incluso si una o varias transformaciones de la canalización no admiten explícitamente la reproducción inversa.

Si un MFT no expone la interfaz IMFRateSupport , la sesión multimedia usa el fino para la reproducción inversa, como se indica a continuación:

  • La sesión de medios envía fotogramas clave al MFT de la manera habitual, llamando a IMFTransform::P rocessInput.

  • La sesión multimedia quita los fotogramas delta y los reemplaza por eventos MEStreamTick .

  • Entre cada ejemplo, la sesión multimedia vacía el MFT, para evitar los errores causados por el hecho de que las marcas de tiempo están disminuyendo.

Un ejemplo se considera un fotograma clave si tiene el atributo MFSampleExtension_CleanPoint establecido en TRUE y se considera un marco delta si este atributo es FALSE o no está establecido.

Si el MFT implementa IMFRateSupport, la sesión multimedia usa esta interfaz para detectar si el MFT admite la reproducción inversa no delgada. Si el MFT admite la reproducción inversa no delgada, la sesión multimedia entrega todas las muestras, en orden inverso, sin quitar muestras ni vaciar el MFT.

Si un MFT admite la reproducción inversa no delgada, debe implementar la interfaz IMFRateControl . La sesión multimedia usará esta interfaz para notificar al MFT cuando se produzca la reproducción inversa. En ese momento, el MFT debe estar preparado para que las marcas de tiempo disminuya y para que los fotogramas delta lleguen en orden inverso. Normalmente, un descodificador necesitará almacenar en búfer muestras hasta que haya recibido un grupo completo de imágenes (GOP), descodificará todo el GOP y generará los marcos descodificados en el orden correcto (inverso).

Receptores de medios

Si un receptor multimedia no tiene velocidad, la sesión multimedia supone que el receptor multimedia puede controlar cualquier velocidad de reproducción. El receptor de medios no necesita implementar IMFRateSupport. (Un receptor de medios sin velocidad devuelve la marca MEDIASINK_RATELESS del método IMFMediaSink::GetCharacteristics ).

De lo contrario, un receptor multimedia debe implementar IMFRateSupport si puede controlar las tasas de reproducción distintas de 1.0.

Los receptores de medios no deben implementar IMFRateControl. Cuando cambia la velocidad de reproducción, el reloj de presentación llama al método IMFClockStateSink::OnClockSetRate del receptor multimedia.

Control de frecuencia

Búsqueda, avance rápido y juego inverso