Procesamiento centrado en filtros
Si un filtro usa el procesamiento centrado en filtros, AVStream llama de forma predeterminada a la rutina de devolución de llamada AVStrMiniFilterProcess proporcionada por minidriver cuando hay fotogramas de datos disponibles en cada instancia de pin. Los minidrivers pueden modificar este comportamiento predeterminado estableciendo el miembro Flags de la estructura KSPIN_DESCRIPTOR_EX .
Para implementar el procesamiento centrado en filtros, proporcione un puntero a una rutina de devolución de llamada AVStrMiniFilterProcess proporcionada por minidriver en el miembro Process de la estructura KSFILTER_DISPATCH . Establezca el miembro Process de KSPIN_DISPATCH en NULL.
AVStream llama a AVStrMiniFilterProcess solo cuando se cumplen todas las condiciones siguientes:
Los marcos están disponibles en patillas que requieren fotogramas para que se produzca el procesamiento. Los minidrivers pueden modificar el comportamiento de procesamiento estableciendo marcas en el miembro Flags de KSPIN_DESCRIPTOR_EX. Preste especial atención a las combinaciones de las marcas mutuamente excluyentes KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING y KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING. El minidriver también puede modificar el conjunto de patillas que requieren fotogramas mediante el uso de las rutinas KsPinAttachAndGate o KsPinAttachOrGate .
El número de instancias de patilla es igual o mayor que el miembro InstancesNecessary de la estructura KSPIN_DESCRIPTOR_EX . El miembro ClientState de la estructura KSPIN especifica el enumerador KSSTATE concreto en el que se establece actualmente el pin. Una vez que se haya cumplido InstancesNecessary , las patillas adicionales en el estado KSSTATE_STOP no impedirán el procesamiento de filtros.
Se cumple el número necesario de instancias de patillas (según lo especificado por el miembro InstancesNecessary de la estructura KSPIN_DESCRIPTOR_EX .
El minidriver no ha cerrado la puerta de control de proceso del filtro mediante las funciones KSGATEXxx .
En la rutina de devolución de llamada AVStrMiniFilterProcess , el minidriver recibe un puntero a una matriz de estructuras KSPROCESSPIN_INDEXENTRY . AVStream ordena la matriz de estructuras de KSPROCESSPIN_INDEXENTRY por identificador de patilla.
En los ejemplos de código siguientes se muestra cómo usar las estructuras de patillas de proceso. El código se toma del ejemplo avStream Filter-Centric simulated Capture Driver (Avssamp), que muestra cómo escribir un controlador de captura centrado en filtros. El código fuente y una descripción de este ejemplo se incluyen en la descarga de ejemplos del Kit de controladores de Windows.
El minidriver recibe una matriz de estructuras de KSPROCESSPIN_INDEXENTRY en su distribución de procesos de filtro. En este ejemplo, el minidriver extrae la primera estructura KSPROCESSPIN de la estructura KSPROCESSPIN_INDEXENTRY del índice VIDEO_PIN_ID:
NTSTATUS
CCaptureFilter::
Process (
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
)
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}
El minidriver no debe hacer referencia a ProcessPinsIndex [n]. Ancla [ 0] antes de comprobar que el miembro Count de ProcessPinsIndex [n] es al menos uno , o que el miembro InstancesNecessary de la estructura KSPIN_DESCRIPTOR_EX contenida en Pins [0] es al menos uno. (Si el último es true, se garantiza que existe la patilla).
A continuación, para especificar el pin en el que se van a capturar fotogramas, la rutina de devolución de llamada AVStrMiniFilterProcess pasa un puntero a una estructura KSPROCESSPIN a CaptureFrame, una rutina de captura proporcionada por el proveedor:
VidCapPin -> CaptureFrame (VideoPin, m_Tick);
Después, la rutina de captura puede copiar en o desde el miembro Data de la estructura KSPROCESSPIN. También puede actualizar los miembros BytesUsed y Terminate de esta estructura, como en el ejemplo siguiente:
RtlCopyMemory ( ProcessPin -> Data,
m_SynthesisBuffer,
m_VideoInfoHeader -> bmiHeader.biSizeImage
);
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;
El minidriver también puede acceder a la estructura de encabezados de secuencia correspondiente al puntero y al pin de flujo actual:
PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;
La mayoría de los minidrives que usan el procesamiento centrado en filtros usan el puntero de flujo solo para el acceso al encabezado de flujo. En el modelo centrado en filtros, AVStream manipula el puntero de flujo internamente. Como resultado, los minidrivers deben continuar con precaución si manipulan el puntero de flujo en un controlador centrado en filtros.