Compartir a través de


QueryAccept (bajada)

[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.

Este mecanismo permite que un pin de salida propondrá un nuevo formato al mismo nivel de bajada. El nuevo formato no debe requerir un tamaño de búfer mayor. El pin de salida hace lo siguiente:

  1. Llama a IPin::QueryAccept o IPinConnection::D ynamicQueryAccept en el pin de bajada, para comprobar si el otro pin puede aceptar el nuevo tipo de medio (vea ilustración, paso A).

  2. Si el valor devuelto del paso 1 es S_OK, el pin adjunta el tipo de medio al ejemplo siguiente. Para ello, primero llama a IMemAllocator::GetBuffer para obtener el ejemplo (B). A continuación, llama a IMediaSample::SetMediaType para adjuntar el tipo de medio a ese ejemplo (C). Al adjuntar el tipo de medio al ejemplo, el filtro indica que el formato ha cambiado, empezando por ese ejemplo.

  3. El pin entrega la muestra (D).

  4. Cuando el filtro de bajada recibe el ejemplo, llama a IMediaSample::GetMediaType para recuperar el nuevo tipo de medio.

    queryaccept (bajada)

Todos los patillas admiten el QueryAccept método . Sin embargo, este método es ligeramente ambiguo, ya que un valor devuelto de S_OK no siempre garantiza que se pueda cambiar el formato mientras el gráfico está activo. Algunos filtros pueden devolver S_OK pero rechazar el cambio si el gráfico está activo. El método DynamicQueryAccept , que es compatible con algunos patillas de entrada, define explícitamente S_OK para que el pin pueda cambiar los formatos mientras están activos. Si un pin de entrada admite la interfaz IPinConnection , debe llamar a DynamicQueryAccept en lugar de QueryAccept.

En la mayoría de los casos, este mecanismo no permite cambios drásticos en el formato, como cambiar la profundidad del bit. Una situación en la que se puede usar es cuando un descodificador de vídeo cambia las paletas. Los detalles básicos del formato permanecen iguales, como las dimensiones de imagen y la profundidad de bits, pero el nuevo tipo de medio tiene un conjunto diferente de entradas de paleta.

Nota de implementación

En las clases base de DirectShow, CBasePin::QueryAccept llama al método CheckMediaType , que también se llama durante la conexión de pin inicial. En el caso de un filtro de transformación, el método CheckMediaType del pin de entrada siempre debe comprobar si el pin de salida está conectado y, si es así, si el tipo de medio de entrada es compatible con el tipo de medio de salida. Por lo tanto, es probable que esta implementación sea válida para QueryAccept. Si no es así, debe invalidar QueryAccept para realizar comprobaciones adicionales que sean necesarias. Además, tenga en cuenta que la clase CTransformFilter encapsula esta lógica dentro de los métodos CheckInputType y CheckTransform . La clase CTransInPlaceFilter , por otro lado, siempre llama QueryAccept a en el siguiente filtro ascendente o descendente.

El método CBaseInputPin::Receive busca un tipo de medio en el ejemplo entrante y, si hay alguno, llama a CheckMediaType. Sin embargo, no actualiza el miembro m_mt del pin, que contiene el tipo de medio actual. Cuando el filtro procesa el ejemplo, debe comprobar el ejemplo de un tipo de medio. Si hay un nuevo tipo, probablemente tendrá que almacenarlo, ya sea llamando a SetMediaType en el pin o estableciendo el valor de m_mt directamente. Por otro lado, la clase CVideoTransformFilter , diseñada para filtros de transformación de vídeo, almacena el tipo de medio cuando cambia. Para obtener más información, consulte el código fuente de CVideoTransformFilter::Receive en la biblioteca de clases base de DirectShow.

En algunos casos, es posible que simplemente pase la QueryAccept llamada de bajada y, a continuación, adjunte el tipo de medio al ejemplo de salida y deje que el filtro de bajada controle el cambio de formato.