Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Si un filtro utiliza el procesamiento centrado en filtros, entonces, de forma predeterminada, AVStream llama a la rutina de devolución de llamada AVStrMiniFilterProcess proporcionada por el minidriver cuando hay tramas 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 el 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 fotogramas están disponibles en pins 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 banderas 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 pines que requieren fotogramas mediante el uso de las rutinas KsPinAttachAndGate o KsPinAttachOrGate.
El número de instancias de pin 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, los pines adicionales en el estado KSSTATE_STOP no impedirán el procesamiento del filtro.
Se cumple el número requerido de instancias de pines (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 de KSPROCESSPIN_INDEXENTRY. AVStream ordena la matriz de estructuras KSPROCESSPIN_INDEXENTRY por identificador de pin.
En los siguientes ejemplos de código se ilustra cómo usar las estructuras de pines 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 KSPROCESSPIN_INDEXENTRY en su gestió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].Pines [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 Pines [0] es al menos uno. (Si lo último es verdadero, se garantiza que el pin existe).
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 copiarse 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 del encabezado de secuencia correspondiente al puntero de flujo actual y al pin.
PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;
La mayoría de los minidriveres que utilizan el procesamiento centrado en filtros emplean el puntero de flujo solo para acceder 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.